From 9eb62c90d2cee751a826868a162b5144e8e38057 Mon Sep 17 00:00:00 2001 From: Jonathan Chico Date: Wed, 21 Oct 2020 11:11:58 +0200 Subject: [PATCH 01/70] Fixing the examples so that they correspond to the new potential setup. Addresses #18 --- README.md | 2 +- examples/launch_lammps_force_gan.py | 3 +-- examples/launch_lammps_md_si.py | 2 +- examples/launch_lammps_optimization_fe.py | 3 +-- examples/launch_lammps_optimization_gan.py | 3 +-- examples/launch_lammps_optimization_lj.py | 2 +- 6 files changed, 6 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index aba57b5..75d7e71 100644 --- a/README.md +++ b/README.md @@ -113,7 +113,7 @@ potential_dict = { 'N N Ga': '1.0 0.001632 0.000 65.20700 2.82100 -0.518000 1.0 0.0 0.00000 0.00000 2.90 0.20 0.00000 0.00000', 'Ga N Ga': '1.0 0.007874 1.846 1.918000 0.75000 -0.301300 1.0 0.0 0.00000 0.00000 2.87 0.15 0.00000 0.00000'} potential = DataFactory("lammps.potential")( - structure=structure, type=pair_style, data=potential_dict + type=pair_style, data=potential_dict ) potential.attributes ``` diff --git a/examples/launch_lammps_force_gan.py b/examples/launch_lammps_force_gan.py index 544b9b3..6db1dcc 100644 --- a/examples/launch_lammps_force_gan.py +++ b/examples/launch_lammps_force_gan.py @@ -81,9 +81,8 @@ # setup nodes inputs.structure = structure - # inputs.potential = Dict(dict=potential) inputs.potential = EmpiricalPotential( - structure=structure, type="tersoff", data=tersoff_gan + type=potential['pair_style'], data=potential['data'] ) # run calculation diff --git a/examples/launch_lammps_md_si.py b/examples/launch_lammps_md_si.py index d301fdf..44e0383 100644 --- a/examples/launch_lammps_md_si.py +++ b/examples/launch_lammps_md_si.py @@ -85,7 +85,7 @@ # setup nodes inputs.structure = structure inputs.potential = EmpiricalPotential( - structure=structure, type="tersoff", data=tersoff_si + type=potential['pair_style'], data=potential['data'] ) inputs.parameters = Dict(dict=parameters_md) diff --git a/examples/launch_lammps_optimization_fe.py b/examples/launch_lammps_optimization_fe.py index b9c8ee5..2129433 100644 --- a/examples/launch_lammps_optimization_fe.py +++ b/examples/launch_lammps_optimization_fe.py @@ -87,9 +87,8 @@ # setup nodes inputs.structure = structure - # inputs.potential = Dict(dict=potential) inputs.potential = EmpiricalPotential( - structure=structure, type="eam", data=eam_data + type=potential['pair_style'], data=potential['data'] ) print(inputs.potential.get_potential_file()) diff --git a/examples/launch_lammps_optimization_gan.py b/examples/launch_lammps_optimization_gan.py index 51233c0..da3e635 100644 --- a/examples/launch_lammps_optimization_gan.py +++ b/examples/launch_lammps_optimization_gan.py @@ -101,9 +101,8 @@ # setup nodes inputs.structure = structure - # inputs.potential = Dict(dict=potential) inputs.potential = EmpiricalPotential( - structure=structure, type="tersoff", data=tersoff_gan + type=potential['pair_style'], data=potential['data'] ) inputs.parameters = Dict(dict=parameters_opt) diff --git a/examples/launch_lammps_optimization_lj.py b/examples/launch_lammps_optimization_lj.py index a421e91..a3f59b6 100644 --- a/examples/launch_lammps_optimization_lj.py +++ b/examples/launch_lammps_optimization_lj.py @@ -89,7 +89,7 @@ # setup nodes inputs.structure = structure inputs.potential = EmpiricalPotential( - structure=structure, type="lennard_jones", data={"1 1": "0.01029 3.4 2.5"} + type=potential['pair_style'], data=potential['data'] ) inputs.parameters = Dict(dict=parameters_opt) From 2c35ea231b7f3d5f1d4cf1f49a82b81304ab68b6 Mon Sep 17 00:00:00 2001 From: Jonathan Chico Date: Wed, 21 Oct 2020 11:28:49 +0200 Subject: [PATCH 02/70] Fixed formatting error which caused the pre-commit hooks to fail --- examples/launch_lammps_force_gan.py | 2 +- examples/launch_lammps_md_si.py | 2 +- examples/launch_lammps_optimization_fe.py | 2 +- examples/launch_lammps_optimization_gan.py | 2 +- examples/launch_lammps_optimization_lj.py | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/examples/launch_lammps_force_gan.py b/examples/launch_lammps_force_gan.py index 6db1dcc..c3bf7cb 100644 --- a/examples/launch_lammps_force_gan.py +++ b/examples/launch_lammps_force_gan.py @@ -82,7 +82,7 @@ # setup nodes inputs.structure = structure inputs.potential = EmpiricalPotential( - type=potential['pair_style'], data=potential['data'] + type=potential["pair_style"], data=potential["data"] ) # run calculation diff --git a/examples/launch_lammps_md_si.py b/examples/launch_lammps_md_si.py index 44e0383..ea2b1f0 100644 --- a/examples/launch_lammps_md_si.py +++ b/examples/launch_lammps_md_si.py @@ -85,7 +85,7 @@ # setup nodes inputs.structure = structure inputs.potential = EmpiricalPotential( - type=potential['pair_style'], data=potential['data'] + type=potential["pair_style"], data=potential["data"] ) inputs.parameters = Dict(dict=parameters_md) diff --git a/examples/launch_lammps_optimization_fe.py b/examples/launch_lammps_optimization_fe.py index 2129433..58cb852 100644 --- a/examples/launch_lammps_optimization_fe.py +++ b/examples/launch_lammps_optimization_fe.py @@ -88,7 +88,7 @@ # setup nodes inputs.structure = structure inputs.potential = EmpiricalPotential( - type=potential['pair_style'], data=potential['data'] + type=potential["pair_style"], data=potential["data"] ) print(inputs.potential.get_potential_file()) diff --git a/examples/launch_lammps_optimization_gan.py b/examples/launch_lammps_optimization_gan.py index da3e635..5805b18 100644 --- a/examples/launch_lammps_optimization_gan.py +++ b/examples/launch_lammps_optimization_gan.py @@ -102,7 +102,7 @@ # setup nodes inputs.structure = structure inputs.potential = EmpiricalPotential( - type=potential['pair_style'], data=potential['data'] + type=potential["pair_style"], data=potential["data"] ) inputs.parameters = Dict(dict=parameters_opt) diff --git a/examples/launch_lammps_optimization_lj.py b/examples/launch_lammps_optimization_lj.py index a3f59b6..392bb1c 100644 --- a/examples/launch_lammps_optimization_lj.py +++ b/examples/launch_lammps_optimization_lj.py @@ -89,7 +89,7 @@ # setup nodes inputs.structure = structure inputs.potential = EmpiricalPotential( - type=potential['pair_style'], data=potential['data'] + type=potential["pair_style"], data=potential["data"] ) inputs.parameters = Dict(dict=parameters_opt) From 2c20ded367d9fdc9390d5bd464ea9661122eec57 Mon Sep 17 00:00:00 2001 From: Jonathan Chico Date: Mon, 8 Nov 2021 16:40:53 +0100 Subject: [PATCH 03/70] Adding a new auxiliary file to auto-generate the lammps input file. --- aiida_lammps/common/input_generator.py | 196 +++++++++++++++++++++++++ 1 file changed, 196 insertions(+) create mode 100644 aiida_lammps/common/input_generator.py diff --git a/aiida_lammps/common/input_generator.py b/aiida_lammps/common/input_generator.py new file mode 100644 index 0000000..3b5d151 --- /dev/null +++ b/aiida_lammps/common/input_generator.py @@ -0,0 +1,196 @@ +""" +[summary] + +[extended_summary] + +""" +from aiida import orm + + +def write_control_block(parameters_control: dict = None) -> str: + """ + Generate the input block with global control options. + + This takes the general options that affect the entire simulation, these + are then used (or their default values) to generate the control block. + + :param parameters_control: dictionary with the basic control parameters, defaults to None + :type parameters_control: dict, optional + :return: control block with general parameters of the simulation. + :rtype: str + """ + + default_timestep = { + 'si': 1.0e-8, + 'lj': 5.0e-3, + 'real': 1.0, + 'metal': 1.0e-3, + 'cgs': 1.0e-8, + 'electron': 1.0e-3, + 'micro': 2.0, + 'nano': 4.5e-4, + } + + _time = default_timestep[parameters_control.get('units', 'si')] + control_block = "# ---- Start of the Control information ----\n" + control_block += "clear\n" + control_block += f"units {parameters_control.get('units', 'si')}\n" + control_block += f"newton {parameters_control.get('newton', 'on')}\n" + control_block += f"processors {parameters_control.get('processors','* * * grid onelevel map cart')}\n" + control_block += f"timestep {parameters_control.get('timestep', _time)}\n" + control_block += "# ---- End of the Control information ----\n" + return control_block + + +def write_potential_block(potential=None, parameters_potential: dict = None) -> str: + """ + Generate the input block with potential options. + + [extended_summary] + + :param potential: [description], defaults to None + :type potential: [type], optional + :param parameters_potential: [description], defaults to None + :type parameters_potential: dict, optional + :return: [description] + :rtype: str + """ + potential_block = "# ---- Start of Potential information ----\n" + potential_block += f"pair_style {potential.pair_style}\n" + potential_block += f"{potential.potential_line}" + potential_block += f"neighbor {parameters_potential.get('neighbor_update', 2.0)} bin\n" + potential_block += f"neigh_modify {join_keywords(parameters_potential['neigh_modify'])}\n" + potential_block += "# ---- End of Potential information ----\n" + return potential_block + + +def write_structure_block( + parameters_structure: dict = None, + structure: orm.StructureData = None, + structure_filename: str = None, +) -> str: + """ + Generate the input block with the structure options. + + [extended_summary] + + :param parameters_structure: [description], defaults to None + :type parameters_structure: dict, optional + :param structure: [description], defaults to None + :type structure: orm.StructureData, optional + :param structure_filename: [description], defaults to None + :type structure_filename: str, optional + :return: [description] + :rtype: str + """ + structure_block = "# ---- Start of the Structure information ----\n" + structure_block += f"box tilt {parameters_structure.get('box_tilt','small')}\n" + + structure_block += f"dimension {structure.get_dimensionality()['dim']}\n" + structure_block += "boundary " + for _bound in ['pbc1', 'pbc2', 'pbc3']: + structure_block += f"{'p' if structure.attributes[_bound] else 'f'} " + structure_block += "\n" + structure_block += f"atom_style {parameters_structure['atom_style']}\n" + structure_block += f"read_data {structure_filename}\n" + structure_block += "# ---- End of the Structure information ----\n" + + return structure_block + + +def write_minimize_block(parameters_minimize: dict = None) -> str: + """ + Generate the input block with the minimization options. + + [extended_summary] + + :param parameters_minimize: [description], defaults to None + :type parameters_minimize: dict, optional + :return: [description] + :rtype: str + """ + minimize_block = "# ---- Start of the Minimization information ----\n" + minimize_block += f"min_style {parameters_minimize.get('style', 'cg')}\n" + minimize_block += f"minimize {parameters_minimize.get('energy_tolerance', 1e-4)}" + minimize_block += f" {parameters_minimize.get('force_tolerance', 1e-4)}" + minimize_block += f" {parameters_minimize.get('max_iterations', 1000)}" + minimize_block += f" {parameters_minimize.get('max_evaluations', 1000)}\n" + minimize_block += "# ---- End of the Minimization information ----\n" + + return minimize_block + + +def write_md_block(parameters_md: dict = None) -> str: + """ + Generate the input block with the MD options. + + [extended_summary] + + :param parameters_md: [description], defaults to None + :type parameters_md: dict, optional + :return: [description] + :rtype: str + """ + md_block = "# ---- Start of the MD information ----\n" + md_block += "reset_timestep 0\n" + if parameters_md.get('run_style', 'verlet') == 'rspa': + md_block += f"run_style {parameters_md.get('run_style', 'verlet')} " + md_block += f"{join_keywords(parameters_md['rspa_options'])}\n" + else: + md_block += f"run_style {parameters_md.get('run_style', 'verlet')}\n" + md_block += f"run {parameters_md.get('max_number_steps', 10)}\n" + md_block += "# ---- End of the MD information ----\n" + + return md_block + + +def write_fix_block(parameters_fix: dict = None) -> str: + """ + Generate the input block with the fix options. + + [extended_summary] + + :param parameters_fix: [description], defaults to None + :type parameters_fix: dict, optional + :return: [description] + :rtype: str + """ + fix_block = "# ---- Start of the Fix information ----\n" + for key, value in parameters_fix.items(): + fix_block += f"fix {key.replace('/','_')}_aiida {value['group']} {key} " + fix_block += f"{join_keywords(value['type'])}\n" + fix_block += "# ---- End of the Fix information ----\n" + return fix_block + + +def write_compute_block(parameters_compute: dict = None) -> str: + """ + Generate the input block with the compute options. + + [extended_summary] + + :param parameters_compute: [description], defaults to None + :type parameters_compute: dict, optional + :return: [description] + :rtype: str + """ + compute_block = "# ---- Start of the Compute information ----\n" + for key, value in parameters_compute.items(): + compute_block += f"compute {key.replace('/','_')}_aiida {value['group']} {key} " + compute_block += f"{join_keywords(value['type'])}\n" + compute_block += "# ---- End of the Compute information ----\n" + return compute_block + + +def join_keywords(value) -> str: + """ + [summary] + + [extended_summary] + + :param value: [description] + :type value: [type] + :return: [description] + :rtype: str + """ + return " ".join([f"{entry['keyword']} {entry['value']}" if isinstance(entry, dict) else f"{entry}" for entry in value]) From 34ef3eee1a65bf7b745e920dd768660e5dd81b07 Mon Sep 17 00:00:00 2001 From: Jonathan Chico Date: Mon, 8 Nov 2021 16:41:30 +0100 Subject: [PATCH 04/70] Added a pre-commit in the style of the one in aiida-core. Change many files to follow this format. --- .pre-commit-config.yaml | 69 +- .pre-commit/check_version.py | 37 +- aiida_lammps/__init__.py | 2 +- aiida_lammps/calculations/dynaphopy.py | 160 ++--- aiida_lammps/calculations/lammps/__init__.py | 184 ++--- aiida_lammps/calculations/lammps/combinate.py | 168 ++--- aiida_lammps/calculations/lammps/force.py | 85 ++- aiida_lammps/calculations/lammps/md.py | 163 +++-- aiida_lammps/calculations/lammps/md_multi.py | 391 +++++------ aiida_lammps/calculations/lammps/optimize.py | 139 ++-- aiida_lammps/common/generate_input_files.py | 58 +- aiida_lammps/common/generate_structure.py | 61 +- aiida_lammps/common/parse_trajectory.py | 63 +- aiida_lammps/common/raw_parsers.py | 314 ++++----- aiida_lammps/common/reaxff_convert.py | 629 ++++++++---------- aiida_lammps/common/utils.py | 20 +- aiida_lammps/data/pot_plugins/base_plugin.py | 1 - aiida_lammps/data/pot_plugins/eam.py | 26 +- .../data/pot_plugins/lennard_jones.py | 10 +- aiida_lammps/data/pot_plugins/reaxff.py | 88 ++- aiida_lammps/data/pot_plugins/tersoff.py | 21 +- aiida_lammps/data/potential.py | 50 +- aiida_lammps/data/trajectory.py | 120 ++-- aiida_lammps/parsers/dynaphopy.py | 19 +- aiida_lammps/parsers/lammps/base.py | 107 ++- aiida_lammps/parsers/lammps/force.py | 46 +- aiida_lammps/parsers/lammps/md.py | 42 +- aiida_lammps/parsers/lammps/md_multi.py | 58 +- aiida_lammps/parsers/lammps/optimize.py | 34 +- aiida_lammps/tests/test_calculations.py | 592 +++++++++-------- aiida_lammps/tests/test_generate_structure.py | 5 +- aiida_lammps/tests/test_parsers.py | 123 ++-- aiida_lammps/tests/test_potential_data.py | 30 +- aiida_lammps/tests/test_reaxff_parse.py | 12 +- aiida_lammps/tests/test_trajectory.py | 28 +- aiida_lammps/tests/utils.py | 97 +-- aiida_lammps/validation/__init__.py | 4 +- aiida_lammps/validation/utils.py | 22 +- conftest.py | 217 +++--- docs/source/conf.py | 18 +- examples/launch_dynaphopy_si.py | 57 +- examples/launch_lammps_combinate.py | 62 +- examples/launch_lammps_force_gan.py | 60 +- examples/launch_lammps_md_si.py | 70 +- examples/launch_lammps_optimization_fe.py | 68 +- examples/launch_lammps_optimization_gan.py | 88 +-- examples/launch_lammps_optimization_lj.py | 71 +- setup.py | 14 +- 48 files changed, 2363 insertions(+), 2440 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 0b1649d..b3f9409 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -8,52 +8,33 @@ exclude: > )$ repos: - - - repo: git://github.com/pre-commit/pre-commit-hooks - rev: v3.2.0 - hooks: - - id: check-json - - id: check-yaml - - id: end-of-file-fixer - - id: trailing-whitespace - - - repo: https://github.com/timothycrosley/isort - rev: 5.5.3 + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v2.5.0 hooks: - - id: isort - - - repo: https://github.com/psf/black - rev: 20.8b1 + - id: trailing-whitespace + - id: end-of-file-fixer + - id: check-yaml + - id: check-json + - id: check-added-large-files + - id: double-quote-string-fixer + - id: forbid-new-submodules + + - repo: https://github.com/pre-commit/mirrors-yapf + rev: v0.30.0 hooks: - - id: black - - - repo: https://gitlab.com/pycqa/flake8 - rev: 3.8.3 - hooks: - - id: flake8 - # additional_dependencies: - # - flake8-bugbear==20.1.4 - # - flake8-builtins==1.5.3 - # - flake8-comprehensions==3.2.3 - exclude: > - (?x)^( - aiida_lammps/calculations/dynaphopy.py - )$ + - id: yapf + name: yapf + types: [python] + args: ["-i"] - repo: local hooks: - - id: version-number - name: Check version numbers - entry: python ./.pre-commit/check_version.py version - language: python - files: >- - (?x)^( - setup.json| - .pre-commit/check_version.py| - aiida_lammps/__init__.py - )$ - pass_filenames: false - additional_dependencies: - - click - - # TODO could also add check-manifest + - id: pylint + name: pylint + entry: pylint + types: [python] + language: system + exclude: | + (?x)( + ^examples/ + ) diff --git a/.pre-commit/check_version.py b/.pre-commit/check_version.py index 797d78d..54cf9fb 100644 --- a/.pre-commit/check_version.py +++ b/.pre-commit/check_version.py @@ -11,7 +11,7 @@ import click -FILENAME_SETUP_JSON = "setup.json" +FILENAME_SETUP_JSON = 'setup.json' SCRIPT_PATH = os.path.split(os.path.realpath(__file__))[0] ROOT_DIR = os.path.join(SCRIPT_PATH, os.pardir) FILEPATH_SETUP_JSON = os.path.join(ROOT_DIR, FILENAME_SETUP_JSON) @@ -19,7 +19,7 @@ def get_setup_json(): """Return the `setup.json` as a python dictionary.""" - with open(FILEPATH_SETUP_JSON, "r") as handle: + with open(FILEPATH_SETUP_JSON, 'r') as handle: setup_json = json.load(handle) # , object_pairs_hook=OrderedDict) return setup_json @@ -31,7 +31,7 @@ def cli(): pass -@cli.command("version") +@cli.command('version') def validate_version(): """Check that version numbers match. @@ -45,27 +45,22 @@ def validate_version(): version = aiida_lammps.__version__ setup_content = get_setup_json() - if version != setup_content["version"]: - click.echo("Version number mismatch detected:") - click.echo( - "Version number in '{}': {}".format( - FILENAME_SETUP_JSON, setup_content["version"] - ) - ) - click.echo( - "Version number in '{}/__init__.py': {}".format("aiida_lammps", version) - ) - click.echo( - "Updating version in '{}' to: {}".format(FILENAME_SETUP_JSON, version) - ) - - setup_content["version"] = version - with open(FILEPATH_SETUP_JSON, "w") as fil: + if version != setup_content['version']: + click.echo('Version number mismatch detected:') + click.echo("Version number in '{}': {}".format( + FILENAME_SETUP_JSON, setup_content['version'])) + click.echo("Version number in '{}/__init__.py': {}".format( + 'aiida_lammps', version)) + click.echo("Updating version in '{}' to: {}".format( + FILENAME_SETUP_JSON, version)) + + setup_content['version'] = version + with open(FILEPATH_SETUP_JSON, 'w') as fil: # Write with indentation of two spaces and explicitly define separators to not have spaces at end of lines - json.dump(setup_content, fil, indent=2, separators=(",", ": ")) + json.dump(setup_content, fil, indent=2, separators=(',', ': ')) sys.exit(1) -if __name__ == "__main__": +if __name__ == '__main__': cli() # pylint: disable=no-value-for-parameter diff --git a/aiida_lammps/__init__.py b/aiida_lammps/__init__.py index 777f190..32a90a3 100644 --- a/aiida_lammps/__init__.py +++ b/aiida_lammps/__init__.py @@ -1 +1 @@ -__version__ = "0.8.0" +__version__ = '0.8.0' diff --git a/aiida_lammps/calculations/dynaphopy.py b/aiida_lammps/calculations/dynaphopy.py index 5571c76..b7cbe44 100644 --- a/aiida_lammps/calculations/dynaphopy.py +++ b/aiida_lammps/calculations/dynaphopy.py @@ -17,20 +17,19 @@ class DynaphopyCalculation(CalcJob): Requirement: the node should be able to import phonopy """ - def _init_internal_params(self): super(DynaphopyCalculation, self)._init_internal_params() - self._INPUT_FILE_NAME = "input_dynaphopy" - self._INPUT_TRAJECTORY = "trajectory" - self._INPUT_CELL = "POSCAR" - self._INPUT_FORCE_CONSTANTS = "FORCE_CONSTANTS" + self._INPUT_FILE_NAME = 'input_dynaphopy' + self._INPUT_TRAJECTORY = 'trajectory' + self._INPUT_CELL = 'POSCAR' + self._INPUT_FORCE_CONSTANTS = 'FORCE_CONSTANTS' - self._OUTPUT_FORCE_CONSTANTS = "FORCE_CONSTANTS_OUT" - self._OUTPUT_FILE_NAME = "OUTPUT" - self._OUTPUT_QUASIPARTICLES = "quasiparticles_data.yaml" + self._OUTPUT_FORCE_CONSTANTS = 'FORCE_CONSTANTS_OUT' + self._OUTPUT_FILE_NAME = 'OUTPUT' + self._OUTPUT_QUASIPARTICLES = 'quasiparticles_data.yaml' - self._default_parser = "dynaphopy" + self._default_parser = 'dynaphopy' @classproperty def _use_methods(cls): @@ -38,43 +37,44 @@ def _use_methods(cls): Additional use_* methods for the namelists class. """ retdict = JobCalculation._use_methods - retdict.update( - { - "parameters": { - "valid_types": ParameterData, - "additional_parameter": None, - "linkname": "parameters", - "docstring": ( - "Use a node that specifies the dynaphopy input " - "for the namelists" - ), - }, - "trajectory": { - "valid_types": TrajectoryData, - "additional_parameter": None, - "linkname": "trajectory", - "docstring": ( - "Use a node that specifies the trajectory data " - "for the namelists" - ), - }, - "force_constants": { - "valid_types": ArrayData, - "additional_parameter": None, - "linkname": "force_constants", - "docstring": ( - "Use a node that specifies the force_constants " - "for the namelists" - ), - }, - "structure": { - "valid_types": StructureData, - "additional_parameter": None, - "linkname": "structure", - "docstring": "Use a node for the structure", - }, - } - ) + retdict.update({ + 'parameters': { + 'valid_types': + ParameterData, + 'additional_parameter': + None, + 'linkname': + 'parameters', + 'docstring': ('Use a node that specifies the dynaphopy input ' + 'for the namelists'), + }, + 'trajectory': { + 'valid_types': + TrajectoryData, + 'additional_parameter': + None, + 'linkname': + 'trajectory', + 'docstring': ('Use a node that specifies the trajectory data ' + 'for the namelists'), + }, + 'force_constants': { + 'valid_types': + ArrayData, + 'additional_parameter': + None, + 'linkname': + 'force_constants', + 'docstring': ('Use a node that specifies the force_constants ' + 'for the namelists'), + }, + 'structure': { + 'valid_types': StructureData, + 'additional_parameter': None, + 'linkname': 'structure', + 'docstring': 'Use a node for the structure', + }, + }) return retdict def _prepare_for_submission(self, tempfolder, inputdict): @@ -89,35 +89,39 @@ def _prepare_for_submission(self, tempfolder, inputdict): """ try: - parameters_data = inputdict.pop(self.get_linkname("parameters")) + parameters_data = inputdict.pop(self.get_linkname('parameters')) except KeyError: pass # raise InputValidationError("No parameters specified for this " # "calculation") if not isinstance(parameters_data, ParameterData): - raise InputValidationError("parameters is not of type " "ParameterData") + raise InputValidationError('parameters is not of type ' + 'ParameterData') try: - structure = inputdict.pop(self.get_linkname("structure")) + structure = inputdict.pop(self.get_linkname('structure')) except KeyError: - raise InputValidationError("no structure is specified for this calculation") + raise InputValidationError( + 'no structure is specified for this calculation') try: - trajectory = inputdict.pop(self.get_linkname("trajectory")) + trajectory = inputdict.pop(self.get_linkname('trajectory')) except KeyError: - raise InputValidationError("trajectory is specified for this calculation") + raise InputValidationError( + 'trajectory is specified for this calculation') try: - force_constants = inputdict.pop(self.get_linkname("force_constants")) + force_constants = inputdict.pop( + self.get_linkname('force_constants')) except KeyError: raise InputValidationError( - "no force_constants is specified for this calculation" - ) + 'no force_constants is specified for this calculation') try: - code = inputdict.pop(self.get_linkname("code")) + code = inputdict.pop(self.get_linkname('code')) except KeyError: - raise InputValidationError("no code is specified for this calculation") + raise InputValidationError( + 'no code is specified for this calculation') time_step = trajectory.get_times()[1] - trajectory.get_times()[0] @@ -135,19 +139,20 @@ def _prepare_for_submission(self, tempfolder, inputdict): # =========================== dump to file ============================= input_filename = tempfolder.get_abs_path(self._INPUT_FILE_NAME) - with open(input_filename, "w") as infile: + with open(input_filename, 'w') as infile: infile.write(input_txt) cell_filename = tempfolder.get_abs_path(self._INPUT_CELL) - with open(cell_filename, "w") as infile: + with open(cell_filename, 'w') as infile: infile.write(cell_txt) - force_constants_filename = tempfolder.get_abs_path(self._INPUT_FORCE_CONSTANTS) - with open(force_constants_filename, "w") as infile: + force_constants_filename = tempfolder.get_abs_path( + self._INPUT_FORCE_CONSTANTS) + with open(force_constants_filename, 'w') as infile: infile.write(force_constants_txt) trajectory_filename = tempfolder.get_abs_path(self._INPUT_TRAJECTORY) - with open(trajectory_filename, "w") as infile: + with open(trajectory_filename, 'w') as infile: infile.write(trajectory_txt) # ============================ calcinfo ================================ @@ -174,27 +179,26 @@ def _prepare_for_submission(self, tempfolder, inputdict): codeinfo.cmdline_params = [ self._INPUT_FILE_NAME, self._INPUT_TRAJECTORY, - "-ts", - "{}".format(time_step), - "--silent", - "-sfc", + '-ts', + '{}'.format(time_step), + '--silent', + '-sfc', self._OUTPUT_FORCE_CONSTANTS, - "-thm", # '--resolution 0.01', - "-psm", - "2", - "--normalize_dos", - "-sdata", + '-thm', # '--resolution 0.01', + '-psm', + '2', + '--normalize_dos', + '-sdata', ] - if "temperature" in parameters_data.get_dict(): - codeinfo.cmdline_params.append("--temperature") - codeinfo.cmdline_params.append( - "{}".format(parameters_data.dict.temperature) - ) + if 'temperature' in parameters_data.get_dict(): + codeinfo.cmdline_params.append('--temperature') + codeinfo.cmdline_params.append('{}'.format( + parameters_data.dict.temperature)) - if "md_commensurate" in parameters_data.get_dict(): + if 'md_commensurate' in parameters_data.get_dict(): if parameters_data.dict.md_commensurate: - codeinfo.cmdline_params.append("--MD_commensurate") + codeinfo.cmdline_params.append('--MD_commensurate') codeinfo.stdout_name = self._OUTPUT_FILE_NAME codeinfo.code_uuid = code.uuid diff --git a/aiida_lammps/calculations/lammps/__init__.py b/aiida_lammps/calculations/lammps/__init__.py index ca015a6..439a8fa 100644 --- a/aiida_lammps/calculations/lammps/__init__.py +++ b/aiida_lammps/calculations/lammps/__init__.py @@ -31,36 +31,37 @@ def get_supercell(structure, supercell_shape): def get_force_constants(force_constants): - force_constants = force_constants.get_array("force_constants") + force_constants = force_constants.get_array('force_constants') fc_shape = force_constants.shape - fc_txt = "%4d\n" % (fc_shape[0]) + fc_txt = '%4d\n' % (fc_shape[0]) for i in range(fc_shape[0]): for j in range(fc_shape[1]): - fc_txt += "%4d%4d\n" % (i + 1, j + 1) + fc_txt += '%4d%4d\n' % (i + 1, j + 1) for vec in force_constants[i][j]: - fc_txt += ("%22.15f" * 3 + "\n") % tuple(vec) + fc_txt += ('%22.15f' * 3 + '\n') % tuple(vec) return fc_txt def structure_to_poscar(structure): - atom_type_unique = np.unique( - [site.kind_name for site in structure.sites], return_index=True - )[1] + atom_type_unique = np.unique([site.kind_name for site in structure.sites], + return_index=True)[1] labels = np.diff(np.append(atom_type_unique, [len(structure.sites)])) - poscar = " ".join(np.unique([site.kind_name for site in structure.sites])) - poscar += "\n1.0\n" + poscar = ' '.join(np.unique([site.kind_name for site in structure.sites])) + poscar += '\n1.0\n' cell = structure.cell for row in cell: - poscar += "{0: 22.16f} {1: 22.16f} {2: 22.16f}\n".format(*row) - poscar += " ".join(np.unique([site.kind_name for site in structure.sites])) + "\n" - poscar += " ".join(np.array(labels, dtype=str)) + "\n" - poscar += "Cartesian\n" + poscar += '{0: 22.16f} {1: 22.16f} {2: 22.16f}\n'.format(*row) + poscar += ' '.join(np.unique([site.kind_name + for site in structure.sites])) + '\n' + poscar += ' '.join(np.array(labels, dtype=str)) + '\n' + poscar += 'Cartesian\n' for site in structure.sites: - poscar += "{0: 22.16f} {1: 22.16f} {2: 22.16f}\n".format(*site.position) + poscar += '{0: 22.16f} {1: 22.16f} {2: 22.16f}\n'.format( + *site.position) return poscar @@ -68,18 +69,18 @@ def structure_to_poscar(structure): def parameters_to_input_file(parameters_object): parameters = parameters_object.get_dict() - input_file = "STRUCTURE FILE POSCAR\nPOSCAR\n\n" - input_file += "FORCE CONSTANTS\nFORCE_CONSTANTS\n\n" - input_file += "PRIMITIVE MATRIX\n" - input_file += ("{} {} {} \n").format(*np.array(parameters["primitive"])[0]) - input_file += ("{} {} {} \n").format(*np.array(parameters["primitive"])[1]) - input_file += ("{} {} {} \n").format(*np.array(parameters["primitive"])[2]) - input_file += "\n" - input_file += "SUPERCELL MATRIX PHONOPY\n" - input_file += ("{} {} {} \n").format(*np.array(parameters["supercell"])[0]) - input_file += ("{} {} {} \n").format(*np.array(parameters["supercell"])[1]) - input_file += ("{} {} {} \n").format(*np.array(parameters["supercell"])[2]) - input_file += "\n" + input_file = 'STRUCTURE FILE POSCAR\nPOSCAR\n\n' + input_file += 'FORCE CONSTANTS\nFORCE_CONSTANTS\n\n' + input_file += 'PRIMITIVE MATRIX\n' + input_file += ('{} {} {} \n').format(*np.array(parameters['primitive'])[0]) + input_file += ('{} {} {} \n').format(*np.array(parameters['primitive'])[1]) + input_file += ('{} {} {} \n').format(*np.array(parameters['primitive'])[2]) + input_file += '\n' + input_file += 'SUPERCELL MATRIX PHONOPY\n' + input_file += ('{} {} {} \n').format(*np.array(parameters['supercell'])[0]) + input_file += ('{} {} {} \n').format(*np.array(parameters['supercell'])[1]) + input_file += ('{} {} {} \n').format(*np.array(parameters['supercell'])[2]) + input_file += '\n' return input_file @@ -91,123 +92,126 @@ class BaseLammpsCalculation(CalcJob): Requirement: the node should be able to import phonopy """ - _INPUT_FILE_NAME = "input.in" - _INPUT_STRUCTURE = "input.data" + _INPUT_FILE_NAME = 'input.in' + _INPUT_STRUCTURE = 'input.data' - _DEFAULT_OUTPUT_FILE_NAME = "log.lammps" - _DEFAULT_TRAJECTORY_FILE_NAME = "trajectory.lammpstrj" - _DEFAULT_SYSTEM_FILE_NAME = "system_info.dump" - _DEFAULT_RESTART_FILE_NAME = "lammps.restart" + _DEFAULT_OUTPUT_FILE_NAME = 'log.lammps' + _DEFAULT_TRAJECTORY_FILE_NAME = 'trajectory.lammpstrj' + _DEFAULT_SYSTEM_FILE_NAME = 'system_info.dump' + _DEFAULT_RESTART_FILE_NAME = 'lammps.restart' - _cmdline_params = ("-in", _INPUT_FILE_NAME) + _cmdline_params = ('-in', _INPUT_FILE_NAME) _stdout_name = None @classmethod def define(cls, spec): super(BaseLammpsCalculation, cls).define(spec) - spec.input("structure", valid_type=StructureData, help="the structure") - spec.input("potential", valid_type=EmpiricalPotential, help="lammps potential") - spec.input("parameters", valid_type=Dict, help="the parameters", required=False) + spec.input('structure', valid_type=StructureData, help='the structure') + spec.input('potential', + valid_type=EmpiricalPotential, + help='lammps potential') + spec.input('parameters', + valid_type=Dict, + help='the parameters', + required=False) spec.input( - "metadata.options.cell_transform_filename", + 'metadata.options.cell_transform_filename', valid_type=str, - default="cell_transform.npy", + default='cell_transform.npy', ) spec.input( - "metadata.options.output_filename", + 'metadata.options.output_filename', valid_type=str, default=cls._DEFAULT_OUTPUT_FILE_NAME, ) spec.input( - "metadata.options.trajectory_suffix", + 'metadata.options.trajectory_suffix', valid_type=str, default=cls._DEFAULT_TRAJECTORY_FILE_NAME, ) spec.input( - "metadata.options.system_suffix", + 'metadata.options.system_suffix', valid_type=str, default=cls._DEFAULT_SYSTEM_FILE_NAME, ) spec.input( - "metadata.options.restart_filename", + 'metadata.options.restart_filename', valid_type=str, default=cls._DEFAULT_RESTART_FILE_NAME, ) spec.output( - "results", - valid_type=DataFactory("dict"), + 'results', + valid_type=DataFactory('dict'), required=True, - help="the data extracted from the main output file", + help='the data extracted from the main output file', ) - spec.default_output_node = "results" + spec.default_output_node = 'results' # Unrecoverable errors: resources like the retrieved folder or its expected contents are missing spec.exit_code( 200, - "ERROR_NO_RETRIEVED_FOLDER", - message="The retrieved folder data node could not be accessed.", + 'ERROR_NO_RETRIEVED_FOLDER', + message='The retrieved folder data node could not be accessed.', ) spec.exit_code( 201, - "ERROR_NO_RETRIEVED_TEMP_FOLDER", - message="The retrieved temporary folder data node could not be accessed.", + 'ERROR_NO_RETRIEVED_TEMP_FOLDER', + message= + 'The retrieved temporary folder data node could not be accessed.', ) spec.exit_code( 202, - "ERROR_LOG_FILE_MISSING", - message="the main log output file was not found", + 'ERROR_LOG_FILE_MISSING', + message='the main log output file was not found', ) spec.exit_code( 203, - "ERROR_TRAJ_FILE_MISSING", - message="the trajectory output file was not found", + 'ERROR_TRAJ_FILE_MISSING', + message='the trajectory output file was not found', ) spec.exit_code( 204, - "ERROR_STDOUT_FILE_MISSING", - message="the stdout output file was not found", + 'ERROR_STDOUT_FILE_MISSING', + message='the stdout output file was not found', ) spec.exit_code( 205, - "ERROR_STDERR_FILE_MISSING", - message="the stderr output file was not found", + 'ERROR_STDERR_FILE_MISSING', + message='the stderr output file was not found', ) # Unrecoverable errors: required retrieved files could not be read, parsed or are otherwise incomplete spec.exit_code( 300, - "ERROR_LOG_PARSING", - message=( - "An error was flagged trying to parse the " - "main lammps output log file" - ), + 'ERROR_LOG_PARSING', + message=('An error was flagged trying to parse the ' + 'main lammps output log file'), ) spec.exit_code( 310, - "ERROR_TRAJ_PARSING", - message=( - "An error was flagged trying to parse the " "trajectory output file" - ), + 'ERROR_TRAJ_PARSING', + message=('An error was flagged trying to parse the ' + 'trajectory output file'), ) spec.exit_code( 320, - "ERROR_INFO_PARSING", - message=( - "An error was flagged trying to parse the " "system info output file" - ), + 'ERROR_INFO_PARSING', + message=('An error was flagged trying to parse the ' + 'system info output file'), ) # Significant errors but calculation can be used to restart spec.exit_code( 400, - "ERROR_LAMMPS_RUN", - message="The main lammps output file flagged an error", + 'ERROR_LAMMPS_RUN', + message='The main lammps output file flagged an error', ) spec.exit_code( 401, - "ERROR_RUN_INCOMPLETE", - message="The main lammps output file did not flag that the computation finished", + 'ERROR_RUN_INCOMPLETE', + message= + 'The main lammps output file did not flag that the computation finished', ) @staticmethod @@ -240,23 +244,22 @@ def prepare_for_submission(self, tempfolder): """ # assert that the potential and structure have the same kind elements if self.inputs.potential.allowed_element_names is not None and not set( - k.symbol for k in self.inputs.structure.kinds - ).issubset(self.inputs.potential.allowed_element_names): + k.symbol for k in self.inputs.structure.kinds).issubset( + self.inputs.potential.allowed_element_names): raise ValidationError( - "the structure and potential are not compatible (different kind elements)" + 'the structure and potential are not compatible (different kind elements)' ) # Setup structure structure_txt, struct_transform = generate_lammps_structure( - self.inputs.structure, self.inputs.potential.atom_style - ) + self.inputs.structure, self.inputs.potential.atom_style) with open( - tempfolder.get_abs_path(self.options.cell_transform_filename), "w+b" - ) as handle: + tempfolder.get_abs_path(self.options.cell_transform_filename), + 'w+b') as handle: np.save(handle, struct_transform) - if "parameters" in self.inputs: + if 'parameters' in self.inputs: parameters = self.inputs.parameters else: parameters = Dict() @@ -274,14 +277,14 @@ def prepare_for_submission(self, tempfolder): input_filename = tempfolder.get_abs_path(self._INPUT_FILE_NAME) - with open(input_filename, "w") as infile: + with open(input_filename, 'w') as infile: infile.write(input_txt) self.validate_parameters(parameters, self.inputs.potential) retrieve_list, retrieve_temporary_list = self.get_retrieve_lists() - retrieve_list.extend( - [self.options.output_filename, self.options.cell_transform_filename] - ) + retrieve_list.extend([ + self.options.output_filename, self.options.cell_transform_filename + ]) # prepare extra files if needed self.prepare_extra_files(tempfolder, self.inputs.potential) @@ -289,12 +292,13 @@ def prepare_for_submission(self, tempfolder): # =========================== dump to file ============================= structure_filename = tempfolder.get_abs_path(self._INPUT_STRUCTURE) - with open(structure_filename, "w") as infile: + with open(structure_filename, 'w') as infile: infile.write(structure_txt) - for name, content in self.inputs.potential.get_external_files().items(): + for name, content in self.inputs.potential.get_external_files().items( + ): fpath = tempfolder.get_abs_path(name) - with open(fpath, "w") as infile: + with open(fpath, 'w') as infile: infile.write(content) # ============================ calcinfo ================================ diff --git a/aiida_lammps/calculations/lammps/combinate.py b/aiida_lammps/calculations/lammps/combinate.py index 089cd22..f8330bb 100644 --- a/aiida_lammps/calculations/lammps/combinate.py +++ b/aiida_lammps/calculations/lammps/combinate.py @@ -14,43 +14,43 @@ def generate_dynaphopy_input( parameters_object, - poscar_name="POSCAR", - force_constants_name="FORCE_CONSTANTS", - force_sets_filename="FORCE_SETS", + poscar_name='POSCAR', + force_constants_name='FORCE_CONSTANTS', + force_sets_filename='FORCE_SETS', use_sets=False, ): parameters = parameters_object.get_dict() - input_file = "STRUCTURE FILE POSCAR\n{}\n\n".format(poscar_name) + input_file = 'STRUCTURE FILE POSCAR\n{}\n\n'.format(poscar_name) if use_sets: - input_file += "FORCE SETS\n{}\n\n".format(force_sets_filename) + input_file += 'FORCE SETS\n{}\n\n'.format(force_sets_filename) else: - input_file += "FORCE CONSTANTS\n{}\n\n".format(force_constants_name) - - input_file += "PRIMITIVE MATRIX\n" - input_file += "{} {} {} \n".format(*np.array(parameters["primitive"])[0]) - input_file += "{} {} {} \n".format(*np.array(parameters["primitive"])[1]) - input_file += "{} {} {} \n".format(*np.array(parameters["primitive"])[2]) - input_file += "\n" - input_file += "SUPERCELL MATRIX PHONOPY\n" - input_file += "{} {} {} \n".format(*np.array(parameters["supercell"])[0]) - input_file += "{} {} {} \n".format(*np.array(parameters["supercell"])[1]) - input_file += "{} {} {} \n".format(*np.array(parameters["supercell"])[2]) - input_file += "\n" + input_file += 'FORCE CONSTANTS\n{}\n\n'.format(force_constants_name) + + input_file += 'PRIMITIVE MATRIX\n' + input_file += '{} {} {} \n'.format(*np.array(parameters['primitive'])[0]) + input_file += '{} {} {} \n'.format(*np.array(parameters['primitive'])[1]) + input_file += '{} {} {} \n'.format(*np.array(parameters['primitive'])[2]) + input_file += '\n' + input_file += 'SUPERCELL MATRIX PHONOPY\n' + input_file += '{} {} {} \n'.format(*np.array(parameters['supercell'])[0]) + input_file += '{} {} {} \n'.format(*np.array(parameters['supercell'])[1]) + input_file += '{} {} {} \n'.format(*np.array(parameters['supercell'])[2]) + input_file += '\n' return input_file class CombinateCalculation(BaseLammpsCalculation): - _POSCAR_NAME = "POSCAR" - _INPUT_FORCE_CONSTANTS = "FORCE_CONSTANTS" - _INPUT_FORCE_SETS = "FORCE_SETS" - _INPUT_FILE_NAME_DYNA = "input_dynaphopy" - _OUTPUT_FORCE_CONSTANTS = "FORCE_CONSTANTS_OUT" - _OUTPUT_QUASIPARTICLES = "quasiparticles_data.yaml" - _OUTPUT_FILE_NAME = "OUTPUT" + _POSCAR_NAME = 'POSCAR' + _INPUT_FORCE_CONSTANTS = 'FORCE_CONSTANTS' + _INPUT_FORCE_SETS = 'FORCE_SETS' + _INPUT_FILE_NAME_DYNA = 'input_dynaphopy' + _OUTPUT_FORCE_CONSTANTS = 'FORCE_CONSTANTS_OUT' + _OUTPUT_QUASIPARTICLES = 'quasiparticles_data.yaml' + _OUTPUT_FILE_NAME = 'OUTPUT' # self._retrieve_list = [self._OUTPUT_QUASIPARTICLES, self._OUTPUT_FORCE_CONSTANTS, self._OUTPUT_FILE_NAME] @@ -58,15 +58,19 @@ class CombinateCalculation(BaseLammpsCalculation): def define(cls, spec): super(CombinateCalculation, cls).define(spec) spec.input( - "metadata.options.parser_name", + 'metadata.options.parser_name', valid_type=str, - default="dynaphopy", + default='dynaphopy', ) - spec.input("parameters_dynaphopy", valid_type=Dict, help="dynaphopy parameters") - spec.input( - "force_constants", valid_type=ArrayData, help="harmonic force constants" - ) - spec.input("force_sets", valid_type=ArrayData, help="phonopy force sets") + spec.input('parameters_dynaphopy', + valid_type=Dict, + help='dynaphopy parameters') + spec.input('force_constants', + valid_type=ArrayData, + help='harmonic force constants') + spec.input('force_sets', + valid_type=ArrayData, + help='phonopy force sets') # spec.input('settings', valid_type=str, default='lammps.optimize') @@ -83,40 +87,39 @@ def create_main_input_content( random_number = np.random.randint(10000000) - lammps_input_file = "units {0}\n".format(potential_data.default_units) - lammps_input_file += "boundary p p p\n" - lammps_input_file += "box tilt large\n" - lammps_input_file += "atom_style {0}\n".format(potential_data.atom_style) - lammps_input_file += "read_data {}\n".format(structure_filename) + lammps_input_file = 'units {0}\n'.format( + potential_data.default_units) + lammps_input_file += 'boundary p p p\n' + lammps_input_file += 'box tilt large\n' + lammps_input_file += 'atom_style {0}\n'.format( + potential_data.atom_style) + lammps_input_file += 'read_data {}\n'.format(structure_filename) lammps_input_file += potential_data.get_input_lines(structure_data) - lammps_input_file += "neighbor 0.3 bin\n" - lammps_input_file += "neigh_modify every 1 delay 0 check no\n" + lammps_input_file += 'neighbor 0.3 bin\n' + lammps_input_file += 'neigh_modify every 1 delay 0 check no\n' lammps_input_file += ( - "velocity all create {0} {1} dist gaussian mom yes\n".format( - parameter_data.dict.temperature, random_number - ) - ) - lammps_input_file += "velocity all scale {}\n".format( - parameter_data.dict.temperature - ) + 'velocity all create {0} {1} dist gaussian mom yes\n'. + format(parameter_data.dict.temperature, random_number)) + lammps_input_file += 'velocity all scale {}\n'.format( + parameter_data.dict.temperature) - lammps_input_file += "fix int all nvt temp {0} {0} {1}\n".format( - parameter_data.dict.temperature, parameter_data.dict.thermostat_variable - ) + lammps_input_file += 'fix int all nvt temp {0} {0} {1}\n'.format( + parameter_data.dict.temperature, + parameter_data.dict.thermostat_variable) return lammps_input_file def prepare_extra_files(self, tempfolder, potential_object): - if "fore_constants" in self.inputs: + if 'fore_constants' in self.inputs: force_constants = self.inputs.force_constants else: force_constants = None - if "fore_constants" in self.inputs: + if 'fore_constants' in self.inputs: force_sets = self.inputs.force_sets else: force_sets = None @@ -124,35 +127,33 @@ def prepare_extra_files(self, tempfolder, potential_object): cell_txt = get_poscar_txt(self.inputs.structure) cell_filename = tempfolder(self._POSCAR_NAME) - with open(cell_filename, "w") as infile: + with open(cell_filename, 'w') as infile: infile.write(cell_txt) if force_constants is not None: force_constants_txt = get_force_constants(force_constants) force_constants_filename = tempfolder.get_abs_path( - self._INPUT_FORCE_CONSTANTS - ) - with open(force_constants_filename, "w") as infile: + self._INPUT_FORCE_CONSTANTS) + with open(force_constants_filename, 'w') as infile: infile.write(force_constants_txt) elif force_sets is not None: force_sets_txt = get_FORCE_SETS_txt(force_sets) - force_sets_filename = tempfolder.get_abs_path(self._INPUT_FORCE_SETS) - with open(force_sets_filename, "w") as infile: + force_sets_filename = tempfolder.get_abs_path( + self._INPUT_FORCE_SETS) + with open(force_sets_filename, 'w') as infile: infile.write(force_sets_txt) else: raise InputValidationError( - "no force_sets nor force_constants are specified for this calculation" + 'no force_sets nor force_constants are specified for this calculation' ) try: parameters_data_dynaphopy = Dict.pop( - self.get_linkname("parameters_dynaphopy") - ) + self.get_linkname('parameters_dynaphopy')) except KeyError: raise InputValidationError( - "No dynaphopy parameters specified for this calculation" - ) + 'No dynaphopy parameters specified for this calculation') parameters_dynaphopy_txt = generate_dynaphopy_input( parameters_data_dynaphopy, @@ -162,8 +163,9 @@ def prepare_extra_files(self, tempfolder, potential_object): use_sets=force_sets is not None, ) - dynaphopy_filename = tempfolder.get_abs_path(self._INPUT_FILE_NAME_DYNA) - with open(dynaphopy_filename, "w") as infile: + dynaphopy_filename = tempfolder.get_abs_path( + self._INPUT_FILE_NAME_DYNA) + with open(dynaphopy_filename, 'w') as infile: infile.write(parameters_dynaphopy_txt) md_supercell = parameters_data_dynaphopy.dict.md_supercell @@ -174,28 +176,28 @@ def prepare_extra_files(self, tempfolder, potential_object): self._cmdline_params = [ self._INPUT_FILE_NAME_DYNA, - "--run_lammps", + '--run_lammps', self._INPUT_FILE_NAME, - "{}".format(total_time), - "{}".format(time_step), - "{}".format(equilibrium_time), - "--dim", - "{}".format(md_supercell[0]), - "{}".format(md_supercell[1]), - "{}".format(md_supercell[2]), - "--silent", - "-sfc", + '{}'.format(total_time), + '{}'.format(time_step), + '{}'.format(equilibrium_time), + '--dim', + '{}'.format(md_supercell[0]), + '{}'.format(md_supercell[1]), + '{}'.format(md_supercell[2]), + '--silent', + '-sfc', self._OUTPUT_FORCE_CONSTANTS, - "-thm", # '--resolution 0.01', - "-psm", - "2", - "--normalize_dos", - "-sdata", - "--velocity_only", - "--temperature", - "{}".format(self._parameters_data.dict.temperature), + '-thm', # '--resolution 0.01', + '-psm', + '2', + '--normalize_dos', + '-sdata', + '--velocity_only', + '--temperature', + '{}'.format(self._parameters_data.dict.temperature), ] - if "md_commensurate" in parameters_data_dynaphopy.get_dict(): + if 'md_commensurate' in parameters_data_dynaphopy.get_dict(): if parameters_data_dynaphopy.dict.md_commensurate: - self._cmdline_params.append("--MD_commensurate") + self._cmdline_params.append('--MD_commensurate') diff --git a/aiida_lammps/calculations/lammps/force.py b/aiida_lammps/calculations/lammps/force.py index e7879c2..b6ddadc 100644 --- a/aiida_lammps/calculations/lammps/force.py +++ b/aiida_lammps/calculations/lammps/force.py @@ -11,18 +11,18 @@ def define(cls, spec): super(ForceCalculation, cls).define(spec) spec.input( - "metadata.options.parser_name", + 'metadata.options.parser_name', valid_type=str, - default="lammps.force", + default='lammps.force', ) # spec.input('settings', valid_type=str, default='lammps.optimize') spec.output( - "arrays", - valid_type=DataFactory("array"), + 'arrays', + valid_type=DataFactory('array'), required=True, - help="force data per atom", + help='force data per atom', ) @staticmethod @@ -37,68 +37,65 @@ def create_main_input_content( ): version_date = convert_date_string( - parameter_data.get_attribute("lammps_version", "11 Aug 2017") - ) + parameter_data.get_attribute('lammps_version', '11 Aug 2017')) - lammps_input_file = "units {0}\n".format(potential_data.default_units) - lammps_input_file += "boundary p p p\n" - lammps_input_file += "box tilt large\n" - lammps_input_file += "atom_style {0}\n".format(potential_data.atom_style) + lammps_input_file = 'units {0}\n'.format( + potential_data.default_units) + lammps_input_file += 'boundary p p p\n' + lammps_input_file += 'box tilt large\n' + lammps_input_file += 'atom_style {0}\n'.format( + potential_data.atom_style) - lammps_input_file += "read_data {}\n".format(structure_filename) + lammps_input_file += 'read_data {}\n'.format(structure_filename) lammps_input_file += potential_data.get_input_lines(kind_symbols) - lammps_input_file += "neighbor 0.3 bin\n" - lammps_input_file += "neigh_modify every 1 delay 0 check no\n" + lammps_input_file += 'neighbor 0.3 bin\n' + lammps_input_file += 'neigh_modify every 1 delay 0 check no\n' - thermo_keywords = ["step", "temp", "epair", "emol", "etotal", "press"] - for kwd in parameter_data.get_attribute("thermo_keywords", []): + thermo_keywords = ['step', 'temp', 'epair', 'emol', 'etotal', 'press'] + for kwd in parameter_data.get_attribute('thermo_keywords', []): if kwd not in thermo_keywords: thermo_keywords.append(kwd) - lammps_input_file += "thermo_style custom {}\n".format( - " ".join(thermo_keywords) - ) + lammps_input_file += 'thermo_style custom {}\n'.format( + ' '.join(thermo_keywords)) - if potential_data.atom_style == "charge": - dump_variables = "element x y z fx fy fz q" + if potential_data.atom_style == 'charge': + dump_variables = 'element x y z fx fy fz q' dump_format = ( - "%4s %16.10f %16.10f %16.10f %16.10f %16.10f %16.10f %16.10f" + '%4s %16.10f %16.10f %16.10f %16.10f %16.10f %16.10f %16.10f' ) else: - dump_variables = "element x y z fx fy fz" - dump_format = "%4s %16.10f %16.10f %16.10f %16.10f %16.10f %16.10f" + dump_variables = 'element x y z fx fy fz' + dump_format = '%4s %16.10f %16.10f %16.10f %16.10f %16.10f %16.10f' - lammps_input_file += "dump aiida all custom 1 {0} {1}\n".format( - trajectory_filename, dump_variables - ) + lammps_input_file += 'dump aiida all custom 1 {0} {1}\n'.format( + trajectory_filename, dump_variables) # TODO find exact version when changes were made - if version_date <= convert_date_string("10 Feb 2015"): - dump_mod_cmnd = "format" + if version_date <= convert_date_string('10 Feb 2015'): + dump_mod_cmnd = 'format' else: - dump_mod_cmnd = "format line" + dump_mod_cmnd = 'format line' lammps_input_file += 'dump_modify aiida {0} "{1}"\n'.format( - dump_mod_cmnd, dump_format - ) + dump_mod_cmnd, dump_format) - lammps_input_file += "dump_modify aiida sort id\n" - lammps_input_file += "dump_modify aiida element {}\n".format( - " ".join(kind_symbols) - ) + lammps_input_file += 'dump_modify aiida sort id\n' + lammps_input_file += 'dump_modify aiida element {}\n'.format( + ' '.join(kind_symbols)) - lammps_input_file += "run 0\n" + lammps_input_file += 'run 0\n' - variables = parameter_data.get_attribute("output_variables", []) + variables = parameter_data.get_attribute('output_variables', []) for var in variables: - var_alias = var.replace("[", "_").replace("]", "_") - lammps_input_file += "variable {0} equal {1}\n".format(var_alias, var) + var_alias = var.replace('[', '_').replace(']', '_') + lammps_input_file += 'variable {0} equal {1}\n'.format( + var_alias, var) lammps_input_file += 'print "final_variable: {0} = ${{{0}}}"\n'.format( - var_alias - ) + var_alias) - lammps_input_file += "variable final_energy equal etotal\n" + lammps_input_file += 'variable final_energy equal etotal\n' lammps_input_file += 'print "final_energy: ${final_energy}"\n' lammps_input_file += 'print "END_OF_COMP"\n' @@ -108,7 +105,7 @@ def create_main_input_content( @staticmethod def validate_parameters(param_data, potential_object): if param_data is not None: - validate_against_schema(param_data.get_dict(), "force.schema.json") + validate_against_schema(param_data.get_dict(), 'force.schema.json') def get_retrieve_lists(self): return [self.options.trajectory_suffix], [] diff --git a/aiida_lammps/calculations/lammps/md.py b/aiida_lammps/calculations/lammps/md.py index 3c18ef4..b11c88b 100644 --- a/aiida_lammps/calculations/lammps/md.py +++ b/aiida_lammps/calculations/lammps/md.py @@ -13,23 +13,23 @@ def define(cls, spec): super(MdCalculation, cls).define(spec) spec.input( - "metadata.options.parser_name", + 'metadata.options.parser_name', valid_type=str, - default="lammps.md", + default='lammps.md', ) - spec.default_output_port = "results" + spec.default_output_port = 'results' spec.output( - "trajectory_data", - valid_type=DataFactory("lammps.trajectory"), + 'trajectory_data', + valid_type=DataFactory('lammps.trajectory'), required=True, - help="atomic configuration data per dump step", + help='atomic configuration data per dump step', ) spec.output( - "system_data", - valid_type=DataFactory("array"), + 'system_data', + valid_type=DataFactory('array'), required=False, - help="selected system data per dump step", + help='selected system data per dump step', ) @staticmethod @@ -44,129 +44,124 @@ def create_main_input_content( ): pdict = parameter_data.get_dict() - version_date = convert_date_string(pdict.get("lammps_version", "11 Aug 2017")) + version_date = convert_date_string( + pdict.get('lammps_version', '11 Aug 2017')) # Geometry Setup - lammps_input_file = "units {0}\n".format(potential_data.default_units) - lammps_input_file += "boundary p p p\n" - lammps_input_file += "box tilt large\n" - lammps_input_file += "atom_style {0}\n".format(potential_data.atom_style) - lammps_input_file += "read_data {}\n".format(structure_filename) + lammps_input_file = 'units {0}\n'.format( + potential_data.default_units) + lammps_input_file += 'boundary p p p\n' + lammps_input_file += 'box tilt large\n' + lammps_input_file += 'atom_style {0}\n'.format( + potential_data.atom_style) + lammps_input_file += 'read_data {}\n'.format(structure_filename) # Potential Specification lammps_input_file += potential_data.get_input_lines(kind_symbols) # Pairwise neighbour list creation - if "neighbor" in pdict: + if 'neighbor' in pdict: # neighbor skin_dist bin/nsq/multi - lammps_input_file += "neighbor {0} {1}\n".format( - pdict["neighbor"][0], pdict["neighbor"][1] - ) - if "neigh_modify" in pdict: + lammps_input_file += 'neighbor {0} {1}\n'.format( + pdict['neighbor'][0], pdict['neighbor'][1]) + if 'neigh_modify' in pdict: # e.g. 'neigh_modify every 1 delay 0 check no\n' - lammps_input_file += "neigh_modify {}\n".format( - join_keywords(pdict["neigh_modify"]) - ) + lammps_input_file += 'neigh_modify {}\n'.format( + join_keywords(pdict['neigh_modify'])) # Define Timestep - lammps_input_file += "timestep {}\n".format(pdict["timestep"]) + lammps_input_file += 'timestep {}\n'.format(pdict['timestep']) # Define computation/printing of thermodynamic info - thermo_keywords = ["step", "temp", "epair", "emol", "etotal", "press"] - for kwd in pdict.get("thermo_keywords", []): + thermo_keywords = ['step', 'temp', 'epair', 'emol', 'etotal', 'press'] + for kwd in pdict.get('thermo_keywords', []): if kwd not in thermo_keywords: thermo_keywords.append(kwd) - lammps_input_file += "thermo_style custom {}\n".format( - " ".join(thermo_keywords) - ) - lammps_input_file += "thermo 1000\n" + lammps_input_file += 'thermo_style custom {}\n'.format( + ' '.join(thermo_keywords)) + lammps_input_file += 'thermo 1000\n' # Define output of restart file - restart = pdict.get("restart", False) + restart = pdict.get('restart', False) if restart: - lammps_input_file += "restart {0} {1}\n".format( - restart, restart_filename - ) + lammps_input_file += 'restart {0} {1}\n'.format( + restart, restart_filename) # Set the initial velocities of atoms, if a temperature is set initial_temp, _, _ = get_path( pdict, - ["integration", "constraints", "temp"], + ['integration', 'constraints', 'temp'], default=[None, None, None], raise_error=False, ) if initial_temp is not None: lammps_input_file += ( - "velocity all create {0} {1} dist gaussian mom yes\n".format( - initial_temp, pdict.get("rand_seed", np.random.randint(10000000)) - ) - ) - lammps_input_file += "velocity all scale {}\n".format(initial_temp) + 'velocity all create {0} {1} dist gaussian mom yes\n'. + format(initial_temp, + pdict.get('rand_seed', np.random.randint(10000000)))) + lammps_input_file += 'velocity all scale {}\n'.format( + initial_temp) # Define Equilibration Stage - lammps_input_file += "fix int all {0} {1} {2}\n".format( - get_path(pdict, ["integration", "style"]), + lammps_input_file += 'fix int all {0} {1} {2}\n'.format( + get_path(pdict, ['integration', 'style']), join_keywords( - get_path(pdict, ["integration", "constraints"], {}, raise_error=False) - ), + get_path(pdict, ['integration', 'constraints'], {}, + raise_error=False)), join_keywords( - get_path(pdict, ["integration", "keywords"], {}, raise_error=False) - ), + get_path(pdict, ['integration', 'keywords'], {}, + raise_error=False)), ) - lammps_input_file += "run {}\n".format( - parameter_data.dict.equilibrium_steps - ) - lammps_input_file += "reset_timestep 0\n" + lammps_input_file += 'run {}\n'.format( + parameter_data.dict.equilibrium_steps) + lammps_input_file += 'reset_timestep 0\n' - if potential_data.atom_style == "charge": - dump_variables = "element x y z q" - dump_format = "%4s %16.10f %16.10f %16.10f %16.10f" + if potential_data.atom_style == 'charge': + dump_variables = 'element x y z q' + dump_format = '%4s %16.10f %16.10f %16.10f %16.10f' else: - dump_variables = "element x y z" - dump_format = "%4s %16.10f %16.10f %16.10f" + dump_variables = 'element x y z' + dump_format = '%4s %16.10f %16.10f %16.10f' - lammps_input_file += "dump aiida all custom {0} {1} {2}\n".format( - parameter_data.dict.dump_rate, trajectory_filename, dump_variables - ) + lammps_input_file += 'dump aiida all custom {0} {1} {2}\n'.format( + parameter_data.dict.dump_rate, trajectory_filename, dump_variables) # TODO find exact version when changes were made - if version_date <= convert_date_string("10 Feb 2015"): - dump_mod_cmnd = "format" + if version_date <= convert_date_string('10 Feb 2015'): + dump_mod_cmnd = 'format' else: - dump_mod_cmnd = "format line" + dump_mod_cmnd = 'format line' lammps_input_file += 'dump_modify aiida {0} "{1}"\n'.format( - dump_mod_cmnd, dump_format - ) - lammps_input_file += "dump_modify aiida sort id\n" - lammps_input_file += "dump_modify aiida element {}\n".format( - " ".join(kind_symbols) - ) + dump_mod_cmnd, dump_format) + lammps_input_file += 'dump_modify aiida sort id\n' + lammps_input_file += 'dump_modify aiida element {}\n'.format( + ' '.join(kind_symbols)) - variables = pdict.get("output_variables", []) - if variables and "step" not in variables: + variables = pdict.get('output_variables', []) + if variables and 'step' not in variables: # always include 'step', so we can sync with the `dump` data # NOTE `dump` includes step 0, whereas `print` starts from step 1 - variables.append("step") + variables.append('step') var_aliases = [] for var in variables: - var_alias = var.replace("[", "_").replace("]", "_") + var_alias = var.replace('[', '_').replace(']', '_') var_aliases.append(var_alias) - lammps_input_file += "variable {0} equal {1}\n".format(var_alias, var) + lammps_input_file += 'variable {0} equal {1}\n'.format( + var_alias, var) if variables: lammps_input_file += 'fix sys_info all print {0} "{1}" title "{2}" file {3} screen no\n'.format( parameter_data.dict.dump_rate, - " ".join(["${{{0}}}".format(v) for v in var_aliases]), - " ".join(var_aliases), + ' '.join(['${{{0}}}'.format(v) for v in var_aliases]), + ' '.join(var_aliases), system_filename, ) - lammps_input_file += "run {}\n".format( - parameter_data.dict.total_steps - ) + lammps_input_file += 'run {}\n'.format( + parameter_data.dict.total_steps) - lammps_input_file += "variable final_energy equal etotal\n" + lammps_input_file += 'variable final_energy equal etotal\n' lammps_input_file += 'print "final_energy: ${final_energy}"\n' lammps_input_file += 'print "END_OF_COMP"\n' @@ -176,18 +171,16 @@ def create_main_input_content( @staticmethod def validate_parameters(param_data, potential_object): if param_data is None: - raise InputValidationError("parameter data not set") - validate_against_schema(param_data.get_dict(), "md.schema.json") + raise InputValidationError('parameter data not set') + validate_against_schema(param_data.get_dict(), 'md.schema.json') # ensure the potential and paramters are in the same unit systems # TODO convert between unit systems (e.g. using https://pint.readthedocs.io) - punits = param_data.get_dict()["units"] + punits = param_data.get_dict()['units'] if not punits == potential_object.default_units: raise InputValidationError( - "the units of the parameters ({}) and potential ({}) are different".format( - punits, potential_object.default_units - ) - ) + 'the units of the parameters ({}) and potential ({}) are different' + .format(punits, potential_object.default_units)) return True diff --git a/aiida_lammps/calculations/lammps/md_multi.py b/aiida_lammps/calculations/lammps/md_multi.py index 1c7dcef..2499d1d 100644 --- a/aiida_lammps/calculations/lammps/md_multi.py +++ b/aiida_lammps/calculations/lammps/md_multi.py @@ -8,30 +8,29 @@ class MdMultiCalculation(BaseLammpsCalculation): """Run a multi-stage molecular dynamic simulation.""" - @classmethod def define(cls, spec): super(MdMultiCalculation, cls).define(spec) spec.input( - "metadata.options.parser_name", + 'metadata.options.parser_name', valid_type=str, - default="lammps.md.multi", + default='lammps.md.multi', ) - spec.default_output_port = "results" + spec.default_output_port = 'results' spec.output_namespace( - "system", + 'system', dynamic=True, - valid_type=DataFactory("array"), - help="selected system data per dump step of a stage", + valid_type=DataFactory('array'), + help='selected system data per dump step of a stage', ) spec.output_namespace( - "trajectory", + 'trajectory', dynamic=True, - valid_type=DataFactory("lammps.trajectory"), - help="atomic configuration data per dump step of a stage", + valid_type=DataFactory('lammps.trajectory'), + help='atomic configuration data per dump step of a stage', ) @staticmethod @@ -46,61 +45,58 @@ def create_main_input_content( ): pdict = parameter_data.get_dict() - version_date = convert_date_string(pdict.get("lammps_version", "11 Aug 2017")) - lammps_input_file = "" + version_date = convert_date_string( + pdict.get('lammps_version', '11 Aug 2017')) + lammps_input_file = '' - lammps_input_file += "# Input written to comply with LAMMPS {}\n".format( - version_date - ) + lammps_input_file += '# Input written to comply with LAMMPS {}\n'.format( + version_date) # Configuration setup - lammps_input_file += "\n# Atomic Configuration\n" - lammps_input_file += "units {0}\n".format( - potential_data.default_units - ) - lammps_input_file += "boundary p p p\n" # TODO allow non-periodic - lammps_input_file += "box tilt large\n" - lammps_input_file += "atom_style {0}\n".format(potential_data.atom_style) - lammps_input_file += "read_data {}\n".format(structure_filename) + lammps_input_file += '\n# Atomic Configuration\n' + lammps_input_file += 'units {0}\n'.format( + potential_data.default_units) + lammps_input_file += 'boundary p p p\n' # TODO allow non-periodic + lammps_input_file += 'box tilt large\n' + lammps_input_file += 'atom_style {0}\n'.format( + potential_data.atom_style) + lammps_input_file += 'read_data {}\n'.format(structure_filename) # Potential specification - lammps_input_file += "\n# Potential Setup\n" + lammps_input_file += '\n# Potential Setup\n' lammps_input_file += potential_data.get_input_lines(kind_symbols) # Modify pairwise neighbour list creation - lammps_input_file += "\n# General Setup\n" - if "neighbor" in pdict: + lammps_input_file += '\n# General Setup\n' + if 'neighbor' in pdict: # neighbor skin_dist bin/nsq/multi - lammps_input_file += "neighbor {0} {1}\n".format( - pdict["neighbor"][0], pdict["neighbor"][1] - ) - if "neigh_modify" in pdict: + lammps_input_file += 'neighbor {0} {1}\n'.format( + pdict['neighbor'][0], pdict['neighbor'][1]) + if 'neigh_modify' in pdict: # e.g. 'neigh_modify every 1 delay 0 check no\n' - lammps_input_file += "neigh_modify {}\n".format( - join_keywords(pdict["neigh_modify"]) - ) + lammps_input_file += 'neigh_modify {}\n'.format( + join_keywords(pdict['neigh_modify'])) # Define Timestep - lammps_input_file += "timestep {}\n".format(pdict["timestep"]) + lammps_input_file += 'timestep {}\n'.format(pdict['timestep']) # Define computation/printing of thermodynamic info - lammps_input_file += "\n# Thermodynamic Information Output\n" - thermo_keywords = ["step", "temp", "epair", "emol", "etotal", "press"] - for kwd in pdict.get("thermo_keywords", []): + lammps_input_file += '\n# Thermodynamic Information Output\n' + thermo_keywords = ['step', 'temp', 'epair', 'emol', 'etotal', 'press'] + for kwd in pdict.get('thermo_keywords', []): if kwd not in thermo_keywords: thermo_keywords.append(kwd) - lammps_input_file += "thermo_style custom {}\n".format( - " ".join(thermo_keywords) - ) - lammps_input_file += "thermo 1000\n" # TODO make variable? + lammps_input_file += 'thermo_style custom {}\n'.format( + ' '.join(thermo_keywords)) + lammps_input_file += 'thermo 1000\n' # TODO make variable? # Setup initial velocities of atoms - if "velocity" in pdict: - lammps_input_file += "\n# Intial Atom Velocity\n" - for vdict in pdict.get("velocity", []): - lammps_input_file += "velocity all {0} {1} {2}\n".format( - vdict["style"], - " ".join([str(a) for a in vdict["args"]]), - join_keywords(vdict.get("keywords", {})), + if 'velocity' in pdict: + lammps_input_file += '\n# Intial Atom Velocity\n' + for vdict in pdict.get('velocity', []): + lammps_input_file += 'velocity all {0} {1} {2}\n'.format( + vdict['style'], + ' '.join([str(a) for a in vdict['args']]), + join_keywords(vdict.get('keywords', {})), ) stage_names = [] @@ -108,128 +104,118 @@ def create_main_input_content( current_dumps = [] current_computes = [] - for stage_id, stage_dict in enumerate(pdict.get("stages")): + for stage_id, stage_dict in enumerate(pdict.get('stages')): - stage_name = stage_dict.get("name") + stage_name = stage_dict.get('name') if stage_name in stage_names: - raise ValueError("non-unique stage name: {}".format(stage_name)) + raise ValueError( + 'non-unique stage name: {}'.format(stage_name)) stage_names.append(stage_name) - lammps_input_file += "\n# Stage {}: {}\n".format(stage_id, stage_name) + lammps_input_file += '\n# Stage {}: {}\n'.format( + stage_id, stage_name) # clear timestep # lammps_input_file += "reset_timestep 0\n" # Clear fixes, dumps and computes for fix in current_fixes: - lammps_input_file += "unfix {}\n".format(fix) + lammps_input_file += 'unfix {}\n'.format(fix) current_fixes = [] for dump in current_dumps: - lammps_input_file += "undump {}\n".format(dump) + lammps_input_file += 'undump {}\n'.format(dump) current_dumps = [] for compute in current_computes: - lammps_input_file += "uncompute {}\n".format(compute) + lammps_input_file += 'uncompute {}\n'.format(compute) current_computes = [] # Define Computes - for compute in stage_dict.get("computes", []): - c_id = compute["id"] - c_style = compute["style"] - c_args = " ".join([str(a) for a in compute.get("args", [])]) - lammps_input_file += "compute {0} all {1} {2}\n".format( - c_id, c_style, c_args - ) + for compute in stage_dict.get('computes', []): + c_id = compute['id'] + c_style = compute['style'] + c_args = ' '.join([str(a) for a in compute.get('args', [])]) + lammps_input_file += 'compute {0} all {1} {2}\n'.format( + c_id, c_style, c_args) current_computes.append(c_id) # Define Atom Level Outputs - output_atom_dict = stage_dict.get("output_atom", {}) - if output_atom_dict.get("dump_rate", 0): + output_atom_dict = stage_dict.get('output_atom', {}) + if output_atom_dict.get('dump_rate', 0): atom_dump_cmnds, acomputes, afixes = atom_info_commands( - variables=output_atom_dict.get("variables", []), - ave_variables=output_atom_dict.get("ave_variables", []), + variables=output_atom_dict.get('variables', []), + ave_variables=output_atom_dict.get('ave_variables', []), kind_symbols=kind_symbols, atom_style=potential_data.atom_style, - dump_rate=output_atom_dict.get("dump_rate", 0), - average_rate=output_atom_dict.get("average_rate", 1), - filename="{}-{}".format(stage_name, trajectory_filename), + dump_rate=output_atom_dict.get('dump_rate', 0), + average_rate=output_atom_dict.get('average_rate', 1), + filename='{}-{}'.format(stage_name, trajectory_filename), version_date=version_date, - dump_name="atom_info", + dump_name='atom_info', ) if atom_dump_cmnds: - lammps_input_file += "\n".join(atom_dump_cmnds) + "\n" - current_dumps.append("atom_info") + lammps_input_file += '\n'.join(atom_dump_cmnds) + '\n' + current_dumps.append('atom_info') current_computes.extend(acomputes) current_fixes.extend(afixes) # Define System Level Outputs - output_sys_dict = stage_dict.get("output_system", {}) - if output_sys_dict.get("dump_rate", 0): + output_sys_dict = stage_dict.get('output_system', {}) + if output_sys_dict.get('dump_rate', 0): sys_info_cmnds = sys_ave_commands( - variables=output_sys_dict.get("variables", []), - ave_variables=output_sys_dict.get("ave_variables", []), - dump_rate=output_sys_dict.get("dump_rate", 0), - filename="{}-{}".format(stage_name, system_filename), - fix_name="sys_info", - average_rate=output_sys_dict.get("average_rate", 1), + variables=output_sys_dict.get('variables', []), + ave_variables=output_sys_dict.get('ave_variables', []), + dump_rate=output_sys_dict.get('dump_rate', 0), + filename='{}-{}'.format(stage_name, system_filename), + fix_name='sys_info', + average_rate=output_sys_dict.get('average_rate', 1), ) if sys_info_cmnds: - lammps_input_file += "\n".join(sys_info_cmnds) + "\n" - current_fixes.append("sys_info") + lammps_input_file += '\n'.join(sys_info_cmnds) + '\n' + current_fixes.append('sys_info') # Define restart - if stage_dict.get("restart_rate", 0): - lammps_input_file += "restart {0} {1}\n".format( - stage_dict.get("restart_rate", 0), - "{}-{}".format(stage_name, restart_filename), + if stage_dict.get('restart_rate', 0): + lammps_input_file += 'restart {0} {1}\n'.format( + stage_dict.get('restart_rate', 0), + '{}-{}'.format(stage_name, restart_filename), ) else: - lammps_input_file += "restart 0\n" + lammps_input_file += 'restart 0\n' # Define time integration method - lammps_input_file += "fix int all {0} {1} {2}\n".format( - get_path(stage_dict, ["integration", "style"]), + lammps_input_file += 'fix int all {0} {1} {2}\n'.format( + get_path(stage_dict, ['integration', 'style']), join_keywords( get_path( stage_dict, - ["integration", "constraints"], + ['integration', 'constraints'], {}, raise_error=False, - ) - ), + )), join_keywords( - get_path( - stage_dict, ["integration", "keywords"], {}, raise_error=False - ) - ), + get_path(stage_dict, ['integration', 'keywords'], {}, + raise_error=False)), ) - current_fixes.append("int") + current_fixes.append('int') # Run - lammps_input_file += "run {}\n".format( - stage_dict.get("steps", 0) - ) + lammps_input_file += 'run {}\n'.format( + stage_dict.get('steps', 0)) # check compute/fix/dump ids are unique if len(current_computes) != len(set(current_computes)): - raise ValueError( - "Stage {}: Non-unique compute ids; {}".format( - stage_name, current_computes - ) - ) + raise ValueError('Stage {}: Non-unique compute ids; {}'.format( + stage_name, current_computes)) if len(current_fixes) != len(set(current_fixes)): - raise ValueError( - "Stage {}: Non-unique fix ids; {}".format(stage_name, current_fixes) - ) + raise ValueError('Stage {}: Non-unique fix ids; {}'.format( + stage_name, current_fixes)) if len(current_dumps) != len(set(current_dumps)): - raise ValueError( - "Stage {}: Non-unique dump ids; {}".format( - stage_name, current_dumps - ) - ) + raise ValueError('Stage {}: Non-unique dump ids; {}'.format( + stage_name, current_dumps)) - lammps_input_file += "\n# Final Commands\n" + lammps_input_file += '\n# Final Commands\n' # output final energy - lammps_input_file += "variable final_energy equal etotal\n" + lammps_input_file += 'variable final_energy equal etotal\n' lammps_input_file += 'print "final_energy: ${final_energy}"\n' lammps_input_file += 'print "END_OF_COMP"\n' @@ -239,18 +225,16 @@ def create_main_input_content( @staticmethod def validate_parameters(param_data, potential_object): if param_data is None: - raise InputValidationError("parameter data not set") - validate_against_schema(param_data.get_dict(), "md-multi.schema.json") + raise InputValidationError('parameter data not set') + validate_against_schema(param_data.get_dict(), 'md-multi.schema.json') # ensure the potential and parameters are in the same unit systems # TODO convert between unit systems (e.g. using https://pint.readthedocs.io) - punits = param_data.get_dict()["units"] + punits = param_data.get_dict()['units'] if not punits == potential_object.default_units: raise InputValidationError( - "the units of the parameters ({}) and potential ({}) are different".format( - punits, potential_object.default_units - ) - ) + 'the units of the parameters ({}) and potential ({}) are different' + .format(punits, potential_object.default_units)) return True @@ -258,42 +242,43 @@ def get_retrieve_lists(self): return ( [], [ - "*-" + self.options.trajectory_suffix, - "*-" + self.options.system_suffix, - "*-" + self.options.restart_filename + ".*", + '*-' + self.options.trajectory_suffix, + '*-' + self.options.system_suffix, + '*-' + self.options.restart_filename + '.*', ], ) -def sys_print_commands( - variables, dump_rate, filename, fix_name="sys_info", append=True, print_header=True -): +def sys_print_commands(variables, + dump_rate, + filename, + fix_name='sys_info', + append=True, + print_header=True): """Create commands to output required system variables to a file.""" commands = [] if not variables: return commands - if "step" not in variables: + if 'step' not in variables: # always include 'step', so we can sync with the `dump` data - variables.insert(0, "step") + variables.insert(0, 'step') var_aliases = [] for var in variables: - var_alias = var.replace("[", "_").replace("]", "_") + var_alias = var.replace('[', '_').replace(']', '_') var_aliases.append(var_alias) - commands.append("variable {0} equal {1}".format(var_alias, var)) + commands.append('variable {0} equal {1}'.format(var_alias, var)) - commands.append( - 'fix {0} all print {1} "{2}" {3} {4} {5} screen no'.format( - fix_name, - dump_rate, - " ".join(["${{{0}}}".format(v) for v in var_aliases]), - 'title "{}"'.format(" ".join(var_aliases)) if print_header else "", - "append" if append else "file", - filename, - ) - ) + commands.append('fix {0} all print {1} "{2}" {3} {4} {5} screen no'.format( + fix_name, + dump_rate, + ' '.join(['${{{0}}}'.format(v) for v in var_aliases]), + 'title "{}"'.format(' '.join(var_aliases)) if print_header else '', + 'append' if append else 'file', + filename, + )) return commands @@ -303,7 +288,7 @@ def sys_ave_commands( ave_variables, dump_rate, filename, - fix_name="sys_info", + fix_name='sys_info', average_rate=None, ): """Create commands to output required system variables to a file.""" @@ -314,17 +299,15 @@ def sys_ave_commands( if set(variables).intersection(ave_variables): raise ValueError( - "variables cannot be in both 'variables' and 'ave_variables': {}".format( - set(variables).intersection(ave_variables) - ) - ) + "variables cannot be in both 'variables' and 'ave_variables': {}". + format(set(variables).intersection(ave_variables))) # Note step is included, by default, as the first arg var_aliases = [] for var in variables + ave_variables: - var_alias = var.replace("[", "_").replace("]", "_") + var_alias = var.replace('[', '_').replace(']', '_') var_aliases.append(var_alias) - commands.append("variable {0} equal {1}".format(var_alias, var)) + commands.append('variable {0} equal {1}'.format(var_alias, var)) if not ave_variables: nevery = dump_rate @@ -332,29 +315,28 @@ def sys_ave_commands( else: if dump_rate % average_rate != 0 or average_rate > dump_rate: raise ValueError( - "The dump rate ({}) must be a multiple of the average_rate ({})".format( - dump_rate, average_rate - ) - ) + 'The dump rate ({}) must be a multiple of the average_rate ({})' + .format(dump_rate, average_rate)) nevery = average_rate nrep = int(dump_rate / average_rate) - commands.append( - """fix {fid} all ave/time {nevery} {nrepeat} {nfreq} & + commands.append("""fix {fid} all ave/time {nevery} {nrepeat} {nfreq} & {variables} & {non_ave} & title1 "step {header}" & file {filename}""".format( - fid=fix_name, - nevery=nevery, # compute variables every n steps - nfreq=dump_rate, # nfreq is the dump rate and must be a multiple of nevery - nrepeat=nrep, # average is over nrepeat quantities, nrepeat*nevery <= nfreq - variables=" ".join(["v_{0}".format(v) for v in var_aliases]), - non_ave=" ".join(["off {0}".format(i + 1) for i in range(len(variables))]), - header=" ".join(var_aliases), - filename=filename, - ) - ) + fid=fix_name, + nevery=nevery, # compute variables every n steps + nfreq= + dump_rate, # nfreq is the dump rate and must be a multiple of nevery + nrepeat= + nrep, # average is over nrepeat quantities, nrepeat*nevery <= nfreq + variables=' '.join(['v_{0}'.format(v) for v in var_aliases]), + non_ave=' '.join( + ['off {0}'.format(i + 1) for i in range(len(variables))]), + header=' '.join(var_aliases), + filename=filename, + )) return commands @@ -368,7 +350,7 @@ def atom_info_commands( average_rate, filename, version_date, - dump_name="atom_info", + dump_name='atom_info', append=True, ): """Create commands to output required atom variables to a file. @@ -394,10 +376,10 @@ def atom_info_commands( """ commands, computes, fixes = [], [], [] - if atom_style == "charge": - dump_variables = "element x y z q".split() + if atom_style == 'charge': + dump_variables = 'element x y z q'.split() else: - dump_variables = "element x y z".split() + dump_variables = 'element x y z'.split() for variable in variables: if variable not in dump_variables: @@ -406,73 +388,68 @@ def atom_info_commands( if ave_variables: if dump_rate % average_rate != 0 or average_rate > dump_rate: raise ValueError( - "The dump rate ({}) must be a multiple of the average_rate ({})".format( - dump_rate, average_rate - ) - ) + 'The dump rate ({}) must be a multiple of the average_rate ({})' + .format(dump_rate, average_rate)) nevery = average_rate nrep = int(dump_rate / average_rate) # work out which variables need to be computed avar_props = [ - v - for v in ave_variables - if not any([v.startswith(s) for s in ["c_", "f_", "v_"]]) + v for v in ave_variables + if not any([v.startswith(s) for s in ['c_', 'f_', 'v_']]) ] avar_names = [] c_at_vars = 1 for ave_var in ave_variables: - if any([ave_var.startswith(s) for s in ["c_", "f_", "v_"]]): + if any([ave_var.startswith(s) for s in ['c_', 'f_', 'v_']]): avar_names.append(ave_var) else: if len(avar_props) > 1: - avar_names.append("c_at_vars[{}]".format(c_at_vars)) + avar_names.append('c_at_vars[{}]'.format(c_at_vars)) c_at_vars += 1 else: - avar_names.append("c_at_vars") + avar_names.append('c_at_vars') # compute required variables if avar_props: - commands.append( - "compute at_vars all property/atom {}".format(" ".join(avar_props)) - ) - computes.append("at_vars") + commands.append('compute at_vars all property/atom {}'.format( + ' '.join(avar_props))) + computes.append('at_vars') # compute means for variables commands.append( - "fix at_means all ave/atom {nevery} {nrepeat} {nfreq} {variables}".format( + 'fix at_means all ave/atom {nevery} {nrepeat} {nfreq} {variables}'. + format( nevery=nevery, # compute variables every n steps - nfreq=dump_rate, # nfreq is the dump rate and must be a multiple of nevery - nrepeat=nrep, # average is over nrepeat quantities, nrepeat*nevery <= nfreq - variables=" ".join(avar_names), - ) - ) - fixes.append("at_means") + nfreq= + dump_rate, # nfreq is the dump rate and must be a multiple of nevery + nrepeat= + nrep, # average is over nrepeat quantities, nrepeat*nevery <= nfreq + variables=' '.join(avar_names), + )) + fixes.append('at_means') # set the averages as variables, just so the dump names are decipherable for i, ave_var in enumerate(ave_variables): - commands.append( - "variable ave_{0} atom f_at_means{1}".format( - ave_var, "[{}]".format(i + 1) if len(ave_variables) > 1 else "" - ) - ) + commands.append('variable ave_{0} atom f_at_means{1}'.format( + ave_var, + '[{}]'.format(i + 1) if len(ave_variables) > 1 else '')) commands.append( - "dump {dump_id} all custom {rate} {fname} {variables} {ave_vars}".format( + 'dump {dump_id} all custom {rate} {fname} {variables} {ave_vars}'. + format( dump_id=dump_name, rate=dump_rate, fname=filename, - variables=" ".join(dump_variables), - ave_vars=" ".join(["v_ave_{}".format(v) for v in ave_variables]), - ) - ) + variables=' '.join(dump_variables), + ave_vars=' '.join(['v_ave_{}'.format(v) for v in ave_variables]), + )) if append: - commands.append("dump_modify {0} append yes".format(dump_name)) + commands.append('dump_modify {0} append yes'.format(dump_name)) - commands.extend( - [ - "dump_modify {0} sort id".format(dump_name), - "dump_modify {0} element {1}".format(dump_name, " ".join(kind_symbols)), - ] - ) + commands.extend([ + 'dump_modify {0} sort id'.format(dump_name), + 'dump_modify {0} element {1}'.format(dump_name, + ' '.join(kind_symbols)), + ]) return commands, computes, fixes diff --git a/aiida_lammps/calculations/lammps/optimize.py b/aiida_lammps/calculations/lammps/optimize.py index fd780de..0c42897 100644 --- a/aiida_lammps/calculations/lammps/optimize.py +++ b/aiida_lammps/calculations/lammps/optimize.py @@ -12,22 +12,22 @@ def define(cls, spec): super(OptimizeCalculation, cls).define(spec) spec.input( - "metadata.options.parser_name", + 'metadata.options.parser_name', valid_type=str, - default="lammps.optimize", + default='lammps.optimize', ) spec.output( - "structure", - valid_type=DataFactory("structure"), + 'structure', + valid_type=DataFactory('structure'), required=True, - help="the structure output from the calculation", + help='the structure output from the calculation', ) spec.output( - "trajectory_data", - valid_type=DataFactory("lammps.trajectory"), + 'trajectory_data', + valid_type=DataFactory('lammps.trajectory'), required=True, - help="forces, stresses and positions data per step", + help='forces, stresses and positions data per step', ) @staticmethod @@ -43,32 +43,34 @@ def create_main_input_content( parameter_data = parameter_data.get_dict() version_date = convert_date_string( - parameter_data.get("lammps_version", "11 Aug 2017") - ) + parameter_data.get('lammps_version', '11 Aug 2017')) - lammps_input_file = "units {0}\n".format(potential_data.default_units) - lammps_input_file += "boundary p p p\n" - lammps_input_file += "box tilt large\n" - lammps_input_file += "atom_style {0}\n".format(potential_data.atom_style) - lammps_input_file += "read_data {}\n".format(structure_filename) + lammps_input_file = 'units {0}\n'.format( + potential_data.default_units) + lammps_input_file += 'boundary p p p\n' + lammps_input_file += 'box tilt large\n' + lammps_input_file += 'atom_style {0}\n'.format( + potential_data.atom_style) + lammps_input_file += 'read_data {}\n'.format(structure_filename) lammps_input_file += potential_data.get_input_lines(kind_symbols) - lammps_input_file += "fix int all box/relax {} {} {}\n".format( - parameter_data["relax"]["type"], - parameter_data["relax"]["pressure"], - join_keywords(parameter_data["relax"], ignore=["type", "pressure"]), + lammps_input_file += 'fix int all box/relax {} {} {}\n'.format( + parameter_data['relax']['type'], + parameter_data['relax']['pressure'], + join_keywords(parameter_data['relax'], ignore=['type', + 'pressure']), ) # TODO find exact version when changes were made - if version_date <= convert_date_string("11 Nov 2013"): - lammps_input_file += "compute stpa all stress/atom\n" + if version_date <= convert_date_string('11 Nov 2013'): + lammps_input_file += 'compute stpa all stress/atom\n' else: - lammps_input_file += "compute stpa all stress/atom NULL\n" + lammps_input_file += 'compute stpa all stress/atom NULL\n' - lammps_input_file += "compute stgb all reduce sum c_stpa[1] c_stpa[2] c_stpa[3] c_stpa[4] c_stpa[5] c_stpa[6]\n" + lammps_input_file += 'compute stgb all reduce sum c_stpa[1] c_stpa[2] c_stpa[3] c_stpa[4] c_stpa[5] c_stpa[6]\n' lammps_input_file += ( - "variable stress_pr equal -(c_stgb[1]+c_stgb[2]+c_stgb[3])/(3*vol)\n" + 'variable stress_pr equal -(c_stgb[1]+c_stgb[2]+c_stgb[3])/(3*vol)\n' ) # lammps_input_file += "variable stress_xx equal c_stgb[1]\n" # lammps_input_file += "variable stress_yy equal c_stgb[2]\n" @@ -78,11 +80,11 @@ def create_main_input_content( # lammps_input_file += "variable stress_yz equal c_stgb[6]\n" thermo_keywords = [ - "step", - "temp", - "press", - "etotal", - "v_stress_pr", + 'step', + 'temp', + 'press', + 'etotal', + 'v_stress_pr', # "c_stgb[1]", # "c_stgb[2]", # "c_stgb[3]", @@ -90,58 +92,53 @@ def create_main_input_content( # "c_stgb[5]", # "c_stgb[6]", ] - for kwd in parameter_data.get("thermo_keywords", []): + for kwd in parameter_data.get('thermo_keywords', []): if kwd not in thermo_keywords: thermo_keywords.append(kwd) - lammps_input_file += "thermo_style custom {}\n".format( - " ".join(thermo_keywords) - ) + lammps_input_file += 'thermo_style custom {}\n'.format( + ' '.join(thermo_keywords)) - if potential_data.atom_style == "charge": - dump_variables = "element x y z fx fy fz q c_stpa[1] c_stpa[2] c_stpa[3] c_stpa[4] c_stpa[5] c_stpa[6]" - dump_format = "%4s " + " ".join(["%16.10f"] * 13) + if potential_data.atom_style == 'charge': + dump_variables = 'element x y z fx fy fz q c_stpa[1] c_stpa[2] c_stpa[3] c_stpa[4] c_stpa[5] c_stpa[6]' + dump_format = '%4s ' + ' '.join(['%16.10f'] * 13) else: - dump_variables = "element x y z fx fy fz c_stpa[1] c_stpa[2] c_stpa[3] c_stpa[4] c_stpa[5] c_stpa[6]" - dump_format = "%4s " + " ".join(["%16.10f"] * 12) + dump_variables = 'element x y z fx fy fz c_stpa[1] c_stpa[2] c_stpa[3] c_stpa[4] c_stpa[5] c_stpa[6]' + dump_format = '%4s ' + ' '.join(['%16.10f'] * 12) - lammps_input_file += "dump aiida all custom 1 {0} {1}\n".format( - trajectory_filename, dump_variables - ) + lammps_input_file += 'dump aiida all custom 1 {0} {1}\n'.format( + trajectory_filename, dump_variables) # TODO find exact version when changes were made - if version_date <= convert_date_string("10 Feb 2015"): - dump_mod_cmnd = "format" + if version_date <= convert_date_string('10 Feb 2015'): + dump_mod_cmnd = 'format' else: - dump_mod_cmnd = "format line" + dump_mod_cmnd = 'format line' lammps_input_file += 'dump_modify aiida {0} "{1}"\n'.format( - dump_mod_cmnd, dump_format - ) + dump_mod_cmnd, dump_format) - lammps_input_file += "dump_modify aiida sort id\n" - lammps_input_file += "dump_modify aiida element {}\n".format( - " ".join(kind_symbols) - ) - lammps_input_file += "min_style {}\n".format( - parameter_data["minimize"]["style"] - ) + lammps_input_file += 'dump_modify aiida sort id\n' + lammps_input_file += 'dump_modify aiida element {}\n'.format( + ' '.join(kind_symbols)) + lammps_input_file += 'min_style {}\n'.format( + parameter_data['minimize']['style']) # lammps_input_file += 'min_style cg\n' - lammps_input_file += "minimize {} {} {} {}\n".format( - parameter_data["minimize"]["energy_tolerance"], - parameter_data["minimize"]["force_tolerance"], - parameter_data["minimize"]["max_iterations"], - parameter_data["minimize"]["max_evaluations"], + lammps_input_file += 'minimize {} {} {} {}\n'.format( + parameter_data['minimize']['energy_tolerance'], + parameter_data['minimize']['force_tolerance'], + parameter_data['minimize']['max_iterations'], + parameter_data['minimize']['max_evaluations'], ) - variables = parameter_data.get("output_variables", []) + variables = parameter_data.get('output_variables', []) for var in variables: - var_alias = var.replace("[", "_").replace("]", "_") - lammps_input_file += "variable {0} equal {1}\n".format(var_alias, var) + var_alias = var.replace('[', '_').replace(']', '_') + lammps_input_file += 'variable {0} equal {1}\n'.format( + var_alias, var) lammps_input_file += 'print "final_variable: {0} = ${{{0}}}"\n'.format( - var_alias - ) + var_alias) - lammps_input_file += "variable final_energy equal etotal\n" + lammps_input_file += 'variable final_energy equal etotal\n' lammps_input_file += 'print "final_energy: ${final_energy}"\n' # lammps_input_file += 'print "final_variable: stress_pr = ${stress_pr}"\n' @@ -155,19 +152,17 @@ def create_main_input_content( @staticmethod def validate_parameters(param_data, potential_object): if param_data is None: - raise InputValidationError("parameter data not set") - validate_against_schema(param_data.get_dict(), "optimize.schema.json") + raise InputValidationError('parameter data not set') + validate_against_schema(param_data.get_dict(), 'optimize.schema.json') # ensure the potential and paramters are in the same unit systems # TODO convert between unit systems (e.g. using https://pint.readthedocs.io) - if "units" in param_data.get_dict(): - punits = param_data.get_dict()["units"] + if 'units' in param_data.get_dict(): + punits = param_data.get_dict()['units'] if not punits == potential_object.default_units: raise InputValidationError( - "the units of the parameters ({}) and potential ({}) are different".format( - punits, potential_object.default_units - ) - ) + 'the units of the parameters ({}) and potential ({}) are different' + .format(punits, potential_object.default_units)) return True diff --git a/aiida_lammps/common/generate_input_files.py b/aiida_lammps/common/generate_input_files.py index c0abde8..b68d615 100644 --- a/aiida_lammps/common/generate_input_files.py +++ b/aiida_lammps/common/generate_input_files.py @@ -30,43 +30,41 @@ def get_trajectory_txt(trajectory): zlo_bound = 0 zhi_bound = zhi - ind = trajectory.get_array("steps") - lammps_data_file = "" + ind = trajectory.get_array('steps') + lammps_data_file = '' for i, position_step in enumerate(trajectory.get_positions()): - lammps_data_file += "ITEM: TIMESTEP\n" - lammps_data_file += "{}\n".format(ind[i]) - lammps_data_file += "ITEM: NUMBER OF ATOMS\n" - lammps_data_file += "{}\n".format(len(position_step)) - lammps_data_file += "ITEM: BOX BOUNDS xy xz yz pp pp pp\n" - lammps_data_file += "{0:20.10f} {1:20.10f} {2:20.10f}\n".format( - xlo_bound, xhi_bound, xy - ) - lammps_data_file += "{0:20.10f} {1:20.10f} {2:20.10f}\n".format( - ylo_bound, yhi_bound, xz - ) - lammps_data_file += "{0:20.10f} {1:20.10f} {2:20.10f}\n".format( - zlo_bound, zhi_bound, yz - ) - lammps_data_file += "ITEM: ATOMS x y z\n" + lammps_data_file += 'ITEM: TIMESTEP\n' + lammps_data_file += '{}\n'.format(ind[i]) + lammps_data_file += 'ITEM: NUMBER OF ATOMS\n' + lammps_data_file += '{}\n'.format(len(position_step)) + lammps_data_file += 'ITEM: BOX BOUNDS xy xz yz pp pp pp\n' + lammps_data_file += '{0:20.10f} {1:20.10f} {2:20.10f}\n'.format( + xlo_bound, xhi_bound, xy) + lammps_data_file += '{0:20.10f} {1:20.10f} {2:20.10f}\n'.format( + ylo_bound, yhi_bound, xz) + lammps_data_file += '{0:20.10f} {1:20.10f} {2:20.10f}\n'.format( + zlo_bound, zhi_bound, yz) + lammps_data_file += 'ITEM: ATOMS x y z\n' for position in position_step: - lammps_data_file += "{0:20.10f} {1:20.10f} {2:20.10f}\n".format(*position) + lammps_data_file += '{0:20.10f} {1:20.10f} {2:20.10f}\n'.format( + *position) return lammps_data_file def parameters_to_input_file(parameters_object): parameters = parameters_object.get_dict() - input_file = "STRUCTURE FILE POSCAR\nPOSCAR\n\n" - input_file += "FORCE CONSTANTS\nFORCE_CONSTANTS\n\n" - input_file += "PRIMITIVE MATRIX\n" - input_file += ("{} {} {} \n").format(*np.array(parameters["primitive"])[0]) - input_file += ("{} {} {} \n").format(*np.array(parameters["primitive"])[1]) - input_file += ("{} {} {} \n").format(*np.array(parameters["primitive"])[2]) - input_file += "\n" - input_file += "SUPERCELL MATRIX PHONOPY\n" - input_file += ("{} {} {} \n").format(*np.array(parameters["supercell"])[0]) - input_file += ("{} {} {} \n").format(*np.array(parameters["supercell"])[1]) - input_file += ("{} {} {} \n").format(*np.array(parameters["supercell"])[2]) - input_file += "\n" + input_file = 'STRUCTURE FILE POSCAR\nPOSCAR\n\n' + input_file += 'FORCE CONSTANTS\nFORCE_CONSTANTS\n\n' + input_file += 'PRIMITIVE MATRIX\n' + input_file += ('{} {} {} \n').format(*np.array(parameters['primitive'])[0]) + input_file += ('{} {} {} \n').format(*np.array(parameters['primitive'])[1]) + input_file += ('{} {} {} \n').format(*np.array(parameters['primitive'])[2]) + input_file += '\n' + input_file += 'SUPERCELL MATRIX PHONOPY\n' + input_file += ('{} {} {} \n').format(*np.array(parameters['supercell'])[0]) + input_file += ('{} {} {} \n').format(*np.array(parameters['supercell'])[1]) + input_file += ('{} {} {} \n').format(*np.array(parameters['supercell'])[2]) + input_file += '\n' return input_file diff --git a/aiida_lammps/common/generate_structure.py b/aiida_lammps/common/generate_structure.py index 733d82f..7f6c2c7 100644 --- a/aiida_lammps/common/generate_structure.py +++ b/aiida_lammps/common/generate_structure.py @@ -17,7 +17,7 @@ def transform_cell(cell): """ cell = np.array(cell) - transform, upper_tri = np.linalg.qr(cell.T, mode="complete") + transform, upper_tri = np.linalg.qr(cell.T, mode='complete') new_cell = np.transpose(upper_tri) # LAMMPS also requires positive values on the diagonal of the, @@ -34,10 +34,10 @@ def transform_cell(cell): def generate_lammps_structure( structure, - atom_style="atomic", + atom_style='atomic', charge_dict=None, round_dp=None, - docstring="generated by aiida_lammps", + docstring='generated by aiida_lammps', ): """create lammps input structure file content @@ -62,10 +62,10 @@ def generate_lammps_structure( the transformation matrix applied to the structure cell and coordinates """ - if atom_style not in ["atomic", "charge"]: + if atom_style not in ['atomic', 'charge']: raise ValueError( - "atom_style must be in ['atomic', 'charge'], not '{}'".format(atom_style) - ) + "atom_style must be in ['atomic', 'charge'], not '{}'".format( + atom_style)) if charge_dict is None: charge_dict = {} @@ -77,49 +77,46 @@ def generate_lammps_structure( # mapping of atom kind_name to mass kind_mass_dict = {kind.name: kind.mass for kind in structure.kinds} - filestring = "" - filestring += "# {}\n\n".format(docstring) - filestring += "{0} atoms\n".format(len(structure.sites)) - filestring += "{0} atom types\n\n".format(len(kind_name_id_map)) + filestring = '' + filestring += '# {}\n\n'.format(docstring) + filestring += '{0} atoms\n'.format(len(structure.sites)) + filestring += '{0} atom types\n\n'.format(len(kind_name_id_map)) atoms = structure.get_ase() cell, coord_transform = transform_cell(atoms.cell) - positions = np.transpose(np.dot(coord_transform, np.transpose(atoms.positions))) + positions = np.transpose( + np.dot(coord_transform, np.transpose(atoms.positions))) if round_dp: cell = np.round(cell, round_dp) + 0.0 positions = np.round(positions, round_dp) + 0.0 - filestring += "0.0 {0:20.10f} xlo xhi\n".format(cell[0][0]) - filestring += "0.0 {0:20.10f} ylo yhi\n".format(cell[1][1]) - filestring += "0.0 {0:20.10f} zlo zhi\n".format(cell[2][2]) - filestring += "{0:20.10f} {1:20.10f} {2:20.10f} xy xz yz\n\n".format( - cell[1][0], cell[2][0], cell[2][1] - ) + filestring += '0.0 {0:20.10f} xlo xhi\n'.format(cell[0][0]) + filestring += '0.0 {0:20.10f} ylo yhi\n'.format(cell[1][1]) + filestring += '0.0 {0:20.10f} zlo zhi\n'.format(cell[2][2]) + filestring += '{0:20.10f} {1:20.10f} {2:20.10f} xy xz yz\n\n'.format( + cell[1][0], cell[2][0], cell[2][1]) - filestring += "Masses\n\n" + filestring += 'Masses\n\n' for kind_name in sorted(list(kind_name_id_map.keys())): - filestring += "{0} {1:20.10f} \n".format( - kind_name_id_map[kind_name], kind_mass_dict[kind_name] - ) - filestring += "\n" + filestring += '{0} {1:20.10f} \n'.format(kind_name_id_map[kind_name], + kind_mass_dict[kind_name]) + filestring += '\n' - filestring += "Atoms\n\n" + filestring += 'Atoms\n\n' for site_index, (pos, site) in enumerate(zip(positions, structure.sites)): kind_id = kind_name_id_map[site.kind_name] - if atom_style == "atomic": - filestring += "{0} {1} {2:20.10f} {3:20.10f} {4:20.10f}\n".format( - site_index + 1, kind_id, pos[0], pos[1], pos[2] - ) - elif atom_style == "charge": + if atom_style == 'atomic': + filestring += '{0} {1} {2:20.10f} {3:20.10f} {4:20.10f}\n'.format( + site_index + 1, kind_id, pos[0], pos[1], pos[2]) + elif atom_style == 'charge': charge = charge_dict.get(site.kind_name, 0.0) - filestring += "{0} {1} {2} {3:20.10f} {4:20.10f} {5:20.10f}\n".format( - site_index + 1, kind_id, charge, pos[0], pos[1], pos[2] - ) + filestring += '{0} {1} {2} {3:20.10f} {4:20.10f} {5:20.10f}\n'.format( + site_index + 1, kind_id, charge, pos[0], pos[1], pos[2]) else: - raise ValueError("atom_style unknown: {}".format(atom_style)) + raise ValueError('atom_style unknown: {}'.format(atom_style)) return filestring, coord_transform diff --git a/aiida_lammps/common/parse_trajectory.py b/aiida_lammps/common/parse_trajectory.py index a6098ed..49cd37f 100644 --- a/aiida_lammps/common/parse_trajectory.py +++ b/aiida_lammps/common/parse_trajectory.py @@ -4,15 +4,15 @@ import numpy as np TRAJ_BLOCK = namedtuple( - "TRAJ_BLOCK", ["lines", "timestep", "natoms", "cell", "pbc", "atom_fields"] -) + 'TRAJ_BLOCK', + ['lines', 'timestep', 'natoms', 'cell', 'pbc', 'atom_fields']) def iter_step_lines(file_obj): step_content = None init_line = 0 for i, line in enumerate(file_obj): - if "ITEM: TIMESTEP" in line: + if 'ITEM: TIMESTEP' in line: if step_content is not None: yield init_line, step_content init_line = i + 1 @@ -24,17 +24,18 @@ def iter_step_lines(file_obj): def parse_step(lines, intial_line=0): - if "ITEM: TIMESTEP" not in lines[0]: - raise IOError("expected line {} to be TIMESTEP".format(intial_line)) - if "ITEM: NUMBER OF ATOMS" not in lines[2]: - raise IOError("expected line {} to be NUMBER OF ATOMS".format(intial_line + 2)) - if "ITEM: BOX BOUNDS xy xz yz" not in lines[4]: + if 'ITEM: TIMESTEP' not in lines[0]: + raise IOError('expected line {} to be TIMESTEP'.format(intial_line)) + if 'ITEM: NUMBER OF ATOMS' not in lines[2]: raise IOError( - "expected line {} to be BOX BOUNDS xy xz yz".format(intial_line + 4) - ) + 'expected line {} to be NUMBER OF ATOMS'.format(intial_line + 2)) + if 'ITEM: BOX BOUNDS xy xz yz' not in lines[4]: + raise IOError( + 'expected line {} to be BOX BOUNDS xy xz yz'.format(intial_line + + 4)) # TODO handle case when xy xz yz not present -> orthogonal box - if "ITEM: ATOMS" not in lines[8]: - raise IOError("expected line {} to be ATOMS".format(intial_line + 8)) + if 'ITEM: ATOMS' not in lines[8]: + raise IOError('expected line {} to be ATOMS'.format(intial_line + 8)) timestep = int(lines[1]) number_of_atoms = int(lines[3]) @@ -58,13 +59,18 @@ def parse_step(lines, intial_line=0): zlo = bounds[2, 0] zhi = bounds[2, 1] - super_cell = np.array([[xhi - xlo, xy, xz], [0, yhi - ylo, yz], [0, 0, zhi - zlo]]) + super_cell = np.array([[xhi - xlo, xy, xz], [0, yhi - ylo, yz], + [0, 0, zhi - zlo]]) cell = super_cell.T field_names = lines[8].split()[2:] fields = [] for i in range(number_of_atoms): fields.append(lines[9 + i].split()) - atom_fields = {n: v.tolist() for n, v in zip(field_names, np.array(fields).T)} + atom_fields = { + n: v.tolist() + for n, v in zip(field_names, + np.array(fields).T) + } return TRAJ_BLOCK(lines, timestep, number_of_atoms, cell, pbc, atom_fields) @@ -76,25 +82,24 @@ def iter_trajectories(file_obj): def create_structure( - traj_block, - symbol_field="element", - position_fields=("x", "y", "z"), - original_structure=None, + traj_block, + symbol_field='element', + position_fields=('x', 'y', 'z'), + original_structure=None, ): symbols = traj_block.atom_fields[symbol_field] - positions = np.array( - [traj_block.atom_fields[f] for f in position_fields], dtype=float - ).T + positions = np.array([traj_block.atom_fields[f] for f in position_fields], + dtype=float).T if original_structure is not None: kind_names = original_structure.get_site_kindnames() - kind_symbols = [original_structure.get_kind(n).symbol for n in kind_names] + kind_symbols = [ + original_structure.get_kind(n).symbol for n in kind_names + ] if symbols != kind_symbols: raise ValueError( - "original_structure has different symbols:: {} != {}".format( - kind_symbols, symbols - ) - ) + 'original_structure has different symbols:: {} != {}'.format( + kind_symbols, symbols)) structure = original_structure.clone() structure.reset_cell(traj_block.cell) structure.reset_sites_positions(positions) @@ -103,12 +108,12 @@ def create_structure( pbcs = [] for pbc in traj_block.pbc: - if pbc == "pp": + if pbc == 'pp': pbcs.append(True) - elif pbc == "ff": + elif pbc == 'ff': pbcs.append(False) else: - raise NotImplementedError("pbc = {}".format(traj_block.pbc)) + raise NotImplementedError('pbc = {}'.format(traj_block.pbc)) structure = StructureData(cell=traj_block.cell, pbc=pbcs) for symbol, position in zip(symbols, positions): diff --git a/aiida_lammps/common/raw_parsers.py b/aiida_lammps/common/raw_parsers.py index c964f85..c6a5cda 100644 --- a/aiida_lammps/common/raw_parsers.py +++ b/aiida_lammps/common/raw_parsers.py @@ -8,10 +8,10 @@ def read_log_file(logdata_txt, compute_stress=False): data = logdata_txt.splitlines() if not data: - raise IOError("The logfile is empty") + raise IOError('The logfile is empty') perf_regex = re.compile( - r"Performance\:\s(.+)\sns\/day,\s(.+)\shours\/ns\,\s(.+)\stimesteps\/s\s*" + r'Performance\:\s(.+)\sns\/day,\s(.+)\shours\/ns\,\s(.+)\stimesteps\/s\s*' ) data_dict = {} @@ -20,10 +20,10 @@ def read_log_file(logdata_txt, compute_stress=False): found_end = False for i, line in enumerate(data): line = line.strip() - if "END_OF_COMP" in line: + if 'END_OF_COMP' in line: found_end = True - elif "Total wall time:" in line: - data_dict["total_wall_time"] = line.split()[-1] + elif 'Total wall time:' in line: + data_dict['total_wall_time'] = line.split()[-1] # These are handled in LAMMPSBaseParser.add_warnings_and_errors # if line.strip().startswith("WARNING"): # data_dict.setdefault("warnings", []).append(line.strip()) @@ -31,23 +31,25 @@ def read_log_file(logdata_txt, compute_stress=False): # data_dict.setdefault("errors", []).append(line.strip()) elif perf_regex.match(line): ns_day, hr_ns, step_sec = perf_regex.match(line).groups() - data_dict.setdefault("steps_per_second", []).append(float(step_sec)) - elif "units" in line: - data_dict["units_style"] = line.split()[1] - elif line.startswith("final_energy:"): - data_dict["energy"] = float(line.split()[1]) - elif line.startswith("final_variable:"): - if "final_variables" not in data_dict: - data_dict["final_variables"] = {} - data_dict["final_variables"][line.split()[1]] = float(line.split()[3]) - - elif line.startswith("final_cell:"): + data_dict.setdefault('steps_per_second', + []).append(float(step_sec)) + elif 'units' in line: + data_dict['units_style'] = line.split()[1] + elif line.startswith('final_energy:'): + data_dict['energy'] = float(line.split()[1]) + elif line.startswith('final_variable:'): + if 'final_variables' not in data_dict: + data_dict['final_variables'] = {} + data_dict['final_variables'][line.split()[1]] = float( + line.split()[3]) + + elif line.startswith('final_cell:'): cell_params = [float(v) for v in line.split()[1:10]] - elif line.startswith("final_stress:"): + elif line.startswith('final_stress:'): stress_params = [float(v) for v in line.split()[1:7]] if not compute_stress: - return {"data": data_dict, "found_end": found_end} + return {'data': data_dict, 'found_end': found_end} if cell_params is None: raise IOError("'final_cell' could not be found") @@ -55,7 +57,8 @@ def read_log_file(logdata_txt, compute_stress=False): raise IOError("'final_stress' could not be found") xlo, xhi, xy, ylo, yhi, xz, zlo, zhi, yz = cell_params - super_cell = np.array([[xhi - xlo, xy, xz], [0, yhi - ylo, yz], [0, 0, zhi - zlo]]) + super_cell = np.array([[xhi - xlo, xy, xz], [0, yhi - ylo, yz], + [0, 0, zhi - zlo]]) cell = super_cell.T if np.linalg.det(cell) < 0: cell = -1.0 * cell @@ -65,10 +68,15 @@ def read_log_file(logdata_txt, compute_stress=False): stress = np.array([[xx, xy, xz], [xy, yy, yz], [xz, yz, zz]], dtype=float) stress = -stress / volume # to get stress in units of pressure - return {"data": data_dict, "cell": cell, "stress": stress, "found_end": found_end} + return { + 'data': data_dict, + 'cell': cell, + 'stress': stress, + 'found_end': found_end + } -def get_units_dict(style, quantities, suffix="_units"): +def get_units_dict(style, quantities, suffix='_units'): """Return a mapping of the unit name to the units, for a particular style. :param style: the unit style set in the lammps input @@ -79,114 +87,114 @@ def get_units_dict(style, quantities, suffix="_units"): """ units_dict = { - "real": { - "mass": "grams/mole", - "distance": "Angstroms", - "time": "femtoseconds", - "energy": "Kcal/mole", - "velocity": "Angstroms/femtosecond", - "force": "Kcal/mole-Angstrom", - "torque": "Kcal/mole", - "temperature": "Kelvin", - "pressure": "atmospheres", - "dynamic_viscosity": "Poise", - "charge": "e", # multiple of electron charge (1.0 is a proton) - "dipole": "charge*Angstroms", - "electric field": "volts/Angstrom", - "density": "gram/cm^dim", + 'real': { + 'mass': 'grams/mole', + 'distance': 'Angstroms', + 'time': 'femtoseconds', + 'energy': 'Kcal/mole', + 'velocity': 'Angstroms/femtosecond', + 'force': 'Kcal/mole-Angstrom', + 'torque': 'Kcal/mole', + 'temperature': 'Kelvin', + 'pressure': 'atmospheres', + 'dynamic_viscosity': 'Poise', + 'charge': 'e', # multiple of electron charge (1.0 is a proton) + 'dipole': 'charge*Angstroms', + 'electric field': 'volts/Angstrom', + 'density': 'gram/cm^dim', }, - "metal": { - "mass": "grams/mole", - "distance": "Angstroms", - "time": "picoseconds", - "energy": "eV", - "velocity": "Angstroms/picosecond", - "force": "eV/Angstrom", - "torque": "eV", - "temperature": "Kelvin", - "pressure": "bars", - "dynamic_viscosity": "Poise", - "charge": "e", # multiple of electron charge (1.0 is a proton) - "dipole": "charge*Angstroms", - "electric field": "volts/Angstrom", - "density": "gram/cm^dim", + 'metal': { + 'mass': 'grams/mole', + 'distance': 'Angstroms', + 'time': 'picoseconds', + 'energy': 'eV', + 'velocity': 'Angstroms/picosecond', + 'force': 'eV/Angstrom', + 'torque': 'eV', + 'temperature': 'Kelvin', + 'pressure': 'bars', + 'dynamic_viscosity': 'Poise', + 'charge': 'e', # multiple of electron charge (1.0 is a proton) + 'dipole': 'charge*Angstroms', + 'electric field': 'volts/Angstrom', + 'density': 'gram/cm^dim', }, - "si": { - "mass": "kilograms", - "distance": "meters", - "time": "seconds", - "energy": "Joules", - "velocity": "meters/second", - "force": "Newtons", - "torque": "Newton-meters", - "temperature": "Kelvin", - "pressure": "Pascals", - "dynamic_viscosity": "Pascal*second", - "charge": "Coulombs", # (1.6021765e-19 is a proton) - "dipole": "Coulombs*meters", - "electric field": "volts/meter", - "density": "kilograms/meter^dim", + 'si': { + 'mass': 'kilograms', + 'distance': 'meters', + 'time': 'seconds', + 'energy': 'Joules', + 'velocity': 'meters/second', + 'force': 'Newtons', + 'torque': 'Newton-meters', + 'temperature': 'Kelvin', + 'pressure': 'Pascals', + 'dynamic_viscosity': 'Pascal*second', + 'charge': 'Coulombs', # (1.6021765e-19 is a proton) + 'dipole': 'Coulombs*meters', + 'electric field': 'volts/meter', + 'density': 'kilograms/meter^dim', }, - "cgs": { - "mass": "grams", - "distance": "centimeters", - "time": "seconds", - "energy": "ergs", - "velocity": "centimeters/second", - "force": "dynes", - "torque": "dyne-centimeters", - "temperature": "Kelvin", - "pressure": "dyne/cm^2", # or barye': '1.0e-6 bars - "dynamic_viscosity": "Poise", - "charge": "statcoulombs", # or esu (4.8032044e-10 is a proton) - "dipole": "statcoul-cm", #: '10^18 debye - "electric_field": "statvolt/cm", # or dyne/esu - "density": "grams/cm^dim", + 'cgs': { + 'mass': 'grams', + 'distance': 'centimeters', + 'time': 'seconds', + 'energy': 'ergs', + 'velocity': 'centimeters/second', + 'force': 'dynes', + 'torque': 'dyne-centimeters', + 'temperature': 'Kelvin', + 'pressure': 'dyne/cm^2', # or barye': '1.0e-6 bars + 'dynamic_viscosity': 'Poise', + 'charge': 'statcoulombs', # or esu (4.8032044e-10 is a proton) + 'dipole': 'statcoul-cm', #: '10^18 debye + 'electric_field': 'statvolt/cm', # or dyne/esu + 'density': 'grams/cm^dim', }, - "electron": { - "mass": "amu", - "distance": "Bohr", - "time": "femtoseconds", - "energy": "Hartrees", - "velocity": "Bohr/atu", # [1.03275e-15 seconds] - "force": "Hartrees/Bohr", - "temperature": "Kelvin", - "pressure": "Pascals", - "charge": "e", # multiple of electron charge (1.0 is a proton) - "dipole_moment": "Debye", - "electric_field": "volts/cm", + 'electron': { + 'mass': 'amu', + 'distance': 'Bohr', + 'time': 'femtoseconds', + 'energy': 'Hartrees', + 'velocity': 'Bohr/atu', # [1.03275e-15 seconds] + 'force': 'Hartrees/Bohr', + 'temperature': 'Kelvin', + 'pressure': 'Pascals', + 'charge': 'e', # multiple of electron charge (1.0 is a proton) + 'dipole_moment': 'Debye', + 'electric_field': 'volts/cm', }, - "micro": { - "mass": "picograms", - "distance": "micrometers", - "time": "microseconds", - "energy": "picogram-micrometer^2/microsecond^2", - "velocity": "micrometers/microsecond", - "force": "picogram-micrometer/microsecond^2", - "torque": "picogram-micrometer^2/microsecond^2", - "temperature": "Kelvin", - "pressure": "picogram/(micrometer-microsecond^2)", - "dynamic_viscosity": "picogram/(micrometer-microsecond)", - "charge": "picocoulombs", # (1.6021765e-7 is a proton) - "dipole": "picocoulomb-micrometer", - "electric field": "volt/micrometer", - "density": "picograms/micrometer^dim", + 'micro': { + 'mass': 'picograms', + 'distance': 'micrometers', + 'time': 'microseconds', + 'energy': 'picogram-micrometer^2/microsecond^2', + 'velocity': 'micrometers/microsecond', + 'force': 'picogram-micrometer/microsecond^2', + 'torque': 'picogram-micrometer^2/microsecond^2', + 'temperature': 'Kelvin', + 'pressure': 'picogram/(micrometer-microsecond^2)', + 'dynamic_viscosity': 'picogram/(micrometer-microsecond)', + 'charge': 'picocoulombs', # (1.6021765e-7 is a proton) + 'dipole': 'picocoulomb-micrometer', + 'electric field': 'volt/micrometer', + 'density': 'picograms/micrometer^dim', }, - "nano": { - "mass": "attograms", - "distance": "nanometers", - "time": "nanoseconds", - "energy": "attogram-nanometer^2/nanosecond^2", - "velocity": "nanometers/nanosecond", - "force": "attogram-nanometer/nanosecond^2", - "torque": "attogram-nanometer^2/nanosecond^2", - "temperature": "Kelvin", - "pressure": "attogram/(nanometer-nanosecond^2)", - "dynamic_viscosity": "attogram/(nanometer-nanosecond)", - "charge": "e", # multiple of electron charge (1.0 is a proton) - "dipole": "charge-nanometer", - "electric_field": "volt/nanometer", - "density": "attograms/nanometer^dim", + 'nano': { + 'mass': 'attograms', + 'distance': 'nanometers', + 'time': 'nanoseconds', + 'energy': 'attogram-nanometer^2/nanosecond^2', + 'velocity': 'nanometers/nanosecond', + 'force': 'attogram-nanometer/nanosecond^2', + 'torque': 'attogram-nanometer^2/nanosecond^2', + 'temperature': 'Kelvin', + 'pressure': 'attogram/(nanometer-nanosecond^2)', + 'dynamic_viscosity': 'attogram/(nanometer-nanosecond)', + 'charge': 'e', # multiple of electron charge (1.0 is a proton) + 'dipole': 'charge-nanometer', + 'electric_field': 'volt/nanometer', + 'density': 'attograms/nanometer^dim', }, } out_dict = {} @@ -197,29 +205,29 @@ def get_units_dict(style, quantities, suffix="_units"): def convert_units(value, style, unit_type, out_units): conversion = { - "seconds": 1, - "milliseconds": 1e-3, - "microseconds": 1e-6, - "nanoseconds": 1e-9, - "picoseconds": 1e-12, - "femtoseconds": 1e-15, + 'seconds': 1, + 'milliseconds': 1e-3, + 'microseconds': 1e-6, + 'nanoseconds': 1e-9, + 'picoseconds': 1e-12, + 'femtoseconds': 1e-15, } - if unit_type != "time" or out_units not in conversion: + if unit_type != 'time' or out_units not in conversion: # TODO use https://pint.readthedocs.io raise NotImplementedError - in_units = get_units_dict(style, [unit_type], "")[unit_type] + in_units = get_units_dict(style, [unit_type], '')[unit_type] return value * conversion[in_units] * (1.0 / conversion[out_units]) def parse_quasiparticle_data(qp_file): import yaml - with open(qp_file, "r") as handle: + with open(qp_file, 'r') as handle: quasiparticle_data = yaml.load(handle) data_dict = {} for i, data in enumerate(quasiparticle_data): - data_dict["q_point_{}".format(i)] = data + data_dict['q_point_{}'.format(i)] = data return data_dict @@ -228,58 +236,56 @@ def parse_dynaphopy_output(file): thermal_properties = None - with open(file, "r") as handle: + with open(file, 'r') as handle: data_lines = handle.readlines() indices = [] q_points = [] for i, line in enumerate(data_lines): - if "Q-point" in line: + if 'Q-point' in line: # print i, np.array(line.replace(']', '').replace('[', '').split()[4:8], dtype=float) indices.append(i) q_points.append( - np.array( - line.replace("]", "").replace("[", "").split()[4:8], dtype=float - ) - ) + np.array(line.replace(']', '').replace('[', '').split()[4:8], + dtype=float)) indices.append(len(data_lines)) phonons = {} for i, index in enumerate(indices[:-1]): - fragment = data_lines[indices[i] : indices[i + 1]] - if "kipped" in fragment: + fragment = data_lines[indices[i]:indices[i + 1]] + if 'kipped' in fragment: continue phonon_modes = {} for j, line in enumerate(fragment): - if "Peak" in line: + if 'Peak' in line: number = line.split()[2] phonon_mode = { - "width": float(fragment[j + 2].split()[1]), - "positions": float(fragment[j + 3].split()[1]), - "shift": float(fragment[j + 12].split()[2]), + 'width': float(fragment[j + 2].split()[1]), + 'positions': float(fragment[j + 3].split()[1]), + 'shift': float(fragment[j + 12].split()[2]), } phonon_modes.update({number: phonon_mode}) - if "Thermal" in line: + if 'Thermal' in line: free_energy = float(fragment[j + 4].split()[4]) entropy = float(fragment[j + 5].split()[3]) cv = float(fragment[j + 6].split()[3]) total_energy = float(fragment[j + 7].split()[4]) - temperature = float(fragment[j].split()[5].replace("(", "")) + temperature = float(fragment[j].split()[5].replace('(', '')) thermal_properties = { - "temperature": temperature, - "free_energy": free_energy, - "entropy": entropy, - "cv": cv, - "total_energy": total_energy, + 'temperature': temperature, + 'free_energy': free_energy, + 'entropy': entropy, + 'cv': cv, + 'total_energy': total_energy, } - phonon_modes.update({"q_point": q_points[i].tolist()}) + phonon_modes.update({'q_point': q_points[i].tolist()}) - phonons.update({"wave_vector_" + str(i): phonon_modes}) + phonons.update({'wave_vector_' + str(i): phonon_modes}) return thermal_properties diff --git a/aiida_lammps/common/reaxff_convert.py b/aiida_lammps/common/reaxff_convert.py index 9b59434..a04a875 100644 --- a/aiida_lammps/common/reaxff_convert.py +++ b/aiida_lammps/common/reaxff_convert.py @@ -7,164 +7,164 @@ from aiida_lammps.validation import validate_against_schema -INDEX_SEP = "-" +INDEX_SEP = '-' KEYS_GLOBAL = ( - "reaxff0_boc1", - "reaxff0_boc2", - "reaxff3_coa2", - "Triple bond stabilisation 1", - "Triple bond stabilisation 2", - "C2-correction", - "reaxff0_ovun6", - "Triple bond stabilisation", - "reaxff0_ovun7", - "reaxff0_ovun8", - "Triple bond stabilization energy", - "Lower Taper-radius", - "Upper Taper-radius", - "reaxff2_pen2", - "reaxff0_val7", - "reaxff0_lp1", - "reaxff0_val9", - "reaxff0_val10", - "Not used 2", - "reaxff0_pen2", - "reaxff0_pen3", - "reaxff0_pen4", - "Not used 3", - "reaxff0_tor2", - "reaxff0_tor3", - "reaxff0_tor4", - "Not used 4", - "reaxff0_cot2", - "reaxff0_vdw1", - "bond order cutoff", - "reaxff3_coa4", - "reaxff0_ovun4", - "reaxff0_ovun3", - "reaxff0_val8", - "Not used 5", - "Not used 6", - "Not used 7", - "Not used 8", - "reaxff3_coa3", + 'reaxff0_boc1', + 'reaxff0_boc2', + 'reaxff3_coa2', + 'Triple bond stabilisation 1', + 'Triple bond stabilisation 2', + 'C2-correction', + 'reaxff0_ovun6', + 'Triple bond stabilisation', + 'reaxff0_ovun7', + 'reaxff0_ovun8', + 'Triple bond stabilization energy', + 'Lower Taper-radius', + 'Upper Taper-radius', + 'reaxff2_pen2', + 'reaxff0_val7', + 'reaxff0_lp1', + 'reaxff0_val9', + 'reaxff0_val10', + 'Not used 2', + 'reaxff0_pen2', + 'reaxff0_pen3', + 'reaxff0_pen4', + 'Not used 3', + 'reaxff0_tor2', + 'reaxff0_tor3', + 'reaxff0_tor4', + 'Not used 4', + 'reaxff0_cot2', + 'reaxff0_vdw1', + 'bond order cutoff', + 'reaxff3_coa4', + 'reaxff0_ovun4', + 'reaxff0_ovun3', + 'reaxff0_val8', + 'Not used 5', + 'Not used 6', + 'Not used 7', + 'Not used 8', + 'reaxff3_coa3', ) # TODO some variables lammps sets as global are actually species dependant in GULP, how to handle these? KEYS_1BODY = ( - "reaxff1_radii1", - "reaxff1_valence1", - "mass", - "reaxff1_morse3", - "reaxff1_morse2", - "reaxff_gamma", - "reaxff1_radii2", - "reaxff1_valence3", - "reaxff1_morse1", - "reaxff1_morse4", - "reaxff1_valence4", - "reaxff1_under", - "dummy1", - "reaxff_chi", - "reaxff_mu", - "dummy2", - "reaxff1_radii3", - "reaxff1_lonepair2", - "dummy3", - "reaxff1_over2", - "reaxff1_over1", - "reaxff1_over3", - "dummy4", - "dummy5", - "reaxff1_over4", - "reaxff1_angle1", - "dummy11", - "reaxff1_valence2", - "reaxff1_angle2", - "dummy6", - "dummy7", - "dummy8", + 'reaxff1_radii1', + 'reaxff1_valence1', + 'mass', + 'reaxff1_morse3', + 'reaxff1_morse2', + 'reaxff_gamma', + 'reaxff1_radii2', + 'reaxff1_valence3', + 'reaxff1_morse1', + 'reaxff1_morse4', + 'reaxff1_valence4', + 'reaxff1_under', + 'dummy1', + 'reaxff_chi', + 'reaxff_mu', + 'dummy2', + 'reaxff1_radii3', + 'reaxff1_lonepair2', + 'dummy3', + 'reaxff1_over2', + 'reaxff1_over1', + 'reaxff1_over3', + 'dummy4', + 'dummy5', + 'reaxff1_over4', + 'reaxff1_angle1', + 'dummy11', + 'reaxff1_valence2', + 'reaxff1_angle2', + 'dummy6', + 'dummy7', + 'dummy8', ) KEYS_2BODY_BONDS = ( - "reaxff2_bond1", - "reaxff2_bond2", - "reaxff2_bond3", - "reaxff2_bond4", - "reaxff2_bo5", - "reaxff2_bo7", - "reaxff2_bo6", - "reaxff2_over", - "reaxff2_bond5", - "reaxff2_bo3", - "reaxff2_bo4", - "dummy1", - "reaxff2_bo1", - "reaxff2_bo2", - "reaxff2_bo8", - "reaxff2_pen1", + 'reaxff2_bond1', + 'reaxff2_bond2', + 'reaxff2_bond3', + 'reaxff2_bond4', + 'reaxff2_bo5', + 'reaxff2_bo7', + 'reaxff2_bo6', + 'reaxff2_over', + 'reaxff2_bond5', + 'reaxff2_bo3', + 'reaxff2_bo4', + 'dummy1', + 'reaxff2_bo1', + 'reaxff2_bo2', + 'reaxff2_bo8', + 'reaxff2_pen1', ) KEYS_2BODY_OFFDIAG = [ - "reaxff2_morse1", - "reaxff2_morse3", - "reaxff2_morse2", - "reaxff2_morse4", - "reaxff2_morse5", - "reaxff2_morse6", + 'reaxff2_morse1', + 'reaxff2_morse3', + 'reaxff2_morse2', + 'reaxff2_morse4', + 'reaxff2_morse5', + 'reaxff2_morse6', ] KEYS_3BODY_ANGLES = ( - "reaxff3_angle1", - "reaxff3_angle2", - "reaxff3_angle3", - "reaxff3_coa1", - "reaxff3_angle5", - "reaxff3_penalty", - "reaxff3_angle4", + 'reaxff3_angle1', + 'reaxff3_angle2', + 'reaxff3_angle3', + 'reaxff3_coa1', + 'reaxff3_angle5', + 'reaxff3_penalty', + 'reaxff3_angle4', ) KEYS_3BODY_HBOND = ( - "reaxff3_hbond1", - "reaxff3_hbond2", - "reaxff3_hbond3", - "reaxff3_hbond4", + 'reaxff3_hbond1', + 'reaxff3_hbond2', + 'reaxff3_hbond3', + 'reaxff3_hbond4', ) KEYS_4BODY_TORSION = ( - "reaxff4_torsion1", - "reaxff4_torsion2", - "reaxff4_torsion3", - "reaxff4_torsion4", - "reaxff4_torsion5", - "dummy1", - "dummy2", + 'reaxff4_torsion1', + 'reaxff4_torsion2', + 'reaxff4_torsion3', + 'reaxff4_torsion4', + 'reaxff4_torsion5', + 'dummy1', + 'dummy2', ) DEFAULT_TOLERANCES = ( # ReaxFF angle/torsion bond order threshold, # for bond orders in valence, penalty and 3-body conjugation # GULP default: 0.001 - ("anglemin", 0.001), + ('anglemin', 0.001), # ReaxFF bond order double product threshold, # for the product of bond orders (1-2 x 2-3, where 2 = pivot) # Hard coded to 0.001 in original code, but this leads to discontinuities # GULP default: 0.000001 - ("angleprod", 0.00001), + ('angleprod', 0.00001), # ReaxFF hydrogen-bond bond order threshold # Hard coded to 0.01 in original code. # GULP default: 0.01 - ("hbondmin", 0.01), + ('hbondmin', 0.01), # ReaxFF H-bond cutoff # Hard coded to 7.5 Ang in original code. # GULP default: 7.5 - ("hbonddist", 7.5), + ('hbonddist', 7.5), # ReaxFF bond order triple product threshold, # for the product of bond orders (1-2 x 2-3 x 3-4) # GULP default: 0.000000001 - ("torsionprod", 0.00001), + ('torsionprod', 0.00001), ) @@ -198,9 +198,10 @@ def split_numbers(string): [0.001, -2.0] """ - _match_number = re.compile("-?\\ *[0-9]+\\.?[0-9]*(?:[Ee]\\ *[+-]?\\ *[0-9]+)?") - string = string.replace(" .", " 0.") - string = string.replace("-.", "-0.") + _match_number = re.compile( + '-?\\ *[0-9]+\\.?[0-9]*(?:[Ee]\\ *[+-]?\\ *[0-9]+)?') + string = string.replace(' .', ' 0.') + string = string.replace('-.', '-0.') return [float(s) for s in re.findall(_match_number, string)] @@ -229,31 +230,33 @@ def read_lammps_format(lines, tolerances=None): """ output = { - "description": lines[0], - "global": {}, - "species": ["X core"], # X is always first - "1body": {}, - "2body": {}, - "3body": {}, - "4body": {}, + 'description': lines[0], + 'global': {}, + 'species': ['X core'], # X is always first + '1body': {}, + '2body': {}, + '3body': {}, + '4body': {}, } lineno = 1 # Global parameters if lines[lineno].split()[0] != str(len(KEYS_GLOBAL)): - raise IOError("Expecting {} global parameters".format(len(KEYS_GLOBAL))) + raise IOError('Expecting {} global parameters'.format( + len(KEYS_GLOBAL))) for key in KEYS_GLOBAL: lineno += 1 - output["global"][key] = float(lines[lineno].split()[0]) + output['global'][key] = float(lines[lineno].split()[0]) - output["global"][ - "reaxff2_pen3" - ] = 1.0 # this is not provided by lammps, but is used by GULP + output['global'][ + 'reaxff2_pen3'] = 1.0 # this is not provided by lammps, but is used by GULP tolerances = tolerances or {} - output["global"].update({k: tolerances.get(k, v) for k, v in DEFAULT_TOLERANCES}) + output['global'].update( + {k: tolerances.get(k, v) + for k, v in DEFAULT_TOLERANCES}) # one-body parameters lineno += 1 @@ -263,12 +266,12 @@ def read_lammps_format(lines, tolerances=None): for i in range(num_species): lineno += 1 symbol, values = lines[lineno].split(None, 1) - if symbol == "X": + if symbol == 'X': species_idx = 0 # the X symbol is always assigned index 0 else: species_idx = idx idx += 1 - output["species"].append(symbol + " core") + output['species'].append(symbol + ' core') values = split_numbers(values) for _ in range(3): lineno += 1 @@ -276,35 +279,37 @@ def read_lammps_format(lines, tolerances=None): if len(values) != len(KEYS_1BODY): raise Exception( - "number of values different than expected for species {0}, " - "{1} != {2}".format(symbol, len(values), len(KEYS_1BODY)) - ) + 'number of values different than expected for species {0}, ' + '{1} != {2}'.format(symbol, len(values), len(KEYS_1BODY))) key_map = {k: v for k, v in zip(KEYS_1BODY, values)} - key_map["reaxff1_lonepair1"] = 0.5 * ( - key_map["reaxff1_valence3"] - key_map["reaxff1_valence1"] - ) + key_map['reaxff1_lonepair1'] = 0.5 * (key_map['reaxff1_valence3'] - + key_map['reaxff1_valence1']) - output["1body"][str(species_idx)] = key_map + output['1body'][str(species_idx)] = key_map # two-body bond parameters lineno += 1 num_lines = int(lines[lineno].split()[0]) lineno += 2 for _ in range(num_lines): - values = split_numbers(lines[lineno]) + split_numbers(lines[lineno + 1]) + values = split_numbers(lines[lineno]) + split_numbers( + lines[lineno + 1]) species_idx1 = int(values.pop(0)) species_idx2 = int(values.pop(0)) - key_name = "{}-{}".format(species_idx1, species_idx2) + key_name = '{}-{}'.format(species_idx1, species_idx2) lineno += 2 if len(values) != len(KEYS_2BODY_BONDS): raise Exception( - "number of bond values different than expected for key {0}, " - "{1} != {2}".format(key_name, len(values), len(KEYS_2BODY_BONDS)) - ) + 'number of bond values different than expected for key {0}, ' + '{1} != {2}'.format(key_name, len(values), + len(KEYS_2BODY_BONDS))) - output["2body"][key_name] = {k: v for k, v in zip(KEYS_2BODY_BONDS, values)} + output['2body'][key_name] = { + k: v + for k, v in zip(KEYS_2BODY_BONDS, values) + } # two-body off-diagonal parameters num_lines = int(lines[lineno].split()[0]) @@ -313,20 +318,18 @@ def read_lammps_format(lines, tolerances=None): values = split_numbers(lines[lineno]) species_idx1 = int(values.pop(0)) species_idx2 = int(values.pop(0)) - key_name = "{}-{}".format(species_idx1, species_idx2) + key_name = '{}-{}'.format(species_idx1, species_idx2) lineno += 1 if len(values) != len(KEYS_2BODY_OFFDIAG): raise Exception( - "number of off-diagonal values different than expected for key {0} (line {1}), " - "{2} != {3}".format( - key_name, lineno - 1, len(values), len(KEYS_2BODY_OFFDIAG) - ) - ) + 'number of off-diagonal values different than expected for key {0} (line {1}), ' + '{2} != {3}'.format(key_name, lineno - 1, len(values), + len(KEYS_2BODY_OFFDIAG))) - output["2body"].setdefault(key_name, {}).update( - {k: v for k, v in zip(KEYS_2BODY_OFFDIAG, values)} - ) + output['2body'].setdefault(key_name, {}).update( + {k: v + for k, v in zip(KEYS_2BODY_OFFDIAG, values)}) # three-body angle parameters num_lines = int(lines[lineno].split()[0]) @@ -336,20 +339,18 @@ def read_lammps_format(lines, tolerances=None): species_idx1 = int(values.pop(0)) species_idx2 = int(values.pop(0)) species_idx3 = int(values.pop(0)) - key_name = "{}-{}-{}".format(species_idx1, species_idx2, species_idx3) + key_name = '{}-{}-{}'.format(species_idx1, species_idx2, species_idx3) lineno += 1 if len(values) != len(KEYS_3BODY_ANGLES): raise Exception( - "number of angle values different than expected for key {0} (line {1}), " - "{2} != {3}".format( - key_name, lineno - 1, len(values), len(KEYS_3BODY_ANGLES) - ) - ) + 'number of angle values different than expected for key {0} (line {1}), ' + '{2} != {3}'.format(key_name, lineno - 1, len(values), + len(KEYS_3BODY_ANGLES))) - output["3body"].setdefault(key_name, {}).update( - {k: v for k, v in zip(KEYS_3BODY_ANGLES, values)} - ) + output['3body'].setdefault(key_name, {}).update( + {k: v + for k, v in zip(KEYS_3BODY_ANGLES, values)}) # four-body torsion parameters num_lines = int(lines[lineno].split()[0]) @@ -360,22 +361,19 @@ def read_lammps_format(lines, tolerances=None): species_idx2 = int(values.pop(0)) species_idx3 = int(values.pop(0)) species_idx4 = int(values.pop(0)) - key_name = "{}-{}-{}-{}".format( - species_idx1, species_idx2, species_idx3, species_idx4 - ) + key_name = '{}-{}-{}-{}'.format(species_idx1, species_idx2, + species_idx3, species_idx4) lineno += 1 if len(values) != len(KEYS_4BODY_TORSION): raise Exception( - "number of torsion values different than expected for key {0} (line {1}), " - "{2} != {3}".format( - key_name, lineno - 1, len(values), len(KEYS_4BODY_TORSION) - ) - ) + 'number of torsion values different than expected for key {0} (line {1}), ' + '{2} != {3}'.format(key_name, lineno - 1, len(values), + len(KEYS_4BODY_TORSION))) - output["4body"].setdefault(key_name, {}).update( - {k: v for k, v in zip(KEYS_4BODY_TORSION, values)} - ) + output['4body'].setdefault(key_name, {}).update( + {k: v + for k, v in zip(KEYS_4BODY_TORSION, values)}) # three-body h-bond parameters num_lines = int(lines[lineno].split()[0]) @@ -385,98 +383,81 @@ def read_lammps_format(lines, tolerances=None): species_idx1 = int(values.pop(0)) species_idx2 = int(values.pop(0)) species_idx3 = int(values.pop(0)) - key_name = "{}-{}-{}".format(species_idx1, species_idx2, species_idx3) + key_name = '{}-{}-{}'.format(species_idx1, species_idx2, species_idx3) lineno += 1 if len(values) != len(KEYS_3BODY_HBOND): raise Exception( - "number of h-bond values different than expected for key {0} (line {1}), " - "{2} != {3}".format( - key_name, lineno - 1, len(values), len(KEYS_3BODY_HBOND) - ) - ) + 'number of h-bond values different than expected for key {0} (line {1}), ' + '{2} != {3}'.format(key_name, lineno - 1, len(values), + len(KEYS_3BODY_HBOND))) - output["3body"].setdefault(key_name, {}).update( - {k: v for k, v in zip(KEYS_3BODY_HBOND, values)} - ) + output['3body'].setdefault(key_name, {}).update( + {k: v + for k, v in zip(KEYS_3BODY_HBOND, values)}) return output def format_lammps_value(value): - return "{:.4f}".format(value) + return '{:.4f}'.format(value) def write_lammps_format(data): """Write a reaxff file, in lammps format, from a standardised potential dictionary.""" # validate dictionary - validate_against_schema(data, "reaxff.schema.json") + validate_against_schema(data, 'reaxff.schema.json') - output = [data["description"]] + output = [data['description']] # Global parameters - output.append("{} ! Number of general parameters".format(len(KEYS_GLOBAL))) + output.append('{} ! Number of general parameters'.format(len(KEYS_GLOBAL))) for key in KEYS_GLOBAL: - output.append("{0:.4f} ! {1}".format(data["global"][key], key)) + output.append('{0:.4f} ! {1}'.format(data['global'][key], key)) # one-body parameters - output.extend( - [ - "{0} ! Nr of atoms; cov.r; valency;a.m;Rvdw;Evdw;gammaEEM;cov.r2;#".format( - len(data["species"]) - ), - "alfa;gammavdW;valency;Eunder;Eover;chiEEM;etaEEM;n.u.", - "cov r3;Elp;Heat inc.;n.u.;n.u.;n.u.;n.u.", - "ov/un;val1;n.u.;val3,vval4", - ] - ) + output.extend([ + '{0} ! Nr of atoms; cov.r; valency;a.m;Rvdw;Evdw;gammaEEM;cov.r2;#'. + format(len(data['species'])), + 'alfa;gammavdW;valency;Eunder;Eover;chiEEM;etaEEM;n.u.', + 'cov r3;Elp;Heat inc.;n.u.;n.u.;n.u.;n.u.', + 'ov/un;val1;n.u.;val3,vval4', + ]) idx_map = {} i = 1 x_species_line = None - for idx, species in enumerate(data["species"]): - if species.endswith("shell"): + for idx, species in enumerate(data['species']): + if species.endswith('shell'): raise ValueError( - "only core species can be used for reaxff, not shell: {}".format( - species - ) - ) + 'only core species can be used for reaxff, not shell: {}'. + format(species)) species = species[:-5] # X is not always present in 1body, even if it is used in nbody terms # see e.g. https://github.com/lammps/lammps/blob/master/potentials/ffield.reax.cho - if species == "X" and str(idx) not in data["1body"]: + if species == 'X' and str(idx) not in data['1body']: species_lines = [] else: species_lines = [ - species - + " " - + " ".join( - [ - format_lammps_value(data["1body"][str(idx)][k]) - for k in KEYS_1BODY[:8] - ] - ), - " ".join( - [ - format_lammps_value(data["1body"][str(idx)][k]) - for k in KEYS_1BODY[8:16] - ] - ), - " ".join( - [ - format_lammps_value(data["1body"][str(idx)][k]) - for k in KEYS_1BODY[16:24] - ] - ), - " ".join( - [ - format_lammps_value(data["1body"][str(idx)][k]) - for k in KEYS_1BODY[24:32] - ] - ), + species + ' ' + ' '.join([ + format_lammps_value(data['1body'][str(idx)][k]) + for k in KEYS_1BODY[:8] + ]), + ' '.join([ + format_lammps_value(data['1body'][str(idx)][k]) + for k in KEYS_1BODY[8:16] + ]), + ' '.join([ + format_lammps_value(data['1body'][str(idx)][k]) + for k in KEYS_1BODY[16:24] + ]), + ' '.join([ + format_lammps_value(data['1body'][str(idx)][k]) + for k in KEYS_1BODY[24:32] + ]), ] - if species == "X": + if species == 'X': # X is always index 0, but must be last in the species list - idx_map[str(idx)] = "0" + idx_map[str(idx)] = '0' x_species_line = species_lines else: idx_map[str(idx)] = str(i) @@ -487,124 +468,98 @@ def write_lammps_format(data): # two-body angle parameters suboutout = [] - for key in sorted(data["2body"]): - subdata = data["2body"][key] + for key in sorted(data['2body']): + subdata = data['2body'][key] if not set(subdata.keys()).issuperset(KEYS_2BODY_BONDS): continue - suboutout.extend( - [ - " ".join([idx_map[k] for k in key.split(INDEX_SEP)]) - + " " - + " ".join( - [format_lammps_value(subdata[k]) for k in KEYS_2BODY_BONDS[:8]] - ), - " ".join( - [format_lammps_value(subdata[k]) for k in KEYS_2BODY_BONDS[8:16]] - ), - ] - ) - - output.extend( - [ - "{0} ! Nr of bonds; Edis1;LPpen;n.u.;pbe1;pbo5;13corr;pbo6".format( - int(len(suboutout) / 2) - ), - "pbe2;pbo3;pbo4;n.u.;pbo1;pbo2;ovcorr", - ] - + suboutout - ) + suboutout.extend([ + ' '.join([idx_map[k] + for k in key.split(INDEX_SEP)]) + ' ' + ' '.join([ + format_lammps_value(subdata[k]) + for k in KEYS_2BODY_BONDS[:8] + ]), + ' '.join([ + format_lammps_value(subdata[k]) for k in KEYS_2BODY_BONDS[8:16] + ]), + ]) + + output.extend([ + '{0} ! Nr of bonds; Edis1;LPpen;n.u.;pbe1;pbo5;13corr;pbo6'.format( + int(len(suboutout) / 2)), + 'pbe2;pbo3;pbo4;n.u.;pbo1;pbo2;ovcorr', + ] + suboutout) # two-body off-diagonal parameters suboutout = [] - for key in sorted(data["2body"]): - subdata = data["2body"][key] + for key in sorted(data['2body']): + subdata = data['2body'][key] if not set(subdata.keys()).issuperset(KEYS_2BODY_OFFDIAG): continue - suboutout.extend( - [ - " ".join([idx_map[k] for k in key.split(INDEX_SEP)]) - + " " - + " ".join( - [format_lammps_value(subdata[k]) for k in KEYS_2BODY_OFFDIAG] - ) - ] - ) + suboutout.extend([ + ' '.join([idx_map[k] for k in key.split(INDEX_SEP)]) + ' ' + + ' '.join( + [format_lammps_value(subdata[k]) for k in KEYS_2BODY_OFFDIAG]) + ]) - output.extend( - [ - "{0} ! Nr of off-diagonal terms; Ediss;Ro;gamma;rsigma;rpi;rpi2".format( - len(suboutout) - ) - ] - + suboutout - ) + output.extend([ + '{0} ! Nr of off-diagonal terms; Ediss;Ro;gamma;rsigma;rpi;rpi2'. + format(len(suboutout)) + ] + suboutout) # three-body angle parameters suboutout = [] - for key in sorted(data["3body"]): - subdata = data["3body"][key] + for key in sorted(data['3body']): + subdata = data['3body'][key] if not set(subdata.keys()).issuperset(KEYS_3BODY_ANGLES): continue - suboutout.extend( - [ - " ".join([idx_map[k] for k in key.split(INDEX_SEP)]) - + " " - + " ".join([format_lammps_value(subdata[k]) for k in KEYS_3BODY_ANGLES]) - ] - ) + suboutout.extend([ + ' '.join([idx_map[k] for k in key.split(INDEX_SEP)]) + ' ' + + ' '.join( + [format_lammps_value(subdata[k]) for k in KEYS_3BODY_ANGLES]) + ]) - output.extend( - ["{0} ! Nr of angles;at1;at2;at3;Thetao,o;ka;kb;pv1;pv2".format(len(suboutout))] - + suboutout - ) + output.extend([ + '{0} ! Nr of angles;at1;at2;at3;Thetao,o;ka;kb;pv1;pv2'.format( + len(suboutout)) + ] + suboutout) # four-body torsion parameters suboutout = [] - for key in sorted(data["4body"]): - subdata = data["4body"][key] + for key in sorted(data['4body']): + subdata = data['4body'][key] if not set(subdata.keys()).issuperset(KEYS_4BODY_TORSION): continue - suboutout.extend( - [ - " ".join([idx_map[k] for k in key.split(INDEX_SEP)]) - + " " - + " ".join( - [format_lammps_value(subdata[k]) for k in KEYS_4BODY_TORSION] - ) - ] - ) + suboutout.extend([ + ' '.join([idx_map[k] for k in key.split(INDEX_SEP)]) + ' ' + + ' '.join( + [format_lammps_value(subdata[k]) for k in KEYS_4BODY_TORSION]) + ]) - output.extend( - [ - "{0} ! Nr of torsions;at1;at2;at3;at4;;V1;V2;V3;V2(BO);vconj;n.u;n".format( - len(suboutout) - ) - ] - + suboutout - ) + output.extend([ + '{0} ! Nr of torsions;at1;at2;at3;at4;;V1;V2;V3;V2(BO);vconj;n.u;n'. + format(len(suboutout)) + ] + suboutout) # three-body h-bond parameters suboutout = [] - for key in sorted(data["3body"]): - subdata = data["3body"][key] + for key in sorted(data['3body']): + subdata = data['3body'][key] if not set(subdata.keys()).issuperset(KEYS_3BODY_HBOND): continue - suboutout.extend( - [ - " ".join([idx_map[k] for k in key.split(INDEX_SEP)]) - + " " - + " ".join([format_lammps_value(subdata[k]) for k in KEYS_3BODY_HBOND]) - ] - ) + suboutout.extend([ + ' '.join([idx_map[k] for k in key.split(INDEX_SEP)]) + ' ' + + ' '.join( + [format_lammps_value(subdata[k]) for k in KEYS_3BODY_HBOND]) + ]) - output.extend( - ["{0} ! Nr of hydrogen bonds;at1;at2;at3;Rhb;Dehb;vhb1".format(len(suboutout))] - + suboutout - ) + output.extend([ + '{0} ! Nr of hydrogen bonds;at1;at2;at3;Rhb;Dehb;vhb1'.format( + len(suboutout)) + ] + suboutout) - output.append("") + output.append('') - return "\n".join(output) + return '\n'.join(output) def filter_by_species(data, species): @@ -632,21 +587,21 @@ def filter_by_species(data, species): """ species = sorted(list(set(species))) - if not set(species).issubset(data["species"]): + if not set(species).issubset(data['species']): raise AssertionError( - "the filter set ({}) is not a subset of the available species ({})".format( - set(species), set(data["species"]) - ) - ) + 'the filter set ({}) is not a subset of the available species ({})' + .format(set(species), set(data['species']))) data = copy.deepcopy(data) - indices = set([str(i) for i, s in enumerate(data["species"]) if s in species]) + indices = set( + [str(i) for i, s in enumerate(data['species']) if s in species]) def convert_indices(key): - return INDEX_SEP.join( - [str(species.index(data["species"][int(k)])) for k in key.split(INDEX_SEP)] - ) + return INDEX_SEP.join([ + str(species.index(data['species'][int(k)])) + for k in key.split(INDEX_SEP) + ]) - for key in ["1body", "2body", "3body", "4body"]: + for key in ['1body', '2body', '3body', '4body']: if key not in data: continue data[key] = { @@ -655,6 +610,6 @@ def convert_indices(key): if indices.issuperset(k.split(INDEX_SEP)) } - data["species"] = species + data['species'] = species return data diff --git a/aiida_lammps/common/utils.py b/aiida_lammps/common/utils.py index ee97a52..823535b 100644 --- a/aiida_lammps/common/utils.py +++ b/aiida_lammps/common/utils.py @@ -18,14 +18,14 @@ def convert_to_str(value): """convert True/False to yes/no and all values to strings""" if isinstance(value, bool): if value: - return "yes" - return "no" + return 'yes' + return 'no' return str(value) def _convert_values(value): if isinstance(value, (tuple, list)): - return " ".join([convert_to_str(v) for v in value]) + return ' '.join([convert_to_str(v) for v in value]) return convert_to_str(value) @@ -35,13 +35,10 @@ def join_keywords(dct, ignore=None): value can be a single value or a list/tuple of values """ ignore = [] if not ignore else ignore - return " ".join( - [ - "{0} {1}".format(k, _convert_values(dct[k])) - for k in sorted(dct.keys()) - if k not in ignore - ] - ) + return ' '.join([ + '{0} {1}'.format(k, _convert_values(dct[k])) + for k in sorted(dct.keys()) if k not in ignore + ]) def get_path(dct, path, default=None, raise_error=True): @@ -50,7 +47,8 @@ def get_path(dct, path, default=None, raise_error=True): for i, key in enumerate(path): if not isinstance(subdct, dict) or key not in subdct: if raise_error: - raise KeyError("path does not exist in dct: {}".format(path[0 : i + 1])) + raise KeyError('path does not exist in dct: {}'.format( + path[0:i + 1])) else: return default subdct = subdct[key] diff --git a/aiida_lammps/data/pot_plugins/base_plugin.py b/aiida_lammps/data/pot_plugins/base_plugin.py index 38bdc1b..2eb4616 100644 --- a/aiida_lammps/data/pot_plugins/base_plugin.py +++ b/aiida_lammps/data/pot_plugins/base_plugin.py @@ -3,7 +3,6 @@ class PotentialAbstract(abc.ABC): """Abstract class for potential plugins.""" - def __init__(self, data): self.validate_data(data) self.data = data diff --git a/aiida_lammps/data/pot_plugins/eam.py b/aiida_lammps/data/pot_plugins/eam.py index 284d34a..218855d 100644 --- a/aiida_lammps/data/pot_plugins/eam.py +++ b/aiida_lammps/data/pot_plugins/eam.py @@ -4,42 +4,42 @@ class EAM(PotentialAbstract): """Class for creation of EAM potential inputs.""" - potential_fname = "potential.pot" + potential_fname = 'potential.pot' def validate_data(self, data): """Validate the input data.""" # TODO use schema - assert "file_contents" in data, data - assert "type" in data, data + assert 'file_contents' in data, data + assert 'type' in data, data def get_external_content(self): # potential_file = ( # "# Potential file generated by aiida plugin " # "(please check citation in the orignal file)\n" # ) - potential_file = "" - for line in self.data["file_contents"]: - potential_file += "{}".format(line) + potential_file = '' + for line in self.data['file_contents']: + potential_file += '{}'.format(line) return {self.potential_fname: potential_file} def get_input_potential_lines(self): - lammps_input_text = "pair_style eam/{}\n".format(self.data["type"]) - lammps_input_text += "pair_coeff * * {0} {{kind_symbols}}\n".format( - self.potential_fname - ) + lammps_input_text = 'pair_style eam/{}\n'.format( + self.data['type']) + lammps_input_text += 'pair_coeff * * {0} {{kind_symbols}}\n'.format( + self.potential_fname) return lammps_input_text @property def allowed_element_names(self): - return self.data.get("element_names", None) + return self.data.get('element_names', None) @property def atom_style(self): - return "atomic" + return 'atomic' @property def default_units(self): - return "metal" + return 'metal' diff --git a/aiida_lammps/data/pot_plugins/lennard_jones.py b/aiida_lammps/data/pot_plugins/lennard_jones.py index 3fa8414..93c3f26 100644 --- a/aiida_lammps/data/pot_plugins/lennard_jones.py +++ b/aiida_lammps/data/pot_plugins/lennard_jones.py @@ -5,7 +5,6 @@ class LennardJones(PotentialAbstract): """Class for creation of Lennard-Jones potential inputs.""" - def validate_data(self, data): """Validate the input data.""" pass @@ -17,12 +16,13 @@ def get_input_potential_lines(self): cut = np.max([float(i.split()[2]) for i in self.data.values()]) - lammps_input_text = "pair_style lj/cut {}\n".format(cut) + lammps_input_text = 'pair_style lj/cut {}\n'.format(cut) # TODO how to map kinds to pair coefficient for lj? for key in sorted(self.data.keys()): - lammps_input_text += "pair_coeff {} {}\n".format(key, self.data[key]) + lammps_input_text += 'pair_coeff {} {}\n'.format( + key, self.data[key]) return lammps_input_text @property @@ -31,8 +31,8 @@ def allowed_element_names(self): @property def atom_style(self): - return "atomic" + return 'atomic' @property def default_units(self): - return "metal" + return 'metal' diff --git a/aiida_lammps/data/pot_plugins/reaxff.py b/aiida_lammps/data/pot_plugins/reaxff.py index 8b96f73..252e684 100644 --- a/aiida_lammps/data/pot_plugins/reaxff.py +++ b/aiida_lammps/data/pot_plugins/reaxff.py @@ -28,65 +28,65 @@ class Reaxff(PotentialAbstract): """ - potential_fname = "potential.pot" - control_fname = "potential.control" + potential_fname = 'potential.pot' + control_fname = 'potential.control' def validate_data(self, data): """Validate the input data.""" - validate_against_schema(data, "reaxff.schema.json") + validate_against_schema(data, 'reaxff.schema.json') def get_potential_file_content(self): - if "file_contents" in self.data: - content = "" - for line in self.data["file_contents"]: - content += "{}".format(line) + if 'file_contents' in self.data: + content = '' + for line in self.data['file_contents']: + content += '{}'.format(line) else: content = write_lammps_format(self.data) return content def get_control_file_content(self): - control = self.data.get("control", {}) - global_dict = self.data.get("global", {}) + control = self.data.get('control', {}) + global_dict = self.data.get('global', {}) content = [] tolerances = { - "hbonddist": "hbond_cutoff", - "nbrhood_cutoff": "nbrhood_cutoff", - "anglemin": "thb_cutoff", - "angleprod": "thb_cutoff_sq", + 'hbonddist': 'hbond_cutoff', + 'nbrhood_cutoff': 'nbrhood_cutoff', + 'anglemin': 'thb_cutoff', + 'angleprod': 'thb_cutoff_sq', } for key, name in tolerances.items(): if key in global_dict: - content.append("{} {}".format(name, global_dict[key])) + content.append('{} {}'.format(name, global_dict[key])) control_variables = [ - "simulation_name", - "traj_title", - "tabulate_long_range", - "energy_update_freq", - "write_freq", - "bond_graph_cutoff", + 'simulation_name', + 'traj_title', + 'tabulate_long_range', + 'energy_update_freq', + 'write_freq', + 'bond_graph_cutoff', ] for name in control_variables: if name in control: - content.append("{} {}".format(name, control[name])) + content.append('{} {}'.format(name, control[name])) bool_to_int = { - "print_atom_info": "atom_info", - "print_atom_forces": "atom_forces", - "print_atom_velocities": "atom_velocities", - "print_bond_info": "bond_info", - "print_angle_info": "angle_info", + 'print_atom_info': 'atom_info', + 'print_atom_forces': 'atom_forces', + 'print_atom_velocities': 'atom_velocities', + 'print_bond_info': 'bond_info', + 'print_angle_info': 'angle_info', } for key, name in bool_to_int.items(): if key in control: - content.append("{} {}".format(name, 1 if control[key] else 0)) + content.append('{} {}'.format(name, 1 if control[key] else 0)) if content: - return "\n".join(content) + return '\n'.join(content) return None def get_external_content(self): @@ -99,32 +99,30 @@ def get_external_content(self): def get_input_potential_lines(self): - control = self.data.get("control", {}) - - lammps_input_text = "pair_style reax/c {} ".format( - self.control_fname if self.get_control_file_content() else "NULL" - ) - if "safezone" in control: - lammps_input_text += "safezone {0} ".format(control["safezone"]) - lammps_input_text += "\n" - lammps_input_text += "pair_coeff * * {} {{kind_symbols}}\n".format( - self.potential_fname - ) - lammps_input_text += "fix qeq all qeq/reax 1 0.0 10.0 1e-6 reax/c\n" - if control.get("fix_modify_qeq", True): + control = self.data.get('control', {}) + + lammps_input_text = 'pair_style reax/c {} '.format( + self.control_fname if self.get_control_file_content() else 'NULL') + if 'safezone' in control: + lammps_input_text += 'safezone {0} '.format(control['safezone']) + lammps_input_text += '\n' + lammps_input_text += 'pair_coeff * * {} {{kind_symbols}}\n'.format( + self.potential_fname) + lammps_input_text += 'fix qeq all qeq/reax 1 0.0 10.0 1e-6 reax/c\n' + if control.get('fix_modify_qeq', True): # TODO #15 in conda-forge/osx-64::lammps-2019.06.05-py36_openmpi_5, # an error is raised: ERROR: Illegal fix_modify command (src/fix.cpp:147) # posted question to lammps-users@lists.sourceforge.net # 'Using qeq/reax fix_modify energy in recent versions of LAMMPS' # lammps_input_text += "fix_modify qeq energy yes\n" pass - lammps_input_text += "compute reax all pair reax/c\n" + lammps_input_text += 'compute reax all pair reax/c\n' return lammps_input_text @property def allowed_element_names(self): - elements = self.data.get("species", None) + elements = self.data.get('species', None) if elements: # strip core/shell elements = [e.split()[0] for e in elements] @@ -132,8 +130,8 @@ def allowed_element_names(self): @property def atom_style(self): - return "charge" + return 'charge' @property def default_units(self): - return "real" + return 'real' diff --git a/aiida_lammps/data/pot_plugins/tersoff.py b/aiida_lammps/data/pot_plugins/tersoff.py index 1ac3add..5b8514c 100644 --- a/aiida_lammps/data/pot_plugins/tersoff.py +++ b/aiida_lammps/data/pot_plugins/tersoff.py @@ -4,28 +4,25 @@ class Tersoff(PotentialAbstract): """Class for creation of Tersoff potential inputs.""" - potential_fname = "potential.pot" + potential_fname = 'potential.pot' def validate_data(self, data): """Validate the input data.""" pass def get_external_content(self): - potential_file = ( - "# Potential file generated by aiida plugin " - "(please check citation in the original file)\n" - ) + potential_file = ('# Potential file generated by aiida plugin ' + '(please check citation in the original file)\n') for key in sorted(self.data.keys()): - potential_file += "{} {}\n".format(key, self.data[key]) + potential_file += '{} {}\n'.format(key, self.data[key]) return {self.potential_fname: potential_file} def get_input_potential_lines(self): - lammps_input_text = "pair_style tersoff\n" - lammps_input_text += "pair_coeff * * {} {{kind_symbols}}\n".format( - self.potential_fname - ) + lammps_input_text = 'pair_style tersoff\n' + lammps_input_text += 'pair_coeff * * {} {{kind_symbols}}\n'.format( + self.potential_fname) return lammps_input_text @@ -38,8 +35,8 @@ def allowed_element_names(self): @property def atom_style(self): - return "atomic" + return 'atomic' @property def default_units(self): - return "metal" + return 'metal' diff --git a/aiida_lammps/data/potential.py b/aiida_lammps/data/potential.py index ba93375..4e7caba 100644 --- a/aiida_lammps/data/potential.py +++ b/aiida_lammps/data/potential.py @@ -10,8 +10,8 @@ class EmpiricalPotential(Data): Store the empirical potential data """ - entry_name = "lammps.potentials" - pot_lines_fname = "potential_lines.txt" + entry_name = 'lammps.potentials' + pot_lines_fname = 'potential_lines.txt' @classmethod def list_types(cls): @@ -40,9 +40,8 @@ def set_data(self, potential_type, data=None): if potential_type is None: raise ValueError("'potential_type' must be provided") if potential_type not in self.list_types(): - raise ValueError( - "'potential_type' must be in: {}".format(self.list_types()) - ) + raise ValueError("'potential_type' must be in: {}".format( + self.list_types())) pot_class = self.load_type(potential_type)(data or {}) atom_style = pot_class.atom_style @@ -52,32 +51,31 @@ def set_data(self, potential_type, data=None): external_contents = pot_class.get_external_content() or {} pot_lines = pot_class.get_input_potential_lines() - self.set_attribute("potential_type", potential_type) - self.set_attribute("atom_style", atom_style) - self.set_attribute("default_units", default_units) + self.set_attribute('potential_type', potential_type) + self.set_attribute('atom_style', atom_style) + self.set_attribute('default_units', default_units) self.set_attribute( - "allowed_element_names", + 'allowed_element_names', sorted(allowed_element_names) - if allowed_element_names - else allowed_element_names, + if allowed_element_names else allowed_element_names, ) # store potential section of main input file - self.set_attribute( - "md5|input_lines", md5(pot_lines.encode("utf-8")).hexdigest() - ) - self.put_object_from_filelike(StringIO(pot_lines), self.pot_lines_fname) + self.set_attribute('md5|input_lines', + md5(pot_lines.encode('utf-8')).hexdigest()) + self.put_object_from_filelike(StringIO(pot_lines), + self.pot_lines_fname) # store external files required by the potential external_files = [] for fname, content in external_contents.items(): self.set_attribute( - "md5|{}".format(fname.replace(".", "_")), - md5(content.encode("utf-8")).hexdigest(), + 'md5|{}'.format(fname.replace('.', '_')), + md5(content.encode('utf-8')).hexdigest(), ) self.put_object_from_filelike(StringIO(content), fname) external_files.append(fname) - self.set_attribute("external_files", sorted(external_files)) + self.set_attribute('external_files', sorted(external_files)) # delete any previously stored files that are no longer required for fname in self.list_object_names(): @@ -87,22 +85,22 @@ def set_data(self, potential_type, data=None): @property def potential_type(self): """Return lammps atom style.""" - return self.get_attribute("potential_type") + return self.get_attribute('potential_type') @property def atom_style(self): """Return lammps atom style.""" - return self.get_attribute("atom_style") + return self.get_attribute('atom_style') @property def default_units(self): """Return lammps default units.""" - return self.get_attribute("default_units") + return self.get_attribute('default_units') @property def allowed_element_names(self): """Return available atomic symbols.""" - return self.get_attribute("allowed_element_names") + return self.get_attribute('allowed_element_names') def get_input_lines(self, kind_symbols=None): """Return the command(s) required to setup the potential. @@ -121,14 +119,14 @@ def get_input_lines(self, kind_symbols=None): pair_coeff * * S Cr """ - content = self.get_object_content(self.pot_lines_fname, "r") + content = self.get_object_content(self.pot_lines_fname, 'r') if kind_symbols: - content = content.replace("{kind_symbols}", " ".join(kind_symbols)) + content = content.replace('{kind_symbols}', ' '.join(kind_symbols)) return content def get_external_files(self): """Return the mapping of external filenames to content.""" fmap = {} - for fname in self.get_attribute("external_files"): - fmap[fname] = self.get_object_content(fname, "r") + for fname in self.get_attribute('external_files'): + fmap[fname] = self.get_object_content(fname, 'r') return fmap diff --git a/aiida_lammps/data/trajectory.py b/aiida_lammps/data/trajectory.py index 6b8d562..3c57212 100644 --- a/aiida_lammps/data/trajectory.py +++ b/aiida_lammps/data/trajectory.py @@ -19,9 +19,9 @@ class LammpsTrajectory(Data): """ - _zip_prefix = "step-" - _traj_filename = "trajectory.zip" - _timestep_filename = "timesteps.txt" + _zip_prefix = 'step-' + _traj_filename = 'trajectory.zip' + _timestep_filename = 'timesteps.txt' _compression_method = ZIP_DEFLATED def __init__(self, fileobj=None, aliases=None, **kwargs): @@ -50,8 +50,8 @@ def _validate(self): from aiida.common.exceptions import ValidationError super(LammpsTrajectory, self)._validate() - if self.get_attribute("number_steps", None) is None: - raise ValidationError("trajectory has not yet been set") + if self.get_attribute('number_steps', None) is None: + raise ValidationError('trajectory has not yet been set') def set_from_fileobj(self, fileobj, aliases=None): """Store a lammps trajectory file. @@ -72,12 +72,14 @@ def set_from_fileobj(self, fileobj, aliases=None): self.reset_attributes({}) if not (aliases is None or isinstance(aliases, dict)): - raise ValueError("aliases must be None or dict") + raise ValueError('aliases must be None or dict') # Write the zip to a temporary file, and then add it to the node repository with tempfile.NamedTemporaryFile() as temp_handle: - with ZipFile(temp_handle, "w", self._compression_method) as zip_file: - for step_id, traj_step in enumerate(iter_trajectories(fileobj)): + with ZipFile(temp_handle, 'w', + self._compression_method) as zip_file: + for step_id, traj_step in enumerate( + iter_trajectories(fileobj)): # extract data to store in attributes time_steps.append(traj_step.timestep) @@ -85,85 +87,84 @@ def set_from_fileobj(self, fileobj, aliases=None): number_atoms = traj_step.natoms elif traj_step.natoms != number_atoms: raise IOError( - "step {} contains different number of atoms: {}".format( - step_id, traj_step.natoms - ) - ) + 'step {} contains different number of atoms: {}'. + format(step_id, traj_step.natoms)) if field_names is None: field_names = list(traj_step.atom_fields.keys()) elif field_names != list(traj_step.atom_fields.keys()): raise IOError( - "step {} contains different field names: {}".format( - step_id, list(traj_step.atom_fields.keys()) - ) - ) - if "element" in traj_step.atom_fields: - elements.update(traj_step.atom_fields["element"]) + 'step {} contains different field names: {}'. + format(step_id, + list(traj_step.atom_fields.keys()))) + if 'element' in traj_step.atom_fields: + elements.update(traj_step.atom_fields['element']) # save content - content = "\n".join(traj_step.lines) - zip_name = "{}{}".format(self._zip_prefix, step_id) + content = '\n'.join(traj_step.lines) + zip_name = '{}{}'.format(self._zip_prefix, step_id) zip_file.writestr(zip_name, content) if not time_steps: - raise IOError("The trajectory file does not contain any timesteps") + raise IOError( + 'The trajectory file does not contain any timesteps') # Flush and rewind the temporary handle, # otherwise the command to store it in the repo will write an empty file temp_handle.flush() temp_handle.seek(0) - self.put_object_from_filelike( - temp_handle, self._traj_filename, mode="wb", encoding=None - ) + self.put_object_from_filelike(temp_handle, + self._traj_filename, + mode='wb', + encoding=None) self.put_object_from_filelike( - io.StringIO(" ".join([str(t) for t in time_steps])), self._timestep_filename - ) - - self.set_attribute("number_steps", len(time_steps)) - self.set_attribute("number_atoms", number_atoms) - self.set_attribute("field_names", list(sorted(field_names))) - self.set_attribute("traj_filename", self._traj_filename) - self.set_attribute("timestep_filename", self._timestep_filename) - self.set_attribute("zip_prefix", self._zip_prefix) - self.set_attribute("compression_method", self._compression_method) - self.set_attribute("aliases", aliases) - self.set_attribute("elements", list(sorted(elements))) + io.StringIO(' '.join([str(t) for t in time_steps])), + self._timestep_filename) + + self.set_attribute('number_steps', len(time_steps)) + self.set_attribute('number_atoms', number_atoms) + self.set_attribute('field_names', list(sorted(field_names))) + self.set_attribute('traj_filename', self._traj_filename) + self.set_attribute('timestep_filename', self._timestep_filename) + self.set_attribute('zip_prefix', self._zip_prefix) + self.set_attribute('compression_method', self._compression_method) + self.set_attribute('aliases', aliases) + self.set_attribute('elements', list(sorted(elements))) @property def number_steps(self): - return self.get_attribute("number_steps") + return self.get_attribute('number_steps') @property def time_steps(self): - with self.open(self.get_attribute("timestep_filename"), "r") as handle: + with self.open(self.get_attribute('timestep_filename'), 'r') as handle: output = [int(i) for i in handle.readline().split()] return output @property def number_atoms(self): - return self.get_attribute("number_atoms") + return self.get_attribute('number_atoms') @property def field_names(self): - return self.get_attribute("field_names") + return self.get_attribute('field_names') @property def aliases(self): - return self.get_attribute("aliases") + return self.get_attribute('aliases') def get_step_string(self, step_idx): """Return the content string, for a specific trajectory step.""" step_idx = list(range(self.number_steps))[step_idx] - zip_name = "{}{}".format(self.get_attribute("zip_prefix"), step_idx) - with self.open(self.get_attribute("traj_filename"), mode="rb") as handle: - with ZipFile( - handle, "r", self.get_attribute("compression_method") - ) as zip_file: - with zip_file.open(zip_name, "r") as step_file: + zip_name = '{}{}'.format(self.get_attribute('zip_prefix'), step_idx) + with self.open(self.get_attribute('traj_filename'), + mode='rb') as handle: + with ZipFile(handle, 'r', + self.get_attribute('compression_method')) as zip_file: + with zip_file.open(zip_name, 'r') as step_file: content = step_file.read() - return content.decode("utf8") + return content.decode('utf8') def get_step_data(self, step_idx): """Return parsed data, for a specific trajectory step.""" @@ -177,22 +178,23 @@ def iter_step_strings(self, steps=None): elif isinstance(steps, int): steps = range(0, self.number_steps, steps) - with self.open(self.get_attribute("traj_filename"), mode="rb") as handle: - with ZipFile( - handle, "r", self.get_attribute("compression_method") - ) as zip_file: + with self.open(self.get_attribute('traj_filename'), + mode='rb') as handle: + with ZipFile(handle, 'r', + self.get_attribute('compression_method')) as zip_file: for step_idx in steps: - zip_name = "{}{}".format(self.get_attribute("zip_prefix"), step_idx) + zip_name = '{}{}'.format(self.get_attribute('zip_prefix'), + step_idx) with zip_file.open(zip_name) as step_file: content = step_file.read() yield content def get_step_structure( - self, - step_idx, - symbol_field="element", - position_fields=("x", "y", "z"), - original_structure=None, + self, + step_idx, + symbol_field='element', + position_fields=('x', 'y', 'z'), + original_structure=None, ): """Return a StructureData object, for a specific trajectory step. @@ -226,4 +228,4 @@ def write_as_lammps(self, handle, steps=None): """ for string in self.iter_step_strings(steps=steps): handle.write(string) - handle.write(b"\n") + handle.write(b'\n') diff --git a/aiida_lammps/parsers/dynaphopy.py b/aiida_lammps/parsers/dynaphopy.py index 798aafa..2149765 100644 --- a/aiida_lammps/parsers/dynaphopy.py +++ b/aiida_lammps/parsers/dynaphopy.py @@ -14,7 +14,6 @@ class DynaphopyParser(Parser): """ Simple Parser for LAMMPS. """ - def __init__(self, calc): """ Initialize the instance of LammpsParser @@ -34,7 +33,7 @@ def parse_with_retrieved(self, retrieved): try: out_folder = retrieved[self._calc._get_linkname_retrieved()] except KeyError: - self.logger.error("No retrieved folder found") + self.logger.error('No retrieved folder found') return False, () # check what is inside the folder @@ -49,8 +48,7 @@ def parse_with_retrieved(self, retrieved): # Get file and do the parsing outfile = out_folder.get_abs_path(self._calc._OUTPUT_FILE_NAME) force_constants_file = out_folder.get_abs_path( - self._calc._OUTPUT_FORCE_CONSTANTS - ) + self._calc._OUTPUT_FORCE_CONSTANTS) qp_file = out_folder.get_abs_path(self._calc._OUTPUT_QUASIPARTICLES) try: @@ -79,26 +77,23 @@ def parse_with_retrieved(self, retrieved): # save phonon data into node try: new_nodes_list.append( - ("quasiparticle_data", ParameterData(dict=quasiparticle_data)) - ) + ('quasiparticle_data', ParameterData(dict=quasiparticle_data))) except KeyError: # keys not pass try: new_nodes_list.append( - ("thermal_properties", ParameterData(dict=thermal_properties)) - ) + ('thermal_properties', ParameterData(dict=thermal_properties))) except KeyError: # keys not pass try: - new_nodes_list.append(("force_constants", force_constants)) + new_nodes_list.append(('force_constants', force_constants)) except KeyError: # keys not pass # add the dictionary with warnings - new_nodes_list.append( - (self.get_linkname_outparams(), ParameterData(dict={"warnings": warnings})) - ) + new_nodes_list.append((self.get_linkname_outparams(), + ParameterData(dict={'warnings': warnings}))) return successful, new_nodes_list diff --git a/aiida_lammps/parsers/lammps/base.py b/aiida_lammps/parsers/lammps/base.py index 92e409a..9a60e2f 100644 --- a/aiida_lammps/parsers/lammps/base.py +++ b/aiida_lammps/parsers/lammps/base.py @@ -10,98 +10,97 @@ from aiida_lammps.common.raw_parsers import read_log_file ParsingResources = namedtuple( - "ParsingResources", ["exit_code", "sys_paths", "traj_paths", "restart_paths"] -) + 'ParsingResources', + ['exit_code', 'sys_paths', 'traj_paths', 'restart_paths']) class LAMMPSBaseParser(Parser): """Abstract Base Parser for LAMMPS, supplying common methods.""" - def __init__(self, node): """Initialize the parser.""" super(LAMMPSBaseParser, self).__init__(node) - def get_parsing_resources(self, kwargs, traj_in_temp=False, sys_in_temp=True): + def get_parsing_resources(self, + kwargs, + traj_in_temp=False, + sys_in_temp=True): """Check that all resources, required for parsing, are present.""" # Check for retrieved folder try: out_folder = self.retrieved except exceptions.NotExistent: - return ParsingResources( - self.exit_codes.ERROR_NO_RETRIEVED_FOLDER, None, None, None - ) + return ParsingResources(self.exit_codes.ERROR_NO_RETRIEVED_FOLDER, + None, None, None) # Check for temporary folder if traj_in_temp or sys_in_temp: - if "retrieved_temporary_folder" not in kwargs: + if 'retrieved_temporary_folder' not in kwargs: return ParsingResources( - self.exit_codes.ERROR_NO_RETRIEVED_TEMP_FOLDER, None, None, None - ) - temporary_folder = kwargs["retrieved_temporary_folder"] + self.exit_codes.ERROR_NO_RETRIEVED_TEMP_FOLDER, None, None, + None) + temporary_folder = kwargs['retrieved_temporary_folder'] list_of_temp_files = os.listdir(temporary_folder) # check what is inside the folder list_of_files = out_folder.list_object_names() # check log file - if self.node.get_option("output_filename") not in list_of_files: - return ParsingResources( - self.exit_codes.ERROR_LOG_FILE_MISSING, None, None, None - ) + if self.node.get_option('output_filename') not in list_of_files: + return ParsingResources(self.exit_codes.ERROR_LOG_FILE_MISSING, + None, None, None) # check stdin and stdout - if self.node.get_option("scheduler_stdout") not in list_of_files: - return ParsingResources( - self.exit_codes.ERROR_STDOUT_FILE_MISSING, None, None, None - ) - if self.node.get_option("scheduler_stderr") not in list_of_files: - return ParsingResources( - self.exit_codes.ERROR_STDERR_FILE_MISSING, None, None, None - ) + if self.node.get_option('scheduler_stdout') not in list_of_files: + return ParsingResources(self.exit_codes.ERROR_STDOUT_FILE_MISSING, + None, None, None) + if self.node.get_option('scheduler_stderr') not in list_of_files: + return ParsingResources(self.exit_codes.ERROR_STDERR_FILE_MISSING, + None, None, None) # check for system info file(s) - system_suffix = self.node.get_option("system_suffix") + system_suffix = self.node.get_option('system_suffix') system_filepaths = [] if sys_in_temp: for filename in list_of_temp_files: - if fnmatch(filename, "*" + system_suffix): - system_filepaths.append(os.path.join(temporary_folder, filename)) + if fnmatch(filename, '*' + system_suffix): + system_filepaths.append( + os.path.join(temporary_folder, filename)) else: for filename in list_of_files: - if fnmatch(filename, "*" + system_suffix): + if fnmatch(filename, '*' + system_suffix): system_filepaths.append(filename) # check for trajectory file(s) - trajectory_suffix = self.node.get_option("trajectory_suffix") + trajectory_suffix = self.node.get_option('trajectory_suffix') trajectory_filepaths = [] if traj_in_temp: for filename in list_of_temp_files: - if fnmatch(filename, "*" + trajectory_suffix): + if fnmatch(filename, '*' + trajectory_suffix): trajectory_filepaths.append( - os.path.join(temporary_folder, filename) - ) + os.path.join(temporary_folder, filename)) else: for filename in list_of_files: - if fnmatch(filename, "*" + trajectory_suffix): + if fnmatch(filename, '*' + trajectory_suffix): trajectory_filepaths.append(filename) # check for restart file(s) - restart_file = self.node.get_option("restart_filename") + restart_file = self.node.get_option('restart_filename') restart_filepaths = [] for filename in list_of_temp_files: - if fnmatch(filename, "*" + restart_file + "*"): - restart_filepaths.append(os.path.join(temporary_folder, filename)) + if fnmatch(filename, '*' + restart_file + '*'): + restart_filepaths.append( + os.path.join(temporary_folder, filename)) - return ParsingResources( - None, system_filepaths, trajectory_filepaths, restart_filepaths - ) + return ParsingResources(None, system_filepaths, trajectory_filepaths, + restart_filepaths) def parse_log_file(self, compute_stress=False): """Parse the log file.""" - output_filename = self.node.get_option("output_filename") + output_filename = self.node.get_option('output_filename') output_txt = self.retrieved.get_object_content(output_filename) try: - output_data = read_log_file(output_txt, compute_stress=compute_stress) + output_data = read_log_file(output_txt, + compute_stress=compute_stress) except Exception: traceback.print_exc() return None, self.exit_codes.ERROR_LOG_PARSING @@ -110,27 +109,25 @@ def parse_log_file(self, compute_stress=False): def add_warnings_and_errors(self, output_data): """Add warning and errors to the output data.""" # add the dictionary with warnings and errors - warnings = ( - self.retrieved.get_object_content(self.node.get_option("scheduler_stderr")) - .strip() - .splitlines() - ) + warnings = (self.retrieved.get_object_content( + self.node.get_option('scheduler_stderr')).strip().splitlines()) # for some reason, errors may be in the stdout, but not the log.lammps stdout = self.retrieved.get_object_content( - self.node.get_option("scheduler_stdout") - ) - errors = [line for line in stdout.splitlines() if line.startswith("ERROR")] - warnings.extend( - [line for line in stdout.splitlines() if line.startswith("WARNING")] - ) + self.node.get_option('scheduler_stdout')) + errors = [ + line for line in stdout.splitlines() if line.startswith('ERROR') + ] + warnings.extend([ + line for line in stdout.splitlines() if line.startswith('WARNING') + ]) for error in errors: self.logger.error(error) - output_data.setdefault("warnings", []).extend(warnings) - output_data.setdefault("errors", []).extend(errors) + output_data.setdefault('warnings', []).extend(warnings) + output_data.setdefault('errors', []).extend(errors) def add_standard_info(self, output_data): """Add standard information to output data.""" - output_data["parser_class"] = self.__class__.__name__ - output_data["parser_version"] = aiida_lammps_version + output_data['parser_class'] = self.__class__.__name__ + output_data['parser_version'] = aiida_lammps_version diff --git a/aiida_lammps/parsers/lammps/force.py b/aiida_lammps/parsers/lammps/force.py index d7443f6..ef60017 100644 --- a/aiida_lammps/parsers/lammps/force.py +++ b/aiida_lammps/parsers/lammps/force.py @@ -9,7 +9,6 @@ class ForceParser(LAMMPSBaseParser): """Parser for LAMMPS single point energy calculation.""" - def __init__(self, node): """Initialize the instance of Force Lammps Parser.""" super(ForceParser, self).__init__(node) @@ -32,68 +31,65 @@ def parse(self, **kwargs): else: try: array_data = self.parse_traj_file(resources.traj_paths[0]) - self.out("arrays", array_data) + self.out('arrays', array_data) except IOError as err: self.logger.error(str(err)) traj_error = self.exit_codes.ERROR_TRAJ_PARSING # save results into node - output_data = log_data["data"] - if "units_style" in output_data: + output_data = log_data['data'] + if 'units_style' in output_data: output_data.update( - get_units_dict( - output_data["units_style"], ["energy", "force", "distance"] - ) - ) + get_units_dict(output_data['units_style'], + ['energy', 'force', 'distance'])) else: - self.logger.warning("units missing in log") + self.logger.warning('units missing in log') self.add_warnings_and_errors(output_data) self.add_standard_info(output_data) parameters_data = Dict(dict=output_data) - self.out("results", parameters_data) + self.out('results', parameters_data) - if output_data["errors"]: + if output_data['errors']: return self.exit_codes.ERROR_LAMMPS_RUN if traj_error: return traj_error - if not log_data.get("found_end", False): + if not log_data.get('found_end', False): return self.exit_codes.ERROR_RUN_INCOMPLETE def parse_traj_file(self, trajectory_filename): - with self.retrieved.open(trajectory_filename, "r") as handle: + with self.retrieved.open(trajectory_filename, 'r') as handle: traj_steps = list(iter_trajectories(handle)) if not traj_steps: - raise IOError("trajectory file empty") + raise IOError('trajectory file empty') if len(traj_steps) > 1: - raise IOError("trajectory file has multiple steps (expecting only one)") + raise IOError( + 'trajectory file has multiple steps (expecting only one)') traj_step = traj_steps[0] # type: TRAJ_BLOCK - for field in ["fx", "fy", "fz"]: + for field in ['fx', 'fy', 'fz']: if field not in traj_step.atom_fields: raise IOError( - "trajectory file does not contain fields {}".format(field) - ) + 'trajectory file does not contain fields {}'.format(field)) array_data = ArrayData() array_data.set_array( - "forces", + 'forces', np.array( [ - traj_step.atom_fields["fx"], - traj_step.atom_fields["fy"], - traj_step.atom_fields["fz"], + traj_step.atom_fields['fx'], + traj_step.atom_fields['fy'], + traj_step.atom_fields['fz'], ], dtype=float, ).T, ) - if "q" in traj_step.atom_fields: + if 'q' in traj_step.atom_fields: array_data.set_array( - "charges", np.array(traj_step.atom_fields["q"], dtype=float) - ) + 'charges', np.array(traj_step.atom_fields['q'], dtype=float)) return array_data diff --git a/aiida_lammps/parsers/lammps/md.py b/aiida_lammps/parsers/lammps/md.py index b4f3653..737b9ce 100644 --- a/aiida_lammps/parsers/lammps/md.py +++ b/aiida_lammps/parsers/lammps/md.py @@ -10,7 +10,6 @@ class MdParser(LAMMPSBaseParser): """Parser for LAMMPS MD calculations.""" - def __init__(self, node): """Initialize the instance of Lammps MD Parser.""" super(MdParser, self).__init__(node) @@ -33,33 +32,31 @@ def parse(self, **kwargs): else: try: trajectory_data = LammpsTrajectory(resources.traj_paths[0]) - self.out("trajectory_data", trajectory_data) + self.out('trajectory_data', trajectory_data) except Exception as err: traceback.print_exc() self.logger.error(str(err)) traj_error = self.exit_codes.ERROR_TRAJ_PARSING # save results into node - output_data = log_data["data"] - if "units_style" in output_data: + output_data = log_data['data'] + if 'units_style' in output_data: output_data.update( - get_units_dict( - output_data["units_style"], ["distance", "time", "energy"] - ) - ) + get_units_dict(output_data['units_style'], + ['distance', 'time', 'energy'])) else: - self.logger.warning("units missing in log") + self.logger.warning('units missing in log') self.add_warnings_and_errors(output_data) self.add_standard_info(output_data) - if "parameters" in self.node.get_incoming().all_link_labels(): - output_data["timestep_picoseconds"] = convert_units( + if 'parameters' in self.node.get_incoming().all_link_labels(): + output_data['timestep_picoseconds'] = convert_units( self.node.inputs.parameters.dict.timestep, - output_data["units_style"], - "time", - "picoseconds", + output_data['units_style'], + 'time', + 'picoseconds', ) parameters_data = Dict(dict=output_data) - self.out("results", parameters_data) + self.out('results', parameters_data) # parse the system data file sys_data_error = None @@ -69,16 +66,19 @@ def parse(self, **kwargs): with open(resources.sys_paths[0]) as handle: names = handle.readline().strip().split() for i, col in enumerate( - np.loadtxt(resources.sys_paths[0], skiprows=1, unpack=True, ndmin=2) - ): + np.loadtxt(resources.sys_paths[0], + skiprows=1, + unpack=True, + ndmin=2)): sys_data.set_array(names[i], col) except Exception: traceback.print_exc() sys_data_error = self.exit_codes.ERROR_INFO_PARSING - sys_data.set_attribute("units_style", output_data.get("units_style", None)) - self.out("system_data", sys_data) + sys_data.set_attribute('units_style', + output_data.get('units_style', None)) + self.out('system_data', sys_data) - if output_data["errors"]: + if output_data['errors']: return self.exit_codes.ERROR_LAMMPS_RUN if traj_error: @@ -87,5 +87,5 @@ def parse(self, **kwargs): if sys_data_error: return sys_data_error - if not log_data.get("found_end", False): + if not log_data.get('found_end', False): return self.exit_codes.ERROR_RUN_INCOMPLETE diff --git a/aiida_lammps/parsers/lammps/md_multi.py b/aiida_lammps/parsers/lammps/md_multi.py index de2206b..3e3eafb 100644 --- a/aiida_lammps/parsers/lammps/md_multi.py +++ b/aiida_lammps/parsers/lammps/md_multi.py @@ -13,7 +13,6 @@ class MdMultiParser(LAMMPSBaseParser): """Parser for LAMMPS MDMulti calculations.""" - def __init__(self, node): """Initialize the instance of Lammps MD Parser.""" super(MdMultiParser, self).__init__(node) @@ -36,80 +35,77 @@ def parse(self, **kwargs): else: try: trajectories = { - os.path.basename(traj_path).split("-")[0]: LammpsTrajectory( - traj_path - ) + os.path.basename(traj_path).split('-')[0]: + LammpsTrajectory(traj_path) for traj_path in resources.traj_paths } - self.out("trajectory", trajectories) + self.out('trajectory', trajectories) except Exception as err: traceback.print_exc() self.logger.error(str(err)) traj_error = self.exit_codes.ERROR_TRAJ_PARSING # save results into node - output_data = log_data["data"] - if "units_style" in output_data: + output_data = log_data['data'] + if 'units_style' in output_data: output_data.update( - get_units_dict( - output_data["units_style"], ["distance", "time", "energy"] - ) - ) + get_units_dict(output_data['units_style'], + ['distance', 'time', 'energy'])) else: - self.logger.warning("units missing in log") + self.logger.warning('units missing in log') self.add_warnings_and_errors(output_data) self.add_standard_info(output_data) - if "parameters" in self.node.get_incoming().all_link_labels(): - output_data["timestep_picoseconds"] = convert_units( + if 'parameters' in self.node.get_incoming().all_link_labels(): + output_data['timestep_picoseconds'] = convert_units( self.node.inputs.parameters.dict.timestep, - output_data["units_style"], - "time", - "picoseconds", + output_data['units_style'], + 'time', + 'picoseconds', ) - output_data["stage_names"] = [ - s["name"] for s in self.node.inputs.parameters.dict.stages + output_data['stage_names'] = [ + s['name'] for s in self.node.inputs.parameters.dict.stages ] parameters_data = Dict(dict=output_data) - self.out("results", parameters_data) + self.out('results', parameters_data) # parse the system data file sys_data_error = None arrays = {} for sys_path in resources.sys_paths: - stage_name = os.path.basename(sys_path).split("-")[0] + stage_name = os.path.basename(sys_path).split('-')[0] sys_data = ArrayData() - sys_data.set_attribute("units_style", output_data.get("units_style", None)) + sys_data.set_attribute('units_style', + output_data.get('units_style', None)) try: with open(sys_path) as handle: names = handle.readline().strip().split() for i, col in enumerate( - np.loadtxt(sys_path, skiprows=1, unpack=True, ndmin=2) - ): + np.loadtxt(sys_path, skiprows=1, unpack=True, + ndmin=2)): sys_data.set_array(names[i], col) arrays[stage_name] = sys_data except Exception: traceback.print_exc() sys_data_error = self.exit_codes.ERROR_INFO_PARSING if arrays: - self.out("system", arrays) + self.out('system', arrays) # retrieve the last restart file, per stage restart_map = {} for rpath in resources.restart_paths: rpath_base = os.path.basename(rpath) - match = re.match(r"([^\-]*)\-.*\.([\d]+)", rpath_base) + match = re.match(r'([^\-]*)\-.*\.([\d]+)', rpath_base) if match: stage, step = match.groups() if int(step) > restart_map.get(stage, (-1, None))[0]: restart_map[stage] = (int(step), rpath) for stage, (step, rpath) in restart_map.items(): - with io.open(rpath, "rb") as handle: + with io.open(rpath, 'rb') as handle: self.retrieved.put_object_from_filelike( - handle, os.path.basename(rpath), "wb", force=True - ) + handle, os.path.basename(rpath), 'wb', force=True) - if output_data["errors"]: + if output_data['errors']: return self.exit_codes.ERROR_LAMMPS_RUN if traj_error: @@ -118,5 +114,5 @@ def parse(self, **kwargs): if sys_data_error: return sys_data_error - if not log_data.get("found_end", False): + if not log_data.get('found_end', False): return self.exit_codes.ERROR_RUN_INCOMPLETE diff --git a/aiida_lammps/parsers/lammps/optimize.py b/aiida_lammps/parsers/lammps/optimize.py index 7c99d8f..fac2f8b 100644 --- a/aiida_lammps/parsers/lammps/optimize.py +++ b/aiida_lammps/parsers/lammps/optimize.py @@ -9,7 +9,6 @@ class OptimizeParser(LAMMPSBaseParser): """Parser for LAMMPS optimization calculation.""" - def __init__(self, node): """Initialize the instance of Optimize Lammps Parser.""" super(OptimizeParser, self).__init__(node) @@ -32,16 +31,16 @@ def parse(self, **kwargs): trajectory_data = LammpsTrajectory( resources.traj_paths[0], aliases={ - "stresses": ["c_stpa[{}]".format(i + 1) for i in range(6)], - "forces": ["fx", "fy", "fz"], + 'stresses': + ['c_stpa[{}]'.format(i + 1) for i in range(6)], + 'forces': ['fx', 'fy', 'fz'], }, ) - self.out("trajectory_data", trajectory_data) + self.out('trajectory_data', trajectory_data) self.out( - "structure", + 'structure', trajectory_data.get_step_structure( - -1, original_structure=self.node.inputs.structure - ), + -1, original_structure=self.node.inputs.structure), ) except Exception as err: traceback.print_exc() @@ -49,27 +48,26 @@ def parse(self, **kwargs): traj_error = self.exit_codes.ERROR_TRAJ_PARSING # save results into node - output_data = log_data["data"] - if "units_style" in output_data: + output_data = log_data['data'] + if 'units_style' in output_data: output_data.update( get_units_dict( - output_data["units_style"], - ["energy", "force", "distance", "pressure"], - ) - ) - output_data["stress_units"] = output_data.pop("pressure_units") + output_data['units_style'], + ['energy', 'force', 'distance', 'pressure'], + )) + output_data['stress_units'] = output_data.pop('pressure_units') else: - self.logger.warning("units missing in log") + self.logger.warning('units missing in log') self.add_warnings_and_errors(output_data) self.add_standard_info(output_data) parameters_data = Dict(dict=output_data) - self.out("results", parameters_data) + self.out('results', parameters_data) - if output_data["errors"]: + if output_data['errors']: return self.exit_codes.ERROR_LAMMPS_RUN if traj_error: return traj_error - if not log_data.get("found_end", False): + if not log_data.get('found_end', False): return self.exit_codes.ERROR_RUN_INCOMPLETE diff --git a/aiida_lammps/tests/test_calculations.py b/aiida_lammps/tests/test_calculations.py index 1d8d72d..33adcbb 100644 --- a/aiida_lammps/tests/test_calculations.py +++ b/aiida_lammps/tests/test_calculations.py @@ -14,98 +14,138 @@ def get_lammps_version(code): def get_calc_parameters(lammps_version, plugin_name, units, potential_type): - if potential_type == "reaxff": - output_variables = ["temp", "etotal", "c_reax[1]"] - thermo_keywords = ["c_reax[1]"] + if potential_type == 'reaxff': + output_variables = ['temp', 'etotal', 'c_reax[1]'] + thermo_keywords = ['c_reax[1]'] else: - output_variables = ["temp", "etotal"] + output_variables = ['temp', 'etotal'] thermo_keywords = [] - if plugin_name == "lammps.force": + if plugin_name == 'lammps.force': parameters_opt = { - "lammps_version": lammps_version, - "output_variables": output_variables, - "thermo_keywords": thermo_keywords, + 'lammps_version': lammps_version, + 'output_variables': output_variables, + 'thermo_keywords': thermo_keywords, } - elif plugin_name == "lammps.optimize": + elif plugin_name == 'lammps.optimize': parameters_opt = { - "lammps_version": lammps_version, - "units": units, - "relax": {"type": "iso", "pressure": 0.0, "vmax": 0.001}, - "minimize": { - "style": "cg", - "energy_tolerance": 1.0e-25, - "force_tolerance": 1.0e-25, - "max_evaluations": 100000, - "max_iterations": 50000, + 'lammps_version': lammps_version, + 'units': units, + 'relax': { + 'type': 'iso', + 'pressure': 0.0, + 'vmax': 0.001 }, - "output_variables": output_variables, - "thermo_keywords": thermo_keywords, + 'minimize': { + 'style': 'cg', + 'energy_tolerance': 1.0e-25, + 'force_tolerance': 1.0e-25, + 'max_evaluations': 100000, + 'max_iterations': 50000, + }, + 'output_variables': output_variables, + 'thermo_keywords': thermo_keywords, } - elif plugin_name == "lammps.md": + elif plugin_name == 'lammps.md': parameters_opt = { - "lammps_version": lammps_version, - "units": units, - "rand_seed": 12345, - "timestep": 0.001, - "integration": {"style": "nvt", "constraints": {"temp": [300, 300, 0.5]}}, - "neighbor": [0.3, "bin"], - "neigh_modify": {"every": 1, "delay": 0, "check": False}, - "equilibrium_steps": 100, - "total_steps": 1000, - "dump_rate": 10, - "restart": 100, - "output_variables": output_variables, - "thermo_keywords": thermo_keywords, + 'lammps_version': lammps_version, + 'units': units, + 'rand_seed': 12345, + 'timestep': 0.001, + 'integration': { + 'style': 'nvt', + 'constraints': { + 'temp': [300, 300, 0.5] + } + }, + 'neighbor': [0.3, 'bin'], + 'neigh_modify': { + 'every': 1, + 'delay': 0, + 'check': False + }, + 'equilibrium_steps': 100, + 'total_steps': 1000, + 'dump_rate': 10, + 'restart': 100, + 'output_variables': output_variables, + 'thermo_keywords': thermo_keywords, } - elif plugin_name == "lammps.md.multi": + elif plugin_name == 'lammps.md.multi': parameters_opt = { - "lammps_version": lammps_version, - "units": units, - "timestep": 0.001, - "neighbor": [0.3, "bin"], - "neigh_modify": {"every": 1, "delay": 0, "check": False}, - "thermo_keywords": thermo_keywords, - "velocity": [ + 'lammps_version': + lammps_version, + 'units': + units, + 'timestep': + 0.001, + 'neighbor': [0.3, 'bin'], + 'neigh_modify': { + 'every': 1, + 'delay': 0, + 'check': False + }, + 'thermo_keywords': + thermo_keywords, + 'velocity': [ { - "style": "create", - "args": [300, 12345], - "keywords": {"dist": "gaussian", "mom": True}, + 'style': 'create', + 'args': [300, 12345], + 'keywords': { + 'dist': 'gaussian', + 'mom': True + }, + }, + { + 'style': 'scale', + 'args': [300] }, - {"style": "scale", "args": [300]}, ], - "stages": [ + 'stages': [ { - "name": "thermalise", - "steps": 100, - "integration": { - "style": "nvt", - "constraints": {"temp": [300, 300, 0.5]}, + 'name': 'thermalise', + 'steps': 100, + 'integration': { + 'style': 'nvt', + 'constraints': { + 'temp': [300, 300, 0.5] + }, + }, + 'output_atom': { + 'dump_rate': 10 + }, + 'output_system': { + 'dump_rate': 100, + 'variables': output_variables }, - "output_atom": {"dump_rate": 10}, - "output_system": {"dump_rate": 100, "variables": output_variables}, }, { - "name": "equilibrate", - "steps": 400, - "integration": { - "style": "nvt", - "constraints": {"temp": [300, 300, 0.5]}, + 'name': 'equilibrate', + 'steps': 400, + 'integration': { + 'style': 'nvt', + 'constraints': { + 'temp': [300, 300, 0.5] + }, }, - "computes": [{"id": "cna", "style": "cna/atom", "args": [3.0]}], - "output_atom": { - "dump_rate": 100, - "average_rate": 10, - "ave_variables": ["xu", "yu", "zu"], - "variables": ["c_cna"], + 'computes': [{ + 'id': 'cna', + 'style': 'cna/atom', + 'args': [3.0] + }], + 'output_atom': { + 'dump_rate': 100, + 'average_rate': 10, + 'ave_variables': ['xu', 'yu', 'zu'], + 'variables': ['c_cna'], }, - "output_system": { - "dump_rate": 10, - "average_rate": 2, - "ave_variables": output_variables, + 'output_system': { + 'dump_rate': 10, + 'average_rate': 2, + 'ave_variables': output_variables, }, - "restart_rate": 200, + 'restart_rate': 200, }, ], } @@ -117,161 +157,149 @@ def get_calc_parameters(lammps_version, plugin_name, units, potential_type): def sanitize_results(results_dict, round_dp_all=None, round_energy=None): """Sanitize the results dictionary for test regression.""" - results_dict.pop("parser_version") - results_dict.pop("warnings") - results_dict.pop("steps_per_second", None) - results_dict.pop("total_wall_time", None) - if round_energy and "energy" in results_dict: - results_dict["energy"] = round(results_dict["energy"], round_energy) + results_dict.pop('parser_version') + results_dict.pop('warnings') + results_dict.pop('steps_per_second', None) + results_dict.pop('total_wall_time', None) + if round_energy and 'energy' in results_dict: + results_dict['energy'] = round(results_dict['energy'], round_energy) if round_dp_all: results_dict = tests.recursive_round(results_dict, round_dp_all) return results_dict @pytest.mark.parametrize( - "potential_type,calc_type", + 'potential_type,calc_type', [ - ("lennard-jones", "lammps.force"), - ("tersoff", "lammps.optimize"), - ("eam", "lammps.md"), - ("reaxff", "lammps.md.multi"), + ('lennard-jones', 'lammps.force'), + ('tersoff', 'lammps.optimize'), + ('eam', 'lammps.md'), + ('reaxff', 'lammps.md.multi'), ], ) -def test_input_creation( - db_test_app, get_potential_data, calc_type, potential_type, file_regression -): +def test_input_creation(db_test_app, get_potential_data, calc_type, + potential_type, file_regression): pot_data = get_potential_data(potential_type) - potential_data = DataFactory("lammps.potential")( - type=pot_data.type, data=pot_data.data - ) - parameter_data = get_calc_parameters( - "17 Aug 2017", calc_type, potential_data.default_units, potential_type - ) + potential_data = DataFactory('lammps.potential')(type=pot_data.type, + data=pot_data.data) + parameter_data = get_calc_parameters('17 Aug 2017', calc_type, + potential_data.default_units, + potential_type) calc = CalculationFactory(calc_type) content = calc.create_main_input_content( parameter_data, potential_data, - kind_symbols=["A", "B"], - structure_filename="input.data", - trajectory_filename="output.traj", - system_filename="sys_info.txt", - restart_filename="calc.restart", + kind_symbols=['A', 'B'], + structure_filename='input.data', + trajectory_filename='output.traj', + system_filename='sys_info.txt', + restart_filename='calc.restart', ) file_regression.check(content) -@pytest.mark.parametrize( - "potential_type", ["lennard-jones", "tersoff", "eam", "reaxff"] -) +@pytest.mark.parametrize('potential_type', + ['lennard-jones', 'tersoff', 'eam', 'reaxff']) def test_force_submission(db_test_app, get_potential_data, potential_type): - calc_plugin = "lammps.force" + calc_plugin = 'lammps.force' code = db_test_app.get_or_create_code(calc_plugin) pot_data = get_potential_data(potential_type) - potential = DataFactory("lammps.potential")(type=pot_data.type, data=pot_data.data) - parameters = get_calc_parameters( - get_lammps_version(code), calc_plugin, potential.default_units, potential_type - ) + potential = DataFactory('lammps.potential')(type=pot_data.type, + data=pot_data.data) + parameters = get_calc_parameters(get_lammps_version(code), calc_plugin, + potential.default_units, potential_type) builder = code.get_builder() - builder._update( - { - "metadata": tests.get_default_metadata(), - "code": code, - "structure": pot_data.structure, - "potential": potential, - "parameters": parameters, - } - ) + builder._update({ + 'metadata': tests.get_default_metadata(), + 'code': code, + 'structure': pot_data.structure, + 'potential': potential, + 'parameters': parameters, + }) with db_test_app.sandbox_folder() as folder: calc_info = db_test_app.generate_calcinfo(calc_plugin, folder, builder) - assert calc_info.codes_info[0].cmdline_params == ["-in", "input.in"] - assert set(folder.get_content_list()).issuperset(["input.data", "input.in"]) + assert calc_info.codes_info[0].cmdline_params == ['-in', 'input.in'] + assert set(folder.get_content_list()).issuperset( + ['input.data', 'input.in']) -@pytest.mark.parametrize( - "potential_type", ["lennard-jones", "tersoff", "eam", "reaxff"] -) +@pytest.mark.parametrize('potential_type', + ['lennard-jones', 'tersoff', 'eam', 'reaxff']) def test_optimize_submission(db_test_app, get_potential_data, potential_type): - calc_plugin = "lammps.optimize" + calc_plugin = 'lammps.optimize' code = db_test_app.get_or_create_code(calc_plugin) pot_data = get_potential_data(potential_type) - potential = DataFactory("lammps.potential")(type=pot_data.type, data=pot_data.data) - parameters = get_calc_parameters( - get_lammps_version(code), calc_plugin, potential.default_units, potential_type - ) + potential = DataFactory('lammps.potential')(type=pot_data.type, + data=pot_data.data) + parameters = get_calc_parameters(get_lammps_version(code), calc_plugin, + potential.default_units, potential_type) builder = code.get_builder() - builder._update( - { - "metadata": tests.get_default_metadata(), - "code": code, - "structure": pot_data.structure, - "potential": potential, - "parameters": parameters, - } - ) + builder._update({ + 'metadata': tests.get_default_metadata(), + 'code': code, + 'structure': pot_data.structure, + 'potential': potential, + 'parameters': parameters, + }) with db_test_app.sandbox_folder() as folder: calc_info = db_test_app.generate_calcinfo(calc_plugin, folder, builder) - assert calc_info.codes_info[0].cmdline_params == ["-in", "input.in"] - assert set(folder.get_content_list()).issuperset(["input.data", "input.in"]) + assert calc_info.codes_info[0].cmdline_params == ['-in', 'input.in'] + assert set(folder.get_content_list()).issuperset( + ['input.data', 'input.in']) -@pytest.mark.parametrize( - "potential_type", ["lennard-jones", "tersoff", "eam", "reaxff"] -) +@pytest.mark.parametrize('potential_type', + ['lennard-jones', 'tersoff', 'eam', 'reaxff']) def test_md_submission(db_test_app, get_potential_data, potential_type): - calc_plugin = "lammps.md" + calc_plugin = 'lammps.md' code = db_test_app.get_or_create_code(calc_plugin) pot_data = get_potential_data(potential_type) - potential = DataFactory("lammps.potential")(type=pot_data.type, data=pot_data.data) - parameters = get_calc_parameters( - get_lammps_version(code), calc_plugin, potential.default_units, potential_type - ) + potential = DataFactory('lammps.potential')(type=pot_data.type, + data=pot_data.data) + parameters = get_calc_parameters(get_lammps_version(code), calc_plugin, + potential.default_units, potential_type) builder = code.get_builder() - builder._update( - { - "metadata": tests.get_default_metadata(), - "code": code, - "structure": pot_data.structure, - "potential": potential, - "parameters": parameters, - } - ) + builder._update({ + 'metadata': tests.get_default_metadata(), + 'code': code, + 'structure': pot_data.structure, + 'potential': potential, + 'parameters': parameters, + }) with db_test_app.sandbox_folder() as folder: calc_info = db_test_app.generate_calcinfo(calc_plugin, folder, builder) - assert calc_info.codes_info[0].cmdline_params == ["-in", "input.in"] - assert set(folder.get_content_list()).issuperset(["input.data", "input.in"]) + assert calc_info.codes_info[0].cmdline_params == ['-in', 'input.in'] + assert set(folder.get_content_list()).issuperset( + ['input.data', 'input.in']) @pytest.mark.lammps_call -@pytest.mark.parametrize( - "potential_type", ["lennard-jones", "tersoff", "eam", "reaxff"] -) -def test_force_process( - db_test_app, get_potential_data, potential_type, data_regression -): - calc_plugin = "lammps.force" +@pytest.mark.parametrize('potential_type', + ['lennard-jones', 'tersoff', 'eam', 'reaxff']) +def test_force_process(db_test_app, get_potential_data, potential_type, + data_regression): + calc_plugin = 'lammps.force' code = db_test_app.get_or_create_code(calc_plugin) pot_data = get_potential_data(potential_type) - potential = DataFactory("lammps.potential")(type=pot_data.type, data=pot_data.data) - parameters = get_calc_parameters( - get_lammps_version(code), calc_plugin, potential.default_units, potential_type - ) + potential = DataFactory('lammps.potential')(type=pot_data.type, + data=pot_data.data) + parameters = get_calc_parameters(get_lammps_version(code), calc_plugin, + potential.default_units, potential_type) builder = code.get_builder() - builder._update( - { - "metadata": tests.get_default_metadata(), - "code": code, - "structure": pot_data.structure, - "potential": potential, - "parameters": parameters, - } - ) + builder._update({ + 'metadata': tests.get_default_metadata(), + 'code': code, + 'structure': pot_data.structure, + 'potential': potential, + 'parameters': parameters, + }) output = run_get_node(builder) calc_node = output.node @@ -283,43 +311,40 @@ def test_force_process( if not calc_node.is_finished_ok: print(calc_node.attributes) print(get_calcjob_report(calc_node)) - raise Exception("finished with exit message: {}".format(calc_node.exit_message)) + raise Exception('finished with exit message: {}'.format( + calc_node.exit_message)) link_labels = calc_node.get_outgoing().all_link_labels() - assert set(link_labels).issuperset(["results", "arrays"]) + assert set(link_labels).issuperset(['results', 'arrays']) - data_regression.check( - { - "results": sanitize_results(calc_node.outputs.results.get_dict(), 1), - "arrays": calc_node.outputs.arrays.attributes, - } - ) + data_regression.check({ + 'results': + sanitize_results(calc_node.outputs.results.get_dict(), 1), + 'arrays': + calc_node.outputs.arrays.attributes, + }) @pytest.mark.lammps_call -@pytest.mark.parametrize( - "potential_type", ["lennard-jones", "tersoff", "eam", "reaxff"] -) -def test_optimize_process( - db_test_app, get_potential_data, potential_type, data_regression -): - calc_plugin = "lammps.optimize" +@pytest.mark.parametrize('potential_type', + ['lennard-jones', 'tersoff', 'eam', 'reaxff']) +def test_optimize_process(db_test_app, get_potential_data, potential_type, + data_regression): + calc_plugin = 'lammps.optimize' code = db_test_app.get_or_create_code(calc_plugin) pot_data = get_potential_data(potential_type) - potential = DataFactory("lammps.potential")(type=pot_data.type, data=pot_data.data) - parameters = get_calc_parameters( - get_lammps_version(code), calc_plugin, potential.default_units, potential_type - ) + potential = DataFactory('lammps.potential')(type=pot_data.type, + data=pot_data.data) + parameters = get_calc_parameters(get_lammps_version(code), calc_plugin, + potential.default_units, potential_type) builder = code.get_builder() - builder._update( - { - "metadata": tests.get_default_metadata(), - "code": code, - "structure": pot_data.structure, - "potential": potential, - "parameters": parameters, - } - ) + builder._update({ + 'metadata': tests.get_default_metadata(), + 'code': code, + 'structure': pot_data.structure, + 'potential': potential, + 'parameters': parameters, + }) output = run_get_node(builder) calc_node = output.node @@ -327,48 +352,54 @@ def test_optimize_process( if not calc_node.is_finished_ok: print(calc_node.attributes) print(get_calcjob_report(calc_node)) - raise Exception("finished with exit message: {}".format(calc_node.exit_message)) + raise Exception('finished with exit message: {}'.format( + calc_node.exit_message)) link_labels = calc_node.get_outgoing().all_link_labels() - assert set(link_labels).issuperset(["results", "trajectory_data", "structure"]) + assert set(link_labels).issuperset( + ['results', 'trajectory_data', 'structure']) trajectory_data = calc_node.outputs.trajectory_data.attributes # optimization steps may differ between lammps versions - trajectory_data = {k: v for k, v in trajectory_data.items() if k != "number_steps"} - data_regression.check( - { - "results": sanitize_results(calc_node.outputs.results.get_dict(), 1), - "trajectory_data": trajectory_data, - "structure": {"kind_names": calc_node.outputs.structure.get_kind_names()} - # "structure": tests.recursive_round( - # calc_node.outputs.structure.attributes, 1, apply_lists=True - # ), + trajectory_data = { + k: v + for k, v in trajectory_data.items() if k != 'number_steps' + } + data_regression.check({ + 'results': + sanitize_results(calc_node.outputs.results.get_dict(), 1), + 'trajectory_data': + trajectory_data, + 'structure': { + 'kind_names': calc_node.outputs.structure.get_kind_names() } - ) + # "structure": tests.recursive_round( + # calc_node.outputs.structure.attributes, 1, apply_lists=True + # ), + }) @pytest.mark.lammps_call -@pytest.mark.parametrize("potential_type", ["lennard-jones", "tersoff", "eam"]) -def test_md_process(db_test_app, get_potential_data, potential_type, data_regression): - calc_plugin = "lammps.md" +@pytest.mark.parametrize('potential_type', ['lennard-jones', 'tersoff', 'eam']) +def test_md_process(db_test_app, get_potential_data, potential_type, + data_regression): + calc_plugin = 'lammps.md' code = db_test_app.get_or_create_code(calc_plugin) pot_data = get_potential_data(potential_type) - potential = DataFactory("lammps.potential")(type=pot_data.type, data=pot_data.data) + potential = DataFactory('lammps.potential')(type=pot_data.type, + data=pot_data.data) version = get_lammps_version(code) version_year = version[-4:] - parameters = get_calc_parameters( - version, calc_plugin, potential.default_units, potential_type - ) + parameters = get_calc_parameters(version, calc_plugin, + potential.default_units, potential_type) builder = code.get_builder() - builder._update( - { - "metadata": tests.get_default_metadata(), - "code": code, - "structure": pot_data.structure, - "potential": potential, - "parameters": parameters, - } - ) + builder._update({ + 'metadata': tests.get_default_metadata(), + 'code': code, + 'structure': pot_data.structure, + 'potential': potential, + 'parameters': parameters, + }) output = run_get_node(builder) calc_node = output.node @@ -376,47 +407,47 @@ def test_md_process(db_test_app, get_potential_data, potential_type, data_regres if not calc_node.is_finished_ok: print(calc_node.attributes) print(get_calcjob_report(calc_node)) - raise Exception("finished with exit message: {}".format(calc_node.exit_message)) + raise Exception('finished with exit message: {}'.format( + calc_node.exit_message)) link_labels = calc_node.get_outgoing().all_link_labels() - assert set(link_labels).issuperset(["results", "trajectory_data", "system_data"]) + assert set(link_labels).issuperset( + ['results', 'trajectory_data', 'system_data']) data_regression.check( { - "results": sanitize_results( - calc_node.outputs.results.get_dict(), round_energy=1 - ), - "system_data": calc_node.outputs.system_data.attributes, - "trajectory_data": calc_node.outputs.trajectory_data.attributes, + 'results': + sanitize_results(calc_node.outputs.results.get_dict(), + round_energy=1), + 'system_data': + calc_node.outputs.system_data.attributes, + 'trajectory_data': + calc_node.outputs.trajectory_data.attributes, }, - basename=f"test_md_process-{potential_type}-{version_year}", + basename=f'test_md_process-{potential_type}-{version_year}', ) @pytest.mark.lammps_call -@pytest.mark.parametrize( - "potential_type", ["lennard-jones", "tersoff", "eam", "reaxff"] -) -def test_md_multi_process( - db_test_app, get_potential_data, potential_type, data_regression -): - calc_plugin = "lammps.md.multi" +@pytest.mark.parametrize('potential_type', + ['lennard-jones', 'tersoff', 'eam', 'reaxff']) +def test_md_multi_process(db_test_app, get_potential_data, potential_type, + data_regression): + calc_plugin = 'lammps.md.multi' code = db_test_app.get_or_create_code(calc_plugin) pot_data = get_potential_data(potential_type) - potential = DataFactory("lammps.potential")(type=pot_data.type, data=pot_data.data) - parameters = get_calc_parameters( - get_lammps_version(code), calc_plugin, potential.default_units, potential_type - ) + potential = DataFactory('lammps.potential')(type=pot_data.type, + data=pot_data.data) + parameters = get_calc_parameters(get_lammps_version(code), calc_plugin, + potential.default_units, potential_type) builder = code.get_builder() - builder._update( - { - "metadata": tests.get_default_metadata(), - "code": code, - "structure": pot_data.structure, - "potential": potential, - "parameters": parameters, - } - ) + builder._update({ + 'metadata': tests.get_default_metadata(), + 'code': code, + 'structure': pot_data.structure, + 'potential': potential, + 'parameters': parameters, + }) output = run_get_node(builder) calc_node = output.node @@ -424,29 +455,30 @@ def test_md_multi_process( if not calc_node.is_finished_ok: print(calc_node.attributes) print(get_calcjob_report(calc_node)) - raise Exception("finished with exit message: {}".format(calc_node.exit_message)) + raise Exception('finished with exit message: {}'.format( + calc_node.exit_message)) link_labels = calc_node.get_outgoing().all_link_labels() - assert set(link_labels).issuperset( - [ - "results", - "retrieved", - "trajectory__thermalise", - "trajectory__equilibrate", - "system__thermalise", - "system__equilibrate", - ] - ) - - data_regression.check( - { - "retrieved": calc_node.outputs.retrieved.list_object_names(), - "results": sanitize_results( - calc_node.outputs.results.get_dict(), round_energy=1 - ), - "system__thermalise": calc_node.outputs.system__thermalise.attributes, - "system__equilibrate": calc_node.outputs.system__equilibrate.attributes, - "trajectory__thermalise": calc_node.outputs.trajectory__thermalise.attributes, - "trajectory__equilibrate": calc_node.outputs.trajectory__equilibrate.attributes, - } - ) + assert set(link_labels).issuperset([ + 'results', + 'retrieved', + 'trajectory__thermalise', + 'trajectory__equilibrate', + 'system__thermalise', + 'system__equilibrate', + ]) + + data_regression.check({ + 'retrieved': + calc_node.outputs.retrieved.list_object_names(), + 'results': + sanitize_results(calc_node.outputs.results.get_dict(), round_energy=1), + 'system__thermalise': + calc_node.outputs.system__thermalise.attributes, + 'system__equilibrate': + calc_node.outputs.system__equilibrate.attributes, + 'trajectory__thermalise': + calc_node.outputs.trajectory__thermalise.attributes, + 'trajectory__equilibrate': + calc_node.outputs.trajectory__equilibrate.attributes, + }) diff --git a/aiida_lammps/tests/test_generate_structure.py b/aiida_lammps/tests/test_generate_structure.py index ac56978..e68c0a5 100644 --- a/aiida_lammps/tests/test_generate_structure.py +++ b/aiida_lammps/tests/test_generate_structure.py @@ -3,9 +3,8 @@ from aiida_lammps.common.generate_structure import generate_lammps_structure -@pytest.mark.parametrize( - "structure", ["Fe", "pyrite", "fes_cubic-zincblende", "greigite"] -) +@pytest.mark.parametrize('structure', + ['Fe', 'pyrite', 'fes_cubic-zincblende', 'greigite']) def test_generate(db_test_app, get_structure_data, structure, file_regression): structure = get_structure_data(structure) text, transform = generate_lammps_structure(structure, round_dp=8) diff --git a/aiida_lammps/tests/test_parsers.py b/aiida_lammps/tests/test_parsers.py index a0394f6..9baecce 100644 --- a/aiida_lammps/tests/test_parsers.py +++ b/aiida_lammps/tests/test_parsers.py @@ -8,19 +8,16 @@ def get_log(): - return dedent( - """\ + return dedent("""\ units metal final_energy: 2.0 final_cell: 0 1 0 0 1 0 0 1 0 final_stress: 0 0 0 0 0 0 - """ - ) + """) def get_traj_force(): - return dedent( - """\ + return dedent("""\ ITEM: TIMESTEP 0 ITEM: NUMBER OF ATOMS @@ -36,13 +33,12 @@ def get_traj_force(): S -25.5468278966 -20.6615772179 -0.0000000000 S 25.5468278966 20.6615772179 -0.0000000000 S 25.5468278966 -20.6615772179 0.0000000000 - """ - ) + """) @pytest.mark.parametrize( - "plugin_name", ["lammps.force", "lammps.optimize", "lammps.md", "lammps.md.multi"] -) + 'plugin_name', + ['lammps.force', 'lammps.optimize', 'lammps.md', 'lammps.md.multi']) def test_missing_log(db_test_app, plugin_name): retrieved = FolderData() @@ -51,135 +47,118 @@ def test_missing_log(db_test_app, plugin_name): parser = ParserFactory(plugin_name) with db_test_app.sandbox_folder() as temp_path: results, calcfunction = parser.parse_from_node( - calc_node, retrieved_temporary_folder=temp_path.abspath - ) + calc_node, retrieved_temporary_folder=temp_path.abspath) assert calcfunction.is_finished, calcfunction.exception assert calcfunction.is_failed, calcfunction.exit_status - assert ( - calcfunction.exit_status - == calc_node.process_class.exit_codes.ERROR_LOG_FILE_MISSING.status - ) + assert (calcfunction.exit_status == + calc_node.process_class.exit_codes.ERROR_LOG_FILE_MISSING.status) @pytest.mark.parametrize( - "plugin_name", ["lammps.force", "lammps.optimize", "lammps.md", "lammps.md.multi"] -) + 'plugin_name', + ['lammps.force', 'lammps.optimize', 'lammps.md', 'lammps.md.multi']) def test_missing_traj(db_test_app, plugin_name): retrieved = FolderData() - retrieved.put_object_from_filelike(StringIO(get_log()), "log.lammps") - retrieved.put_object_from_filelike(StringIO(""), "_scheduler-stdout.txt") - retrieved.put_object_from_filelike(StringIO(""), "_scheduler-stderr.txt") + retrieved.put_object_from_filelike(StringIO(get_log()), 'log.lammps') + retrieved.put_object_from_filelike(StringIO(''), '_scheduler-stdout.txt') + retrieved.put_object_from_filelike(StringIO(''), '_scheduler-stderr.txt') calc_node = db_test_app.generate_calcjob_node(plugin_name, retrieved) parser = ParserFactory(plugin_name) with db_test_app.sandbox_folder() as temp_path: results, calcfunction = parser.parse_from_node( - calc_node, retrieved_temporary_folder=temp_path.abspath - ) + calc_node, retrieved_temporary_folder=temp_path.abspath) assert calcfunction.is_finished, calcfunction.exception assert calcfunction.is_failed, calcfunction.exit_status - assert ( - calcfunction.exit_status - == calc_node.process_class.exit_codes.ERROR_TRAJ_FILE_MISSING.status - ) + assert (calcfunction.exit_status == + calc_node.process_class.exit_codes.ERROR_TRAJ_FILE_MISSING.status) @pytest.mark.parametrize( - "plugin_name", ["lammps.force", "lammps.optimize", "lammps.md", "lammps.md.multi"] -) + 'plugin_name', + ['lammps.force', 'lammps.optimize', 'lammps.md', 'lammps.md.multi']) def test_empty_log(db_test_app, plugin_name): retrieved = FolderData() for filename in [ - "log.lammps", - "trajectory.lammpstrj", - "_scheduler-stdout.txt", - "_scheduler-stderr.txt", + 'log.lammps', + 'trajectory.lammpstrj', + '_scheduler-stdout.txt', + '_scheduler-stderr.txt', ]: - retrieved.put_object_from_filelike(StringIO(""), filename) + retrieved.put_object_from_filelike(StringIO(''), filename) calc_node = db_test_app.generate_calcjob_node(plugin_name, retrieved) parser = ParserFactory(plugin_name) with db_test_app.sandbox_folder() as temp_path: - with temp_path.open("x-trajectory.lammpstrj", "w"): + with temp_path.open('x-trajectory.lammpstrj', 'w'): pass results, calcfunction = parser.parse_from_node( - calc_node, retrieved_temporary_folder=temp_path.abspath - ) + calc_node, retrieved_temporary_folder=temp_path.abspath) assert calcfunction.is_finished, calcfunction.exception assert calcfunction.is_failed, calcfunction.exit_status - assert ( - calcfunction.exit_status - == calc_node.process_class.exit_codes.ERROR_LOG_PARSING.status - ) + assert (calcfunction.exit_status == + calc_node.process_class.exit_codes.ERROR_LOG_PARSING.status) @pytest.mark.parametrize( - "plugin_name", ["lammps.force", "lammps.optimize", "lammps.md", "lammps.md.multi"] -) + 'plugin_name', + ['lammps.force', 'lammps.optimize', 'lammps.md', 'lammps.md.multi']) def test_empty_traj(db_test_app, plugin_name): retrieved = FolderData() - retrieved.put_object_from_filelike(StringIO(get_log()), "log.lammps") + retrieved.put_object_from_filelike(StringIO(get_log()), 'log.lammps') for filename in [ - "trajectory.lammpstrj", - "_scheduler-stdout.txt", - "_scheduler-stderr.txt", + 'trajectory.lammpstrj', + '_scheduler-stdout.txt', + '_scheduler-stderr.txt', ]: - retrieved.put_object_from_filelike(StringIO(""), filename) + retrieved.put_object_from_filelike(StringIO(''), filename) calc_node = db_test_app.generate_calcjob_node(plugin_name, retrieved) parser = ParserFactory(plugin_name) with db_test_app.sandbox_folder() as temp_path: - with temp_path.open("x-trajectory.lammpstrj", "w"): + with temp_path.open('x-trajectory.lammpstrj', 'w'): pass results, calcfunction = parser.parse_from_node( - calc_node, retrieved_temporary_folder=temp_path.abspath - ) + calc_node, retrieved_temporary_folder=temp_path.abspath) assert calcfunction.is_finished, calcfunction.exception assert calcfunction.is_failed, calcfunction.exit_status - assert ( - calcfunction.exit_status - == calc_node.process_class.exit_codes.ERROR_TRAJ_PARSING.status - ) + assert (calcfunction.exit_status == + calc_node.process_class.exit_codes.ERROR_TRAJ_PARSING.status) @pytest.mark.parametrize( - "plugin_name", ["lammps.force", "lammps.optimize", "lammps.md", "lammps.md.multi"] -) + 'plugin_name', + ['lammps.force', 'lammps.optimize', 'lammps.md', 'lammps.md.multi']) def test_run_error(db_test_app, plugin_name): retrieved = FolderData() - retrieved.put_object_from_filelike(StringIO(get_log()), "log.lammps") - retrieved.put_object_from_filelike( - StringIO(get_traj_force()), "x-trajectory.lammpstrj" - ) - retrieved.put_object_from_filelike( - StringIO("ERROR description"), "_scheduler-stdout.txt" - ) - retrieved.put_object_from_filelike(StringIO(""), "_scheduler-stderr.txt") + retrieved.put_object_from_filelike(StringIO(get_log()), 'log.lammps') + retrieved.put_object_from_filelike(StringIO(get_traj_force()), + 'x-trajectory.lammpstrj') + retrieved.put_object_from_filelike(StringIO('ERROR description'), + '_scheduler-stdout.txt') + retrieved.put_object_from_filelike(StringIO(''), '_scheduler-stderr.txt') calc_node = db_test_app.generate_calcjob_node(plugin_name, retrieved) parser = ParserFactory(plugin_name) with db_test_app.sandbox_folder() as temp_path: - with temp_path.open("x-trajectory.lammpstrj", "w") as handle: + with temp_path.open('x-trajectory.lammpstrj', 'w') as handle: handle.write(get_traj_force()) results, calcfunction = parser.parse_from_node( - calc_node, retrieved_temporary_folder=temp_path.abspath - ) + calc_node, retrieved_temporary_folder=temp_path.abspath) print(get_calcjob_report(calc_node)) assert calcfunction.is_finished, calcfunction.exception assert calcfunction.is_failed, calcfunction.exit_status - assert ( - calcfunction.exit_status - == calc_node.process_class.exit_codes.ERROR_LAMMPS_RUN.status - ) + assert (calcfunction.exit_status == + calc_node.process_class.exit_codes.ERROR_LAMMPS_RUN.status) diff --git a/aiida_lammps/tests/test_potential_data.py b/aiida_lammps/tests/test_potential_data.py index a6d6fb4..aba6373 100644 --- a/aiida_lammps/tests/test_potential_data.py +++ b/aiida_lammps/tests/test_potential_data.py @@ -5,36 +5,34 @@ def test_list_potentials(): assert set(EmpiricalPotential.list_types()).issuperset( - ["eam", "lennard_jones", "reaxff", "tersoff"] - ) + ['eam', 'lennard_jones', 'reaxff', 'tersoff']) def test_load_type(): - EmpiricalPotential.load_type("eam") + EmpiricalPotential.load_type('eam') -@pytest.mark.parametrize( - "potential_type", ["lennard-jones", "tersoff", "eam", "reaxff"] -) -def test_init(db_test_app, get_potential_data, potential_type, data_regression): +@pytest.mark.parametrize('potential_type', + ['lennard-jones', 'tersoff', 'eam', 'reaxff']) +def test_init(db_test_app, get_potential_data, potential_type, + data_regression): potential = get_potential_data(potential_type) node = EmpiricalPotential(type=potential.type, data=potential.data) data_regression.check(node.attributes) -@pytest.mark.parametrize("potential_type", ["tersoff"]) -def test_potential_files( - db_test_app, get_potential_data, potential_type, file_regression -): +@pytest.mark.parametrize('potential_type', ['tersoff']) +def test_potential_files(db_test_app, get_potential_data, potential_type, + file_regression): potential = get_potential_data(potential_type) node = EmpiricalPotential(type=potential.type, data=potential.data) - file_regression.check(node.get_object_content("potential.pot", "r")) + file_regression.check(node.get_object_content('potential.pot', 'r')) -@pytest.mark.parametrize( - "potential_type", ["lennard-jones", "tersoff", "eam", "reaxff"] -) -def test_input_lines(db_test_app, get_potential_data, potential_type, file_regression): +@pytest.mark.parametrize('potential_type', + ['lennard-jones', 'tersoff', 'eam', 'reaxff']) +def test_input_lines(db_test_app, get_potential_data, potential_type, + file_regression): potential = get_potential_data(potential_type) node = EmpiricalPotential(type=potential.type, data=potential.data) file_regression.check(node.get_input_lines()) diff --git a/aiida_lammps/tests/test_reaxff_parse.py b/aiida_lammps/tests/test_reaxff_parse.py index 14e3011..a8fec5f 100644 --- a/aiida_lammps/tests/test_reaxff_parse.py +++ b/aiida_lammps/tests/test_reaxff_parse.py @@ -2,8 +2,7 @@ from aiida_lammps.common.reaxff_convert import read_lammps_format, write_lammps_format -lammps_file1 = dedent( - """\ +lammps_file1 = dedent("""\ Reactive MD-force field: Cr/O/Fe/S/C/H force field 2014 39 ! Number of general parameters 50.0000 ! Overcoordination 1 @@ -296,11 +295,9 @@ 3 2 5 2.5000 -1.0000 1.4500 19.5000 5 2 3 2.5000 -1.0000 1.4500 19.5000 5 2 5 2.5000 -2.0000 1.4500 19.5000 - """ -) + """) -lammps_file2 = dedent( - """\ +lammps_file2 = dedent("""\ Reactive MD-force field c/h/o combustion force field 39 ! Number of general parameters 50.0000 !p(boc1) @@ -424,8 +421,7 @@ 0 3 3 0 0.5511 25.4150 1.1330 -5.1903 -1.0000 0.0000 0.0000 1 ! Nr of hydrogen bonds. at1;at2;at3;r(hb);p(hb1);p(hb2);p(hb3) 3 2 3 1.9682 -4.4628 1.7976 3.0000 - """ -) + """) def test_read_lammps_format(data_regression): diff --git a/aiida_lammps/tests/test_trajectory.py b/aiida_lammps/tests/test_trajectory.py index 394c079..4714cd0 100644 --- a/aiida_lammps/tests/test_trajectory.py +++ b/aiida_lammps/tests/test_trajectory.py @@ -7,48 +7,50 @@ def test_iter_trajectories(data_regression): - path = os.path.join(TEST_DIR, "input_files", "trajectory.lammpstrj") + path = os.path.join(TEST_DIR, 'input_files', 'trajectory.lammpstrj') output = [] with io.open(path) as handle: for tstep in iter_trajectories(handle): dct = dict(tstep._asdict()) - dct.pop("cell") - dct.pop("lines") + dct.pop('cell') + dct.pop('lines') output.append(dct) data_regression.check(output) def test_create_structure(db_test_app, data_regression): - path = os.path.join(TEST_DIR, "input_files", "trajectory.lammpstrj") + path = os.path.join(TEST_DIR, 'input_files', 'trajectory.lammpstrj') with io.open(path) as handle: traj_block = next(iter_trajectories(handle)) structure = create_structure(traj_block) - data_regression.check(recursive_round(structure.attributes, 2, apply_lists=True)) + data_regression.check( + recursive_round(structure.attributes, 2, apply_lists=True)) def test_lammps_trajectory_data(db_test_app, data_regression): - path = os.path.join(TEST_DIR, "input_files", "trajectory.lammpstrj") + path = os.path.join(TEST_DIR, 'input_files', 'trajectory.lammpstrj') data = LammpsTrajectory(path) data_regression.check(data.attributes) def test_lammpstraj_get_step_string(db_test_app, file_regression): - path = os.path.join(TEST_DIR, "input_files", "trajectory.lammpstrj") + path = os.path.join(TEST_DIR, 'input_files', 'trajectory.lammpstrj') data = LammpsTrajectory(path) file_regression.check(data.get_step_string(-1)) def test_lammpstraj_get_step_struct(db_test_app, data_regression): - path = os.path.join(TEST_DIR, "input_files", "trajectory.lammpstrj") + path = os.path.join(TEST_DIR, 'input_files', 'trajectory.lammpstrj') data = LammpsTrajectory(path) data_regression.check( - recursive_round(data.get_step_structure(-1).attributes, 2, apply_lists=True) - ) + recursive_round(data.get_step_structure(-1).attributes, + 2, + apply_lists=True)) def test_lammpstraj_timesteps(db_test_app): - path = os.path.join(TEST_DIR, "input_files", "trajectory.lammpstrj") + path = os.path.join(TEST_DIR, 'input_files', 'trajectory.lammpstrj') data = LammpsTrajectory(path) assert data.time_steps == [ 0, @@ -76,7 +78,7 @@ def test_lammpstraj_timesteps(db_test_app): def test_write_as_lammps(db_test_app, tmp_path): - path = os.path.join(TEST_DIR, "input_files", "trajectory.lammpstrj") + path = os.path.join(TEST_DIR, 'input_files', 'trajectory.lammpstrj') data = LammpsTrajectory(path) - with tmp_path.joinpath("trajectory.lammpstrj").open(mode="wb") as handle: + with tmp_path.joinpath('trajectory.lammpstrj').open(mode='wb') as handle: data.write_as_lammps(handle) diff --git a/aiida_lammps/tests/utils.py b/aiida_lammps/tests/utils.py index 2b36f62..e28ac5e 100644 --- a/aiida_lammps/tests/utils.py +++ b/aiida_lammps/tests/utils.py @@ -9,25 +9,25 @@ TEST_DIR = os.path.dirname(os.path.realpath(__file__)) -def lammps_version(executable="lammps"): +def lammps_version(executable='lammps'): """Get the version of lammps. we assume `lammps -h` returns e.g. 'LAMMPS (10 Feb 2015)' or 'Large-scale Atomic/Molecular Massively Parallel Simulator - 5 Jun 2019' """ - out_text = subprocess.check_output([executable, "-h"]).decode("utf8") - match = re.search(r"LAMMPS \((.*)\)", out_text) + out_text = subprocess.check_output([executable, '-h']).decode('utf8') + match = re.search(r'LAMMPS \((.*)\)', out_text) if match: return match.group(1) regex = re.compile( - r"^Large-scale Atomic/Molecular Massively Parallel Simulator - (.*)$", + r'^Large-scale Atomic/Molecular Massively Parallel Simulator - (.*)$', re.MULTILINE, ) match = re.search(regex, out_text) if match: return match.group(1).strip() - raise IOError("Could not find version from `{} -h`".format(executable)) + raise IOError('Could not find version from `{} -h`'.format(executable)) def get_path_to_executable(executable): @@ -50,12 +50,12 @@ def get_path_to_executable(executable): if path is None: path = distutils.spawn.find_executable(executable) if path is None: - raise ValueError("{} executable not found in PATH.".format(executable)) + raise ValueError('{} executable not found in PATH.'.format(executable)) return os.path.abspath(path) -def get_or_create_local_computer(work_directory, name="localhost"): +def get_or_create_local_computer(work_directory, name='localhost'): """Retrieve or setup a local computer Parameters @@ -78,10 +78,11 @@ def get_or_create_local_computer(work_directory, name="localhost"): except NotExistent: computer = Computer( label=name, - hostname="localhost", - description=("localhost computer, " "set up by aiida_lammps tests"), - transport_type="local", - scheduler_type="direct", + hostname='localhost', + description=('localhost computer, ' + 'set up by aiida_lammps tests'), + transport_type='local', + scheduler_type='direct', workdir=os.path.abspath(work_directory), ) computer.store() @@ -100,15 +101,13 @@ def get_or_create_code(entry_point, computer, executable, exec_path=None): try: code = Code.objects.get( - label="{}-{}-{}".format(entry_point, executable, computer.label) - ) + label='{}-{}-{}'.format(entry_point, executable, computer.label)) except NotExistent: if exec_path is None: exec_path = get_path_to_executable(executable) - code = Code( - input_plugin_name=entry_point, remote_computer_exec=[computer, exec_path] - ) - code.label = "{}-{}-{}".format(entry_point, executable, computer.label) + code = Code(input_plugin_name=entry_point, + remote_computer_exec=[computer, exec_path]) + code.label = '{}-{}-{}'.format(entry_point, executable, computer.label) code.store() return code @@ -132,13 +131,13 @@ def get_default_metadata( :rtype: dict """ return { - "options": { - "resources": { - "num_machines": int(max_num_machines), - "num_mpiprocs_per_machine": int(num_mpiprocs_per_machine), + 'options': { + 'resources': { + 'num_machines': int(max_num_machines), + 'num_mpiprocs_per_machine': int(num_mpiprocs_per_machine), }, - "max_wallclock_seconds": int(max_wallclock_seconds), - "withmpi": with_mpi, + 'max_wallclock_seconds': int(max_wallclock_seconds), + 'withmpi': with_mpi, } } @@ -183,11 +182,11 @@ def environment(self): """return manager of a temporary AiiDA environment""" return self._environment - def get_or_create_computer(self, name="localhost"): + def get_or_create_computer(self, name='localhost'): """Setup localhost computer""" return get_or_create_local_computer(self.work_directory, name) - def get_or_create_code(self, entry_point, computer_name="localhost"): + def get_or_create_code(self, entry_point, computer_name='localhost'): """Setup code on localhost computer""" computer = self.get_or_create_computer(computer_name) @@ -196,18 +195,17 @@ def get_or_create_code(self, entry_point, computer_name="localhost"): executable = self._executables[entry_point] except KeyError: raise KeyError( - "Entry point {} not recognized. Allowed values: {}".format( - entry_point, self._executables.keys() - ) - ) + 'Entry point {} not recognized. Allowed values: {}'.format( + entry_point, self._executables.keys())) return get_or_create_code(entry_point, computer, executable) @staticmethod - def get_default_metadata( - max_num_machines=1, max_wallclock_seconds=1800, with_mpi=False - ): - return get_default_metadata(max_num_machines, max_wallclock_seconds, with_mpi) + def get_default_metadata(max_num_machines=1, + max_wallclock_seconds=1800, + with_mpi=False): + return get_default_metadata(max_num_machines, max_wallclock_seconds, + with_mpi) @staticmethod def get_parser_cls(entry_point_name): @@ -259,9 +257,11 @@ def get_calc_cls(entry_point_name): return CalculationFactory(entry_point_name) - def generate_calcjob_node( - self, entry_point_name, retrieved, computer_name="localhost", attributes=None - ): + def generate_calcjob_node(self, + entry_point_name, + retrieved, + computer_name='localhost', + attributes=None): """Fixture to generate a mock `CalcJobNode` for testing parsers. Parameters @@ -287,25 +287,28 @@ def generate_calcjob_node( process = self.get_calc_cls(entry_point_name) computer = self.get_or_create_computer(computer_name) - entry_point = format_entry_point_string("aiida.calculations", entry_point_name) + entry_point = format_entry_point_string('aiida.calculations', + entry_point_name) node = CalcJobNode(computer=computer, process_type=entry_point) - node.set_options( - { - k: v.default() if callable(v.default) else v.default - for k, v in process.spec_options.items() - if v.has_default() - } - ) - node.set_option("resources", {"num_machines": 1, "num_mpiprocs_per_machine": 1}) - node.set_option("max_wallclock_seconds", 1800) + node.set_options({ + k: v.default() if callable(v.default) else v.default + for k, v in process.spec_options.items() if v.has_default() + }) + node.set_option('resources', { + 'num_machines': 1, + 'num_mpiprocs_per_machine': 1 + }) + node.set_option('max_wallclock_seconds', 1800) if attributes: node.set_attributes(attributes) node.store() - retrieved.add_incoming(node, link_type=LinkType.CREATE, link_label="retrieved") + retrieved.add_incoming(node, + link_type=LinkType.CREATE, + link_label='retrieved') retrieved.store() return node diff --git a/aiida_lammps/validation/__init__.py b/aiida_lammps/validation/__init__.py index 1f7e5e8..8990c03 100644 --- a/aiida_lammps/validation/__init__.py +++ b/aiida_lammps/validation/__init__.py @@ -1,6 +1,4 @@ """Package for validating JSON objects against schemas.""" from aiida_lammps.validation.utils import ( # noqa: F401 - load_schema, - load_validator, - validate_against_schema, + load_schema, load_validator, validate_against_schema, ) diff --git a/aiida_lammps/validation/utils.py b/aiida_lammps/validation/utils.py index db3c19c..1e04cb6 100644 --- a/aiida_lammps/validation/utils.py +++ b/aiida_lammps/validation/utils.py @@ -59,10 +59,9 @@ def load_validator(schema): def is_array(checker, instance): return isinstance(instance, (tuple, list)) - type_checker = validator_cls.TYPE_CHECKER.redefine("array", is_array) - validator_cls = jsonschema.validators.extend( - validator_cls, type_checker=type_checker - ) + type_checker = validator_cls.TYPE_CHECKER.redefine('array', is_array) + validator_cls = jsonschema.validators.extend(validator_cls, + type_checker=type_checker) validator = validator_cls(schema=schema) return validator @@ -95,15 +94,10 @@ def validate_against_schema(data, schema): # validator.validate(data) errors = sorted(validator.iter_errors(data), key=lambda e: e.path) if errors: - raise jsonschema.ValidationError( - "\n".join( - [ - "- {} [key path: '{}']".format( - error.message, "/".join([str(p) for p in error.path]) - ) - for error in errors - ] - ) - ) + raise jsonschema.ValidationError('\n'.join([ + "- {} [key path: '{}']".format( + error.message, '/'.join([str(p) for p in error.path])) + for error in errors + ])) return True diff --git a/conftest.py b/conftest.py index 1c0c630..03bd752 100644 --- a/conftest.py +++ b/conftest.py @@ -13,60 +13,58 @@ from aiida_lammps.tests.utils import TEST_DIR, AiidaTestApp -pytest_plugins = ["aiida.manage.tests.pytest_fixtures"] +pytest_plugins = ['aiida.manage.tests.pytest_fixtures'] def pytest_addoption(parser): """Define pytest command-line.""" - group = parser.getgroup("aiida_lammps") + group = parser.getgroup('aiida_lammps') group.addoption( - "--lammps-workdir", - dest="lammps_workdir", + '--lammps-workdir', + dest='lammps_workdir', default=None, help=( - "Specify a work directory path for aiida calcjob execution. " - "If not specified, " - "a temporary directory is used and deleted after tests execution." + 'Specify a work directory path for aiida calcjob execution. ' + 'If not specified, ' + 'a temporary directory is used and deleted after tests execution.' ), ) group.addoption( - "--lammps-exec", - dest="lammps_exec", + '--lammps-exec', + dest='lammps_exec', default=None, - help=("Specify a the lammps executable to run (default: lammps)."), + help=('Specify a the lammps executable to run (default: lammps).'), ) def get_work_directory(config): """Return the aiida work directory to use.""" - if config.getoption("lammps_workdir") is not None: - return config.getoption("lammps_workdir") + if config.getoption('lammps_workdir') is not None: + return config.getoption('lammps_workdir') return None def pytest_report_header(config): """Add header information for pytest execution.""" return [ - "LAMMPS Executable: {}".format( - shutil.which(config.getoption("lammps_exec") or "lammps") - ), - "LAMMPS Work Directory: {}".format( - config.getoption("lammps_workdir") or "" - ), + 'LAMMPS Executable: {}'.format( + shutil.which(config.getoption('lammps_exec') or 'lammps')), + 'LAMMPS Work Directory: {}'.format( + config.getoption('lammps_workdir') or ''), ] -@pytest.fixture(scope="function") +@pytest.fixture(scope='function') def db_test_app(aiida_profile, pytestconfig): """Clear the database after each test.""" - exec_name = pytestconfig.getoption("lammps_exec") or "lammps" + exec_name = pytestconfig.getoption('lammps_exec') or 'lammps' executables = { - "lammps.md": exec_name, - "lammps.md.multi": exec_name, - "lammps.optimize": exec_name, - "lammps.force": exec_name, - "lammps.combinate": exec_name, + 'lammps.md': exec_name, + 'lammps.md.multi': exec_name, + 'lammps.optimize': exec_name, + 'lammps.force': exec_name, + 'lammps.combinate': exec_name, } test_workdir = get_work_directory(pytestconfig) @@ -82,11 +80,11 @@ def db_test_app(aiida_profile, pytestconfig): shutil.rmtree(work_directory) -@pytest.fixture(scope="function") +@pytest.fixture(scope='function') def get_structure_data(): def _get_structure_data(pkey): """return test structure data""" - if pkey == "Fe": + if pkey == 'Fe': cell = [ [2.848116, 0.000000, 0.000000], @@ -100,10 +98,10 @@ def _get_structure_data(pkey): ] fractional = True - symbols = ["Fe", "Fe"] - names = ["Fe1", "Fe2"] + symbols = ['Fe', 'Fe'] + names = ['Fe1', 'Fe2'] - elif pkey == "Ar": + elif pkey == 'Ar': cell = [ [3.987594, 0.000000, 0.000000], @@ -111,12 +109,13 @@ def _get_structure_data(pkey): [0.000000, 0.000000, 6.538394], ] - symbols = names = ["Ar"] * 2 + symbols = names = ['Ar'] * 2 - positions = [(0.33333, 0.66666, 0.25000), (0.66667, 0.33333, 0.75000)] + positions = [(0.33333, 0.66666, 0.25000), + (0.66667, 0.33333, 0.75000)] fractional = True - elif pkey == "GaN": + elif pkey == 'GaN': cell = [ [3.1900000572, 0, 0], @@ -132,9 +131,9 @@ def _get_structure_data(pkey): ] fractional = True - symbols = names = ["Ga", "Ga", "N", "N"] + symbols = names = ['Ga', 'Ga', 'N', 'N'] - elif pkey == "pyrite": + elif pkey == 'pyrite': cell = [ [5.38, 0.000000, 0.000000], @@ -158,15 +157,16 @@ def _get_structure_data(pkey): ] fractional = True - symbols = names = ["Fe"] * 4 + ["S"] * 8 + symbols = names = ['Fe'] * 4 + ['S'] * 8 - elif pkey == "fes_cubic-zincblende": + elif pkey == 'fes_cubic-zincblende': cell = [[2.71, -2.71, 0.0], [2.71, 0.0, 2.71], [0.0, -2.71, 2.71]] - symbols = names = ["Fe", "S"] + symbols = names = ['Fe', 'S'] positions = [[0, 0, 0], [4.065, -4.065, 4.065]] fractional = False - elif pkey == "greigite": - cell = [[0.0, 4.938, 4.938], [4.938, 0.0, 4.938], [4.938, 4.938, 0.0]] + elif pkey == 'greigite': + cell = [[0.0, 4.938, 4.938], [4.938, 0.0, 4.938], + [4.938, 4.938, 0.0]] positions = [ (1.2345, 1.2345, 1.2345), (8.6415, 8.6415, 8.6415), @@ -185,27 +185,27 @@ def _get_structure_data(pkey): ] fractional = False symbols = names = [ - "Fe", - "Fe", - "Fe", - "Fe", - "Fe", - "Fe", - "S", - "S", - "S", - "S", - "S", - "S", - "S", - "S", + 'Fe', + 'Fe', + 'Fe', + 'Fe', + 'Fe', + 'Fe', + 'S', + 'S', + 'S', + 'S', + 'S', + 'S', + 'S', + 'S', ] else: - raise ValueError("Unknown structure key: {}".format(pkey)) + raise ValueError('Unknown structure key: {}'.format(pkey)) # create structure - structure = DataFactory("structure")(cell=cell) + structure = DataFactory('structure')(cell=cell) for position, symbol, name in zip(positions, symbols, names): if fractional: position = np.dot(position, cell).tolist() @@ -216,103 +216,108 @@ def _get_structure_data(pkey): return _get_structure_data -potential_data = namedtuple( - "PotentialTestData", ["type", "data", "structure", "output"] -) +potential_data = namedtuple('PotentialTestData', + ['type', 'data', 'structure', 'output']) -@pytest.fixture(scope="function") +@pytest.fixture(scope='function') def get_potential_data(get_structure_data): def _get_potential_data(pkey): """return data to create a potential, and accompanying structure data and expected output data to test it with """ - if pkey == "eam": - pair_style = "eam" - with io.open( - os.path.join(TEST_DIR, "input_files", "Fe_mm.eam.fs") - ) as handle: + if pkey == 'eam': + pair_style = 'eam' + with io.open(os.path.join(TEST_DIR, 'input_files', + 'Fe_mm.eam.fs')) as handle: potential_dict = { - "type": "fs", - "file_contents": handle.readlines(), - "element_names": ["Fe"], + 'type': 'fs', + 'file_contents': handle.readlines(), + 'element_names': ['Fe'], } - structure = get_structure_data("Fe") - output_dict = {"initial_energy": -8.2441284, "energy": -8.2448702} + structure = get_structure_data('Fe') + output_dict = {'initial_energy': -8.2441284, 'energy': -8.2448702} - elif pkey == "lennard-jones": + elif pkey == 'lennard-jones': - structure = get_structure_data("Ar") + structure = get_structure_data('Ar') # Example LJ parameters for Argon. These may not be accurate at all - pair_style = "lennard_jones" + pair_style = 'lennard_jones' potential_dict = { - "1 1": "0.01029 3.4 3.5", + '1 1': '0.01029 3.4 3.5', # '2 2': '1.0 1.0 2.5', # '1 2': '1.0 1.0 2.5' } output_dict = { - "initial_energy": 0.0, - "energy": 0.0, # TODO should LJ energy be 0? + 'initial_energy': 0.0, + 'energy': 0.0, # TODO should LJ energy be 0? } - elif pkey == "tersoff": + elif pkey == 'tersoff': - structure = get_structure_data("GaN") + structure = get_structure_data('GaN') potential_dict = { - "Ga Ga Ga": "1.0 0.007874 1.846 1.918000 0.75000 -0.301300 1.0 1.0 1.44970 410.132 2.87 0.15 1.60916 535.199", - "N N N": "1.0 0.766120 0.000 0.178493 0.20172 -0.045238 1.0 1.0 2.38426 423.769 2.20 0.20 3.55779 1044.77", - "Ga Ga N": "1.0 0.001632 0.000 65.20700 2.82100 -0.518000 1.0 0.0 0.00000 0.00000 2.90 0.20 0.00000 0.00000", - "Ga N N": "1.0 0.001632 0.000 65.20700 2.82100 -0.518000 1.0 1.0 2.63906 3864.27 2.90 0.20 2.93516 6136.44", - "N Ga Ga": "1.0 0.001632 0.000 65.20700 2.82100 -0.518000 1.0 1.0 2.63906 3864.27 2.90 0.20 2.93516 6136.44", - "N Ga N ": "1.0 0.766120 0.000 0.178493 0.20172 -0.045238 1.0 0.0 0.00000 0.00000 2.20 0.20 0.00000 0.00000", - "N N Ga": "1.0 0.001632 0.000 65.20700 2.82100 -0.518000 1.0 0.0 0.00000 0.00000 2.90 0.20 0.00000 0.00000", - "Ga N Ga": "1.0 0.007874 1.846 1.918000 0.75000 -0.301300 1.0 0.0 0.00000 0.00000 2.87 0.15 0.00000 0.00000", + 'Ga Ga Ga': + '1.0 0.007874 1.846 1.918000 0.75000 -0.301300 1.0 1.0 1.44970 410.132 2.87 0.15 1.60916 535.199', + 'N N N': + '1.0 0.766120 0.000 0.178493 0.20172 -0.045238 1.0 1.0 2.38426 423.769 2.20 0.20 3.55779 1044.77', + 'Ga Ga N': + '1.0 0.001632 0.000 65.20700 2.82100 -0.518000 1.0 0.0 0.00000 0.00000 2.90 0.20 0.00000 0.00000', + 'Ga N N': + '1.0 0.001632 0.000 65.20700 2.82100 -0.518000 1.0 1.0 2.63906 3864.27 2.90 0.20 2.93516 6136.44', + 'N Ga Ga': + '1.0 0.001632 0.000 65.20700 2.82100 -0.518000 1.0 1.0 2.63906 3864.27 2.90 0.20 2.93516 6136.44', + 'N Ga N ': + '1.0 0.766120 0.000 0.178493 0.20172 -0.045238 1.0 0.0 0.00000 0.00000 2.20 0.20 0.00000 0.00000', + 'N N Ga': + '1.0 0.001632 0.000 65.20700 2.82100 -0.518000 1.0 0.0 0.00000 0.00000 2.90 0.20 0.00000 0.00000', + 'Ga N Ga': + '1.0 0.007874 1.846 1.918000 0.75000 -0.301300 1.0 0.0 0.00000 0.00000 2.87 0.15 0.00000 0.00000', } - pair_style = "tersoff" + pair_style = 'tersoff' - output_dict = {"initial_energy": -18.109886, "energy": -18.110852} + output_dict = {'initial_energy': -18.109886, 'energy': -18.110852} - elif pkey == "reaxff": + elif pkey == 'reaxff': from aiida_lammps.common.reaxff_convert import ( filter_by_species, read_lammps_format, ) - pair_style = "reaxff" + pair_style = 'reaxff' with io.open( - os.path.join(TEST_DIR, "input_files", "FeCrOSCH.reaxff") - ) as handle: + os.path.join(TEST_DIR, 'input_files', + 'FeCrOSCH.reaxff')) as handle: potential_dict = read_lammps_format( - handle.read().splitlines(), tolerances={"hbonddist": 7.0} - ) - potential_dict = filter_by_species( - potential_dict, ["Fe core", "S core"] - ) - for n in ["anglemin", "angleprod", "hbondmin", "torsionprod"]: - potential_dict["global"].pop(n) - potential_dict["control"] = {"safezone": 1.6} + handle.read().splitlines(), tolerances={'hbonddist': 7.0}) + potential_dict = filter_by_species(potential_dict, + ['Fe core', 'S core']) + for n in ['anglemin', 'angleprod', 'hbondmin', 'torsionprod']: + potential_dict['global'].pop(n) + potential_dict['control'] = {'safezone': 1.6} # potential_dict = { # "file_contents": handle.readlines(), # "control": {"safezone": 1.6}, # "global": {"hbonddist": 7.0}, # } - structure = get_structure_data("pyrite") + structure = get_structure_data('pyrite') output_dict = { - "initial_energy": -1027.9739, - "energy": -1030.3543, - "units": "real", + 'initial_energy': -1027.9739, + 'energy': -1030.3543, + 'units': 'real', } else: - raise ValueError("Unknown potential key: {}".format(pkey)) + raise ValueError('Unknown potential key: {}'.format(pkey)) - return potential_data(pair_style, potential_dict, structure, output_dict) + return potential_data(pair_style, potential_dict, structure, + output_dict) return _get_potential_data diff --git a/docs/source/conf.py b/docs/source/conf.py index 3298e32..a86c117 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -6,21 +6,21 @@ """ from aiida_lammps import __version__ -project = "AiiDA LAMMPS" -copyright = "2021, AiiDA Team" -author = "AiiDA Team" +project = 'AiiDA LAMMPS' +copyright = '2021, AiiDA Team' +author = 'AiiDA Team' version = __version__ extensions = [ # read Markdown files - "myst_parser", + 'myst_parser', # specify sitemap in single file (not toctrees) - "sphinx_external_toc", + 'sphinx_external_toc', ] -html_theme = "furo" -html_title = f"v{__version__}" -html_logo = "static/logo.png" +html_theme = 'furo' +html_title = f'v{__version__}' +html_logo = 'static/logo.png' html_theme_options = { - "announcement": "This documentation is in development!", + 'announcement': 'This documentation is in development!', } diff --git a/examples/launch_dynaphopy_si.py b/examples/launch_dynaphopy_si.py index eb0bab8..df0f428 100644 --- a/examples/launch_dynaphopy_si.py +++ b/examples/launch_dynaphopy_si.py @@ -4,13 +4,13 @@ from aiida.plugins import CalculationFactory import numpy as np -if __name__ == "__main__": +if __name__ == '__main__': from aiida import load_profile # noqa: F401 load_profile() - codename = "dynaphopy@stern" + codename = 'dynaphopy@stern' ############################ # Define input parameters # @@ -19,7 +19,7 @@ a = 5.404 cell = [[a, 0, 0], [0, a, 0], [0, 0, a]] - symbols = ["Si"] * 8 + symbols = ['Si'] * 8 scaled_positions = [ (0.875, 0.875, 0.875), (0.875, 0.375, 0.375), @@ -35,24 +35,23 @@ positions = np.dot(scaled_positions, cell) for i, scaled_position in enumerate(scaled_positions): - structure.append_atom( - position=np.dot(scaled_position, cell).tolist(), symbols=symbols[i] - ) + structure.append_atom(position=np.dot(scaled_position, cell).tolist(), + symbols=symbols[i]) structure.store() dynaphopy_parameters = { - "supercell": [[2, 0, 0], [0, 2, 0], [0, 0, 2]], - "primitive": [[1.0, 0.0, 0.0], [0.0, 1.0, 0.0], [0.0, 0.0, 1.0]], - "mesh": [40, 40, 40], - "md_commensurate": True, - "temperature": 300, + 'supercell': [[2, 0, 0], [0, 2, 0], [0, 0, 2]], + 'primitive': [[1.0, 0.0, 0.0], [0.0, 1.0, 0.0], [0.0, 0.0, 1.0]], + 'mesh': [40, 40, 40], + 'md_commensurate': True, + 'temperature': 300, } # Temperature can be omitted (If ommited calculated from Max.-Boltz.) dynaphopy_machine = { - "num_machines": 1, - "parallel_env": "mpi*", - "tot_num_mpiprocs": 16, + 'num_machines': 1, + 'parallel_env': 'mpi*', + 'tot_num_mpiprocs': 16, } from aiida.orm import load_node @@ -61,15 +60,15 @@ 20569 ) # Loads node that contains the harmonic force constants (Array data) trajectory = load_node( - 20528 - ) # Loads node that constains the MD trajectory (TrajectoryData) + 20528) # Loads node that constains the MD trajectory (TrajectoryData) codename = codename code = Code.get_from_string(codename) - calc = code.new_calc(max_wallclock_seconds=3600, resources=dynaphopy_machine) + calc = code.new_calc(max_wallclock_seconds=3600, + resources=dynaphopy_machine) - calc.label = "test dynaphopy calculation" - calc.description = "A much longer description" + calc.label = 'test dynaphopy calculation' + calc.description = 'A much longer description' calc.use_code(code) @@ -81,20 +80,20 @@ calc.store_all() calc.submit() - print("submitted calculation with PK={}".format(calc.dbnode.pk)) + print('submitted calculation with PK={}'.format(calc.dbnode.pk)) - LammpsOptimizeCalculation = CalculationFactory("lammps.optimize") + LammpsOptimizeCalculation = CalculationFactory('lammps.optimize') inputs = LammpsOptimizeCalculation.get_builder() # Computer options options = AttributeDict() - options.account = "" - options.qos = "" + options.account = '' + options.qos = '' options.resources = { - "num_machines": 1, - "num_mpiprocs_per_machine": 1, - "parallel_env": "localmpi", - "tot_num_mpiprocs": 1, + 'num_machines': 1, + 'num_mpiprocs_per_machine': 1, + 'parallel_env': 'localmpi', + 'tot_num_mpiprocs': 1, } # options.queue_name = 'iqtc04.q' options.max_wallclock_seconds = 3600 @@ -111,8 +110,8 @@ # run calculation result, node = run_get_node(LammpsOptimizeCalculation, **inputs) - print("results:", result) - print("node:", node) + print('results:', result) + print('node:', node) # submit to deamon # submit(LammpsOptimizeCalculation, **inputs) diff --git a/examples/launch_lammps_combinate.py b/examples/launch_lammps_combinate.py index c29e99d..939fd54 100644 --- a/examples/launch_lammps_combinate.py +++ b/examples/launch_lammps_combinate.py @@ -6,13 +6,13 @@ from aiida.plugins import CalculationFactory import numpy as np -if __name__ == "__main__": +if __name__ == '__main__': from aiida import load_profile # noqa: F401 load_profile() - codename = "lammps_combinate@stern" + codename = 'lammps_combinate@stern' ############################ # Define input parameters # @@ -21,7 +21,7 @@ a = 5.404 cell = [[a, 0, 0], [0, a, 0], [0, 0, a]] - symbols = ["Si"] * 8 + symbols = ['Si'] * 8 scaled_positions = [ (0.875, 0.875, 0.875), (0.875, 0.375, 0.375), @@ -37,25 +37,25 @@ positions = np.dot(scaled_positions, cell) for i, scaled_position in enumerate(scaled_positions): - structure.append_atom( - position=np.dot(scaled_position, cell).tolist(), symbols=symbols[i] - ) + structure.append_atom(position=np.dot(scaled_position, cell).tolist(), + symbols=symbols[i]) structure.store() # Silicon(C) Tersoff tersoff_si = { - "Si Si Si ": "3.0 1.0 1.7322 1.0039e5 16.218 -0.59826 0.78734 1.0999e-6 1.7322 471.18 2.85 0.15 2.4799 1830.8" + 'Si Si Si ': + '3.0 1.0 1.7322 1.0039e5 16.218 -0.59826 0.78734 1.0999e-6 1.7322 471.18 2.85 0.15 2.4799 1830.8' } - potential = {"pair_style": "tersoff", "data": tersoff_si} + potential = {'pair_style': 'tersoff', 'data': tersoff_si} dynaphopy_parameters = { - "supercell": [[2, 0, 0], [0, 2, 0], [0, 0, 2]], - "primitive": [[0.0, 0.5, 0.5], [0.5, 0.0, 0.5], [0.5, 0.5, 0.0]], - "mesh": [40, 40, 40], - "md_commensurate": False, - "md_supercell": [2, 2, 2], + 'supercell': [[2, 0, 0], [0, 2, 0], [0, 0, 2]], + 'primitive': [[0.0, 0.5, 0.5], [0.5, 0.0, 0.5], [0.5, 0.5, 0.0]], + 'mesh': [40, 40, 40], + 'md_commensurate': False, + 'md_supercell': [2, 2, 2], } from aiida.orm import load_node @@ -64,29 +64,33 @@ 38 ) # Loads node that contains the harmonic force constants (Array data) - machine = {"num_machines": 1, "parallel_env": "mpi*", "tot_num_mpiprocs": 16} + machine = { + 'num_machines': 1, + 'parallel_env': 'mpi*', + 'tot_num_mpiprocs': 16 + } parameters_md = { - "timestep": 0.001, - "temperature": 300, - "thermostat_variable": 0.5, - "equilibrium_steps": 2000, - "total_steps": 2000, - "dump_rate": 1, + 'timestep': 0.001, + 'temperature': 300, + 'thermostat_variable': 0.5, + 'equilibrium_steps': 2000, + 'total_steps': 2000, + 'dump_rate': 1, } - CombinateCalculation = CalculationFactory("lammps.force") + CombinateCalculation = CalculationFactory('lammps.force') inputs = CombinateCalculation.get_builder() # Computer options options = AttributeDict() - options.account = "" - options.qos = "" + options.account = '' + options.qos = '' options.resources = { - "num_machines": 1, - "num_mpiprocs_per_machine": 1, - "parallel_env": "localmpi", - "tot_num_mpiprocs": 1, + 'num_machines': 1, + 'num_mpiprocs_per_machine': 1, + 'parallel_env': 'localmpi', + 'tot_num_mpiprocs': 1, } # options.queue_name = 'iqtc04.q' options.max_wallclock_seconds = 3600 @@ -103,8 +107,8 @@ # run calculation result, node = run_get_node(CombinateCalculation, **inputs) - print("results:", result) - print("node:", node) + print('results:', result) + print('node:', node) # submit to deamon # submit(LammpsOptimizeCalculation, **inputs) diff --git a/examples/launch_lammps_force_gan.py b/examples/launch_lammps_force_gan.py index c3bf7cb..4a99b15 100644 --- a/examples/launch_lammps_force_gan.py +++ b/examples/launch_lammps_force_gan.py @@ -6,13 +6,13 @@ from aiida_lammps.data.potential import EmpiricalPotential -if __name__ == "__main__": +if __name__ == '__main__': from aiida import load_profile # noqa: F401 load_profile() - codename = "lammps_force@stern" + codename = 'lammps_force@stern' ############################ # Define input parameters # @@ -32,45 +32,52 @@ (0.3333331, 0.6666663, 0.8750000), ] - symbols = ["Ga", "Ga", "N", "N"] + symbols = ['Ga', 'Ga', 'N', 'N'] structure = StructureData(cell=cell) positions = np.dot(scaled_positions, cell) for i, scaled_position in enumerate(scaled_positions): - structure.append_atom( - position=np.dot(scaled_position, cell).tolist(), symbols=symbols[i] - ) + structure.append_atom(position=np.dot(scaled_position, cell).tolist(), + symbols=symbols[i]) # GaN Tersoff tersoff_gan = { - "Ga Ga Ga": "1.0 0.007874 1.846 1.918000 0.75000 -0.301300 1.0 1.0 1.44970 410.132 2.87 0.15 1.60916 535.199", - "N N N": "1.0 0.766120 0.000 0.178493 0.20172 -0.045238 1.0 1.0 2.38426 423.769 2.20 0.20 3.55779 1044.77", - "Ga Ga N": "1.0 0.001632 0.000 65.20700 2.82100 -0.518000 1.0 0.0 0.00000 0.00000 2.90 0.20 0.00000 0.00000", - "Ga N N": "1.0 0.001632 0.000 65.20700 2.82100 -0.518000 1.0 1.0 2.63906 3864.27 2.90 0.20 2.93516 6136.44", - "N Ga Ga": "1.0 0.001632 0.000 65.20700 2.82100 -0.518000 1.0 1.0 2.63906 3864.27 2.90 0.20 2.93516 6136.44", - "N Ga N ": "1.0 0.766120 0.000 0.178493 0.20172 -0.045238 1.0 0.0 0.00000 0.00000 2.20 0.20 0.00000 0.00000", - "N N Ga": "1.0 0.001632 0.000 65.20700 2.82100 -0.518000 1.0 0.0 0.00000 0.00000 2.90 0.20 0.00000 0.00000", - "Ga N Ga": "1.0 0.007874 1.846 1.918000 0.75000 -0.301300 1.0 0.0 0.00000 0.00000 2.87 0.15 0.00000 0.00000", + 'Ga Ga Ga': + '1.0 0.007874 1.846 1.918000 0.75000 -0.301300 1.0 1.0 1.44970 410.132 2.87 0.15 1.60916 535.199', + 'N N N': + '1.0 0.766120 0.000 0.178493 0.20172 -0.045238 1.0 1.0 2.38426 423.769 2.20 0.20 3.55779 1044.77', + 'Ga Ga N': + '1.0 0.001632 0.000 65.20700 2.82100 -0.518000 1.0 0.0 0.00000 0.00000 2.90 0.20 0.00000 0.00000', + 'Ga N N': + '1.0 0.001632 0.000 65.20700 2.82100 -0.518000 1.0 1.0 2.63906 3864.27 2.90 0.20 2.93516 6136.44', + 'N Ga Ga': + '1.0 0.001632 0.000 65.20700 2.82100 -0.518000 1.0 1.0 2.63906 3864.27 2.90 0.20 2.93516 6136.44', + 'N Ga N ': + '1.0 0.766120 0.000 0.178493 0.20172 -0.045238 1.0 0.0 0.00000 0.00000 2.20 0.20 0.00000 0.00000', + 'N N Ga': + '1.0 0.001632 0.000 65.20700 2.82100 -0.518000 1.0 0.0 0.00000 0.00000 2.90 0.20 0.00000 0.00000', + 'Ga N Ga': + '1.0 0.007874 1.846 1.918000 0.75000 -0.301300 1.0 0.0 0.00000 0.00000 2.87 0.15 0.00000 0.00000', } # Silicon(C) Tersoff # tersoff_si = {'Si Si Si ': '3.0 1.0 1.7322 1.0039e5 16.218 -0.59826 0.78734 1.0999e-6 1.7322 471.18 2.85 0.15 2.4799 1830.8'} - potential = {"pair_style": "tersoff", "data": tersoff_gan} + potential = {'pair_style': 'tersoff', 'data': tersoff_gan} - LammpsForceCalculation = CalculationFactory("lammps.force") + LammpsForceCalculation = CalculationFactory('lammps.force') inputs = LammpsForceCalculation.get_builder() # Computer options options = AttributeDict() - options.account = "" - options.qos = "" + options.account = '' + options.qos = '' options.resources = { - "num_machines": 1, - "num_mpiprocs_per_machine": 1, - "parallel_env": "localmpi", - "tot_num_mpiprocs": 1, + 'num_machines': 1, + 'num_mpiprocs_per_machine': 1, + 'parallel_env': 'localmpi', + 'tot_num_mpiprocs': 1, } # options.queue_name = 'iqtc04.q' options.max_wallclock_seconds = 3600 @@ -81,14 +88,13 @@ # setup nodes inputs.structure = structure - inputs.potential = EmpiricalPotential( - type=potential["pair_style"], data=potential["data"] - ) + inputs.potential = EmpiricalPotential(type=potential['pair_style'], + data=potential['data']) # run calculation result, node = run_get_node(LammpsForceCalculation, **inputs) - print("results:", result) - print("node:", node) + print('results:', result) + print('node:', node) # submit to deamon # submit(LammpsForceCalculation, **inputs) diff --git a/examples/launch_lammps_md_si.py b/examples/launch_lammps_md_si.py index ea2b1f0..d61bb8e 100644 --- a/examples/launch_lammps_md_si.py +++ b/examples/launch_lammps_md_si.py @@ -7,11 +7,11 @@ from aiida_lammps.data.potential import EmpiricalPotential -if __name__ == "__main__": +if __name__ == '__main__': load_profile() - codename = "lammps_md@stern" + codename = 'lammps_md@stern' ############################ # Define input parameters # @@ -20,7 +20,7 @@ a = 5.404 cell = [[a, 0, 0], [0, a, 0], [0, 0, a]] - symbols = ["Si"] * 8 + symbols = ['Si'] * 8 scaled_positions = [ (0.875, 0.875, 0.875), (0.875, 0.375, 0.375), @@ -36,44 +36,57 @@ positions = np.dot(scaled_positions, cell) for i, scaled_position in enumerate(scaled_positions): - structure.append_atom( - position=np.dot(scaled_position, cell).tolist(), symbols=symbols[i] - ) + structure.append_atom(position=np.dot(scaled_position, cell).tolist(), + symbols=symbols[i]) structure.store() # Silicon(C) Tersoff tersoff_si = { - "Si Si Si ": "3.0 1.0 1.7322 1.0039e5 16.218 -0.59826 0.78734 1.0999e-6 1.7322 471.18 2.85 0.15 2.4799 1830.8" + 'Si Si Si ': + '3.0 1.0 1.7322 1.0039e5 16.218 -0.59826 0.78734 1.0999e-6 1.7322 471.18 2.85 0.15 2.4799 1830.8' } - potential = {"pair_style": "tersoff", "data": tersoff_si} + potential = {'pair_style': 'tersoff', 'data': tersoff_si} - lammps_machine = {"num_machines": 1, "parallel_env": "mpi*", "tot_num_mpiprocs": 16} + lammps_machine = { + 'num_machines': 1, + 'parallel_env': 'mpi*', + 'tot_num_mpiprocs': 16 + } parameters_md = { - "units": "metal", - "timestep": 0.001, - "integration": {"style": "nvt", "constraints": {"temp": [300, 300, 0.5]}}, - "neighbor": [0.3, "bin"], - "neigh_modify": {"every": 1, "delay": 0, "check": False}, - "equilibrium_steps": 100, - "total_steps": 2000, - "dump_rate": 1, + 'units': 'metal', + 'timestep': 0.001, + 'integration': { + 'style': 'nvt', + 'constraints': { + 'temp': [300, 300, 0.5] + } + }, + 'neighbor': [0.3, 'bin'], + 'neigh_modify': { + 'every': 1, + 'delay': 0, + 'check': False + }, + 'equilibrium_steps': 100, + 'total_steps': 2000, + 'dump_rate': 1, } - LammpsMDCalculation = CalculationFactory("lammps.md") + LammpsMDCalculation = CalculationFactory('lammps.md') inputs = LammpsMDCalculation.get_builder() # Computer options options = AttributeDict() - options.account = "" - options.qos = "" + options.account = '' + options.qos = '' options.resources = { - "num_machines": 1, - "num_mpiprocs_per_machine": 1, - "parallel_env": "localmpi", - "tot_num_mpiprocs": 1, + 'num_machines': 1, + 'num_mpiprocs_per_machine': 1, + 'parallel_env': 'localmpi', + 'tot_num_mpiprocs': 1, } # options.queue_name = 'iqtc04.q' options.max_wallclock_seconds = 3600 @@ -84,16 +97,15 @@ # setup nodes inputs.structure = structure - inputs.potential = EmpiricalPotential( - type=potential["pair_style"], data=potential["data"] - ) + inputs.potential = EmpiricalPotential(type=potential['pair_style'], + data=potential['data']) inputs.parameters = Dict(dict=parameters_md) # run calculation result, node = run_get_node(LammpsMDCalculation, **inputs) - print("results:", result) - print("node:", node) + print('results:', result) + print('node:', node) # submit to deamon # submit(LammpsOptimizeCalculation, **inputs) diff --git a/examples/launch_lammps_optimization_fe.py b/examples/launch_lammps_optimization_fe.py index 58cb852..6f17388 100644 --- a/examples/launch_lammps_optimization_fe.py +++ b/examples/launch_lammps_optimization_fe.py @@ -6,13 +6,13 @@ from aiida_lammps.data.potential import EmpiricalPotential -if __name__ == "__main__": +if __name__ == '__main__': from aiida import load_profile # noqa: F401 load_profile() - codename = "lammps_optimize@stern" + codename = 'lammps_optimize@stern' ############################ # Define input parameters # @@ -30,53 +30,56 @@ (0.5000000, 0.5000000, 0.5000000), ] - symbols = ["Fe", "Fe"] + symbols = ['Fe', 'Fe'] structure = StructureData(cell=cell) positions = np.dot(scaled_positions, cell) for i, scaled_position in enumerate(scaled_positions): - structure.append_atom( - position=np.dot(scaled_position, cell).tolist(), symbols=symbols[i] - ) + structure.append_atom(position=np.dot(scaled_position, cell).tolist(), + symbols=symbols[i]) structure.store() - with open("Fe_mm.eam.fs") as handle: - eam_data = {"type": "fs", "file_contents": handle.readlines()} + with open('Fe_mm.eam.fs') as handle: + eam_data = {'type': 'fs', 'file_contents': handle.readlines()} - potential = {"pair_style": "eam", "data": eam_data} + potential = {'pair_style': 'eam', 'data': eam_data} - lammps_machine = {"num_machines": 1, "parallel_env": "mpi*", "tot_num_mpiprocs": 16} + lammps_machine = { + 'num_machines': 1, + 'parallel_env': 'mpi*', + 'tot_num_mpiprocs': 16 + } parameters_opt = { - "units": "metal", - "relax": { - "type": "tri", # iso/aniso/tri - "pressure": 0.0, # bars - "vmax": 0.000001, # Angstrom^3 + 'units': 'metal', + 'relax': { + 'type': 'tri', # iso/aniso/tri + 'pressure': 0.0, # bars + 'vmax': 0.000001, # Angstrom^3 }, - "minimize": { - "style": "cg", - "energy_tolerance": 1.0e-25, # eV - "force_tolerance": 1.0e-25, # eV angstrom - "max_evaluations": 100000, - "max_iterations": 50000, + 'minimize': { + 'style': 'cg', + 'energy_tolerance': 1.0e-25, # eV + 'force_tolerance': 1.0e-25, # eV angstrom + 'max_evaluations': 100000, + 'max_iterations': 50000, }, } - LammpsOptimizeCalculation = CalculationFactory("lammps.optimize") + LammpsOptimizeCalculation = CalculationFactory('lammps.optimize') inputs = LammpsOptimizeCalculation.get_builder() # Computer options options = AttributeDict() - options.account = "" - options.qos = "" + options.account = '' + options.qos = '' options.resources = { - "num_machines": 1, - "num_mpiprocs_per_machine": 1, - "parallel_env": "localmpi", - "tot_num_mpiprocs": 1, + 'num_machines': 1, + 'num_mpiprocs_per_machine': 1, + 'parallel_env': 'localmpi', + 'tot_num_mpiprocs': 1, } # options.queue_name = 'iqtc04.q' options.max_wallclock_seconds = 3600 @@ -87,9 +90,8 @@ # setup nodes inputs.structure = structure - inputs.potential = EmpiricalPotential( - type=potential["pair_style"], data=potential["data"] - ) + inputs.potential = EmpiricalPotential(type=potential['pair_style'], + data=potential['data']) print(inputs.potential.get_potential_file()) print(inputs.potential.atom_style) @@ -99,8 +101,8 @@ # run calculation result, node = run_get_node(LammpsOptimizeCalculation, **inputs) - print("results:", result) - print("node:", node) + print('results:', result) + print('node:', node) # submit to deamon # submit(LammpsOptimizeCalculation, **inputs) diff --git a/examples/launch_lammps_optimization_gan.py b/examples/launch_lammps_optimization_gan.py index 5805b18..05091fb 100644 --- a/examples/launch_lammps_optimization_gan.py +++ b/examples/launch_lammps_optimization_gan.py @@ -6,13 +6,13 @@ from aiida_lammps.data.potential import EmpiricalPotential -if __name__ == "__main__": +if __name__ == '__main__': from aiida import load_profile # noqa: F401 load_profile() - codename = "lammps_optimize@stern" + codename = 'lammps_optimize@stern' ############################ # Define input parameters # @@ -32,65 +32,76 @@ (0.3333331, 0.6666663, 0.8750000), ] - symbols = ["Ga", "Ga", "N", "N"] + symbols = ['Ga', 'Ga', 'N', 'N'] structure = StructureData(cell=cell) positions = np.dot(scaled_positions, cell) for i, scaled_position in enumerate(scaled_positions): - structure.append_atom( - position=np.dot(scaled_position, cell).tolist(), symbols=symbols[i] - ) + structure.append_atom(position=np.dot(scaled_position, cell).tolist(), + symbols=symbols[i]) structure.store() # GaN Tersoff tersoff_gan = { - "Ga Ga Ga": "1.0 0.007874 1.846 1.918000 0.75000 -0.301300 1.0 1.0 1.44970 410.132 2.87 0.15 1.60916 535.199", - "N N N": "1.0 0.766120 0.000 0.178493 0.20172 -0.045238 1.0 1.0 2.38426 423.769 2.20 0.20 3.55779 1044.77", - "Ga Ga N": "1.0 0.001632 0.000 65.20700 2.82100 -0.518000 1.0 0.0 0.00000 0.00000 2.90 0.20 0.00000 0.00000", - "Ga N N": "1.0 0.001632 0.000 65.20700 2.82100 -0.518000 1.0 1.0 2.63906 3864.27 2.90 0.20 2.93516 6136.44", - "N Ga Ga": "1.0 0.001632 0.000 65.20700 2.82100 -0.518000 1.0 1.0 2.63906 3864.27 2.90 0.20 2.93516 6136.44", - "N Ga N ": "1.0 0.766120 0.000 0.178493 0.20172 -0.045238 1.0 0.0 0.00000 0.00000 2.20 0.20 0.00000 0.00000", - "N N Ga": "1.0 0.001632 0.000 65.20700 2.82100 -0.518000 1.0 0.0 0.00000 0.00000 2.90 0.20 0.00000 0.00000", - "Ga N Ga": "1.0 0.007874 1.846 1.918000 0.75000 -0.301300 1.0 0.0 0.00000 0.00000 2.87 0.15 0.00000 0.00000", + 'Ga Ga Ga': + '1.0 0.007874 1.846 1.918000 0.75000 -0.301300 1.0 1.0 1.44970 410.132 2.87 0.15 1.60916 535.199', + 'N N N': + '1.0 0.766120 0.000 0.178493 0.20172 -0.045238 1.0 1.0 2.38426 423.769 2.20 0.20 3.55779 1044.77', + 'Ga Ga N': + '1.0 0.001632 0.000 65.20700 2.82100 -0.518000 1.0 0.0 0.00000 0.00000 2.90 0.20 0.00000 0.00000', + 'Ga N N': + '1.0 0.001632 0.000 65.20700 2.82100 -0.518000 1.0 1.0 2.63906 3864.27 2.90 0.20 2.93516 6136.44', + 'N Ga Ga': + '1.0 0.001632 0.000 65.20700 2.82100 -0.518000 1.0 1.0 2.63906 3864.27 2.90 0.20 2.93516 6136.44', + 'N Ga N ': + '1.0 0.766120 0.000 0.178493 0.20172 -0.045238 1.0 0.0 0.00000 0.00000 2.20 0.20 0.00000 0.00000', + 'N N Ga': + '1.0 0.001632 0.000 65.20700 2.82100 -0.518000 1.0 0.0 0.00000 0.00000 2.90 0.20 0.00000 0.00000', + 'Ga N Ga': + '1.0 0.007874 1.846 1.918000 0.75000 -0.301300 1.0 0.0 0.00000 0.00000 2.87 0.15 0.00000 0.00000', } # Silicon(C) Tersoff # tersoff_si = {'Si Si Si ': '3.0 1.0 1.7322 1.0039e5 16.218 -0.59826 0.78734 1.0999e-6 1.7322 471.18 2.85 0.15 2.4799 1830.8'} - potential = {"pair_style": "tersoff", "data": tersoff_gan} + potential = {'pair_style': 'tersoff', 'data': tersoff_gan} - lammps_machine = {"num_machines": 1, "parallel_env": "mpi*", "tot_num_mpiprocs": 16} + lammps_machine = { + 'num_machines': 1, + 'parallel_env': 'mpi*', + 'tot_num_mpiprocs': 16 + } parameters_opt = { - "units": "metal", - "relax": { - "type": "tri", # iso/aniso/tri - "pressure": 0.0, # bars - "vmax": 0.000001, # Angstrom^3 + 'units': 'metal', + 'relax': { + 'type': 'tri', # iso/aniso/tri + 'pressure': 0.0, # bars + 'vmax': 0.000001, # Angstrom^3 }, - "minimize": { - "style": "cg", - "energy_tolerance": 1.0e-25, # eV - "force_tolerance": 1.0e-25, # eV angstrom - "max_evaluations": 1000000, - "max_iterations": 500000, + 'minimize': { + 'style': 'cg', + 'energy_tolerance': 1.0e-25, # eV + 'force_tolerance': 1.0e-25, # eV angstrom + 'max_evaluations': 1000000, + 'max_iterations': 500000, }, } - LammpsOptimizeCalculation = CalculationFactory("lammps.optimize") + LammpsOptimizeCalculation = CalculationFactory('lammps.optimize') inputs = LammpsOptimizeCalculation.get_builder() # Computer options options = AttributeDict() - options.account = "" - options.qos = "" + options.account = '' + options.qos = '' options.resources = { - "num_machines": 1, - "num_mpiprocs_per_machine": 1, - "parallel_env": "localmpi", - "tot_num_mpiprocs": 1, + 'num_machines': 1, + 'num_mpiprocs_per_machine': 1, + 'parallel_env': 'localmpi', + 'tot_num_mpiprocs': 1, } # options.queue_name = 'iqtc04.q' options.max_wallclock_seconds = 3600 @@ -101,9 +112,8 @@ # setup nodes inputs.structure = structure - inputs.potential = EmpiricalPotential( - type=potential["pair_style"], data=potential["data"] - ) + inputs.potential = EmpiricalPotential(type=potential['pair_style'], + data=potential['data']) inputs.parameters = Dict(dict=parameters_opt) @@ -113,8 +123,8 @@ # run calculation result, node = run_get_node(LammpsOptimizeCalculation, **inputs) - print("results:", result) - print("node:", node) + print('results:', result) + print('node:', node) # submit to deamon # submit(LammpsOptimizeCalculation, **inputs) diff --git a/examples/launch_lammps_optimization_lj.py b/examples/launch_lammps_optimization_lj.py index 392bb1c..892c306 100644 --- a/examples/launch_lammps_optimization_lj.py +++ b/examples/launch_lammps_optimization_lj.py @@ -6,13 +6,13 @@ from aiida_lammps.data.potential import EmpiricalPotential -if __name__ == "__main__": +if __name__ == '__main__': from aiida import load_profile # noqa: F401 load_profile() - codename = "lammps_optimize@stern" + codename = 'lammps_optimize@stern' ############################ # Define input parameters # @@ -24,60 +24,64 @@ [0.000000, 0.000000, 6.538394], ] - symbols = ["Ar"] * 2 - scaled_positions = [(0.33333, 0.66666, 0.25000), (0.66667, 0.33333, 0.75000)] + symbols = ['Ar'] * 2 + scaled_positions = [(0.33333, 0.66666, 0.25000), + (0.66667, 0.33333, 0.75000)] structure = StructureData(cell=cell) positions = np.dot(scaled_positions, cell) for i, scaled_position in enumerate(scaled_positions): - structure.append_atom( - position=np.dot(scaled_position, cell).tolist(), symbols=symbols[i] - ) + structure.append_atom(position=np.dot(scaled_position, cell).tolist(), + symbols=symbols[i]) structure.store() # Example LJ parameters for Argon. These may not be accurate at all potential = { - "pair_style": "lennard_jones", + 'pair_style': 'lennard_jones', # epsilon, sigma, cutoff - "data": { - "1 1": "0.01029 3.4 2.5", + 'data': { + '1 1': '0.01029 3.4 2.5', # '2 2': '1.0 1.0 2.5', # '1 2': '1.0 1.0 2.5' }, } - lammps_machine = {"num_machines": 1, "parallel_env": "mpi*", "tot_num_mpiprocs": 16} + lammps_machine = { + 'num_machines': 1, + 'parallel_env': 'mpi*', + 'tot_num_mpiprocs': 16 + } parameters_opt = { - "units": "metal", - "relax": { - "type": "tri", # iso/aniso/tri - "pressure": 0.0, # bars - "vmax": 0.000001, # Angstrom^3 + 'units': 'metal', + 'relax': { + 'type': 'tri', # iso/aniso/tri + 'pressure': 0.0, # bars + 'vmax': 0.000001, # Angstrom^3 }, - "minimize": { - "style": "cg", - "energy_tolerance": 1.0e-25, # eV - "force_tolerance": 1.0e-25, # eV angstrom - "max_evaluations": 1000000, - "max_iterations": 500000, + 'minimize': { + 'style': 'cg', + 'energy_tolerance': 1.0e-25, # eV + 'force_tolerance': 1.0e-25, # eV angstrom + 'max_evaluations': 1000000, + 'max_iterations': 500000, }, } - LammpsOptimizeCalculation = CalculationFactory("lammps.optimize") + LammpsOptimizeCalculation = CalculationFactory('lammps.optimize') inputs = LammpsOptimizeCalculation.get_builder() # Computer options options = AttributeDict() - options.account = "" - options.qos = "" + options.account = '' + options.qos = '' options.resources = { - "num_machines": 1, - "num_mpiprocs_per_machine": 1, - "parallel_env": "localmpi", - "tot_num_mpiprocs": 1, + 'num_machines': 1, + 'num_mpiprocs_per_machine': 1, + 'parallel_env': 'localmpi', + 'tot_num_mpiprocs': 1, } # options.queue_name = 'iqtc04.q' options.max_wallclock_seconds = 3600 @@ -88,16 +92,15 @@ # setup nodes inputs.structure = structure - inputs.potential = EmpiricalPotential( - type=potential["pair_style"], data=potential["data"] - ) + inputs.potential = EmpiricalPotential(type=potential['pair_style'], + data=potential['data']) inputs.parameters = Dict(dict=parameters_opt) # run calculation result, node = run_get_node(LammpsOptimizeCalculation, **inputs) - print("results:", result) - print("node:", node) + print('results:', result) + print('node:', node) # submit to deamon # submit(LammpsOptimizeCalculation, **inputs) diff --git a/setup.py b/setup.py index a607dbb..932082b 100644 --- a/setup.py +++ b/setup.py @@ -6,13 +6,11 @@ from setuptools import find_packages, setup -if __name__ == "__main__": - with open("setup.json", "r") as info: +if __name__ == '__main__': + with open('setup.json', 'r') as info: kwargs = json.load(info) - setup( - packages=find_packages(), - long_description=open("README.md").read(), - long_description_content_type="text/markdown", - **kwargs - ) + setup(packages=find_packages(), + long_description=open('README.md').read(), + long_description_content_type='text/markdown', + **kwargs) From c54d8ff081f8cee10122f62c567241d218383515 Mon Sep 17 00:00:00 2001 From: Jonathan Chico Date: Mon, 8 Nov 2021 17:17:48 +0100 Subject: [PATCH 05/70] (WIP) Adding a new file for the automatic generation of the lammps input file. --- aiida_lammps/common/input_generator.py | 72 +++++++++++++++++--------- 1 file changed, 48 insertions(+), 24 deletions(-) diff --git a/aiida_lammps/common/input_generator.py b/aiida_lammps/common/input_generator.py index 3b5d151..d07d428 100644 --- a/aiida_lammps/common/input_generator.py +++ b/aiida_lammps/common/input_generator.py @@ -32,17 +32,18 @@ def write_control_block(parameters_control: dict = None) -> str: } _time = default_timestep[parameters_control.get('units', 'si')] - control_block = "# ---- Start of the Control information ----\n" - control_block += "clear\n" + control_block = '# ---- Start of the Control information ----\n' + control_block += 'clear\n' control_block += f"units {parameters_control.get('units', 'si')}\n" control_block += f"newton {parameters_control.get('newton', 'on')}\n" control_block += f"processors {parameters_control.get('processors','* * * grid onelevel map cart')}\n" control_block += f"timestep {parameters_control.get('timestep', _time)}\n" - control_block += "# ---- End of the Control information ----\n" + control_block += '# ---- End of the Control information ----\n' return control_block -def write_potential_block(potential=None, parameters_potential: dict = None) -> str: +def write_potential_block(potential=None, + parameters_potential: dict = None) -> str: """ Generate the input block with potential options. @@ -55,12 +56,12 @@ def write_potential_block(potential=None, parameters_potential: dict = None) -> :return: [description] :rtype: str """ - potential_block = "# ---- Start of Potential information ----\n" - potential_block += f"pair_style {potential.pair_style}\n" - potential_block += f"{potential.potential_line}" + potential_block = '# ---- Start of Potential information ----\n' + potential_block += f'pair_style {potential.pair_style}\n' + potential_block += f'{potential.potential_line}' potential_block += f"neighbor {parameters_potential.get('neighbor_update', 2.0)} bin\n" potential_block += f"neigh_modify {join_keywords(parameters_potential['neigh_modify'])}\n" - potential_block += "# ---- End of Potential information ----\n" + potential_block += '# ---- End of Potential information ----\n' return potential_block @@ -83,17 +84,17 @@ def write_structure_block( :return: [description] :rtype: str """ - structure_block = "# ---- Start of the Structure information ----\n" + structure_block = '# ---- Start of the Structure information ----\n' structure_block += f"box tilt {parameters_structure.get('box_tilt','small')}\n" structure_block += f"dimension {structure.get_dimensionality()['dim']}\n" - structure_block += "boundary " + structure_block += 'boundary ' for _bound in ['pbc1', 'pbc2', 'pbc3']: structure_block += f"{'p' if structure.attributes[_bound] else 'f'} " - structure_block += "\n" + structure_block += '\n' structure_block += f"atom_style {parameters_structure['atom_style']}\n" - structure_block += f"read_data {structure_filename}\n" - structure_block += "# ---- End of the Structure information ----\n" + structure_block += f'read_data {structure_filename}\n' + structure_block += '# ---- End of the Structure information ----\n' return structure_block @@ -109,18 +110,19 @@ def write_minimize_block(parameters_minimize: dict = None) -> str: :return: [description] :rtype: str """ - minimize_block = "# ---- Start of the Minimization information ----\n" + minimize_block = '# ---- Start of the Minimization information ----\n' minimize_block += f"min_style {parameters_minimize.get('style', 'cg')}\n" minimize_block += f"minimize {parameters_minimize.get('energy_tolerance', 1e-4)}" minimize_block += f" {parameters_minimize.get('force_tolerance', 1e-4)}" minimize_block += f" {parameters_minimize.get('max_iterations', 1000)}" minimize_block += f" {parameters_minimize.get('max_evaluations', 1000)}\n" - minimize_block += "# ---- End of the Minimization information ----\n" + minimize_block += '# ---- End of the Minimization information ----\n' return minimize_block -def write_md_block(parameters_md: dict = None) -> str: +def write_md_block(parameters_md: dict = None, + parameters_fix: dict = None) -> str: """ Generate the input block with the MD options. @@ -131,15 +133,33 @@ def write_md_block(parameters_md: dict = None) -> str: :return: [description] :rtype: str """ - md_block = "# ---- Start of the MD information ----\n" - md_block += "reset_timestep 0\n" + + integrators = [ + 'nvt', + 'nvp', + 'nph', + 'nvt/eff', + 'nvp/eff', + 'nph/eff', + 'nvt/uef', + 'npt/uef', + 'nph/asphere', + 'nph/body', + 'nph/sphere', + ] + + assert any(x in parameters_fix.keys() + for x in integrators), 'No integrator provided' + + md_block = '# ---- Start of the MD information ----\n' + md_block += 'reset_timestep 0\n' if parameters_md.get('run_style', 'verlet') == 'rspa': md_block += f"run_style {parameters_md.get('run_style', 'verlet')} " md_block += f"{join_keywords(parameters_md['rspa_options'])}\n" else: md_block += f"run_style {parameters_md.get('run_style', 'verlet')}\n" md_block += f"run {parameters_md.get('max_number_steps', 10)}\n" - md_block += "# ---- End of the MD information ----\n" + md_block += '# ---- End of the MD information ----\n' return md_block @@ -155,11 +175,12 @@ def write_fix_block(parameters_fix: dict = None) -> str: :return: [description] :rtype: str """ - fix_block = "# ---- Start of the Fix information ----\n" + + fix_block = '# ---- Start of the Fix information ----\n' for key, value in parameters_fix.items(): fix_block += f"fix {key.replace('/','_')}_aiida {value['group']} {key} " fix_block += f"{join_keywords(value['type'])}\n" - fix_block += "# ---- End of the Fix information ----\n" + fix_block += '# ---- End of the Fix information ----\n' return fix_block @@ -174,11 +195,11 @@ def write_compute_block(parameters_compute: dict = None) -> str: :return: [description] :rtype: str """ - compute_block = "# ---- Start of the Compute information ----\n" + compute_block = '# ---- Start of the Compute information ----\n' for key, value in parameters_compute.items(): compute_block += f"compute {key.replace('/','_')}_aiida {value['group']} {key} " compute_block += f"{join_keywords(value['type'])}\n" - compute_block += "# ---- End of the Compute information ----\n" + compute_block += '# ---- End of the Compute information ----\n' return compute_block @@ -193,4 +214,7 @@ def join_keywords(value) -> str: :return: [description] :rtype: str """ - return " ".join([f"{entry['keyword']} {entry['value']}" if isinstance(entry, dict) else f"{entry}" for entry in value]) + return ' '.join([ + f"{entry['keyword']} {entry['value']}" + if isinstance(entry, dict) else f'{entry}' for entry in value + ]) From 96d24dc5cac0db578b7f15a54c3183dbdad4c106 Mon Sep 17 00:00:00 2001 From: Jonathan Chico Date: Tue, 9 Nov 2021 16:49:52 +0100 Subject: [PATCH 06/70] (WIP) Improving the input file generation. Added a new more general schema for the base calculation. Minor modifications to the input_generator --- aiida_lammps/common/input_generator.py | 12 ++++++++---- aiida_lammps/validation/schemas/lammps_schema.json | 1 + 2 files changed, 9 insertions(+), 4 deletions(-) create mode 100644 aiida_lammps/validation/schemas/lammps_schema.json diff --git a/aiida_lammps/common/input_generator.py b/aiida_lammps/common/input_generator.py index d07d428..8a97ec2 100644 --- a/aiida_lammps/common/input_generator.py +++ b/aiida_lammps/common/input_generator.py @@ -42,8 +42,10 @@ def write_control_block(parameters_control: dict = None) -> str: return control_block -def write_potential_block(potential=None, - parameters_potential: dict = None) -> str: +def write_potential_block( + potential=None, + parameters_potential: dict = None, +) -> str: """ Generate the input block with potential options. @@ -121,8 +123,10 @@ def write_minimize_block(parameters_minimize: dict = None) -> str: return minimize_block -def write_md_block(parameters_md: dict = None, - parameters_fix: dict = None) -> str: +def write_md_block( + parameters_md: dict = None, + parameters_fix: dict = None, +) -> str: """ Generate the input block with the MD options. diff --git a/aiida_lammps/validation/schemas/lammps_schema.json b/aiida_lammps/validation/schemas/lammps_schema.json new file mode 100644 index 0000000..5e2d742 --- /dev/null +++ b/aiida_lammps/validation/schemas/lammps_schema.json @@ -0,0 +1 @@ +{"id": "#root", "title": "LAMMPS AiiDA Run Parameters", "description": "AiiDA dictionary with the structure that will be transformed into a LAMMPS input", "type": "object", "propertyNames": {"enum": ["compute", "relax", "md", "fix"]}, "properties": {"compute": {"$ref": "#/definitions/computes"}, "md": {"type": "object"}, "relax": {"type": "object"}}, "oneOf": [{"required": ["md"], "not": {"required": ["relax"]}}, {"required": ["relax"], "not": {"required": ["md"]}}], "if": {"required": ["relax"]}, "then": {"properties": {"fix": {"$ref": "#/definitions/fixes_relax"}}}, "else": {"properties": {"fix": {"$ref": "#/definitions/fixes"}}}, "definitions": {"computes": {"id": "#compute", "description": "Dictionary containing the different computation that will be performed in a group of atoms. From https://docs.lammps.org/compute.html", "type": "object", "propertyNames": {"enum": ["ackland/atom", "adf", "aggregate/atom", "angle", "angle/local", "angmom/chunk", "basal/atom", "body/local", "bond", "bond/local", "centro/atom", "centroid/stress/atom", "chunk/atom", "chunk/spread/atom", "cluster/atom", "cna/atom", "cnp/atom", "com", "com/chunk", "contact/atom", "coord/atom", "damage/atom", "dihedral", "dihedral/local", "dilatation/atom", "dipole", "dipole/chunk", "displace/atom", "dpd", "dpd/atom", "edpd/temp/atom", "efield/atom", "entropy/atom", "erotate/asphere", "erotate/rigid", "erotate/sphere", "erotate/sphere/atom", "event/displace", "fabric", "fep", "force/tally", "fragment/atom", "global/atom", "group/group", "gyration", "gyration/chunk", "gyration/shape", "gyration/shape/chunk", "heat/flux", "heat/flux/tally", "heat/flux/virial/tally", "hexorder/atom", "hma", "improper", "improper/local", "inertia/chunk", "ke", "ke/atom", "ke/atom/eff", "ke/eff", "ke/rigid", "mliap", "momentum", "msd", "msd/chunk", "msd/nongauss", "omega/chunk", "orientorder/atom", "pair", "pair/local", "pe", "pe/atom", "mesont", "pe/mol/tally", "pe/tally", "plasticity/atom", "pressure", "pressure/cylinder", "pressure/uef", "property/atom", "property/chunk", "property/local", "ptm/atom", "rdf", "reduce", "reduce/chunk", "reduce/region", "rigid/local", "saed", "slice", "smd/contact/radius", "smd/damage", "smd/hourglass/error", "smd/internal/energy", "smd/plastic/strain", "smd/plastic/strain/rate", "smd/rho", "smd/tlsph/defgrad", "smd/tlsph/dt", "smd/tlsph/num/neighs", "smd/tlsph/shape", "smd/tlsph/strain", "smd/tlsph/strain/rate", "smd/tlsph/stress", "smd/triangle/vertices", "smd/ulsph/effm", "smd/ulsph/num/neighs", "smd/ulsph/strain", "smd/ulsph/strain/rate", "smd/ulsph/stress", "smd/vol", "snap", "sna/atom", "snad/atom", "snav/atom", "sph/e/atom", "sph/rho/atom", "sph/t/atom", "spin", "stress/atom", "stress/mop", "stress/mop/profile", "stress/tally", "tdpd/cc/atom", "temp", "temp/asphere", "temp/body", "temp/chunk", "temp/com", "temp/cs", "temp/deform", "temp/deform/eff", "temp/drude", "temp/eff", "temp/partial", "temp/profile", "temp/ramp", "temp/region", "temp/region/eff", "temp/rotate", "temp/sphere", "temp/uef", "ti", "torque/chunk", "vacf", "vcm/chunk", "viscosity/cos", "voronoi/atom", "xrd"]}, "patternProperties": {"^": {"$ref": "#/definitions/children"}}}, "fixes_relax": {"id": "#fix_relax", "description": "Dictionary containing the different fixes that will be performed in a group of atoms (only those for the minimization step). A 'fix' is any operation that is applied to the system during timestepping or minimization. From https://docs.lammps.org/minimize.html", "type": "object", "propertyNames": {"enum": ["addforce", "addtorque", "box/relax", "efield"]}, "patternProperties": {"^": {"$ref": "#/definitions/children"}}}, "fixes": {"id": "#fix", "description": "Dictionary containing the different fixes that will be performed in a group of atoms. A 'fix' is any operation that is applied to the system during timestepping or minimization. From https://docs.lammps.org/fix.html", "type": "object", "propertyNames": {"enum": ["accelerate/cos", "acks2/reaxff", "adapt", "adapt/fep", "addforce", "addtorque", "append/atoms", "atc", "atom/swap", "ave/atom", "ave/chunk", "ave/correlate", "ave/correlate/long", "ave/histo", "ave/histo/weight", "ave/time", "aveforce", "balance", "brownian", "brownian/asphere", "brownian/sphere", "bocs", "bond/break", "bond/create", "bond/create/angle", "bond/react", "bond/swap", "box/relax", "charge/regulation", "client/md", "cmap", "colvars", "controller", "deform", "deposit", "dpd/energy", "drag", "drude", "drude/transform/direct", "drude/transform/inverse", "dt/reset", "edpd/source", "efield", "ehex", "electron/stopping", "electron/stopping/fit", "enforce2d", "eos/cv", "eos/table", "eos/table/rx", "evaporate", "external", "ffl", "filter/corotate", "flow/gauss", "freeze", "gcmc", "gld", "gle", "gravity", "grem", "halt", "heat", "hyper/global", "hyper/local", "imd", "indent", "ipi", "langevin", "langevin/drude", "langevin/eff", "langevin/spin", "latte", "lb/fluid", "lb/momentum", "lb/pc", "lb/rigid/pc/sphere", "lb/viscous", "lineforce", "manifoldforce", "mdi/engine", "meso/move", "mol/swap", "momentum", "momentum/chunk", "move", "mscg", "msst", "mvv/dpd", "mvv/edpd", "mvv/tdpd", "neb", "neb/spin", "nph", "nph/asphere", "nph/body", "nph/eff", "nph/sphere", "nphug", "npt", "npt/asphere", "npt/body", "npt/cauchy", "npt/eff", "npt/sphere", "npt/uef", "numdiff", "nve", "nve/asphere", "nve/asphere/noforce", "nve/awpmd", "nve/body", "nve/dot", "nve/dotc/langevin", "nve/eff", "nve/limit", "nve/line", "nve/manifold/rattle", "nve/noforce", "nve/sphere", "nve/spin", "nve/tri", "nvk", "nvt", "nvt/asphere", "nvt/body", "nvt/eff", "nvt/manifold/rattle", "nvt/sllod", "nvt/sllod/eff", "nvt/sphere", "nvt/uef", "oneway", "orient/bcc", "orient/fcc", "orient/eco", "pafi", "pair/tracker", "phonon", "pimd", "planeforce", "plumed", "poems", "polarize/bem/gmres", "polarize/bem/icc", "polarize/functional", "pour", "precession/spin", "press/berendsen", "print", "propel/self", "property/atom", "python/invoke", "python/move", "qbmsst", "qeq/comb", "qeq/dynamic", "qeq/fire", "qeq/point", "qeq/reaxff", "qeq/shielded", "qeq/slater", "qmmm", "qtb", "rattle", "reaxff/bonds", "reaxff/species", "recenter", "restrain", "rhok", "rigid", "rigid/meso", "rigid/nph", "rigid/nph/small", "rigid/npt", "rigid/npt/small", "rigid/nve", "rigid/nve/small", "rigid/nvt", "rigid/nvt/small", "rigid/small", "rx", "saed/vtk", "setforce", "setforce/spin", "shake", "shardlow", "smd", "smd/adjust_dt", "smd/integrate_tlsph", "smd/integrate_ulsph", "smd/move_tri_surf", "smd/setvel", "smd/wall_surface", "sph", "sph/stationary", "spring", "spring/chunk", "spring/rg", "spring/self", "srd", "store/force", "store/state", "tdpd/source", "temp/berendsen", "temp/csld", "temp/csvr", "temp/rescale", "temp/rescale/eff", "tfmc", "tgnvt/drude", "tgnpt/drude", "thermal/conductivity", "ti/spring", "tmd", "ttm", "ttm/grid", "ttm/mod", "tune/kspace", "vector", "viscosity", "viscous", "wall/body/polygon", "wall/body/polyhedron", "wall/colloid", "wall/ees", "wall/gran", "wall/gran/region", "wall/harmonic", "wall/lj1043", "wall/lj126", "wall/lj93", "wall/morse", "wall/piston", "wall/reflect", "wall/reflect/stochastic", "wall/region", "wall/region/ees", "wall/srd", "widom"]}, "patternProperties": {"^": {"$ref": "#/definitions/children"}}, "oneOf": [{"required": ["nph"]}, {"required": ["nph/asphere"]}, {"required": ["nph/body"]}, {"required": ["nph/eff"]}, {"required": ["nph/sphere"]}, {"required": ["nphug"]}, {"required": ["npt"]}, {"required": ["npt/asphere"]}, {"required": ["npt/body"]}, {"required": ["npt/cauchy"]}, {"required": ["npt/eff"]}, {"required": ["npt/sphere"]}, {"required": ["npt/uef"]}, {"required": ["nve"]}, {"required": ["nve/asphere"]}, {"required": ["nve/asphere/noforce"]}, {"required": ["nve/awpmd"]}, {"required": ["nve/body"]}, {"required": ["nve/dot"]}, {"required": ["nve/dotc/langevin"]}, {"required": ["nve/eff"]}, {"required": ["nve/limit"]}, {"required": ["nve/line"]}, {"required": ["nve/manifold/rattle"]}, {"required": ["nve/noforce"]}, {"required": ["nve/sphere"]}, {"required": ["nve/spin"]}, {"required": ["nve/tri"]}, {"required": ["nvk"]}, {"required": ["nvt"]}, {"required": ["nvt/asphere"]}, {"required": ["nvt/body"]}, {"required": ["nvt/eff"]}, {"required": ["nvt/manifold/rattle"]}, {"required": ["nvt/sllod"]}, {"required": ["nvt/sllod/eff"]}, {"required": ["nvt/sphere"]}, {"required": ["nvt/uef"]}]}, "children": {"id": "#children", "description": "schema for the entries related to the compute and fixes", "type": "object", "properties": {"type": {"type": "array"}, "group": {"type": "string"}}, "required": ["type"]}}} \ No newline at end of file From c30875c8b5b488e86354420e553af3192e2c045b Mon Sep 17 00:00:00 2001 From: Jonathan Chico Date: Wed, 10 Nov 2021 11:36:33 +0100 Subject: [PATCH 07/70] (WIP) Improving the input generation. Fixing an issue in which the schema did not have the complete list of fixes for the minimization. Renamed the "relax" to "minimize" in the schema for clarity. --- aiida_lammps/common/input_generator.py | 6 +- .../validation/schemas/lammps_schema.json | 722 +++++++++++++++++- 2 files changed, 725 insertions(+), 3 deletions(-) diff --git a/aiida_lammps/common/input_generator.py b/aiida_lammps/common/input_generator.py index 8a97ec2..21d44dd 100644 --- a/aiida_lammps/common/input_generator.py +++ b/aiida_lammps/common/input_generator.py @@ -61,8 +61,10 @@ def write_potential_block( potential_block = '# ---- Start of Potential information ----\n' potential_block += f'pair_style {potential.pair_style}\n' potential_block += f'{potential.potential_line}' - potential_block += f"neighbor {parameters_potential.get('neighbor_update', 2.0)} bin\n" - potential_block += f"neigh_modify {join_keywords(parameters_potential['neigh_modify'])}\n" + if 'neighbor': + potential_block += f"neighbor {join_keywords(parameters_potential['neighbor_update'])}\n" + if 'neigh_modify' in parameters_potential: + potential_block += f"neigh_modify {(parameters_potential['neigh_modify'])}\n" potential_block += '# ---- End of Potential information ----\n' return potential_block diff --git a/aiida_lammps/validation/schemas/lammps_schema.json b/aiida_lammps/validation/schemas/lammps_schema.json index 5e2d742..855868d 100644 --- a/aiida_lammps/validation/schemas/lammps_schema.json +++ b/aiida_lammps/validation/schemas/lammps_schema.json @@ -1 +1,721 @@ -{"id": "#root", "title": "LAMMPS AiiDA Run Parameters", "description": "AiiDA dictionary with the structure that will be transformed into a LAMMPS input", "type": "object", "propertyNames": {"enum": ["compute", "relax", "md", "fix"]}, "properties": {"compute": {"$ref": "#/definitions/computes"}, "md": {"type": "object"}, "relax": {"type": "object"}}, "oneOf": [{"required": ["md"], "not": {"required": ["relax"]}}, {"required": ["relax"], "not": {"required": ["md"]}}], "if": {"required": ["relax"]}, "then": {"properties": {"fix": {"$ref": "#/definitions/fixes_relax"}}}, "else": {"properties": {"fix": {"$ref": "#/definitions/fixes"}}}, "definitions": {"computes": {"id": "#compute", "description": "Dictionary containing the different computation that will be performed in a group of atoms. From https://docs.lammps.org/compute.html", "type": "object", "propertyNames": {"enum": ["ackland/atom", "adf", "aggregate/atom", "angle", "angle/local", "angmom/chunk", "basal/atom", "body/local", "bond", "bond/local", "centro/atom", "centroid/stress/atom", "chunk/atom", "chunk/spread/atom", "cluster/atom", "cna/atom", "cnp/atom", "com", "com/chunk", "contact/atom", "coord/atom", "damage/atom", "dihedral", "dihedral/local", "dilatation/atom", "dipole", "dipole/chunk", "displace/atom", "dpd", "dpd/atom", "edpd/temp/atom", "efield/atom", "entropy/atom", "erotate/asphere", "erotate/rigid", "erotate/sphere", "erotate/sphere/atom", "event/displace", "fabric", "fep", "force/tally", "fragment/atom", "global/atom", "group/group", "gyration", "gyration/chunk", "gyration/shape", "gyration/shape/chunk", "heat/flux", "heat/flux/tally", "heat/flux/virial/tally", "hexorder/atom", "hma", "improper", "improper/local", "inertia/chunk", "ke", "ke/atom", "ke/atom/eff", "ke/eff", "ke/rigid", "mliap", "momentum", "msd", "msd/chunk", "msd/nongauss", "omega/chunk", "orientorder/atom", "pair", "pair/local", "pe", "pe/atom", "mesont", "pe/mol/tally", "pe/tally", "plasticity/atom", "pressure", "pressure/cylinder", "pressure/uef", "property/atom", "property/chunk", "property/local", "ptm/atom", "rdf", "reduce", "reduce/chunk", "reduce/region", "rigid/local", "saed", "slice", "smd/contact/radius", "smd/damage", "smd/hourglass/error", "smd/internal/energy", "smd/plastic/strain", "smd/plastic/strain/rate", "smd/rho", "smd/tlsph/defgrad", "smd/tlsph/dt", "smd/tlsph/num/neighs", "smd/tlsph/shape", "smd/tlsph/strain", "smd/tlsph/strain/rate", "smd/tlsph/stress", "smd/triangle/vertices", "smd/ulsph/effm", "smd/ulsph/num/neighs", "smd/ulsph/strain", "smd/ulsph/strain/rate", "smd/ulsph/stress", "smd/vol", "snap", "sna/atom", "snad/atom", "snav/atom", "sph/e/atom", "sph/rho/atom", "sph/t/atom", "spin", "stress/atom", "stress/mop", "stress/mop/profile", "stress/tally", "tdpd/cc/atom", "temp", "temp/asphere", "temp/body", "temp/chunk", "temp/com", "temp/cs", "temp/deform", "temp/deform/eff", "temp/drude", "temp/eff", "temp/partial", "temp/profile", "temp/ramp", "temp/region", "temp/region/eff", "temp/rotate", "temp/sphere", "temp/uef", "ti", "torque/chunk", "vacf", "vcm/chunk", "viscosity/cos", "voronoi/atom", "xrd"]}, "patternProperties": {"^": {"$ref": "#/definitions/children"}}}, "fixes_relax": {"id": "#fix_relax", "description": "Dictionary containing the different fixes that will be performed in a group of atoms (only those for the minimization step). A 'fix' is any operation that is applied to the system during timestepping or minimization. From https://docs.lammps.org/minimize.html", "type": "object", "propertyNames": {"enum": ["addforce", "addtorque", "box/relax", "efield"]}, "patternProperties": {"^": {"$ref": "#/definitions/children"}}}, "fixes": {"id": "#fix", "description": "Dictionary containing the different fixes that will be performed in a group of atoms. A 'fix' is any operation that is applied to the system during timestepping or minimization. From https://docs.lammps.org/fix.html", "type": "object", "propertyNames": {"enum": ["accelerate/cos", "acks2/reaxff", "adapt", "adapt/fep", "addforce", "addtorque", "append/atoms", "atc", "atom/swap", "ave/atom", "ave/chunk", "ave/correlate", "ave/correlate/long", "ave/histo", "ave/histo/weight", "ave/time", "aveforce", "balance", "brownian", "brownian/asphere", "brownian/sphere", "bocs", "bond/break", "bond/create", "bond/create/angle", "bond/react", "bond/swap", "box/relax", "charge/regulation", "client/md", "cmap", "colvars", "controller", "deform", "deposit", "dpd/energy", "drag", "drude", "drude/transform/direct", "drude/transform/inverse", "dt/reset", "edpd/source", "efield", "ehex", "electron/stopping", "electron/stopping/fit", "enforce2d", "eos/cv", "eos/table", "eos/table/rx", "evaporate", "external", "ffl", "filter/corotate", "flow/gauss", "freeze", "gcmc", "gld", "gle", "gravity", "grem", "halt", "heat", "hyper/global", "hyper/local", "imd", "indent", "ipi", "langevin", "langevin/drude", "langevin/eff", "langevin/spin", "latte", "lb/fluid", "lb/momentum", "lb/pc", "lb/rigid/pc/sphere", "lb/viscous", "lineforce", "manifoldforce", "mdi/engine", "meso/move", "mol/swap", "momentum", "momentum/chunk", "move", "mscg", "msst", "mvv/dpd", "mvv/edpd", "mvv/tdpd", "neb", "neb/spin", "nph", "nph/asphere", "nph/body", "nph/eff", "nph/sphere", "nphug", "npt", "npt/asphere", "npt/body", "npt/cauchy", "npt/eff", "npt/sphere", "npt/uef", "numdiff", "nve", "nve/asphere", "nve/asphere/noforce", "nve/awpmd", "nve/body", "nve/dot", "nve/dotc/langevin", "nve/eff", "nve/limit", "nve/line", "nve/manifold/rattle", "nve/noforce", "nve/sphere", "nve/spin", "nve/tri", "nvk", "nvt", "nvt/asphere", "nvt/body", "nvt/eff", "nvt/manifold/rattle", "nvt/sllod", "nvt/sllod/eff", "nvt/sphere", "nvt/uef", "oneway", "orient/bcc", "orient/fcc", "orient/eco", "pafi", "pair/tracker", "phonon", "pimd", "planeforce", "plumed", "poems", "polarize/bem/gmres", "polarize/bem/icc", "polarize/functional", "pour", "precession/spin", "press/berendsen", "print", "propel/self", "property/atom", "python/invoke", "python/move", "qbmsst", "qeq/comb", "qeq/dynamic", "qeq/fire", "qeq/point", "qeq/reaxff", "qeq/shielded", "qeq/slater", "qmmm", "qtb", "rattle", "reaxff/bonds", "reaxff/species", "recenter", "restrain", "rhok", "rigid", "rigid/meso", "rigid/nph", "rigid/nph/small", "rigid/npt", "rigid/npt/small", "rigid/nve", "rigid/nve/small", "rigid/nvt", "rigid/nvt/small", "rigid/small", "rx", "saed/vtk", "setforce", "setforce/spin", "shake", "shardlow", "smd", "smd/adjust_dt", "smd/integrate_tlsph", "smd/integrate_ulsph", "smd/move_tri_surf", "smd/setvel", "smd/wall_surface", "sph", "sph/stationary", "spring", "spring/chunk", "spring/rg", "spring/self", "srd", "store/force", "store/state", "tdpd/source", "temp/berendsen", "temp/csld", "temp/csvr", "temp/rescale", "temp/rescale/eff", "tfmc", "tgnvt/drude", "tgnpt/drude", "thermal/conductivity", "ti/spring", "tmd", "ttm", "ttm/grid", "ttm/mod", "tune/kspace", "vector", "viscosity", "viscous", "wall/body/polygon", "wall/body/polyhedron", "wall/colloid", "wall/ees", "wall/gran", "wall/gran/region", "wall/harmonic", "wall/lj1043", "wall/lj126", "wall/lj93", "wall/morse", "wall/piston", "wall/reflect", "wall/reflect/stochastic", "wall/region", "wall/region/ees", "wall/srd", "widom"]}, "patternProperties": {"^": {"$ref": "#/definitions/children"}}, "oneOf": [{"required": ["nph"]}, {"required": ["nph/asphere"]}, {"required": ["nph/body"]}, {"required": ["nph/eff"]}, {"required": ["nph/sphere"]}, {"required": ["nphug"]}, {"required": ["npt"]}, {"required": ["npt/asphere"]}, {"required": ["npt/body"]}, {"required": ["npt/cauchy"]}, {"required": ["npt/eff"]}, {"required": ["npt/sphere"]}, {"required": ["npt/uef"]}, {"required": ["nve"]}, {"required": ["nve/asphere"]}, {"required": ["nve/asphere/noforce"]}, {"required": ["nve/awpmd"]}, {"required": ["nve/body"]}, {"required": ["nve/dot"]}, {"required": ["nve/dotc/langevin"]}, {"required": ["nve/eff"]}, {"required": ["nve/limit"]}, {"required": ["nve/line"]}, {"required": ["nve/manifold/rattle"]}, {"required": ["nve/noforce"]}, {"required": ["nve/sphere"]}, {"required": ["nve/spin"]}, {"required": ["nve/tri"]}, {"required": ["nvk"]}, {"required": ["nvt"]}, {"required": ["nvt/asphere"]}, {"required": ["nvt/body"]}, {"required": ["nvt/eff"]}, {"required": ["nvt/manifold/rattle"]}, {"required": ["nvt/sllod"]}, {"required": ["nvt/sllod/eff"]}, {"required": ["nvt/sphere"]}, {"required": ["nvt/uef"]}]}, "children": {"id": "#children", "description": "schema for the entries related to the compute and fixes", "type": "object", "properties": {"type": {"type": "array"}, "group": {"type": "string"}}, "required": ["type"]}}} \ No newline at end of file +{ + "id": "#root", + "title": "LAMMPS AiiDA Run Parameters", + "description": "AiiDA dictionary with the structure that will be transformed into a LAMMPS input", + "type": "object", + "propertyNames": { + "enum": [ + "compute", + "minimize", + "md", + "fix" + ] + }, + "properties": { + "compute": { + "$ref": "#/definitions/computes" + }, + "md": { + "type": "object" + }, + "minimize": { + "type": "object" + } + }, + "oneOf": [ + { + "required": [ + "md" + ], + "not": { + "required": [ + "minimize" + ] + } + }, + { + "required": [ + "minimize" + ], + "not": { + "required": [ + "md" + ] + } + } + ], + "if": { + "required": [ + "minimize" + ] + }, + "then": { + "properties": { + "fix": { + "$ref": "#/definitions/fixes_minimize" + } + } + }, + "else": { + "properties": { + "fix": { + "$ref": "#/definitions/fixes" + } + } + }, + "definitions": { + "computes": { + "id": "#compute", + "description": "Dictionary containing the different computation that will be performed in a group of atoms. From https://docs.lammps.org/compute.html", + "type": "object", + "propertyNames": { + "enum": [ + "ackland/atom", + "adf", + "aggregate/atom", + "angle", + "angle/local", + "angmom/chunk", + "basal/atom", + "body/local", + "bond", + "bond/local", + "centro/atom", + "centroid/stress/atom", + "chunk/atom", + "chunk/spread/atom", + "cluster/atom", + "cna/atom", + "cnp/atom", + "com", + "com/chunk", + "contact/atom", + "coord/atom", + "damage/atom", + "dihedral", + "dihedral/local", + "dilatation/atom", + "dipole", + "dipole/chunk", + "displace/atom", + "dpd", + "dpd/atom", + "edpd/temp/atom", + "efield/atom", + "entropy/atom", + "erotate/asphere", + "erotate/rigid", + "erotate/sphere", + "erotate/sphere/atom", + "event/displace", + "fabric", + "fep", + "force/tally", + "fragment/atom", + "global/atom", + "group/group", + "gyration", + "gyration/chunk", + "gyration/shape", + "gyration/shape/chunk", + "heat/flux", + "heat/flux/tally", + "heat/flux/virial/tally", + "hexorder/atom", + "hma", + "improper", + "improper/local", + "inertia/chunk", + "ke", + "ke/atom", + "ke/atom/eff", + "ke/eff", + "ke/rigid", + "mliap", + "momentum", + "msd", + "msd/chunk", + "msd/nongauss", + "omega/chunk", + "orientorder/atom", + "pair", + "pair/local", + "pe", + "pe/atom", + "mesont", + "pe/mol/tally", + "pe/tally", + "plasticity/atom", + "pressure", + "pressure/cylinder", + "pressure/uef", + "property/atom", + "property/chunk", + "property/local", + "ptm/atom", + "rdf", + "reduce", + "reduce/chunk", + "reduce/region", + "rigid/local", + "saed", + "slice", + "smd/contact/radius", + "smd/damage", + "smd/hourglass/error", + "smd/internal/energy", + "smd/plastic/strain", + "smd/plastic/strain/rate", + "smd/rho", + "smd/tlsph/defgrad", + "smd/tlsph/dt", + "smd/tlsph/num/neighs", + "smd/tlsph/shape", + "smd/tlsph/strain", + "smd/tlsph/strain/rate", + "smd/tlsph/stress", + "smd/triangle/vertices", + "smd/ulsph/effm", + "smd/ulsph/num/neighs", + "smd/ulsph/strain", + "smd/ulsph/strain/rate", + "smd/ulsph/stress", + "smd/vol", + "snap", + "sna/atom", + "snad/atom", + "snav/atom", + "sph/e/atom", + "sph/rho/atom", + "sph/t/atom", + "spin", + "stress/atom", + "stress/mop", + "stress/mop/profile", + "stress/tally", + "tdpd/cc/atom", + "temp", + "temp/asphere", + "temp/body", + "temp/chunk", + "temp/com", + "temp/cs", + "temp/deform", + "temp/deform/eff", + "temp/drude", + "temp/eff", + "temp/partial", + "temp/profile", + "temp/ramp", + "temp/region", + "temp/region/eff", + "temp/rotate", + "temp/sphere", + "temp/uef", + "ti", + "torque/chunk", + "vacf", + "vcm/chunk", + "viscosity/cos", + "voronoi/atom", + "xrd" + ] + }, + "patternProperties": { + "^": { + "$ref": "#/definitions/children" + } + } + }, + "fixes_minimize": { + "id": "#fix_minimize", + "description": "Dictionary containing the different fixes that will be performed in a group of atoms (only those for the minimization step). A 'fix' is any operation that is applied to the system during timestepping or minimization. From https://docs.lammps.org/minimize.html", + "type": "object", + "propertyNames": { + "enum": [ + "addforce", + "addtorque", + "box/relax", + "efield", + "enforce2d", + "indent", + "lineforce", + "planeforce", + "setforce", + "spring", + "spring/self", + "viscous", + "wall", + "wall/region" + ] + }, + "patternProperties": { + "^": { + "$ref": "#/definitions/children" + } + } + }, + "fixes": { + "id": "#fix", + "description": "Dictionary containing the different fixes that will be performed in a group of atoms. A 'fix' is any operation that is applied to the system during timestepping or minimization. From https://docs.lammps.org/fix.html", + "type": "object", + "propertyNames": { + "enum": [ + "accelerate/cos", + "acks2/reaxff", + "adapt", + "adapt/fep", + "addforce", + "addtorque", + "append/atoms", + "atc", + "atom/swap", + "ave/atom", + "ave/chunk", + "ave/correlate", + "ave/correlate/long", + "ave/histo", + "ave/histo/weight", + "ave/time", + "aveforce", + "balance", + "brownian", + "brownian/asphere", + "brownian/sphere", + "bocs", + "bond/break", + "bond/create", + "bond/create/angle", + "bond/react", + "bond/swap", + "box/relax", + "charge/regulation", + "client/md", + "cmap", + "colvars", + "controller", + "deform", + "deposit", + "dpd/energy", + "drag", + "drude", + "drude/transform/direct", + "drude/transform/inverse", + "dt/reset", + "edpd/source", + "efield", + "ehex", + "electron/stopping", + "electron/stopping/fit", + "enforce2d", + "eos/cv", + "eos/table", + "eos/table/rx", + "evaporate", + "external", + "ffl", + "filter/corotate", + "flow/gauss", + "freeze", + "gcmc", + "gld", + "gle", + "gravity", + "grem", + "halt", + "heat", + "hyper/global", + "hyper/local", + "imd", + "indent", + "ipi", + "langevin", + "langevin/drude", + "langevin/eff", + "langevin/spin", + "latte", + "lb/fluid", + "lb/momentum", + "lb/pc", + "lb/rigid/pc/sphere", + "lb/viscous", + "lineforce", + "manifoldforce", + "mdi/engine", + "meso/move", + "mol/swap", + "momentum", + "momentum/chunk", + "move", + "mscg", + "msst", + "mvv/dpd", + "mvv/edpd", + "mvv/tdpd", + "neb", + "neb/spin", + "nph", + "nph/asphere", + "nph/body", + "nph/eff", + "nph/sphere", + "nphug", + "npt", + "npt/asphere", + "npt/body", + "npt/cauchy", + "npt/eff", + "npt/sphere", + "npt/uef", + "numdiff", + "nve", + "nve/asphere", + "nve/asphere/noforce", + "nve/awpmd", + "nve/body", + "nve/dot", + "nve/dotc/langevin", + "nve/eff", + "nve/limit", + "nve/line", + "nve/manifold/rattle", + "nve/noforce", + "nve/sphere", + "nve/spin", + "nve/tri", + "nvk", + "nvt", + "nvt/asphere", + "nvt/body", + "nvt/eff", + "nvt/manifold/rattle", + "nvt/sllod", + "nvt/sllod/eff", + "nvt/sphere", + "nvt/uef", + "oneway", + "orient/bcc", + "orient/fcc", + "orient/eco", + "pafi", + "pair/tracker", + "phonon", + "pimd", + "planeforce", + "plumed", + "poems", + "polarize/bem/gmres", + "polarize/bem/icc", + "polarize/functional", + "pour", + "precession/spin", + "press/berendsen", + "print", + "propel/self", + "property/atom", + "python/invoke", + "python/move", + "qbmsst", + "qeq/comb", + "qeq/dynamic", + "qeq/fire", + "qeq/point", + "qeq/reaxff", + "qeq/shielded", + "qeq/slater", + "qmmm", + "qtb", + "rattle", + "reaxff/bonds", + "reaxff/species", + "recenter", + "restrain", + "rhok", + "rigid", + "rigid/meso", + "rigid/nph", + "rigid/nph/small", + "rigid/npt", + "rigid/npt/small", + "rigid/nve", + "rigid/nve/small", + "rigid/nvt", + "rigid/nvt/small", + "rigid/small", + "rx", + "saed/vtk", + "setforce", + "setforce/spin", + "shake", + "shardlow", + "smd", + "smd/adjust_dt", + "smd/integrate_tlsph", + "smd/integrate_ulsph", + "smd/move_tri_surf", + "smd/setvel", + "smd/wall_surface", + "sph", + "sph/stationary", + "spring", + "spring/chunk", + "spring/rg", + "spring/self", + "srd", + "store/force", + "store/state", + "tdpd/source", + "temp/berendsen", + "temp/csld", + "temp/csvr", + "temp/rescale", + "temp/rescale/eff", + "tfmc", + "tgnvt/drude", + "tgnpt/drude", + "thermal/conductivity", + "ti/spring", + "tmd", + "ttm", + "ttm/grid", + "ttm/mod", + "tune/kspace", + "vector", + "viscosity", + "viscous", + "wall/body/polygon", + "wall/body/polyhedron", + "wall/colloid", + "wall/ees", + "wall/gran", + "wall/gran/region", + "wall/harmonic", + "wall/lj1043", + "wall/lj126", + "wall/lj93", + "wall/morse", + "wall/piston", + "wall/reflect", + "wall/reflect/stochastic", + "wall/region", + "wall/region/ees", + "wall/srd", + "widom" + ] + }, + "patternProperties": { + "^": { + "$ref": "#/definitions/children" + } + }, + "oneOf": [ + { + "required": [ + "nph" + ] + }, + { + "required": [ + "nph/asphere" + ] + }, + { + "required": [ + "nph/body" + ] + }, + { + "required": [ + "nph/eff" + ] + }, + { + "required": [ + "nph/sphere" + ] + }, + { + "required": [ + "nphug" + ] + }, + { + "required": [ + "npt" + ] + }, + { + "required": [ + "npt/asphere" + ] + }, + { + "required": [ + "npt/body" + ] + }, + { + "required": [ + "npt/cauchy" + ] + }, + { + "required": [ + "npt/eff" + ] + }, + { + "required": [ + "npt/sphere" + ] + }, + { + "required": [ + "npt/uef" + ] + }, + { + "required": [ + "nve" + ] + }, + { + "required": [ + "nve/asphere" + ] + }, + { + "required": [ + "nve/asphere/noforce" + ] + }, + { + "required": [ + "nve/awpmd" + ] + }, + { + "required": [ + "nve/body" + ] + }, + { + "required": [ + "nve/dot" + ] + }, + { + "required": [ + "nve/dotc/langevin" + ] + }, + { + "required": [ + "nve/eff" + ] + }, + { + "required": [ + "nve/limit" + ] + }, + { + "required": [ + "nve/line" + ] + }, + { + "required": [ + "nve/manifold/rattle" + ] + }, + { + "required": [ + "nve/noforce" + ] + }, + { + "required": [ + "nve/sphere" + ] + }, + { + "required": [ + "nve/spin" + ] + }, + { + "required": [ + "nve/tri" + ] + }, + { + "required": [ + "nvk" + ] + }, + { + "required": [ + "nvt" + ] + }, + { + "required": [ + "nvt/asphere" + ] + }, + { + "required": [ + "nvt/body" + ] + }, + { + "required": [ + "nvt/eff" + ] + }, + { + "required": [ + "nvt/manifold/rattle" + ] + }, + { + "required": [ + "nvt/sllod" + ] + }, + { + "required": [ + "nvt/sllod/eff" + ] + }, + { + "required": [ + "nvt/sphere" + ] + }, + { + "required": [ + "nvt/uef" + ] + } + ] + }, + "children": { + "id": "#children", + "description": "schema for the entries related to the compute and fixes", + "type": "object", + "properties": { + "type": { + "type": "array" + }, + "group": { + "type": "string" + } + }, + "required": [ + "type" + ] + } + } +} \ No newline at end of file From 5469404e8617f16bbc565c324c2563261c981ce4 Mon Sep 17 00:00:00 2001 From: Jonathan Chico Date: Wed, 10 Nov 2021 15:56:42 +0100 Subject: [PATCH 08/70] (WIP) Makign the input generation more flexible. Added a function for the generation of the dump block. General improvements for the dosctrings. Added the automatic tag generation as a function. Added the capability of creating groups in the structure generation. --- aiida_lammps/common/input_generator.py | 255 +++++++++++++----- .../validation/schemas/lammps_schema.json | 2 +- 2 files changed, 193 insertions(+), 64 deletions(-) diff --git a/aiida_lammps/common/input_generator.py b/aiida_lammps/common/input_generator.py index 21d44dd..b1d32dc 100644 --- a/aiida_lammps/common/input_generator.py +++ b/aiida_lammps/common/input_generator.py @@ -1,9 +1,17 @@ """ -[summary] +Set of functions for the generation of the LAMMPS input file -[extended_summary] +These functions will be called depending on what options are present in the +calculation parameters. The input file is generated via 'blocks', each of these +blocks will be responsible for printing and/or generate the data that needs to +be set in the LAMMPS file in accordance to the user defined parameters. + +Certain blocks are conditionally called, e.g. if no fixes are specified the +fixes block is never called, on the other hand the control block is always +called since it is necessary for the functioning of LAMMPS. """ +from typing import Union from aiida import orm @@ -36,7 +44,8 @@ def write_control_block(parameters_control: dict = None) -> str: control_block += 'clear\n' control_block += f"units {parameters_control.get('units', 'si')}\n" control_block += f"newton {parameters_control.get('newton', 'on')}\n" - control_block += f"processors {parameters_control.get('processors','* * * grid onelevel map cart')}\n" + if 'processors' in parameters_control: + control_block += f"processors {join_keywords(parameters_control['processors'])}\n" control_block += f"timestep {parameters_control.get('timestep', _time)}\n" control_block += '# ---- End of the Control information ----\n' return control_block @@ -49,19 +58,22 @@ def write_potential_block( """ Generate the input block with potential options. - [extended_summary] + This will take into consideration the type of potential, as well as other + parameters which affect the usage of the potential (such as neighbor information) + and generate a block that is written in the LAMMPS input file. - :param potential: [description], defaults to None + :param potential: md-potential which will be used in the calculation, defaults to None :type potential: [type], optional - :param parameters_potential: [description], defaults to None + :param parameters_potential: parameters which have to deal with the potential, defaults to None :type parameters_potential: dict, optional - :return: [description] + :return: block with the information needed to setup the potential part of + the LAMMPS calculation. :rtype: str """ potential_block = '# ---- Start of Potential information ----\n' potential_block += f'pair_style {potential.pair_style}\n' potential_block += f'{potential.potential_line}' - if 'neighbor': + if 'neighbor' in parameters_potential: potential_block += f"neighbor {join_keywords(parameters_potential['neighbor_update'])}\n" if 'neigh_modify' in parameters_potential: potential_block += f"neigh_modify {(parameters_potential['neigh_modify'])}\n" @@ -73,21 +85,34 @@ def write_structure_block( parameters_structure: dict = None, structure: orm.StructureData = None, structure_filename: str = None, -) -> str: +) -> Union[str, list]: """ Generate the input block with the structure options. - [extended_summary] + Takes the AiiDA StructureData as well as as a series of user defined + parameters to generate the structure related input block. + This is also responsible of defining the distinct groups that can then + be used for different compute and/or fixes operations. - :param parameters_structure: [description], defaults to None + :param parameters_structure: set of user defined parameters relating to the + structure, defaults to None :type parameters_structure: dict, optional - :param structure: [description], defaults to None + :param structure: structure that will be studied, defaults to None :type structure: orm.StructureData, optional - :param structure_filename: [description], defaults to None + :param structure_filename: name of the file where the structure will be + written so that LAMMPS can read it, defaults to None :type structure_filename: str, optional - :return: [description] - :rtype: str + :return: block with the structural information and list of groups present + :rtype: Union[str, list] """ + + group_names = [] + + kind_name_id_map = {} + for site in structure.sites: + if site.kind_name not in kind_name_id_map: + kind_name_id_map[site.kind_name] = len(kind_name_id_map) + 1 + structure_block = '# ---- Start of the Structure information ----\n' structure_block += f"box tilt {parameters_structure.get('box_tilt','small')}\n" @@ -98,20 +123,36 @@ def write_structure_block( structure_block += '\n' structure_block += f"atom_style {parameters_structure['atom_style']}\n" structure_block += f'read_data {structure_filename}\n' + # Set the groups which will be used for the calculations + if 'groups' in parameters_structure: + for _group in parameters_structure['group']: + # Check if the given type name corresponds to the ones assigned to the atom types + if 'type' in _group['args']: + assert all( + kind in kind_name_id_map.values() + for kind in _group['args'][_group['args'].index('type') + + 1:]), 'atom type not defined' + # Set the current group + structure_block += f"group {_group['name']} {join_keywords(_group['args'])}\n" + # Store the name of the group for later usage + group_names.append(_group['name']) structure_block += '# ---- End of the Structure information ----\n' - return structure_block + return structure_block, group_names def write_minimize_block(parameters_minimize: dict = None) -> str: """ Generate the input block with the minimization options. - [extended_summary] + If the user wishes to do a minimization calculation the parameters will be passed + to this routine and the necessary block for the input file will be generated. + + .. note: this mode is mutually exclusive with the md mode. - :param parameters_minimize: [description], defaults to None + :param parameters_minimize: user defined parameters for the minimization, defaults to None :type parameters_minimize: dict, optional - :return: [description] + :return: block with the minimization options. :rtype: str """ minimize_block = '# ---- Start of the Minimization information ----\n' @@ -125,38 +166,25 @@ def write_minimize_block(parameters_minimize: dict = None) -> str: return minimize_block -def write_md_block( - parameters_md: dict = None, - parameters_fix: dict = None, -) -> str: +def write_md_block(parameters_md: dict = None) -> str: """ Generate the input block with the MD options. - [extended_summary] + If the user wishes to perform an MD run this will take the user defined + parameters and set them in a LAMMPS compliant form. - :param parameters_md: [description], defaults to None + .. note: For MD to function an integrator must be provided, this is done + by providing a fix in the fix part of the input. The existence of at least one + integrator is checked by the schema. + + .. note: this mode is mutually exclusive with the minimize mode. + + :param parameters_md: user defined parameters for the MD run, defaults to None :type parameters_md: dict, optional - :return: [description] + :return: block with the MD options. :rtype: str """ - integrators = [ - 'nvt', - 'nvp', - 'nph', - 'nvt/eff', - 'nvp/eff', - 'nph/eff', - 'nvt/uef', - 'npt/uef', - 'nph/asphere', - 'nph/body', - 'nph/sphere', - ] - - assert any(x in parameters_fix.keys() - for x in integrators), 'No integrator provided' - md_block = '# ---- Start of the MD information ----\n' md_block += 'reset_timestep 0\n' if parameters_md.get('run_style', 'verlet') == 'rspa': @@ -170,54 +198,155 @@ def write_md_block( return md_block -def write_fix_block(parameters_fix: dict = None) -> str: +def write_fix_block( + parameters_fix: dict = None, + group_names: list = None, +) -> Union[str, list]: """ Generate the input block with the fix options. - [extended_summary] + This takes the user defined fixes and generates a block where each one of + them is defined. They can be applied to different groups which can be + selected by the user and are checked to exist with the previously defined groups + in the structure setup. + + ..note: fixes which are incompatible with the minimize option are checked by + the validation schema. - :param parameters_fix: [description], defaults to None + ..note: the md mode required one of the integrators (nve, nvt, etc) to be defined + their existence is checked by the schema. + + :param parameters_fix: fixes that will be applied to the calculation, defaults to None :type parameters_fix: dict, optional - :return: [description] - :rtype: str + :param group_names: list of groups names as defined during structure + generation, defaults to None + :type group_names: list, optional + :return: block with the fixes information, list of applied fixes + :rtype: Union[str, list] """ + fixes_list = [] + fix_block = '# ---- Start of the Fix information ----\n' for key, value in parameters_fix.items(): - fix_block += f"fix {key.replace('/','_')}_aiida {value['group']} {key} " + _group = value.get('group', 'all') + assert _group in group_names + ['all'], 'group name not defined' + fix_block += f'fix {generate_id_tag(key, _group)} {_group} {key} ' fix_block += f"{join_keywords(value['type'])}\n" + fixes_list.append(generate_id_tag(key, _group)) fix_block += '# ---- End of the Fix information ----\n' - return fix_block + return fix_block, fixes_list -def write_compute_block(parameters_compute: dict = None) -> str: +def write_compute_block( + parameters_compute: dict = None, + group_names: list = None, +) -> Union[str, list]: """ Generate the input block with the compute options. - [extended_summary] + This takes the user defined computes and generates a block where each one of + them is defined. They can be applied to different groups which can be + selected by the user and are checked to exist with the previously defined groups + in the structure setup. - :param parameters_compute: [description], defaults to None + :param parameters_compute: computes that will be applied to the calculation, + defaults to None :type parameters_compute: dict, optional - :return: [description] - :rtype: str + :param group_names: list of groups names as defined during structure + generation, defaults to None + :type group_names: list, optional + :return: block with the computes information, list with all the applied computes + :rtype: Union[str, list] """ + + computes_list = [] + compute_block = '# ---- Start of the Compute information ----\n' for key, value in parameters_compute.items(): - compute_block += f"compute {key.replace('/','_')}_aiida {value['group']} {key} " + _group = value.get('group', 'all') + assert _group in group_names + ['all'], 'group name not defined' + compute_block += f'compute {generate_id_tag(key, _group)} {_group} {key} ' compute_block += f"{join_keywords(value['type'])}\n" + computes_list.append(generate_id_tag(key, _group)) + compute_block += '# ---- End of the Compute information ----\n' - return compute_block + return compute_block, computes_list + + +def write_dump_block( + parameters_dump: dict, + trajectory_filename: str, + atom_style: str, + computes_list: list = None, + fixes_list: list = None, +) -> str: + """Generate the block with dumps commands. + + This will check for any compute and/or fix that generates atom dependent data + and will make sure that it is written to file in a controllable manner, so that + they can be easily parsed afterwards. + + :param parameters_dump: set of user defined parameters for the writing of data + :type parameters_dump: dict + :param trajectory_filename: name of the file where the trajectory is written. + :type trajectory_filename: str + :param atom_style: which kind of LAMMPS atomic style is used for the calculation. + :param computes_list: list with all the computes set in this calculation, defaults to None + :type computes_list: list, optional + :param fixes_list: list with all the fixes defined for the calculation, defaults to None + :type fixes_list: list, optional + :return: block with the dump options for the calculation + :rtype: str + """ + site_specific_computes = [ + compute for compute in computes_list if '_atom_' in compute + ] + + site_specific_fixes = [fix for fix in fixes_list if 'ave_' in fix] + + dump_block = '# ---- Start of the Compute information ----\n' + dump_block += f'dump aiida all custom {parameters_dump.get("dump_rate", 10)} ' + dump_block += f'{trajectory_filename} id type element x y z' + dump_block += f'{" q" if atom_style=="charge" else ""}\n' + dump_block += '# ---- End of the Compute information ----\n' + + return dump_block -def join_keywords(value) -> str: +def generate_id_tag(name: str = None, group: str = None) -> str: + """Generate an id tag for fixes and/or computes. + + To standardize the naming of computes and/or fixes and to ensure that one + can programatically recreate them their name will consist of the name of the fix/compute + with the group at which is applied appended plus the aiida keyword. Of this + way one can always regenerate these tags by knowing which fix/computes + were asked of the calculation. + + :param name: name of the fix/compute, defaults to None + :type name: str, optional + :param group: group which at which the fix/compute will be applied to, defaults to None + :type group: str, optional + :return: if tag for the compute/fix + :rtype: str """ - [summary] + return f"{name.replace('/','_')}_{group}_aiida" - [extended_summary] - :param value: [description] - :type value: [type] - :return: [description] +def join_keywords(value: list) -> str: + """ + Generate a string for the compute/fix options. + + Depending on the desired fix/compute several options might need to be passed + to it to dictate its behavior. Having the user pass these options as a single string + is a bad idea, instead it is simple if the user passes them as a list, where key,value + pairs dictionaries can be present and or single entries. These items will be + taken and concatenated to ensure that a LAMMPS compliant string is produced + out of all these options. + + :param value: list with the options for a given fix/compute + :type value: list + :return: LAMMPS compliant string with the fix/compute options :rtype: str """ return ' '.join([ diff --git a/aiida_lammps/validation/schemas/lammps_schema.json b/aiida_lammps/validation/schemas/lammps_schema.json index 855868d..d5dc849 100644 --- a/aiida_lammps/validation/schemas/lammps_schema.json +++ b/aiida_lammps/validation/schemas/lammps_schema.json @@ -718,4 +718,4 @@ ] } } -} \ No newline at end of file +} From abb20164dc169672d19aab16262daf47fd56058f Mon Sep 17 00:00:00 2001 From: Jonathan Chico Date: Wed, 10 Nov 2021 17:20:52 +0100 Subject: [PATCH 09/70] (WIP) make the input file generation more flexible. Add the capability of having any of the defined computes in the thermo block so that they are printed in the log file. --- aiida_lammps/common/input_generator.py | 32 ++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/aiida_lammps/common/input_generator.py b/aiida_lammps/common/input_generator.py index b1d32dc..fa672fc 100644 --- a/aiida_lammps/common/input_generator.py +++ b/aiida_lammps/common/input_generator.py @@ -305,14 +305,42 @@ def write_dump_block( site_specific_fixes = [fix for fix in fixes_list if 'ave_' in fix] - dump_block = '# ---- Start of the Compute information ----\n' + dump_block = '# ---- Start of the Dump information ----\n' dump_block += f'dump aiida all custom {parameters_dump.get("dump_rate", 10)} ' dump_block += f'{trajectory_filename} id type element x y z' dump_block += f'{" q" if atom_style=="charge" else ""}\n' - dump_block += '# ---- End of the Compute information ----\n' + dump_block += '# ---- End of the Dump information ----\n' return dump_block +def write_thermo_block(parameters_thermo: dict, computes_list: list = None) -> str: + """Generate the block with the thermo command. + + This will take all the global computes which were generated during the calculation + plus the 'common' thermodynamic parameters set by LAMMPS and set them so that + they are printed to the LAMMPS log file. + + :param parameters_thermo: user defined parameters to control the log data. + :type parameters_thermo: dict + :param computes_list: list with all the computes set in this calculation, defaults to None + :type computes_list: list, optional + :return: block with the thermo options for the calculation. + :rtype: str + """ + + + global_computes = [ + f'c_{compute}' for compute in computes_list if '_atom_' not in compute + ] + + fixed_thermo = ['step', 'temp', 'epair', 'emol', 'etotal', 'press'] + + thermo_block = '# ---- Start of the Thermo information ----\n' + thermo_block += f'thermo_style {" ".join(fixed_thermo)} {" ".join(global_computes)}\n' + thermo_block += f'thermo {parameters_thermo.get("printing_rate", 1000)}\n' + thermo_block += '# ---- End of the Thermo information ----\n' + + return thermo_block def generate_id_tag(name: str = None, group: str = None) -> str: """Generate an id tag for fixes and/or computes. From a693920e35fe7eb0eb434eb30c0711f808d00a10 Mon Sep 17 00:00:00 2001 From: Jonathan Chico Date: Mon, 15 Nov 2021 16:40:12 +0100 Subject: [PATCH 10/70] (WIP) making the input more flexible. Adding a helper routine and file to programatically generate the compute strings for the thermo_style. --- aiida_lammps/common/input_generator.py | 146 ++++++++++++----- aiida_lammps/common/variables_types.json | 153 ++++++++++++++++++ .../validation/schemas/lammps_schema.json | 82 +++++++++- 3 files changed, 342 insertions(+), 39 deletions(-) create mode 100644 aiida_lammps/common/variables_types.json diff --git a/aiida_lammps/common/input_generator.py b/aiida_lammps/common/input_generator.py index fa672fc..b8ddf2e 100644 --- a/aiida_lammps/common/input_generator.py +++ b/aiida_lammps/common/input_generator.py @@ -9,21 +9,21 @@ Certain blocks are conditionally called, e.g. if no fixes are specified the fixes block is never called, on the other hand the control block is always called since it is necessary for the functioning of LAMMPS. - """ from typing import Union +import json from aiida import orm -def write_control_block(parameters_control: dict = None) -> str: +def write_control_block(parameters_control: dict) -> str: """ Generate the input block with global control options. This takes the general options that affect the entire simulation, these are then used (or their default values) to generate the control block. - :param parameters_control: dictionary with the basic control parameters, defaults to None - :type parameters_control: dict, optional + :param parameters_control: dictionary with the basic control parameters + :type parameters_control: dict :return: control block with general parameters of the simulation. :rtype: str """ @@ -52,8 +52,8 @@ def write_control_block(parameters_control: dict = None) -> str: def write_potential_block( - potential=None, - parameters_potential: dict = None, + potential, + parameters_potential: dict, ) -> str: """ Generate the input block with potential options. @@ -62,14 +62,15 @@ def write_potential_block( parameters which affect the usage of the potential (such as neighbor information) and generate a block that is written in the LAMMPS input file. - :param potential: md-potential which will be used in the calculation, defaults to None - :type potential: [type], optional - :param parameters_potential: parameters which have to deal with the potential, defaults to None - :type parameters_potential: dict, optional + :param potential: md-potential which will be used in the calculation + :type potential: [type], + :param parameters_potential: parameters which have to deal with the potential + :type parameters_potential: dict :return: block with the information needed to setup the potential part of the LAMMPS calculation. :rtype: str """ + potential_block = '# ---- Start of Potential information ----\n' potential_block += f'pair_style {potential.pair_style}\n' potential_block += f'{potential.potential_line}' @@ -82,9 +83,9 @@ def write_potential_block( def write_structure_block( - parameters_structure: dict = None, - structure: orm.StructureData = None, - structure_filename: str = None, + parameters_structure: dict, + structure: orm.StructureData, + structure_filename: str, ) -> Union[str, list]: """ Generate the input block with the structure options. @@ -95,13 +96,13 @@ def write_structure_block( be used for different compute and/or fixes operations. :param parameters_structure: set of user defined parameters relating to the - structure, defaults to None - :type parameters_structure: dict, optional - :param structure: structure that will be studied, defaults to None - :type structure: orm.StructureData, optional + structure. + :type parameters_structure: dict + :param structure: structure that will be studied + :type structure: orm.StructureData :param structure_filename: name of the file where the structure will be - written so that LAMMPS can read it, defaults to None - :type structure_filename: str, optional + written so that LAMMPS can read it + :type structure_filename: str :return: block with the structural information and list of groups present :rtype: Union[str, list] """ @@ -128,10 +129,11 @@ def write_structure_block( for _group in parameters_structure['group']: # Check if the given type name corresponds to the ones assigned to the atom types if 'type' in _group['args']: - assert all( - kind in kind_name_id_map.values() - for kind in _group['args'][_group['args'].index('type') + - 1:]), 'atom type not defined' + + _subset = _group['args'][_group['args'].index('type') + 1:] + + assert all(kind in kind_name_id_map.values() + for kind in _subset), 'atom type not defined' # Set the current group structure_block += f"group {_group['name']} {join_keywords(_group['args'])}\n" # Store the name of the group for later usage @@ -141,7 +143,7 @@ def write_structure_block( return structure_block, group_names -def write_minimize_block(parameters_minimize: dict = None) -> str: +def write_minimize_block(parameters_minimize: dict) -> str: """ Generate the input block with the minimization options. @@ -150,11 +152,12 @@ def write_minimize_block(parameters_minimize: dict = None) -> str: .. note: this mode is mutually exclusive with the md mode. - :param parameters_minimize: user defined parameters for the minimization, defaults to None - :type parameters_minimize: dict, optional + :param parameters_minimize: user defined parameters for the minimization + :type parameters_minimize: dict :return: block with the minimization options. :rtype: str """ + minimize_block = '# ---- Start of the Minimization information ----\n' minimize_block += f"min_style {parameters_minimize.get('style', 'cg')}\n" minimize_block += f"minimize {parameters_minimize.get('energy_tolerance', 1e-4)}" @@ -166,7 +169,7 @@ def write_minimize_block(parameters_minimize: dict = None) -> str: return minimize_block -def write_md_block(parameters_md: dict = None) -> str: +def write_md_block(parameters_md: dict) -> str: """ Generate the input block with the MD options. @@ -179,8 +182,8 @@ def write_md_block(parameters_md: dict = None) -> str: .. note: this mode is mutually exclusive with the minimize mode. - :param parameters_md: user defined parameters for the MD run, defaults to None - :type parameters_md: dict, optional + :param parameters_md: user defined parameters for the MD run + :type parameters_md: dict :return: block with the MD options. :rtype: str """ @@ -199,7 +202,7 @@ def write_md_block(parameters_md: dict = None) -> str: def write_fix_block( - parameters_fix: dict = None, + parameters_fix: dict, group_names: list = None, ) -> Union[str, list]: """ @@ -216,8 +219,8 @@ def write_fix_block( ..note: the md mode required one of the integrators (nve, nvt, etc) to be defined their existence is checked by the schema. - :param parameters_fix: fixes that will be applied to the calculation, defaults to None - :type parameters_fix: dict, optional + :param parameters_fix: fixes that will be applied to the calculation + :type parameters_fix: dict :param group_names: list of groups names as defined during structure generation, defaults to None :type group_names: list, optional @@ -227,6 +230,9 @@ def write_fix_block( fixes_list = [] + if group_names is None: + group_names = [] + fix_block = '# ---- Start of the Fix information ----\n' for key, value in parameters_fix.items(): _group = value.get('group', 'all') @@ -239,7 +245,7 @@ def write_fix_block( def write_compute_block( - parameters_compute: dict = None, + parameters_compute: dict, group_names: list = None, ) -> Union[str, list]: """ @@ -250,9 +256,8 @@ def write_compute_block( selected by the user and are checked to exist with the previously defined groups in the structure setup. - :param parameters_compute: computes that will be applied to the calculation, - defaults to None - :type parameters_compute: dict, optional + :param parameters_compute: computes that will be applied to the calculation + :type parameters_compute: dict :param group_names: list of groups names as defined during structure generation, defaults to None :type group_names: list, optional @@ -262,6 +267,9 @@ def write_compute_block( computes_list = [] + if group_names is None: + group_names = [] + compute_block = '# ---- Start of the Compute information ----\n' for key, value in parameters_compute.items(): _group = value.get('group', 'all') @@ -299,10 +307,17 @@ def write_dump_block( :return: block with the dump options for the calculation :rtype: str """ + + if computes_list is None: + computes_list = [] + site_specific_computes = [ compute for compute in computes_list if '_atom_' in compute ] + if fixes_list is None: + fixes_list = [] + site_specific_fixes = [fix for fix in fixes_list if 'ave_' in fix] dump_block = '# ---- Start of the Dump information ----\n' @@ -313,7 +328,12 @@ def write_dump_block( return dump_block -def write_thermo_block(parameters_thermo: dict, computes_list: list = None) -> str: + +def write_thermo_block( + parameters_thermo: dict, + computes_list: list = None, + computes_printing: dict = None, +) -> str: """Generate the block with the thermo command. This will take all the global computes which were generated during the calculation @@ -324,16 +344,25 @@ def write_thermo_block(parameters_thermo: dict, computes_list: list = None) -> s :type parameters_thermo: dict :param computes_list: list with all the computes set in this calculation, defaults to None :type computes_list: list, optional + :param computes_printing: dict with all the user defined computes to be printed, defaults to None + :type computes_printing: dict, optional :return: block with the thermo options for the calculation. :rtype: str """ + if computes_list is None: + computes_list = [] global_computes = [ f'c_{compute}' for compute in computes_list if '_atom_' not in compute ] - fixed_thermo = ['step', 'temp', 'epair', 'emol', 'etotal', 'press'] + if computes_printing is None or not computes_printing: + fixed_thermo = ['step', 'temp', 'epair', 'emol', 'etotal', 'press'] + else: + fixed_thermo = [ + key for key, value in computes_printing.items() if value + ] thermo_block = '# ---- Start of the Thermo information ----\n' thermo_block += f'thermo_style {" ".join(fixed_thermo)} {" ".join(global_computes)}\n' @@ -342,6 +371,45 @@ def write_thermo_block(parameters_thermo: dict, computes_list: list = None) -> s return thermo_block + +def generate_compute_string(name: str, group: str) -> str: + """ + [summary] + + [extended_summary] + + :param name: [description] + :type name: str + :param group: [description] + :type group: str + :return: [description] + :rtype: str + """ + + + with open('variables_types.json', 'r') as handler: + _compute_variables = json.load(handler)['computes'] + + _type = _compute_variables[name]["type"] + _size = _compute_variables[name]["size"] + + c_string = [] + + if _type == "vector" and _size > 0: + for index in range(1, _size+1): + c_string.append(f"{name.replace('/','_')}_{group}_aiida[{index}]") + + if _type == "mixed" and _size > 0: + c_string.append(f"{name.replace('/','_')}_{group}_aiida") + for index in range(1, _size+1): + c_string.append(f"{name.replace('/','_')}_{group}_aiida[{index}]") + + if _type == "scalar": + c_string.append(f"{name.replace('/','_')}_{group}_aiida") + + return " ".join(c_string) + + def generate_id_tag(name: str = None, group: str = None) -> str: """Generate an id tag for fixes and/or computes. @@ -358,6 +426,7 @@ def generate_id_tag(name: str = None, group: str = None) -> str: :return: if tag for the compute/fix :rtype: str """ + return f"{name.replace('/','_')}_{group}_aiida" @@ -377,6 +446,7 @@ def join_keywords(value: list) -> str: :return: LAMMPS compliant string with the fix/compute options :rtype: str """ + return ' '.join([ f"{entry['keyword']} {entry['value']}" if isinstance(entry, dict) else f'{entry}' for entry in value diff --git a/aiida_lammps/common/variables_types.json b/aiida_lammps/common/variables_types.json new file mode 100644 index 0000000..b75ee3c --- /dev/null +++ b/aiida_lammps/common/variables_types.json @@ -0,0 +1,153 @@ +{ + "computes":{ + "ackland/atom": {"type": "array", "size": 0, "locality": "local"}, + "adf": {"type": "array", "size": 0, "locality": "global"}, + "aggregate/atom": {"type": "array", "size": 0, "locality": "local"}, + "angle": {"type": "array", "size": 0, "locality": "global"}, + "angle/local": {"type": "array", "size": 0, "locality": "global"}, + "angmom/chunk": {"type": "array", "size": 0, "locality": "global"}, + "basal/atom": {"type": "array", "size": 0, "locality": "local"}, + "body/local": {"type": "array", "size": 0, "locality": "local"}, + "bond": {"type": "array", "size": 0, "locality": "global"}, + "bond/local": {"type": "array", "size": 0, "locality": "local"}, + "centro/atom": {"type": "array", "size": 0, "locality": "local"}, + "centroid/stress/atom": {"type": "array", "size": 0, "locality": "local"}, + "chunk/atom": {"type": "mixed", "size": 0, "locality": "local"}, + "chunk/spread/atom": {"type": "array", "size": 0, "locality": "local"}, + "cluster/atom": {"type": "array", "size": 0, "locality": "local"}, + "cna/atom": {"type": "array", "size": 0, "locality": "local"}, + "cnp/atom": {"type": "array", "size": 0, "locality": "local"}, + "com": {"type": "vector", "size": 3, "locality": "global"}, + "com/chunk": {"type": "array", "size": 0, "locality": "global"}, + "contact/atom": {"type": "array", "size": 0, "locality": "local"}, + "coord/atom": {"type": "array", "size": 0, "locality": "local"}, + "damage/atom": {"type": "array", "size": 0, "locality": "local"}, + "dihedral": {"type": "array", "size": 0, "locality": "global"}, + "dihedral/local": {"type": "array", "size": 0, "locality": "global"}, + "dilatation/atom": {"type": "array", "size": 0, "locality": "local"}, + "dipole": {"type": "mixed", "size": 3, "locality": "global"}, + "dipole/chunk": {"type": "array", "size": 0, "locality": "global"}, + "displace/atom": {"type": "array", "size": 0, "locality": "local"}, + "dpd": {"type": "vector", "size": 5, "locality": "global"}, + "dpd/atom": {"type": "array", "size": 4, "locality": "local"}, + "edpd/temp/atom": {"type": "array", "size": 0, "locality": "local"}, + "efield/atom": {"type": "array", "size": 0, "locality": "local"}, + "entropy/atom": {"type": "array", "size": 0, "locality": "local"}, + "erotate/asphere": {"type": "scalar", "size": 0, "locality": "global"}, + "erotate/rigid": {"type": "scalar", "size": 0, "locality": "global"}, + "erotate/sphere": {"type": "scalar", "size": 0, "locality": "global"}, + "erotate/sphere/atom": {"type": "array", "size": 0, "locality": "local"}, + "event/displace": {"type": "scalar", "size": 0, "locality": "global"}, + "fabric": {"type": "array", "size": 0, "locality": "global"}, + "fep": {"type": "vector", "size": 3, "locality": "global"}, + "force/tally": {"type": "array", "size": 3, "locality": "global"}, + "fragment/atom": {"type": "", "size": 0, "locality": "local"}, + "global/atom": {"type": "array", "size": 0, "locality": "local"}, + "group/group": {"type": "mixed", "size": 3, "locality": "global"}, + "gyration": {"type": "mixed", "size": 6, "locality": "global"}, + "gyration/chunk": {"type": "array", "size": 6, "locality": "global"}, + "gyration/shape":{ "type": "vector", "size": 6, "locality": "global"}, + "gyration/shape/chunk": {"type": "vector", "size": 6, "locality": "global"}, + "heat/flux": {"type": "vector", "size": 6, "locality": "global"}, + "heat/flux/tally": {"type": "vector", "size": 6, "locality": "global"}, + "heat/flux/virial/tally": {"type": "mixed", "size": 0, "locality": "local"}, + "hexorder/atom": {"type": "array", "size": 0, "locality": "local"}, + "hma": {"type": "vector", "size": 0, "locality": "global"}, + "improper": {"type": "", "size": 0, "locality": "global"}, + "improper/local": {"type": "array", "size": 0, "locality": "global"}, + "inertia/chunk": {"type": "array", "size": 0, "locality": "global"}, + "ke": {"type": "scalar", "size": 0, "locality": "global"}, + "ke/atom": {"type": "array", "size": 0, "locality": "local"}, + "ke/atom/eff": {"type": "array", "size": 0, "locality": "local"}, + "ke/eff": {"type": "scalar", "size": 0, "locality": "global"}, + "ke/rigid": {"type": "scalar", "size": 0, "locality": "global"}, + "mliap": {"type": "array", "size": 0, "locality": "global"}, + "momentum": {"type": "vector", "size": 3, "locality": "global"}, + "msd": {"type": "vector", "size": 4, "locality": "global"}, + "msd/chunk": {"type": "array", "size": 0, "locality": "global"}, + "msd/nongauss": {"type": "vector", "size": 3, "locality": "global"}, + "omega/chunk": {"type": "array", "size": 0, "locality": "global"}, + "orientorder/atom": {"type": "array", "size": 0, "locality": "local"}, + "pair": {"type": "mixed", "size": 0, "locality": "global"}, + "pair/local": {"type": "array", "size": 0, "locality": "global"}, + "pe": {"type": "scalar", "size": 0, "locality": "global"}, + "pe/atom": {"type": "array", "size": 0, "locality": "local"}, + "mesont": {"type": "array", "size": 0, "locality": "local"}, + "pe/mol/tally": {"type": "vector", "size": 4, "locality": "global"}, + "pe/tally": {"type": "array", "size": 0, "locality": "local"}, + "plasticity/atom": {"type": "array", "size": 0, "locality": "local"}, + "pressure": {"type": "mixed", "size": 6, "locality": "global"}, + "pressure/cylinder": {"type": "array", "size": 0, "locality": "global"}, + "pressure/uef": {"type": "array", "size": 0, "locality": "global"}, + "property/atom": {"type": "array", "size": 0, "locality": "local"}, + "property/chunk": {"type": "array", "size": 0, "locality": "global"}, + "property/local": {"type": "array", "size": 0, "locality": "global"}, + "ptm/atom": {"type": "array", "size": 0, "locality": "local"}, + "rdf": {"type": "array", "size": 0, "locality": "global"}, + "reduce": {"type": "", "size": 0, "locality": "global"}, + "reduce/chunk": {"type": "", "size": 0, "locality": "global"}, + "reduce/region": {"type": "", "size": 0, "locality": "global"}, + "rigid/local": {"type": "array", "size": 0, "locality": "local"}, + "saed": {"type": "vector", "size": 0, "locality": "global"}, + "slice": {"type": "array", "size": 0, "locality": "global"}, + "smd/contact/radius": {"type": "array", "size": 0, "locality": "local"}, + "smd/damage": {"type": "array", "size": 0, "locality": "local"}, + "smd/hourglass/error": {"type": "array", "size": 0, "locality": "local"}, + "smd/internal/energy": {"type": "array", "size": 0, "locality": "local"}, + "smd/plastic/strain": {"type": "array", "size": 0, "locality": "local"}, + "smd/plastic/strain/rate": {"type": "array", "size": 0, "locality": "local"}, + "smd/rho": {"type": "array", "size": 0, "locality": "local"}, + "smd/tlsph/defgrad": {"type": "array", "size": 0, "locality": "local"}, + "smd/tlsph/dt": {"type": "array", "size": 0, "locality": "local"}, + "smd/tlsph/num/neighs": {"type": "array", "size": 0, "locality": "local"}, + "smd/tlsph/shape": {"type": "array", "size": 0, "locality": "local"}, + "smd/tlsph/strain": {"type": "array", "size": 0, "locality": "local"}, + "smd/tlsph/strain/rate": {"type": "array", "size": 0, "locality": "local"}, + "smd/tlsph/stress": {"type": "array", "size": 0, "locality": "local"}, + "smd/triangle/vertices": {"type": "array", "size": 0, "locality": "local"}, + "smd/ulsph/effm": {"type": "array", "size": 0, "locality": "local"}, + "smd/ulsph/num/neighs": {"type": "array", "size": 0, "locality": "local"}, + "smd/ulsph/strain": {"type": "array", "size": 0, "locality": "local"}, + "smd/ulsph/strain/rate": {"type": "array", "size": 0, "locality": "local"}, + "smd/ulsph/stress": {"type": "array", "size": 0, "locality": "local"}, + "smd/vol": {"type": "array", "size": 0, "locality": "local"}, + "snap": {"type": "array", "size": 0, "locality": "global"}, + "sna/atom": {"type": "array", "size": 0, "locality": "local"}, + "snad/atom": {"type": "array", "size": 0, "locality": "local"}, + "snav/atom": {"type": "array", "size": 0, "locality": "local"}, + "sph/e/atom": {"type": "array", "size": 0, "locality": "local"}, + "sph/rho/atom": {"type": "array", "size": 0, "locality": "local"}, + "sph/t/atom": {"type": "array", "size": 0, "locality": "local"}, + "spin": {"type": "array", "size": 0, "locality": "global"}, + "stress/atom": {"type": "array", "size": 0, "locality": "local"}, + "stress/mop": {"type": "vector", "size": 3, "locality": "global"}, + "stress/mop/profile": {"type": "vector", "size": 3, "locality": "global"}, + "stress/tally": {"type": "mixed", "size": 0, "locality": "local"}, + "tdpd/cc/atom": {"type": "array", "size": 0, "locality": "local"}, + "temp": {"type": "mixed", "size": 6, "locality": "global"}, + "temp/asphere": {"type": "mixed", "size": 6, "locality": "global"}, + "temp/body": {"type": "mixed", "size": 6, "locality": "global"}, + "temp/chunk": {"type": "mixed", "size": 6, "locality": "global"}, + "temp/com": {"type": "mixed", "size": 6, "locality": "global"}, + "temp/cs": {"type": "mixed", "size": 6, "locality": "global"}, + "temp/deform": {"type": "mixed", "size": 6, "locality": "global"}, + "temp/deform/eff": {"type": "mixed", "size": 6, "locality": "global"}, + "temp/drude": {"type": "mixed", "size": 6, "locality": "global"}, + "temp/eff": {"type": "mixed", "size": 6, "locality": "global"}, + "temp/partial": {"type": "mixed", "size": 6, "locality": "global"}, + "temp/profile": {"type": "mixed", "size": 6, "locality": "global"}, + "temp/ramp": {"type": "mixed", "size": 6, "locality": "global"}, + "temp/region": {"type": "mixed", "size": 6, "locality": "global"}, + "temp/region/eff": {"type": "mixed", "size": 6, "locality": "global"}, + "temp/rotate": {"type": "mixed", "size": 6, "locality": "global"}, + "temp/sphere": {"type": "mixed", "size": 6, "locality": "global"}, + "temp/uef": {"type": "mixed", "size": 6, "locality": "global"}, + "ti": {"type": "scalar", "size": 0, "locality": "global"}, + "torque/chunk": {"type": "array", "size": 0, "locality": "global"}, + "vacf": {"type": "vector", "size": 4, "locality": "global"}, + "vcm/chunk": {"type": "array", "size": 0, "locality": "global"}, + "viscosity/cos": {"type": "mixed", "size": 7, "locality": "global"}, + "voronoi/atom": {"type": "array", "size": 0, "locality": "local"}, + "xrd": {"type": "array", "size": 0, "locality": "global"} + } +} diff --git a/aiida_lammps/validation/schemas/lammps_schema.json b/aiida_lammps/validation/schemas/lammps_schema.json index d5dc849..da696c2 100644 --- a/aiida_lammps/validation/schemas/lammps_schema.json +++ b/aiida_lammps/validation/schemas/lammps_schema.json @@ -8,7 +8,8 @@ "compute", "minimize", "md", - "fix" + "fix", + "thermo_print" ] }, "properties": { @@ -20,6 +21,85 @@ }, "minimize": { "type": "object" + }, + "thermo_print": { + "type": "object", + "propertyNames":{ + "enum":[ + "step", + "elapsed", + "elaplong", + "dt", + "time", + "cpu", + "tpcpu", + "spcpu", + "cpuremain", + "part", + "timeremain", + "atoms", + "temp", + "press", + "pe", + "ke", + "etotal", + "evdwl", + "ecoul", + "epair", + "ebond", + "eangle", + "edihed", + "eimp", + "emol", + "elong", + "etail", + "enthalpy", + "ecouple", + "econserve", + "vol", + "density", + "lx", + "ly", + "lz", + "xlo", + "xhi", + "ylo", + "yhi", + "zlo", + "zhi", + "xy", + "xz", + "yz", + "xlat", + "ylat", + "zlat", + "bonds", + "angles", + "dihedrals", + "impropers", + "pxx", + "pyy", + "pzz", + "pxy", + "pxz", + "pyz", + "fmax", + "fnorm", + "nbuild", + "ndanger", + "cella", + "cellb", + "cellc", + "cellalpha", + "cellbeta", + "cellgamma" + ], + "patternProperties": { + "^": { + "type": "boolean" + } + } + } } }, "oneOf": [ From e948a4264c0e2928f2c2f96996090484de107901 Mon Sep 17 00:00:00 2001 From: Jonathan Chico Date: Wed, 17 Nov 2021 16:34:42 +0100 Subject: [PATCH 11/70] (WIP) Make the input generation more flexible. Make the generation of printing strings for computes for local and global variables automatic --- aiida_lammps/common/input_generator.py | 121 ++++++--- aiida_lammps/common/variables_types.json | 298 +++++++++++------------ 2 files changed, 232 insertions(+), 187 deletions(-) diff --git a/aiida_lammps/common/input_generator.py b/aiida_lammps/common/input_generator.py index b8ddf2e..95c22f7 100644 --- a/aiida_lammps/common/input_generator.py +++ b/aiida_lammps/common/input_generator.py @@ -10,6 +10,7 @@ fixes block is never called, on the other hand the control block is always called since it is necessary for the functioning of LAMMPS. """ +import os from typing import Union import json from aiida import orm @@ -265,8 +266,6 @@ def write_compute_block( :rtype: Union[str, list] """ - computes_list = [] - if group_names is None: group_names = [] @@ -276,17 +275,16 @@ def write_compute_block( assert _group in group_names + ['all'], 'group name not defined' compute_block += f'compute {generate_id_tag(key, _group)} {_group} {key} ' compute_block += f"{join_keywords(value['type'])}\n" - computes_list.append(generate_id_tag(key, _group)) compute_block += '# ---- End of the Compute information ----\n' - return compute_block, computes_list + return compute_block def write_dump_block( parameters_dump: dict, trajectory_filename: str, atom_style: str, - computes_list: list = None, + parameters_compute: dict = None, fixes_list: list = None, ) -> str: """Generate the block with dumps commands. @@ -300,20 +298,33 @@ def write_dump_block( :param trajectory_filename: name of the file where the trajectory is written. :type trajectory_filename: str :param atom_style: which kind of LAMMPS atomic style is used for the calculation. - :param computes_list: list with all the computes set in this calculation, defaults to None - :type computes_list: list, optional + :param parameters_compute: computes that will be applied to the calculation + :type parameters_compute: dict :param fixes_list: list with all the fixes defined for the calculation, defaults to None :type fixes_list: list, optional :return: block with the dump options for the calculation :rtype: str """ - if computes_list is None: - computes_list = [] + with open( + os.path.join(os.path.dirname(os.path.abspath(__file__)), + 'variables_types.json'), 'r') as handler: + _compute_variables = json.load(handler)['computes'] + + computes_list = [] - site_specific_computes = [ - compute for compute in computes_list if '_atom_' in compute - ] + for key, value in parameters_compute.items(): + name = key + group = value['group'] + if _compute_variables[name][ + 'locality'] == 'local' and _compute_variables[name][ + 'printable']: + computes_list.append( + generate_thermo_string( + name=name, + group=group, + calculation_type='compute', + )) if fixes_list is None: fixes_list = [] @@ -322,8 +333,9 @@ def write_dump_block( dump_block = '# ---- Start of the Dump information ----\n' dump_block += f'dump aiida all custom {parameters_dump.get("dump_rate", 10)} ' - dump_block += f'{trajectory_filename} id type element x y z' - dump_block += f'{" q" if atom_style=="charge" else ""}\n' + dump_block += f'{trajectory_filename} id type element x y z ' + dump_block += f'{"q " if atom_style=="charge" else ""}' + dump_block += f'{" ".join(computes_list)}\n' dump_block += '# ---- End of the Dump information ----\n' return dump_block @@ -331,8 +343,8 @@ def write_dump_block( def write_thermo_block( parameters_thermo: dict, - computes_list: list = None, computes_printing: dict = None, + parameters_compute: dict = None, ) -> str: """Generate the block with the thermo command. @@ -342,20 +354,33 @@ def write_thermo_block( :param parameters_thermo: user defined parameters to control the log data. :type parameters_thermo: dict - :param computes_list: list with all the computes set in this calculation, defaults to None - :type computes_list: list, optional :param computes_printing: dict with all the user defined computes to be printed, defaults to None :type computes_printing: dict, optional + :param parameters_compute: computes that will be applied to the calculation + :type parameters_compute: dict :return: block with the thermo options for the calculation. :rtype: str """ - if computes_list is None: - computes_list = [] + with open( + os.path.join(os.path.dirname(os.path.abspath(__file__)), + 'variables_types.json'), 'r') as handler: + _compute_variables = json.load(handler)['computes'] + + computes_list = [] - global_computes = [ - f'c_{compute}' for compute in computes_list if '_atom_' not in compute - ] + for key, value in parameters_compute.items(): + name = key + group = value['group'] + if _compute_variables[name][ + 'locality'] == 'global' and _compute_variables[name][ + 'printable']: + computes_list.append( + generate_thermo_string( + name=name, + group=group, + calculation_type='compute', + )) if computes_printing is None or not computes_printing: fixed_thermo = ['step', 'temp', 'epair', 'emol', 'etotal', 'press'] @@ -365,14 +390,18 @@ def write_thermo_block( ] thermo_block = '# ---- Start of the Thermo information ----\n' - thermo_block += f'thermo_style {" ".join(fixed_thermo)} {" ".join(global_computes)}\n' + thermo_block += f'thermo_style {" ".join(fixed_thermo)} {" ".join(computes_list)}\n' thermo_block += f'thermo {parameters_thermo.get("printing_rate", 1000)}\n' thermo_block += '# ---- End of the Thermo information ----\n' return thermo_block -def generate_compute_string(name: str, group: str) -> str: +def generate_thermo_string( + name: str, + group: str, + calculation_type: str, +) -> str: """ [summary] @@ -386,28 +415,44 @@ def generate_compute_string(name: str, group: str) -> str: :rtype: str """ + if calculation_type == 'compute': + prefactor = 'c' + if calculation_type == 'fix': + prefactor = 'f' - with open('variables_types.json', 'r') as handler: + with open( + os.path.join(os.path.dirname(os.path.abspath(__file__)), + 'variables_types.json'), 'r') as handler: _compute_variables = json.load(handler)['computes'] - _type = _compute_variables[name]["type"] - _size = _compute_variables[name]["size"] + _type = _compute_variables[name]['type'] + _size = _compute_variables[name]['size'] + + _string = [] - c_string = [] + if _type == 'vector' and _size > 0: + for index in range(1, _size + 1): + _string.append( + f'{prefactor}_{generate_id_tag(name, group)}[{index}]') + elif _type == 'vector' and _size == 0: + _string.append(f'{prefactor}_{generate_id_tag(name, group)}[*]') - if _type == "vector" and _size > 0: - for index in range(1, _size+1): - c_string.append(f"{name.replace('/','_')}_{group}_aiida[{index}]") + if _type == 'mixed' and _size > 0: + _string.append(f'{prefactor}_{generate_id_tag(name, group)}') + for index in range(1, _size + 1): + _string.append( + f'{prefactor}_{generate_id_tag(name, group)}[{index}]') + elif _type == 'mixed' and _size == 0: + _string.append(f'{prefactor}_{generate_id_tag(name, group)}') + _string.append(f'{prefactor}_{generate_id_tag(name, group)}[*]') - if _type == "mixed" and _size > 0: - c_string.append(f"{name.replace('/','_')}_{group}_aiida") - for index in range(1, _size+1): - c_string.append(f"{name.replace('/','_')}_{group}_aiida[{index}]") + if _type == 'scalar': + _string.append(f'{prefactor}_{generate_id_tag(name, group)}') - if _type == "scalar": - c_string.append(f"{name.replace('/','_')}_{group}_aiida") + if _type == 'array': + _string.append(f'{prefactor}_{generate_id_tag(name, group)}') - return " ".join(c_string) + return ' '.join(_string) def generate_id_tag(name: str = None, group: str = None) -> str: diff --git a/aiida_lammps/common/variables_types.json b/aiida_lammps/common/variables_types.json index b75ee3c..05bd688 100644 --- a/aiida_lammps/common/variables_types.json +++ b/aiida_lammps/common/variables_types.json @@ -1,153 +1,153 @@ { "computes":{ - "ackland/atom": {"type": "array", "size": 0, "locality": "local"}, - "adf": {"type": "array", "size": 0, "locality": "global"}, - "aggregate/atom": {"type": "array", "size": 0, "locality": "local"}, - "angle": {"type": "array", "size": 0, "locality": "global"}, - "angle/local": {"type": "array", "size": 0, "locality": "global"}, - "angmom/chunk": {"type": "array", "size": 0, "locality": "global"}, - "basal/atom": {"type": "array", "size": 0, "locality": "local"}, - "body/local": {"type": "array", "size": 0, "locality": "local"}, - "bond": {"type": "array", "size": 0, "locality": "global"}, - "bond/local": {"type": "array", "size": 0, "locality": "local"}, - "centro/atom": {"type": "array", "size": 0, "locality": "local"}, - "centroid/stress/atom": {"type": "array", "size": 0, "locality": "local"}, - "chunk/atom": {"type": "mixed", "size": 0, "locality": "local"}, - "chunk/spread/atom": {"type": "array", "size": 0, "locality": "local"}, - "cluster/atom": {"type": "array", "size": 0, "locality": "local"}, - "cna/atom": {"type": "array", "size": 0, "locality": "local"}, - "cnp/atom": {"type": "array", "size": 0, "locality": "local"}, - "com": {"type": "vector", "size": 3, "locality": "global"}, - "com/chunk": {"type": "array", "size": 0, "locality": "global"}, - "contact/atom": {"type": "array", "size": 0, "locality": "local"}, - "coord/atom": {"type": "array", "size": 0, "locality": "local"}, - "damage/atom": {"type": "array", "size": 0, "locality": "local"}, - "dihedral": {"type": "array", "size": 0, "locality": "global"}, - "dihedral/local": {"type": "array", "size": 0, "locality": "global"}, - "dilatation/atom": {"type": "array", "size": 0, "locality": "local"}, - "dipole": {"type": "mixed", "size": 3, "locality": "global"}, - "dipole/chunk": {"type": "array", "size": 0, "locality": "global"}, - "displace/atom": {"type": "array", "size": 0, "locality": "local"}, - "dpd": {"type": "vector", "size": 5, "locality": "global"}, - "dpd/atom": {"type": "array", "size": 4, "locality": "local"}, - "edpd/temp/atom": {"type": "array", "size": 0, "locality": "local"}, - "efield/atom": {"type": "array", "size": 0, "locality": "local"}, - "entropy/atom": {"type": "array", "size": 0, "locality": "local"}, - "erotate/asphere": {"type": "scalar", "size": 0, "locality": "global"}, - "erotate/rigid": {"type": "scalar", "size": 0, "locality": "global"}, - "erotate/sphere": {"type": "scalar", "size": 0, "locality": "global"}, - "erotate/sphere/atom": {"type": "array", "size": 0, "locality": "local"}, - "event/displace": {"type": "scalar", "size": 0, "locality": "global"}, - "fabric": {"type": "array", "size": 0, "locality": "global"}, - "fep": {"type": "vector", "size": 3, "locality": "global"}, - "force/tally": {"type": "array", "size": 3, "locality": "global"}, - "fragment/atom": {"type": "", "size": 0, "locality": "local"}, - "global/atom": {"type": "array", "size": 0, "locality": "local"}, - "group/group": {"type": "mixed", "size": 3, "locality": "global"}, - "gyration": {"type": "mixed", "size": 6, "locality": "global"}, - "gyration/chunk": {"type": "array", "size": 6, "locality": "global"}, - "gyration/shape":{ "type": "vector", "size": 6, "locality": "global"}, - "gyration/shape/chunk": {"type": "vector", "size": 6, "locality": "global"}, - "heat/flux": {"type": "vector", "size": 6, "locality": "global"}, - "heat/flux/tally": {"type": "vector", "size": 6, "locality": "global"}, - "heat/flux/virial/tally": {"type": "mixed", "size": 0, "locality": "local"}, - "hexorder/atom": {"type": "array", "size": 0, "locality": "local"}, - "hma": {"type": "vector", "size": 0, "locality": "global"}, - "improper": {"type": "", "size": 0, "locality": "global"}, - "improper/local": {"type": "array", "size": 0, "locality": "global"}, - "inertia/chunk": {"type": "array", "size": 0, "locality": "global"}, - "ke": {"type": "scalar", "size": 0, "locality": "global"}, - "ke/atom": {"type": "array", "size": 0, "locality": "local"}, - "ke/atom/eff": {"type": "array", "size": 0, "locality": "local"}, - "ke/eff": {"type": "scalar", "size": 0, "locality": "global"}, - "ke/rigid": {"type": "scalar", "size": 0, "locality": "global"}, - "mliap": {"type": "array", "size": 0, "locality": "global"}, - "momentum": {"type": "vector", "size": 3, "locality": "global"}, - "msd": {"type": "vector", "size": 4, "locality": "global"}, - "msd/chunk": {"type": "array", "size": 0, "locality": "global"}, - "msd/nongauss": {"type": "vector", "size": 3, "locality": "global"}, - "omega/chunk": {"type": "array", "size": 0, "locality": "global"}, - "orientorder/atom": {"type": "array", "size": 0, "locality": "local"}, - "pair": {"type": "mixed", "size": 0, "locality": "global"}, - "pair/local": {"type": "array", "size": 0, "locality": "global"}, - "pe": {"type": "scalar", "size": 0, "locality": "global"}, - "pe/atom": {"type": "array", "size": 0, "locality": "local"}, - "mesont": {"type": "array", "size": 0, "locality": "local"}, - "pe/mol/tally": {"type": "vector", "size": 4, "locality": "global"}, - "pe/tally": {"type": "array", "size": 0, "locality": "local"}, - "plasticity/atom": {"type": "array", "size": 0, "locality": "local"}, - "pressure": {"type": "mixed", "size": 6, "locality": "global"}, - "pressure/cylinder": {"type": "array", "size": 0, "locality": "global"}, - "pressure/uef": {"type": "array", "size": 0, "locality": "global"}, - "property/atom": {"type": "array", "size": 0, "locality": "local"}, - "property/chunk": {"type": "array", "size": 0, "locality": "global"}, - "property/local": {"type": "array", "size": 0, "locality": "global"}, - "ptm/atom": {"type": "array", "size": 0, "locality": "local"}, - "rdf": {"type": "array", "size": 0, "locality": "global"}, - "reduce": {"type": "", "size": 0, "locality": "global"}, - "reduce/chunk": {"type": "", "size": 0, "locality": "global"}, - "reduce/region": {"type": "", "size": 0, "locality": "global"}, - "rigid/local": {"type": "array", "size": 0, "locality": "local"}, - "saed": {"type": "vector", "size": 0, "locality": "global"}, - "slice": {"type": "array", "size": 0, "locality": "global"}, - "smd/contact/radius": {"type": "array", "size": 0, "locality": "local"}, - "smd/damage": {"type": "array", "size": 0, "locality": "local"}, - "smd/hourglass/error": {"type": "array", "size": 0, "locality": "local"}, - "smd/internal/energy": {"type": "array", "size": 0, "locality": "local"}, - "smd/plastic/strain": {"type": "array", "size": 0, "locality": "local"}, - "smd/plastic/strain/rate": {"type": "array", "size": 0, "locality": "local"}, - "smd/rho": {"type": "array", "size": 0, "locality": "local"}, - "smd/tlsph/defgrad": {"type": "array", "size": 0, "locality": "local"}, - "smd/tlsph/dt": {"type": "array", "size": 0, "locality": "local"}, - "smd/tlsph/num/neighs": {"type": "array", "size": 0, "locality": "local"}, - "smd/tlsph/shape": {"type": "array", "size": 0, "locality": "local"}, - "smd/tlsph/strain": {"type": "array", "size": 0, "locality": "local"}, - "smd/tlsph/strain/rate": {"type": "array", "size": 0, "locality": "local"}, - "smd/tlsph/stress": {"type": "array", "size": 0, "locality": "local"}, - "smd/triangle/vertices": {"type": "array", "size": 0, "locality": "local"}, - "smd/ulsph/effm": {"type": "array", "size": 0, "locality": "local"}, - "smd/ulsph/num/neighs": {"type": "array", "size": 0, "locality": "local"}, - "smd/ulsph/strain": {"type": "array", "size": 0, "locality": "local"}, - "smd/ulsph/strain/rate": {"type": "array", "size": 0, "locality": "local"}, - "smd/ulsph/stress": {"type": "array", "size": 0, "locality": "local"}, - "smd/vol": {"type": "array", "size": 0, "locality": "local"}, - "snap": {"type": "array", "size": 0, "locality": "global"}, - "sna/atom": {"type": "array", "size": 0, "locality": "local"}, - "snad/atom": {"type": "array", "size": 0, "locality": "local"}, - "snav/atom": {"type": "array", "size": 0, "locality": "local"}, - "sph/e/atom": {"type": "array", "size": 0, "locality": "local"}, - "sph/rho/atom": {"type": "array", "size": 0, "locality": "local"}, - "sph/t/atom": {"type": "array", "size": 0, "locality": "local"}, - "spin": {"type": "array", "size": 0, "locality": "global"}, - "stress/atom": {"type": "array", "size": 0, "locality": "local"}, - "stress/mop": {"type": "vector", "size": 3, "locality": "global"}, - "stress/mop/profile": {"type": "vector", "size": 3, "locality": "global"}, - "stress/tally": {"type": "mixed", "size": 0, "locality": "local"}, - "tdpd/cc/atom": {"type": "array", "size": 0, "locality": "local"}, - "temp": {"type": "mixed", "size": 6, "locality": "global"}, - "temp/asphere": {"type": "mixed", "size": 6, "locality": "global"}, - "temp/body": {"type": "mixed", "size": 6, "locality": "global"}, - "temp/chunk": {"type": "mixed", "size": 6, "locality": "global"}, - "temp/com": {"type": "mixed", "size": 6, "locality": "global"}, - "temp/cs": {"type": "mixed", "size": 6, "locality": "global"}, - "temp/deform": {"type": "mixed", "size": 6, "locality": "global"}, - "temp/deform/eff": {"type": "mixed", "size": 6, "locality": "global"}, - "temp/drude": {"type": "mixed", "size": 6, "locality": "global"}, - "temp/eff": {"type": "mixed", "size": 6, "locality": "global"}, - "temp/partial": {"type": "mixed", "size": 6, "locality": "global"}, - "temp/profile": {"type": "mixed", "size": 6, "locality": "global"}, - "temp/ramp": {"type": "mixed", "size": 6, "locality": "global"}, - "temp/region": {"type": "mixed", "size": 6, "locality": "global"}, - "temp/region/eff": {"type": "mixed", "size": 6, "locality": "global"}, - "temp/rotate": {"type": "mixed", "size": 6, "locality": "global"}, - "temp/sphere": {"type": "mixed", "size": 6, "locality": "global"}, - "temp/uef": {"type": "mixed", "size": 6, "locality": "global"}, - "ti": {"type": "scalar", "size": 0, "locality": "global"}, - "torque/chunk": {"type": "array", "size": 0, "locality": "global"}, - "vacf": {"type": "vector", "size": 4, "locality": "global"}, - "vcm/chunk": {"type": "array", "size": 0, "locality": "global"}, - "viscosity/cos": {"type": "mixed", "size": 7, "locality": "global"}, - "voronoi/atom": {"type": "array", "size": 0, "locality": "local"}, - "xrd": {"type": "array", "size": 0, "locality": "global"} + "ackland/atom": {"type": "scalar", "size": 0, "locality": "local", "printable": true}, + "adf": {"type": "array", "size": 0, "locality": "global", "printable": true}, + "aggregate/atom": {"type": "scalar", "size": 0, "locality": "local", "printable": true}, + "angle": {"type": "array", "size": 0, "locality": "global", "printable": true}, + "angle/local": {"type": "array", "size": 0, "locality": "global", "printable": true}, + "angmom/chunk": {"type": "array", "size": 0, "locality": "global", "printable": false}, + "basal/atom": {"type": "array", "size": 0, "locality": "local", "printable": true}, + "body/local": {"type": "array", "size": 0, "locality": "local", "printable": true}, + "bond": {"type": "array", "size": 0, "locality": "global", "printable": true}, + "bond/local": {"type": "array", "size": 0, "locality": "local", "printable": true}, + "centro/atom": {"type": "vector", "size": 10, "locality": "local", "printable": true}, + "centroid/stress/atom": {"type": "vector", "size": 9, "locality": "local", "printable": true}, + "chunk/atom": {"type": "mixed", "size": 0, "locality": "local", "printable": true}, + "chunk/spread/atom": {"type": "array", "size": 0, "locality": "local", "printable": true}, + "cluster/atom": {"type": "array", "size": 0, "locality": "local", "printable": true}, + "cna/atom": {"type": "scalar", "size": 0, "locality": "local", "printable": true}, + "cnp/atom": {"type": "scalar", "size": 0, "locality": "local", "printable": true}, + "com": {"type": "vector", "size": 3, "locality": "global", "printable": true}, + "com/chunk": {"type": "array", "size": 0, "locality": "global", "printable": false}, + "contact/atom": {"type": "scalar", "size": 0, "locality": "local", "printable": true}, + "coord/atom": {"type": "vector", "size": 0, "locality": "local", "printable": true}, + "damage/atom": {"type": "scalar", "size": 0, "locality": "local", "printable": true}, + "dihedral": {"type": "array", "size": 0, "locality": "global", "printable": true}, + "dihedral/local": {"type": "array", "size": 0, "locality": "global", "printable": true}, + "dilatation/atom": {"type": "array", "size": 0, "locality": "local", "printable": true}, + "dipole": {"type": "mixed", "size": 3, "locality": "global", "printable": true}, + "dipole/chunk": {"type": "vector", "size": 0, "locality": "global", "printable": false}, + "displace/atom": {"type": "vector", "size": 4, "locality": "local", "printable": true}, + "dpd": {"type": "vector", "size": 5, "locality": "global", "printable": true}, + "dpd/atom": {"type": "vector", "size": 4, "locality": "local", "printable": true}, + "edpd/temp/atom": {"type": "array", "size": 0, "locality": "local", "printable": true}, + "efield/atom": {"type": "vector", "size": 3, "locality": "local", "printable": true}, + "entropy/atom": {"type": "scalar", "size": 0, "locality": "local", "printable": true}, + "erotate/asphere": {"type": "scalar", "size": 0, "locality": "global", "printable": true}, + "erotate/rigid": {"type": "scalar", "size": 0, "locality": "global", "printable": true}, + "erotate/sphere": {"type": "scalar", "size": 0, "locality": "global", "printable": true}, + "erotate/sphere/atom": {"type": "scalar", "size": 0, "locality": "local", "printable": true}, + "event/displace": {"type": "scalar", "size": 0, "locality": "global", "printable": true}, + "fabric": {"type": "array", "size": 0, "locality": "global", "printable": true}, + "fep": {"type": "vector", "size": 3, "locality": "global", "printable": true}, + "force/tally": {"type": "mixed", "size": 3, "locality": "both", "printable": true}, + "fragment/atom": {"type": "", "size": 0, "locality": "local", "printable": true}, + "global/atom": {"type": "array", "size": 0, "locality": "local", "printable": true}, + "group/group": {"type": "mixed", "size": 3, "locality": "global", "printable": true}, + "gyration": {"type": "mixed", "size": 6, "locality": "global", "printable": true}, + "gyration/chunk": {"type": "array", "size": 6, "locality": "global", "printable": false}, + "gyration/shape":{ "type": "vector", "size": 6, "locality": "global", "printable": true}, + "gyration/shape/chunk": {"type": "vector", "size": 6, "locality": "global", "printable": true}, + "heat/flux": {"type": "vector", "size": 6, "locality": "global", "printable": true}, + "heat/flux/tally": {"type": "vector", "size": 6, "locality": "global", "printable": true}, + "heat/flux/virial/tally": {"type": "mixed", "size": 3, "locality": "both", "printable": true}, + "hexorder/atom": {"type": "vector", "size": 2, "locality": "local", "printable": true}, + "hma": {"type": "vector", "size": 0, "locality": "global", "printable": true}, + "improper": {"type": "vector", "size": 0, "locality": "global", "printable": true}, + "improper/local": {"type": "array", "size": 0, "locality": "global", "printable": true}, + "inertia/chunk": {"type": "array", "size": 0, "locality": "global", "printable": false}, + "ke": {"type": "scalar", "size": 0, "locality": "global", "printable": true}, + "ke/atom": {"type": "scalar", "size": 0, "locality": "local", "printable": true}, + "ke/atom/eff": {"type": "scalar", "size": 0, "locality": "local", "printable": true}, + "ke/eff": {"type": "scalar", "size": 0, "locality": "global", "printable": true}, + "ke/rigid": {"type": "scalar", "size": 0, "locality": "global", "printable": true}, + "mliap": {"type": "array", "size": 0, "locality": "global", "printable": true}, + "momentum": {"type": "vector", "size": 3, "locality": "global", "printable": true}, + "msd": {"type": "vector", "size": 4, "locality": "global", "printable": true}, + "msd/chunk": {"type": "array", "size": 0, "locality": "global", "printable": false}, + "msd/nongauss": {"type": "vector", "size": 3, "locality": "global", "printable": true}, + "omega/chunk": {"type": "array", "size": 0, "locality": "global", "printable": false}, + "orientorder/atom": {"type": "array", "size": 0, "locality": "local", "printable": true}, + "pair": {"type": "mixed", "size": 0, "locality": "global", "printable": true}, + "pair/local": {"type": "array", "size": 0, "locality": "global", "printable": true}, + "pe": {"type": "scalar", "size": 0, "locality": "global", "printable": true}, + "pe/atom": {"type": "scalar", "size": 0, "locality": "local", "printable": true}, + "mesont": {"type": "scalar", "size": 0, "locality": "local", "printable": true}, + "pe/mol/tally": {"type": "vector", "size": 4, "locality": "global", "printable": true}, + "pe/tally": {"type": "scalar", "size": 0, "locality": "both", "printable": true}, + "plasticity/atom": {"type": "scalar", "size": 0, "locality": "local", "printable": true}, + "pressure": {"type": "mixed", "size": 6, "locality": "global", "printable": true}, + "pressure/cylinder": {"type": "array", "size": 0, "locality": "global", "printable": true}, + "pressure/uef": {"type": "scalar", "size": 0, "locality": "global", "printable": true}, + "property/atom": {"type": "array", "size": 0, "locality": "local", "printable": true}, + "property/chunk": {"type": "array", "size": 0, "locality": "global", "printable": false}, + "property/local": {"type": "array", "size": 0, "locality": "global", "printable": true}, + "ptm/atom": {"type": "scalar", "size": 0, "locality": "local", "printable": true}, + "rdf": {"type": "array", "size": 0, "locality": "global", "printable": false}, + "reduce": {"type": "mixed", "size": 0, "locality": "global", "printable": true}, + "reduce/chunk": {"type": "mixed", "size": 0, "locality": "global", "printable": false}, + "reduce/region": {"type": "mixed", "size": 0, "locality": "global", "printable": true}, + "rigid/local": {"type": "array", "size": 0, "locality": "local", "printable": true}, + "saed": {"type": "vector", "size": 0, "locality": "global", "printable": true}, + "slice": {"type": "array", "size": 0, "locality": "global", "printable": true}, + "smd/contact/radius": {"type": "array", "size": 0, "locality": "local", "printable": true}, + "smd/damage": {"type": "array", "size": 0, "locality": "local", "printable": true}, + "smd/hourglass/error": {"type": "array", "size": 0, "locality": "local", "printable": true}, + "smd/internal/energy": {"type": "array", "size": 0, "locality": "local", "printable": true}, + "smd/plastic/strain": {"type": "array", "size": 0, "locality": "local", "printable": true}, + "smd/plastic/strain/rate": {"type": "array", "size": 0, "locality": "local", "printable": true}, + "smd/rho": {"type": "array", "size": 0, "locality": "local", "printable": true}, + "smd/tlsph/defgrad": {"type": "array", "size": 0, "locality": "local", "printable": true}, + "smd/tlsph/dt": {"type": "array", "size": 0, "locality": "local", "printable": true}, + "smd/tlsph/num/neighs": {"type": "array", "size": 0, "locality": "local", "printable": true}, + "smd/tlsph/shape": {"type": "array", "size": 0, "locality": "local", "printable": true}, + "smd/tlsph/strain": {"type": "array", "size": 0, "locality": "local", "printable": true}, + "smd/tlsph/strain/rate": {"type": "array", "size": 0, "locality": "local", "printable": true}, + "smd/tlsph/stress": {"type": "array", "size": 0, "locality": "local", "printable": true}, + "smd/triangle/vertices": {"type": "array", "size": 0, "locality": "local", "printable": true}, + "smd/ulsph/effm": {"type": "array", "size": 0, "locality": "local", "printable": true}, + "smd/ulsph/num/neighs": {"type": "array", "size": 0, "locality": "local", "printable": true}, + "smd/ulsph/strain": {"type": "array", "size": 0, "locality": "local", "printable": true}, + "smd/ulsph/strain/rate": {"type": "array", "size": 0, "locality": "local", "printable": true}, + "smd/ulsph/stress": {"type": "array", "size": 0, "locality": "local", "printable": true}, + "smd/vol": {"type": "array", "size": 0, "locality": "local", "printable": true}, + "snap": {"type": "array", "size": 0, "locality": "global", "printable": true}, + "sna/atom": {"type": "array", "size": 0, "locality": "local", "printable": true}, + "snad/atom": {"type": "array", "size": 0, "locality": "local", "printable": true}, + "snav/atom": {"type": "array", "size": 0, "locality": "local", "printable": true}, + "sph/e/atom": {"type": "array", "size": 0, "locality": "local", "printable": true}, + "sph/rho/atom": {"type": "array", "size": 0, "locality": "local", "printable": true}, + "sph/t/atom": {"type": "array", "size": 0, "locality": "local", "printable": true}, + "spin": {"type": "array", "size": 0, "locality": "global", "printable": true}, + "stress/atom": {"type": "vector", "size": 6, "locality": "local", "printable": true}, + "stress/mop": {"type": "vector", "size": 3, "locality": "global", "printable": true}, + "stress/mop/profile": {"type": "vector", "size": 3, "locality": "global", "printable": true}, + "stress/tally": {"type": "mixed", "size": 6, "locality": "both", "printable": true}, + "tdpd/cc/atom": {"type": "scalar", "size": 0, "locality": "local", "printable": true}, + "temp": {"type": "mixed", "size": 6, "locality": "global", "printable": true}, + "temp/asphere": {"type": "mixed", "size": 6, "locality": "global", "printable": true}, + "temp/body": {"type": "mixed", "size": 6, "locality": "global", "printable": true}, + "temp/chunk": {"type": "mixed", "size": 6, "locality": "global", "printable": false}, + "temp/com": {"type": "mixed", "size": 6, "locality": "global", "printable": true}, + "temp/cs": {"type": "mixed", "size": 6, "locality": "global", "printable": true}, + "temp/deform": {"type": "mixed", "size": 6, "locality": "global", "printable": true}, + "temp/deform/eff": {"type": "mixed", "size": 6, "locality": "global", "printable": true}, + "temp/drude": {"type": "mixed", "size": 6, "locality": "global", "printable": true}, + "temp/eff": {"type": "mixed", "size": 6, "locality": "global", "printable": true}, + "temp/partial": {"type": "mixed", "size": 6, "locality": "global", "printable": true}, + "temp/profile": {"type": "mixed", "size": 6, "locality": "global", "printable": true}, + "temp/ramp": {"type": "mixed", "size": 6, "locality": "global", "printable": true}, + "temp/region": {"type": "mixed", "size": 6, "locality": "global", "printable": true}, + "temp/region/eff": {"type": "mixed", "size": 6, "locality": "global", "printable": true}, + "temp/rotate": {"type": "mixed", "size": 6, "locality": "global", "printable": true}, + "temp/sphere": {"type": "mixed", "size": 6, "locality": "global", "printable": true}, + "temp/uef": {"type": "mixed", "size": 6, "locality": "global", "printable": true}, + "ti": {"type": "scalar", "size": 0, "locality": "global", "printable": true}, + "torque/chunk": {"type": "vector", "size": 0, "locality": "global", "printable": false}, + "vacf": {"type": "vector", "size": 4, "locality": "global", "printable": true}, + "vcm/chunk": {"type": "vector", "size": 0, "locality": "global", "printable": false}, + "viscosity/cos": {"type": "mixed", "size": 7, "locality": "global", "printable": true}, + "voronoi/atom": {"type": "array", "size": 0, "locality": "local", "printable": true}, + "xrd": {"type": "array", "size": 0, "locality": "global", "printable": false} } } From 8697b35a084f1cbee9a00fe42e821e695e380faf Mon Sep 17 00:00:00 2001 From: Jonathan Chico Date: Fri, 19 Nov 2021 17:02:16 +0100 Subject: [PATCH 12/70] (WIP) Improving the potential storage by making it similar to the PseudoData --- aiida_lammps/common/generate_structure.py | 29 +- aiida_lammps/common/input_generator.py | 135 ++++---- aiida_lammps/data/lammps_potential.py | 226 ++++++++++++++ aiida_lammps/data/lammps_potentials.json | 288 ++++++++++++++++++ .../validation/schemas/lammps_schema.json | 223 ++++++++------ 5 files changed, 729 insertions(+), 172 deletions(-) create mode 100644 aiida_lammps/data/lammps_potential.py create mode 100644 aiida_lammps/data/lammps_potentials.json diff --git a/aiida_lammps/common/generate_structure.py b/aiida_lammps/common/generate_structure.py index 7f6c2c7..50fe755 100644 --- a/aiida_lammps/common/generate_structure.py +++ b/aiida_lammps/common/generate_structure.py @@ -64,8 +64,7 @@ def generate_lammps_structure( """ if atom_style not in ['atomic', 'charge']: raise ValueError( - "atom_style must be in ['atomic', 'charge'], not '{}'".format( - atom_style)) + f"atom_style must be in ['atomic', 'charge'], not '{atom_style}'") if charge_dict is None: charge_dict = {} @@ -78,9 +77,9 @@ def generate_lammps_structure( kind_mass_dict = {kind.name: kind.mass for kind in structure.kinds} filestring = '' - filestring += '# {}\n\n'.format(docstring) - filestring += '{0} atoms\n'.format(len(structure.sites)) - filestring += '{0} atom types\n\n'.format(len(kind_name_id_map)) + filestring += f'# {docstring}\n\n' + filestring += f'{len(structure.sites)} atoms\n' + filestring += f'{len(kind_name_id_map)} atom types\n\n' atoms = structure.get_ase() cell, coord_transform = transform_cell(atoms.cell) @@ -91,16 +90,14 @@ def generate_lammps_structure( cell = np.round(cell, round_dp) + 0.0 positions = np.round(positions, round_dp) + 0.0 - filestring += '0.0 {0:20.10f} xlo xhi\n'.format(cell[0][0]) - filestring += '0.0 {0:20.10f} ylo yhi\n'.format(cell[1][1]) - filestring += '0.0 {0:20.10f} zlo zhi\n'.format(cell[2][2]) - filestring += '{0:20.10f} {1:20.10f} {2:20.10f} xy xz yz\n\n'.format( - cell[1][0], cell[2][0], cell[2][1]) + filestring += f'0.0 {cell[0][0]:20.10f} xlo xhi\n' + filestring += f'0.0 {cell[1][1]:20.10f} ylo yhi\n' + filestring += f'0.0 {cell[2][2]:20.10f} zlo zhi\n' + filestring += f'{cell[1][0]:20.10f} {cell[2][0]:20.10f} {cell[2][1]:20.10f} xy xz yz\n\n' filestring += 'Masses\n\n' for kind_name in sorted(list(kind_name_id_map.keys())): - filestring += '{0} {1:20.10f} \n'.format(kind_name_id_map[kind_name], - kind_mass_dict[kind_name]) + filestring += f'{kind_name_id_map[kind_name]} {kind_mass_dict[kind_name]:20.10f} \n' filestring += '\n' filestring += 'Atoms\n\n' @@ -110,13 +107,11 @@ def generate_lammps_structure( kind_id = kind_name_id_map[site.kind_name] if atom_style == 'atomic': - filestring += '{0} {1} {2:20.10f} {3:20.10f} {4:20.10f}\n'.format( - site_index + 1, kind_id, pos[0], pos[1], pos[2]) + filestring += f'{site_index + 1} {kind_id} {pos[0]:20.10f} {pos[1]:20.10f} {pos[2]:20.10f}\n' elif atom_style == 'charge': charge = charge_dict.get(site.kind_name, 0.0) - filestring += '{0} {1} {2} {3:20.10f} {4:20.10f} {5:20.10f}\n'.format( - site_index + 1, kind_id, charge, pos[0], pos[1], pos[2]) + filestring += f'{site_index + 1} {kind_id} {charge} {pos[0]:20.10f} {pos[1]:20.10f} {pos[2]:20.10f}\n' else: - raise ValueError('atom_style unknown: {}'.format(atom_style)) + raise ValueError(f'atom_style unknown: {atom_style}') return filestring, coord_transform diff --git a/aiida_lammps/common/input_generator.py b/aiida_lammps/common/input_generator.py index 95c22f7..aaa85db 100644 --- a/aiida_lammps/common/input_generator.py +++ b/aiida_lammps/common/input_generator.py @@ -205,7 +205,7 @@ def write_md_block(parameters_md: dict) -> str: def write_fix_block( parameters_fix: dict, group_names: list = None, -) -> Union[str, list]: +) -> str: """ Generate the input block with the fix options. @@ -225,30 +225,28 @@ def write_fix_block( :param group_names: list of groups names as defined during structure generation, defaults to None :type group_names: list, optional - :return: block with the fixes information, list of applied fixes - :rtype: Union[str, list] + :return: block with the fixes information + :rtype: str """ - fixes_list = [] - if group_names is None: group_names = [] fix_block = '# ---- Start of the Fix information ----\n' for key, value in parameters_fix.items(): - _group = value.get('group', 'all') - assert _group in group_names + ['all'], 'group name not defined' - fix_block += f'fix {generate_id_tag(key, _group)} {_group} {key} ' - fix_block += f"{join_keywords(value['type'])}\n" - fixes_list.append(generate_id_tag(key, _group)) + for entry in value: + _group = entry.get('group', 'all') + assert _group in group_names + ['all'], 'group name not defined' + fix_block += f'fix {generate_id_tag(key, _group)} {_group} {key} ' + fix_block += f'{join_keywords(entry["type"])}\n' fix_block += '# ---- End of the Fix information ----\n' - return fix_block, fixes_list + return fix_block def write_compute_block( parameters_compute: dict, group_names: list = None, -) -> Union[str, list]: +) -> str: """ Generate the input block with the compute options. @@ -262,8 +260,8 @@ def write_compute_block( :param group_names: list of groups names as defined during structure generation, defaults to None :type group_names: list, optional - :return: block with the computes information, list with all the applied computes - :rtype: Union[str, list] + :return: block with the computes information + :rtype: str """ if group_names is None: @@ -271,11 +269,11 @@ def write_compute_block( compute_block = '# ---- Start of the Compute information ----\n' for key, value in parameters_compute.items(): - _group = value.get('group', 'all') - assert _group in group_names + ['all'], 'group name not defined' - compute_block += f'compute {generate_id_tag(key, _group)} {_group} {key} ' - compute_block += f"{join_keywords(value['type'])}\n" - + for entry in value: + _group = entry.get('group', 'all') + assert _group in group_names + ['all'], 'group name not defined' + compute_block += f'compute {generate_id_tag(key, _group)} {_group} {key} ' + compute_block += f'{join_keywords(entry["type"])}\n' compute_block += '# ---- End of the Compute information ----\n' return compute_block @@ -285,7 +283,6 @@ def write_dump_block( trajectory_filename: str, atom_style: str, parameters_compute: dict = None, - fixes_list: list = None, ) -> str: """Generate the block with dumps commands. @@ -300,36 +297,32 @@ def write_dump_block( :param atom_style: which kind of LAMMPS atomic style is used for the calculation. :param parameters_compute: computes that will be applied to the calculation :type parameters_compute: dict - :param fixes_list: list with all the fixes defined for the calculation, defaults to None - :type fixes_list: list, optional :return: block with the dump options for the calculation :rtype: str """ - with open( - os.path.join(os.path.dirname(os.path.abspath(__file__)), - 'variables_types.json'), 'r') as handler: + _file = os.path.join( + os.path.dirname(os.path.abspath(__file__)), + 'variables_types.json', + ) + + with open(_file, 'r') as handler: _compute_variables = json.load(handler)['computes'] computes_list = [] for key, value in parameters_compute.items(): - name = key - group = value['group'] - if _compute_variables[name][ - 'locality'] == 'local' and _compute_variables[name][ - 'printable']: - computes_list.append( - generate_thermo_string( - name=name, - group=group, - calculation_type='compute', - )) - - if fixes_list is None: - fixes_list = [] - - site_specific_fixes = [fix for fix in fixes_list if 'ave_' in fix] + for entry in value: + _locality = _compute_variables[key]['locality'] + _printable = _compute_variables[key]['printable'] + + if _locality == 'local' and _printable: + computes_list.append( + generate_printing_string( + name=key, + group=entry['group'], + calculation_type='compute', + )) dump_block = '# ---- Start of the Dump information ----\n' dump_block += f'dump aiida all custom {parameters_dump.get("dump_rate", 10)} ' @@ -343,7 +336,6 @@ def write_dump_block( def write_thermo_block( parameters_thermo: dict, - computes_printing: dict = None, parameters_compute: dict = None, ) -> str: """Generate the block with the thermo command. @@ -354,33 +346,36 @@ def write_thermo_block( :param parameters_thermo: user defined parameters to control the log data. :type parameters_thermo: dict - :param computes_printing: dict with all the user defined computes to be printed, defaults to None - :type computes_printing: dict, optional :param parameters_compute: computes that will be applied to the calculation :type parameters_compute: dict :return: block with the thermo options for the calculation. :rtype: str """ - with open( - os.path.join(os.path.dirname(os.path.abspath(__file__)), - 'variables_types.json'), 'r') as handler: + _file = os.path.join( + os.path.dirname(os.path.abspath(__file__)), + 'variables_types.json', + ) + + with open(_file, 'r') as handler: _compute_variables = json.load(handler)['computes'] computes_list = [] for key, value in parameters_compute.items(): - name = key - group = value['group'] - if _compute_variables[name][ - 'locality'] == 'global' and _compute_variables[name][ - 'printable']: - computes_list.append( - generate_thermo_string( - name=name, - group=group, - calculation_type='compute', - )) + for entry in value: + _locality = _compute_variables[key]['locality'] + _printable = _compute_variables[key]['printable'] + + if _locality == 'global' and _printable: + computes_list.append( + generate_printing_string( + name=key, + group=entry['group'], + calculation_type='compute', + )) + + computes_printing = parameters_thermo.get('thermo_printing', None) if computes_printing is None or not computes_printing: fixed_thermo = ['step', 'temp', 'epair', 'emol', 'etotal', 'press'] @@ -397,21 +392,24 @@ def write_thermo_block( return thermo_block -def generate_thermo_string( +def generate_printing_string( name: str, group: str, calculation_type: str, ) -> str: """ - [summary] + Generate string for the quantities that will be printed. - [extended_summary] + The idea is to take the name as well as the group of the parameter + that one wishes to print, then in conjunction with the information + stored for each parameter one can generate a string for either the thermo + or dump commands. - :param name: [description] + :param name: Name of the compute/fix that one wishes to print :type name: str - :param group: [description] + :param group: Name of the group where the compute/fix is calculated :type group: str - :return: [description] + :return: string for the compute/fix that will be used for printing :rtype: str """ @@ -420,9 +418,12 @@ def generate_thermo_string( if calculation_type == 'fix': prefactor = 'f' - with open( - os.path.join(os.path.dirname(os.path.abspath(__file__)), - 'variables_types.json'), 'r') as handler: + _file = os.path.join( + os.path.dirname(os.path.abspath(__file__)), + 'variables_types.json', + ) + + with open(_file, 'r') as handler: _compute_variables = json.load(handler)['computes'] _type = _compute_variables[name]['type'] diff --git a/aiida_lammps/data/lammps_potential.py b/aiida_lammps/data/lammps_potential.py new file mode 100644 index 0000000..e86942e --- /dev/null +++ b/aiida_lammps/data/lammps_potential.py @@ -0,0 +1,226 @@ +import io +import os +import pathlib +import typing +import json + +from aiida import orm +from aiida import plugins +from aiida.common.constants import elements +from aiida.common.exceptions import StoringNotAllowed +from aiida.common.files import md5_from_filelike + +class LammpsPotentialData(orm.SinglefileData): + + _key_element = 'element' + _key_md5 = 'md5' + + _schema_file = os.path.join( + os.path.dirname(os.path.abspath(__file__)), + 'lammps_potentials.json', + ) + + with open() as handler: + _default_potential_info = json.load(handler)['pair_style'] + _default_atom_style_info = json.load(handler)['atom_style'] + + @classmethod + def get_or_create( + cls, + source: typing.Union[str, pathlib.Path, typing.BinaryIO], + filename: str = None, + pair_style: str = None, + species: list = None, + atom_style: str = None, + units: str = None, + ): + """Get lammps potential data node from database with matching md5 checksum or create a new one if not existent. + :param source: the source potential content, either a binary stream, or a ``str`` or ``Path`` to the path + of the file on disk, which can be relative or absolute. + :param filename: optional explicit filename to give to the file stored in the repository. + :return: instance of ``LammpsPotentialData``, stored if taken from database, unstored otherwise. + :raises TypeError: if the source is not a ``str``, ``pathlib.Path`` instance or binary stream. + :raises FileNotFoundError: if the source is a filepath but does not exist. + """ + source = cls.prepare_source(source) + + query = orm.QueryBuilder() + query.append(cls, subclassing=False, filters={f'attributes.{cls._key_md5}': md5_from_filelike(source)},) + + existing = query.first() + + if existing: + potential = existing[0] + else: + source.seek(0) + potential = cls(source, filename, pair_style, species, atom_style, units) + + return potential + + @classmethod + def get_entry_point_name(cls): + """Return the entry point name associated with this data class. + :return: the entry point name. + """ + _, entry_point = plugins.entry_point.get_entry_point_from_class(cls.__module__, cls.__name__,) + return entry_point.name + + @staticmethod + def is_readable_byte_stream(stream) -> bool: + """Return whether an object appears to be a readable filelike object in binary mode or stream of bytes. + :param stream: the object to analyse. + :returns: True if ``stream`` appears to be a readable filelike object in binary mode, False otherwise. + """ + return ( + isinstance(stream, io.BytesIO) or + (hasattr(stream, 'read') and hasattr(stream, 'mode') and 'b' in stream.mode) + ) + + @classmethod + def prepare_source(cls, source: typing.Union[str, pathlib.Path, typing.BinaryIO]) -> typing.BinaryIO: + """Validate the ``source`` representing a file on disk or a byte stream. + .. note:: if the ``source`` is a valid file on disk, its content is read and returned as a stream of bytes. + :raises TypeError: if the source is not a ``str``, ``pathlib.Path`` instance or binary stream. + :raises FileNotFoundError: if the source is a filepath but does not exist. + """ + if not isinstance(source, (str, pathlib.Path)) and not cls.is_readable_byte_stream(source): + raise TypeError( + f'`source` should be a `str` or `pathlib.Path` filepath on disk or a stream of bytes, got: {source}' + ) + + if isinstance(source, (str, pathlib.Path)): + filename = pathlib.Path(source).name + with open(source, 'rb') as handle: + source = io.BytesIO(handle.read()) + source.name = filename + + return source + + def validate_md5(self, md5: str): + """Validate that the md5 checksum matches that of the currently stored file. + :param value: the md5 checksum. + :raises ValueError: if the md5 does not match that of the currently stored file. + """ + with self.open(mode='rb') as handle: + md5_file = md5_from_filelike(handle) + if md5 != md5_file: + raise ValueError(f'md5 does not match that of stored file: {md5} != {md5_file}') + + def validate_pair_style(self, pair_style: str): + if pair_style is None: + raise TypeError('The pair_style of the potential must be provided.') + if pair_style not in self._default_potential_info.keys(): + raise KeyError(f'The pair_style "{pair_style}" is not vvalid') + self.set_attribute('pair_style', pair_style) + + def validate_species(self, species: list): + if species is None: + raise TypeError('The species for this potential must be provided.') + for _specie in species: + self.validate_element(_specie) + self.set_attribute('species', species) + + def validate_atom_style(self, atom_style: str, pair_style: str): + if atom_style is None: + atom_style = self._default_potential_info[pair_style]['atom_style'] + if atom_style not in self._default_atom_style_info: + raise ValueError(f'The atom_style "{atom_style}" is not valid') + self.set_attribute('atom_style', atom_style) + + @classmethod + def validate_element(cls, element: str): + """Validate the given element symbol. + :param element: the symbol of the element following the IUPAC naming standard. + :raises ValueError: if the element symbol is invalid. + """ + if element not in [values['symbol'] for values in elements.values()]: + raise ValueError(f'`{element}` is not a valid element.') + + def validate_units(self, units: str, pair_style: str): + if units is None: + units = self._default_potential_info[pair_style]['units'] + if units not in ['si', 'lj', 'real', 'metal', 'cgs', 'electron', 'micro', 'nano']: + raise ValueError(f'The units "{units}" is not valie') + self.set_attribute('default_units', units) + + def set_file( + self, + source: typing.Union[str, pathlib.Path, typing.BinaryIO], + filename: str = None, + pair_style: str = None, + species: list = None, + atom_style: str = None, + units: str = None, + **kwargs, + ): + """Set the file content. + .. note:: this method will first analyse the type of the ``source`` and if it is a filepath will convert it + to a binary stream of the content located at that filepath, which is then passed on to the superclass. This + needs to be done first, because it will properly set the file and filename attributes that are expected by + other methods. Straight after the superclass call, the source seeker needs to be reset to zero if it needs + to be read again, because the superclass most likely will have read the stream to the end. Finally it is + important that the ``prepare_source`` is called here before the superclass invocation, because this way the + conversion from filepath to byte stream will be performed only once. Otherwise, each subclass would perform + the conversion over and over again. + :param source: the source lammps potential content, either a binary stream, or a ``str`` or ``Path`` to the path + of the file on disk, which can be relative or absolute. + :param filename: optional explicit filename to give to the file stored in the repository. + :raises TypeError: if the source is not a ``str``, ``pathlib.Path`` instance or binary stream. + :raises FileNotFoundError: if the source is a filepath but does not exist. + """ + source = self.prepare_source(source) + self.validate_pair_style(pair_style=pair_style) + self.validate_species(species=species) + self.validate_atom_style(atom_style=atom_style, pair_style=pair_style) + self.validate_units(units=units, pair_style=pair_style) + super().set_file(source, filename, **kwargs) + source.seek(0) + self.md5 = md5_from_filelike(source) + + + def store(self, **kwargs): + """Store the node verifying first that all required attributes are set. + :raises :py:exc:`~aiida.common.StoringNotAllowed`: if no valid element has been defined. + """ + + try: + self.validate_md5(self.md5) + except ValueError as exception: + raise StoringNotAllowed(exception) from exception + + return super().store(**kwargs) + + @property + def atom_style(self): + return self.get_attribute('atom_style') + + @property + def pair_style(self): + return self.get_attribute('pair_style') + + @property + def species(self): + """Return the list of species which this potential can be used for. + :return: The list of chemical species which are contained in this potential. + """ + return self.get_attribute('species') + + @property + def default_units(self): + return self.get_attribute('default_units') + + @property + def md5(self) -> typing.Optional[int]: + """Return the md5. + :return: the md5 of the stored file. + """ + return self.get_attribute(self._key_md5, None) + + @md5.setter + def md5(self, value: str): + """Set the md5. + :param value: the md5 checksum. + :raises ValueError: if the md5 does not match that of the currently stored file. + """ + self.validate_md5(value) + self.set_attribute(self._key_md5, value) diff --git a/aiida_lammps/data/lammps_potentials.json b/aiida_lammps/data/lammps_potentials.json new file mode 100644 index 0000000..690ccca --- /dev/null +++ b/aiida_lammps/data/lammps_potentials.json @@ -0,0 +1,288 @@ +{ + "atom_style": [ + "angle", + "atomic", + "body", + "bond", + "charge", + "dielectric", + "dipole", + "dpd", + "edpd", + "electron", + "ellipsoid", + "full", + "line", + "mdpd", + "mesont", + "molecular", + "oxdna", + "peri", + "smd", + "sph", + "sphere", + "spin", + "tdpd", + "template", + "tri", + "wavepacket" + ], + "pair_style": { + "adp":{"units": "unknown", "atom_style": "atomic"}, + "agni":{"units": "unknown", "atom_style": "atomic"}, + "airebo":{"units": "unknown", "atom_style": "atomic"}, + "airebo/morse":{"units": "unknown", "atom_style": "atomic"}, + "rebo":{"units": "unknown", "atom_style": "atomic"}, + "atm":{"units": "unknown", "atom_style": "atomic"}, + "awpmd/cut":{"units": "unknown", "atom_style": "atomic"}, + "beck":{"units": "unknown", "atom_style": "atomic"}, + "body/nparticle":{"units": "unknown", "atom_style": "atomic"}, + "body/rounded/polygon":{"units": "unknown", "atom_style": "atomic"}, + "body/rounded/polyhedron":{"units": "unknown", "atom_style": "atomic"}, + "bop":{"units": "unknown", "atom_style": "atomic"}, + "born":{"units": "unknown", "atom_style": "atomic"}, + "born/coul/long":{"units": "unknown", "atom_style": "atomic"}, + "born/coul/msm":{"units": "unknown", "atom_style": "atomic"}, + "born/coul/wolf":{"units": "unknown", "atom_style": "atomic"}, + "born/coul/dsf":{"units": "unknown", "atom_style": "atomic"}, + "brownian":{"units": "unknown", "atom_style": "atomic"}, + "brownian/poly":{"units": "unknown", "atom_style": "atomic"}, + "buck":{"units": "unknown", "atom_style": "atomic"}, + "buck/coul/cut":{"units": "unknown", "atom_style": "atomic"}, + "buck/coul/long":{"units": "unknown", "atom_style": "atomic"}, + "buck/coul/msm":{"units": "unknown", "atom_style": "atomic"}, + "buck6d/coul/gauss/dsf":{"units": "unknown", "atom_style": "atomic"}, + "buck6d/coul/gauss/long":{"units": "unknown", "atom_style": "atomic"}, + "buck/long/coul/long":{"units": "unknown", "atom_style": "atomic"}, + "lj/charmm/coul/charmm":{"units": "metal", "atom_style": "atomic"}, + "lj/charmm/coul/charmm/implicit":{"units": "metal", "atom_style": "atomic"}, + "lj/charmm/coul/long":{"units": "metal", "atom_style": "atomic"}, + "lj/charmm/coul/msm":{"units": "metal", "atom_style": "atomic"}, + "lj/charmmfsw/coul/charmmfsh":{"units": "metal", "atom_style": "atomic"}, + "lj/charmmfsw/coul/long":{"units": "metal", "atom_style": "atomic"}, + "lj/class2":{"units": "metal", "atom_style": "atomic"}, + "lj/class2/coul/cut":{"units": "metal", "atom_style": "atomic"}, + "lj/class2/coul/long":{"units": "metal", "atom_style": "atomic"}, + "colloid":{"units": "unknown", "atom_style": "atomic"}, + "comb":{"units": "unknown", "atom_style": "atomic"}, + "comb3":{"units": "unknown", "atom_style": "atomic"}, + "cosine/squared":{"units": "unknown", "atom_style": "atomic"}, + "coul/cut":{"units": "unknown", "atom_style": "atomic"}, + "coul/debye":{"units": "unknown", "atom_style": "atomic"}, + "coul/dsf":{"units": "unknown", "atom_style": "atomic"}, + "coul/exclude":{"units": "unknown", "atom_style": "atomic"}, + "coul/cut/global":{"units": "unknown", "atom_style": "atomic"}, + "coul/long":{"units": "unknown", "atom_style": "atomic"}, + "coul/msm":{"units": "unknown", "atom_style": "atomic"}, + "coul/streitz":{"units": "unknown", "atom_style": "atomic"}, + "coul/wolf":{"units": "unknown", "atom_style": "atomic"}, + "tip4p/cut":{"units": "unknown", "atom_style": "atomic"}, + "tip4p/long":{"units": "unknown", "atom_style": "atomic"}, + "coul/diel":{"units": "unknown", "atom_style": "atomic"}, + "coul/shield":{"units": "unknown", "atom_style": "atomic"}, + "coul/slater":{"units": "unknown", "atom_style": "atomic"}, + "coul/slater/cut":{"units": "unknown", "atom_style": "atomic"}, + "coul/slater/long":{"units": "unknown", "atom_style": "atomic"}, + "coul/tt":{"units": "unknown", "atom_style": "atomic"}, + "born/coul/dsf/cs":{"units": "unknown", "atom_style": "atomic"}, + "born/coul/long/cs":{"units": "unknown", "atom_style": "atomic"}, + "born/coul/wolf/cs":{"units": "unknown", "atom_style": "atomic"}, + "buck/coul/long/cs":{"units": "unknown", "atom_style": "atomic"}, + "coul/long/cs":{"units": "unknown", "atom_style": "atomic"}, + "coul/wolf/cs":{"units": "unknown", "atom_style": "atomic"}, + "lj/cut/coul/long/cs":{"units": "metal", "atom_style": "atomic"}, + "lj/class2/coul/long/cs":{"units": "metal", "atom_style": "atomic"}, + "coul/cut/dielectric":{"units": "unknown", "atom_style": "atomic"}, + "coul/long/dielectric":{"units": "unknown", "atom_style": "atomic"}, + "lj/cut/coul/cut/dielectric":{"units": "metal", "atom_style": "atomic"}, + "lj/cut/coul/debye/dielectric":{"units": "metal", "atom_style": "atomic"}, + "lj/cut/coul/long/dielectric":{"units": "metal", "atom_style": "atomic"}, + "lj/cut/coul/msm/dielectric":{"units": "metal", "atom_style": "atomic"}, + "lj/long/coul/long/dielectric":{"units": "metal", "atom_style": "atomic"}, + "lj/cut/dipole/cut":{"units": "metal", "atom_style": "atomic"}, + "lj/sf/dipole/sf":{"units": "metal", "atom_style": "atomic"}, + "lj/cut/dipole/long":{"units": "metal", "atom_style": "atomic"}, + "lj/long/dipole/long":{"units": "metal", "atom_style": "atomic"}, + "dpd":{"units": "unknown", "atom_style": "atomic"}, + "dpd/tstat":{"units": "unknown", "atom_style": "atomic"}, + "dpd/ext":{"units": "unknown", "atom_style": "atomic"}, + "dpd/ext/tstat":{"units": "unknown", "atom_style": "atomic"}, + "dpd/fdt":{"units": "unknown", "atom_style": "atomic"}, + "dpd/fdt/energy":{"units": "unknown", "atom_style": "atomic"}, + "drip":{"units": "unknown", "atom_style": "atomic"}, + "dsmc":{"units": "unknown", "atom_style": "atomic"}, + "e3b":{"units": "unknown", "atom_style": "atomic"}, + "eam":{"units": "metal", "atom_style": "atomic"}, + "eam/alloy":{"units": "metal", "atom_style": "atomic"}, + "eam/cd":{"units": "metal", "atom_style": "atomic"}, + "eam/cd/old":{"units": "metal", "atom_style": "atomic"}, + "eam/fs":{"units": "metal", "atom_style": "atomic"}, + "eam/he":{"units": "metal", "atom_style": "atomic"}, + "edip":{"units": "unknown", "atom_style": "atomic"}, + "edip/multi":{"units": "unknown", "atom_style": "atomic"}, + "eff/cut":{"units": "unknown", "atom_style": "atomic"}, + "eim":{"units": "unknown", "atom_style": "atomic"}, + "exp6/rx":{"units": "unknown", "atom_style": "atomic"}, + "extep":{"units": "unknown", "atom_style": "atomic"}, + "lj/cut/soft":{"units": "metal", "atom_style": "atomic"}, + "lj/cut/coul/cut/soft":{"units": "metal", "atom_style": "atomic"}, + "lj/cut/coul/long/soft":{"units": "metal", "atom_style": "atomic"}, + "lj/cut/tip4p/long/soft":{"units": "metal", "atom_style": "atomic"}, + "lj/charmm/coul/long/soft":{"units": "metal", "atom_style": "atomic"}, + "lj/class2/soft":{"units": "metal", "atom_style": "atomic"}, + "lj/class2/coul/cut/soft":{"units": "metal", "atom_style": "atomic"}, + "lj/class2/coul/long/soft":{"units": "metal", "atom_style": "atomic"}, + "coul/cut/soft":{"units": "unknown", "atom_style": "atomic"}, + "coul/long/soft":{"units": "unknown", "atom_style": "atomic"}, + "tip4p/long/soft":{"units": "unknown", "atom_style": "atomic"}, + "morse/soft":{"units": "unknown", "atom_style": "atomic"}, + "gauss":{"units": "unknown", "atom_style": "atomic"}, + "gauss/cut":{"units": "unknown", "atom_style": "atomic"}, + "gayberne":{"units": "unknown", "atom_style": "atomic"}, + "gran/hooke":{"units": "unknown", "atom_style": "atomic"}, + "gran/hooke/history":{"units": "unknown", "atom_style": "atomic"}, + "gran/hertz/history":{"units": "unknown", "atom_style": "atomic"}, + "granular":{"units": "unknown", "atom_style": "atomic"}, + "lj/gromacs":{"units": "metal", "atom_style": "atomic"}, + "lj/gromacs/coul/gromacs":{"units": "metal", "atom_style": "atomic"}, + "gw":{"units": "unknown", "atom_style": "atomic"}, + "gw/zbl":{"units": "unknown", "atom_style": "atomic"}, + "hbond/dreiding/lj":{"units": "unknown", "atom_style": "atomic"}, + "hbond/dreiding/morse":{"units": "unknown", "atom_style": "atomic"}, + "hdnnp":{"units": "unknown", "atom_style": "atomic"}, + "hybrid":{"units": "unknown", "atom_style": "atomic"}, + "hybrid/overlay":{"units": "unknown", "atom_style": "atomic"}, + "hybrid/scaled":{"units": "unknown", "atom_style": "atomic"}, + "ilp/graphene/hbn":{"units": "unknown", "atom_style": "atomic"}, + "kim":{"units": "unknown", "atom_style": "atomic"}, + "kolmogorov/crespi/full":{"units": "unknown", "atom_style": "atomic"}, + "kolmogorov/crespi/z":{"units": "unknown", "atom_style": "atomic"}, + "lcbop":{"units": "unknown", "atom_style": "atomic"}, + "lebedeva/z":{"units": "unknown", "atom_style": "atomic"}, + "line/lj":{"units": "unknown", "atom_style": "atomic"}, + "list":{"units": "unknown", "atom_style": "atomic"}, + "lj/cut":{"units": "metal", "atom_style": "atomic"}, + "lj96/cut":{"units": "metal", "atom_style": "atomic"}, + "lj/cubic":{"units": "metal", "atom_style": "atomic"}, + "lj/cut/coul/cut":{"units": "metal", "atom_style": "atomic"}, + "lj/cut/coul/debye":{"units": "metal", "atom_style": "atomic"}, + "lj/cut/coul/dsf":{"units": "metal", "atom_style": "atomic"}, + "lj/cut/coul/long":{"units": "metal", "atom_style": "atomic"}, + "lj/cut/coul/msm":{"units": "metal", "atom_style": "atomic"}, + "lj/cut/coul/wolf":{"units": "metal", "atom_style": "atomic"}, + "lj/cut/tip4p/cut":{"units": "metal", "atom_style": "atomic"}, + "lj/cut/tip4p/long":{"units": "metal", "atom_style": "atomic"}, + "lj/expand":{"units": "metal", "atom_style": "atomic"}, + "lj/expand/coul/long":{"units": "metal", "atom_style": "atomic"}, + "lj/long/coul/long":{"units": "metal", "atom_style": "atomic"}, + "lj/long/tip4p/long":{"units": "metal", "atom_style": "atomic"}, + "lj/relres":{"units": "metal", "atom_style": "atomic"}, + "lj/smooth":{"units": "metal", "atom_style": "atomic"}, + "lj/smooth/linear":{"units": "metal", "atom_style": "atomic"}, + "lj/switch3/coulgauss/long":{"units": "metal", "atom_style": "atomic"}, + "mm3/switch3/coulgauss/long":{"units": "unknown", "atom_style": "atomic"}, + "local/density":{"units": "unknown", "atom_style": "atomic"}, + "lubricate":{"units": "unknown", "atom_style": "atomic"}, + "lubricate/poly":{"units": "unknown", "atom_style": "atomic"}, + "lubricateU":{"units": "unknown", "atom_style": "atomic"}, + "lubricateU/poly":{"units": "unknown", "atom_style": "atomic"}, + "lj/mdf":{"units": "metal", "atom_style": "atomic"}, + "buck/mdf":{"units": "unknown", "atom_style": "atomic"}, + "lennard/mdf":{"units": "unknown", "atom_style": "atomic"}, + "meam":{"units": "unknown", "atom_style": "atomic"}, + "meam/spline":{"units": "unknown", "atom_style": "atomic"}, + "meam/sw/spline":{"units": "unknown", "atom_style": "atomic"}, + "mesocnt":{"units": "unknown", "atom_style": "atomic"}, + "edpd":{"units": "unknown", "atom_style": "atomic"}, + "mdpd":{"units": "unknown", "atom_style": "atomic"}, + "mdpd/rhosum":{"units": "unknown", "atom_style": "atomic"}, + "tdpd":{"units": "unknown", "atom_style": "atomic"}, + "mesont/tpm":{"units": "unknown", "atom_style": "atomic"}, + "mgpt":{"units": "unknown", "atom_style": "atomic"}, + "mie/cut":{"units": "unknown", "atom_style": "atomic"}, + "mliap":{"units": "unknown", "atom_style": "atomic"}, + "momb":{"units": "unknown", "atom_style": "atomic"}, + "morse":{"units": "unknown", "atom_style": "atomic"}, + "morse/smooth/linear":{"units": "unknown", "atom_style": "atomic"}, + "multi/lucy":{"units": "unknown", "atom_style": "atomic"}, + "multi/lucy/rx":{"units": "unknown", "atom_style": "atomic"}, + "nb3b/harmonic":{"units": "unknown", "atom_style": "atomic"}, + "nm/cut":{"units": "unknown", "atom_style": "atomic"}, + "nm/cut/coul/cut":{"units": "unknown", "atom_style": "atomic"}, + "nm/cut/coul/long":{"units": "unknown", "atom_style": "atomic"}, + "none":{"units": "unknown", "atom_style": "atomic"}, + "oxdna/excv":{"units": "unknown", "atom_style": "atomic"}, + "oxdna/stk":{"units": "unknown", "atom_style": "atomic"}, + "oxdna/hbond":{"units": "unknown", "atom_style": "atomic"}, + "oxdna/xstk":{"units": "unknown", "atom_style": "atomic"}, + "oxdna/coaxstk":{"units": "unknown", "atom_style": "atomic"}, + "oxdna2/excv":{"units": "unknown", "atom_style": "atomic"}, + "oxdna2/stk":{"units": "unknown", "atom_style": "atomic"}, + "oxdna2/hbond":{"units": "unknown", "atom_style": "atomic"}, + "oxdna2/xstk":{"units": "unknown", "atom_style": "atomic"}, + "oxdna2/coaxstk":{"units": "unknown", "atom_style": "atomic"}, + "oxdna2/dh":{"units": "unknown", "atom_style": "atomic"}, + "oxrna2/excv":{"units": "unknown", "atom_style": "atomic"}, + "oxrna2/stk":{"units": "unknown", "atom_style": "atomic"}, + "oxrna2/hbond":{"units": "unknown", "atom_style": "atomic"}, + "oxrna2/xstk":{"units": "unknown", "atom_style": "atomic"}, + "oxrna2/coaxstk":{"units": "unknown", "atom_style": "atomic"}, + "oxrna2/dh":{"units": "unknown", "atom_style": "atomic"}, + "pace":{"units": "unknown", "atom_style": "atomic"}, + "peri/pmb":{"units": "unknown", "atom_style": "atomic"}, + "peri/lps":{"units": "unknown", "atom_style": "atomic"}, + "peri/ves":{"units": "unknown", "atom_style": "atomic"}, + "peri/eps":{"units": "unknown", "atom_style": "atomic"}, + "polymorphic":{"units": "unknown", "atom_style": "atomic"}, + "python":{"units": "unknown", "atom_style": "atomic"}, + "quip":{"units": "unknown", "atom_style": "atomic"}, + "rann":{"units": "unknown", "atom_style": "atomic"}, + "reaxff":{"units": "real", "atom_style": "charge"}, + "resquared":{"units": "unknown", "atom_style": "atomic"}, + "lj/sdk":{"units": "metal", "atom_style": "atomic"}, + "lj/sdk/coul/long":{"units": "metal", "atom_style": "atomic"}, + "lj/sdk/coul/msm":{"units": "metal", "atom_style": "atomic"}, + "sdpd/taitwater/isothermal":{"units": "unknown", "atom_style": "atomic"}, + "smd/hertz":{"units": "unknown", "atom_style": "atomic"}, + "smd/tlsph":{"units": "unknown", "atom_style": "atomic"}, + "smd/tri_surface":{"units": "unknown", "atom_style": "atomic"}, + "smd/ulsph":{"units": "unknown", "atom_style": "atomic"}, + "smtbq":{"units": "unknown", "atom_style": "atomic"}, + "snap":{"units": "unknown", "atom_style": "atomic"}, + "soft":{"units": "unknown", "atom_style": "atomic"}, + "sph/heatconduction":{"units": "unknown", "atom_style": "atomic"}, + "sph/idealgas":{"units": "unknown", "atom_style": "atomic"}, + "sph/lj":{"units": "unknown", "atom_style": "atomic"}, + "sph/rhosum":{"units": "unknown", "atom_style": "atomic"}, + "sph/taitwater":{"units": "unknown", "atom_style": "atomic"}, + "sph/taitwater/morris":{"units": "unknown", "atom_style": "atomic"}, + "spin/dipole/cut":{"units": "unknown", "atom_style": "atomic"}, + "spin/dipole/long":{"units": "unknown", "atom_style": "atomic"}, + "spin/dmi":{"units": "unknown", "atom_style": "atomic"}, + "spin/exchange":{"units": "unknown", "atom_style": "atomic"}, + "spin/exchange/biquadratic":{"units": "unknown", "atom_style": "atomic"}, + "spin/magelec":{"units": "unknown", "atom_style": "atomic"}, + "spin/neel":{"units": "unknown", "atom_style": "atomic"}, + "srp":{"units": "unknown", "atom_style": "atomic"}, + "sw":{"units": "unknown", "atom_style": "atomic"}, + "table":{"units": "unknown", "atom_style": "atomic"}, + "table/rx":{"units": "unknown", "atom_style": "atomic"}, + "tersoff":{"units": "metal", "atom_style": "atomic"}, + "tersoff/table":{"units": "metal", "atom_style": "atomic"}, + "tersoff/mod":{"units": "metal", "atom_style": "atomic"}, + "tersoff/mod/c":{"units": "metal", "atom_style": "atomic"}, + "tersoff/zbl":{"units": "metal", "atom_style": "atomic"}, + "thole":{"units": "unknown", "atom_style": "atomic"}, + "lj/cut/thole/long":{"units": "metal", "atom_style": "atomic"}, + "tracker":{"units": "unknown", "atom_style": "atomic"}, + "tri/lj":{"units": "unknown", "atom_style": "atomic"}, + "ufm":{"units": "unknown", "atom_style": "atomic"}, + "vashishta":{"units": "unknown", "atom_style": "atomic"}, + "vashishta/table":{"units": "unknown", "atom_style": "atomic"}, + "wf/cut":{"units": "unknown", "atom_style": "atomic"}, + "yukawa":{"units": "unknown", "atom_style": "atomic"}, + "yukawa/colloid":{"units": "unknown", "atom_style": "atomic"}, + "zbl":{"units": "unknown", "atom_style": "atomic"}, + "zero":{"units": "unknown", "atom_style": "atomic"} + } +} diff --git a/aiida_lammps/validation/schemas/lammps_schema.json b/aiida_lammps/validation/schemas/lammps_schema.json index da696c2..10c76f2 100644 --- a/aiida_lammps/validation/schemas/lammps_schema.json +++ b/aiida_lammps/validation/schemas/lammps_schema.json @@ -9,7 +9,8 @@ "minimize", "md", "fix", - "thermo_print" + "thermo", + "dump" ] }, "properties": { @@ -17,86 +18,129 @@ "$ref": "#/definitions/computes" }, "md": { - "type": "object" + "type": "object", + "properties": { + "run_style": { + "type": "string" + }, + "rspa_options": { + "type": "array" + }, + "max_number_steps": { + "type": "integer" + } + } }, "minimize": { - "type": "object" + "type": "object", + "properties": { + "style": { + "type": "string" + }, + "energy_tolerance": { + "type": "numeric" + }, + "force_tolerance": { + "type": "numeric" + }, + "max_iterations": { + "type": "integer" + }, + "max_evaluations": { + "type": "integer" + } + } }, - "thermo_print": { + "dump": { "type": "object", - "propertyNames":{ - "enum":[ - "step", - "elapsed", - "elaplong", - "dt", - "time", - "cpu", - "tpcpu", - "spcpu", - "cpuremain", - "part", - "timeremain", - "atoms", - "temp", - "press", - "pe", - "ke", - "etotal", - "evdwl", - "ecoul", - "epair", - "ebond", - "eangle", - "edihed", - "eimp", - "emol", - "elong", - "etail", - "enthalpy", - "ecouple", - "econserve", - "vol", - "density", - "lx", - "ly", - "lz", - "xlo", - "xhi", - "ylo", - "yhi", - "zlo", - "zhi", - "xy", - "xz", - "yz", - "xlat", - "ylat", - "zlat", - "bonds", - "angles", - "dihedrals", - "impropers", - "pxx", - "pyy", - "pzz", - "pxy", - "pxz", - "pyz", - "fmax", - "fnorm", - "nbuild", - "ndanger", - "cella", - "cellb", - "cellc", - "cellalpha", - "cellbeta", - "cellgamma" - ], - "patternProperties": { - "^": { - "type": "boolean" + "properties": { + "dump_rate": { + "type": "integer" + } + } + }, + "thermo": { + "type": "object", + "properties": { + "printing_rate":{ + "type": "integer" + }, + "thermo_print":{ + "propertyNames":{ + "enum":[ + "step", + "elapsed", + "elaplong", + "dt", + "time", + "cpu", + "tpcpu", + "spcpu", + "cpuremain", + "part", + "timeremain", + "atoms", + "temp", + "press", + "pe", + "ke", + "etotal", + "evdwl", + "ecoul", + "epair", + "ebond", + "eangle", + "edihed", + "eimp", + "emol", + "elong", + "etail", + "enthalpy", + "ecouple", + "econserve", + "vol", + "density", + "lx", + "ly", + "lz", + "xlo", + "xhi", + "ylo", + "yhi", + "zlo", + "zhi", + "xy", + "xz", + "yz", + "xlat", + "ylat", + "zlat", + "bonds", + "angles", + "dihedrals", + "impropers", + "pxx", + "pyy", + "pzz", + "pxy", + "pxz", + "pyz", + "fmax", + "fnorm", + "nbuild", + "ndanger", + "cella", + "cellb", + "cellc", + "cellalpha", + "cellbeta", + "cellgamma" + ], + "patternProperties": { + "^": { + "type": "boolean" + } + } } } } @@ -784,18 +828,21 @@ "children": { "id": "#children", "description": "schema for the entries related to the compute and fixes", - "type": "object", - "properties": { - "type": { - "type": "array" + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "array" + }, + "group": { + "type": "string" + } }, - "group": { - "type": "string" - } - }, - "required": [ - "type" - ] + "required": [ + "type" + ] + } } } } From bce0bd90ed2e2010509e0350141ccf8bd58e2464 Mon Sep 17 00:00:00 2001 From: Jonathan Chico Date: Mon, 22 Nov 2021 16:55:11 +0100 Subject: [PATCH 13/70] (WIP) Improving the potential. Adding the extra attributes to tage the potential. Improvements of the dosctrings. --- aiida_lammps/common/input_generator.py | 31 +- aiida_lammps/data/lammps_potential.py | 372 +++++++++++++++- aiida_lammps/data/lammps_potentials.json | 512 +++++++++++------------ 3 files changed, 631 insertions(+), 284 deletions(-) diff --git a/aiida_lammps/common/input_generator.py b/aiida_lammps/common/input_generator.py index aaa85db..d456356 100644 --- a/aiida_lammps/common/input_generator.py +++ b/aiida_lammps/common/input_generator.py @@ -14,6 +14,7 @@ from typing import Union import json from aiida import orm +from aiida_lammps.data.lammps_potential import LammpsPotentialData def write_control_block(parameters_control: dict) -> str: @@ -53,8 +54,10 @@ def write_control_block(parameters_control: dict) -> str: def write_potential_block( - potential, + potential: LammpsPotentialData, + structure: orm.StructureData, parameters_potential: dict, + potential_file: str, ) -> str: """ Generate the input block with potential options. @@ -64,21 +67,35 @@ def write_potential_block( and generate a block that is written in the LAMMPS input file. :param potential: md-potential which will be used in the calculation - :type potential: [type], + :type potential: LammpsPotentialData, + :param structure: structure used for the calculation + :type structure: orm.StructureData :param parameters_potential: parameters which have to deal with the potential :type parameters_potential: dict + :param potential_file: filename for the potential to be used. + :type str: :return: block with the information needed to setup the potential part of the LAMMPS calculation. :rtype: str """ + default_potential = LammpsPotentialData._default_potential_info + + kind_symbols = [kind.symbol for kind in structure.kinds] + potential_block = '# ---- Start of Potential information ----\n' - potential_block += f'pair_style {potential.pair_style}\n' - potential_block += f'{potential.potential_line}' - if 'neighbor' in parameters_potential: - potential_block += f"neighbor {join_keywords(parameters_potential['neighbor_update'])}\n" + potential_block += f'pair_style {potential.pair_style}' + potential_block += f' {" ".join(parameters_potential.get("potential_style_options", ""))}\n' + + if default_potential[potential.pair_style].get('read_from_file'): + potential_block += f'pair_coeff * * {potential_file} {" ".join(kind_symbols)}\n' + if not default_potential[potential.pair_style].get('read_from_file'): + potential_block += f'pair_coeff {potential.get_content()}\n' + + if 'neighbor_update' in parameters_potential: + potential_block += f'neighbor {join_keywords(parameters_potential["neighbor_update"])}\n' if 'neigh_modify' in parameters_potential: - potential_block += f"neigh_modify {(parameters_potential['neigh_modify'])}\n" + potential_block += f'neigh_modify {(parameters_potential["neigh_modify"])}\n' potential_block += '# ---- End of Potential information ----\n' return potential_block diff --git a/aiida_lammps/data/lammps_potential.py b/aiida_lammps/data/lammps_potential.py index e86942e..1527736 100644 --- a/aiida_lammps/data/lammps_potential.py +++ b/aiida_lammps/data/lammps_potential.py @@ -1,3 +1,8 @@ +""" +[summary] + +[extended_summary] +""" import io import os import pathlib @@ -10,8 +15,29 @@ from aiida.common.exceptions import StoringNotAllowed from aiida.common.files import md5_from_filelike -class LammpsPotentialData(orm.SinglefileData): +class LammpsPotentialData(orm.SinglefileData): + """ + [summary] + + [extended_summary] + + :param orm: [description] + :type orm: [type] + :raises TypeError: [description] + :raises ValueError: [description] + :raises TypeError: [description] + :raises KeyError: [description] + :raises TypeError: [description] + :raises ValueError: [description] + :raises ValueError: [description] + :raises ValueError: [description] + :raises ValueError: [description] + :raises ValueError: [description] + :raises StoringNotAllowed: [description] + :return: [description] + :rtype: [type] + """ _key_element = 'element' _key_md5 = 'md5' @@ -20,9 +46,44 @@ class LammpsPotentialData(orm.SinglefileData): 'lammps_potentials.json', ) - with open() as handler: - _default_potential_info = json.load(handler)['pair_style'] - _default_atom_style_info = json.load(handler)['atom_style'] + _extra_keys = { + 'content_origin': { + 'type': str + }, + 'content_other_locations': { + 'type': str + }, + 'data_method': { + 'type': str, + 'values': ['experiment', 'computation', 'unknown'] + }, + 'description': { + 'type': str + }, + 'developer': { + 'type': str + }, + 'disclaimer': { + 'type': str + }, + 'properties': { + 'type': str + }, + 'publication_year': { + 'type': str + }, + 'source_citations': { + 'type': str + }, + 'title': { + 'type': str + }, + } + + with open(_schema_file, 'r') as handler: + _defaults = json.load(handler) + _default_potential_info = _defaults['pair_style'] + _default_atom_style_info = _defaults['atom_style'] @classmethod def get_or_create( @@ -33,7 +94,8 @@ def get_or_create( species: list = None, atom_style: str = None, units: str = None, - ): + extra_tags: dict = None, + ): """Get lammps potential data node from database with matching md5 checksum or create a new one if not existent. :param source: the source potential content, either a binary stream, or a ``str`` or ``Path`` to the path of the file on disk, which can be relative or absolute. @@ -45,7 +107,11 @@ def get_or_create( source = cls.prepare_source(source) query = orm.QueryBuilder() - query.append(cls, subclassing=False, filters={f'attributes.{cls._key_md5}': md5_from_filelike(source)},) + query.append( + cls, + subclassing=False, + filters={f'attributes.{cls._key_md5}': md5_from_filelike(source)}, + ) existing = query.first() @@ -53,7 +119,15 @@ def get_or_create( potential = existing[0] else: source.seek(0) - potential = cls(source, filename, pair_style, species, atom_style, units) + potential = cls( + source, + filename, + pair_style, + species, + atom_style, + units, + extra_tags, + ) return potential @@ -62,7 +136,10 @@ def get_entry_point_name(cls): """Return the entry point name associated with this data class. :return: the entry point name. """ - _, entry_point = plugins.entry_point.get_entry_point_from_class(cls.__module__, cls.__name__,) + _, entry_point = plugins.entry_point.get_entry_point_from_class( + cls.__module__, + cls.__name__, + ) return entry_point.name @staticmethod @@ -71,19 +148,22 @@ def is_readable_byte_stream(stream) -> bool: :param stream: the object to analyse. :returns: True if ``stream`` appears to be a readable filelike object in binary mode, False otherwise. """ - return ( - isinstance(stream, io.BytesIO) or - (hasattr(stream, 'read') and hasattr(stream, 'mode') and 'b' in stream.mode) - ) + return (isinstance(stream, io.BytesIO) + or (hasattr(stream, 'read') and hasattr(stream, 'mode') + and 'b' in stream.mode)) @classmethod - def prepare_source(cls, source: typing.Union[str, pathlib.Path, typing.BinaryIO]) -> typing.BinaryIO: + def prepare_source( + cls, source: typing.Union[str, pathlib.Path, typing.BinaryIO] + ) -> typing.BinaryIO: """Validate the ``source`` representing a file on disk or a byte stream. .. note:: if the ``source`` is a valid file on disk, its content is read and returned as a stream of bytes. :raises TypeError: if the source is not a ``str``, ``pathlib.Path`` instance or binary stream. :raises FileNotFoundError: if the source is a filepath but does not exist. """ - if not isinstance(source, (str, pathlib.Path)) and not cls.is_readable_byte_stream(source): + if not isinstance( + source, + (str, pathlib.Path)) and not cls.is_readable_byte_stream(source): raise TypeError( f'`source` should be a `str` or `pathlib.Path` filepath on disk or a stream of bytes, got: {source}' ) @@ -104,16 +184,40 @@ def validate_md5(self, md5: str): with self.open(mode='rb') as handle: md5_file = md5_from_filelike(handle) if md5 != md5_file: - raise ValueError(f'md5 does not match that of stored file: {md5} != {md5_file}') + raise ValueError( + f'md5 does not match that of stored file: {md5} != {md5_file}' + ) def validate_pair_style(self, pair_style: str): + """ + Validate that the given `pair_style` is a valid lammps `pair_style` + + Takes the given `pair_style` and compares it with those supported by lammps + and see if there it a match. + + :param pair_style: Name of the LAMMPS potential `pair_style` + :type pair_style: str + :raises TypeError: If the `pair_style` is None. + :raises KeyError: If the `pair_style` is not supported by LAMMPS. + """ if pair_style is None: - raise TypeError('The pair_style of the potential must be provided.') + raise TypeError( + 'The pair_style of the potential must be provided.') if pair_style not in self._default_potential_info.keys(): - raise KeyError(f'The pair_style "{pair_style}" is not vvalid') + raise KeyError(f'The pair_style "{pair_style}" is not valid') self.set_attribute('pair_style', pair_style) def validate_species(self, species: list): + """ + Validate that the given species are actual atomic species. + + This checks that each of the entries in the species list are actual + elements. + + :param species: list of atomic species for this potential + :type species: list + :raises TypeError: If the list of species is not provided + """ if species is None: raise TypeError('The species for this potential must be provided.') for _specie in species: @@ -121,6 +225,18 @@ def validate_species(self, species: list): self.set_attribute('species', species) def validate_atom_style(self, atom_style: str, pair_style: str): + """ + Validate that the given `atom_style` is a proper LAMMPS `atom_style` + + The idea is to check if the given `atom_style` is supported by LAMMPS + if no `atom_style` is given a default one is assigned. + + :param atom_style: Name of the given `atom_style` + :type atom_style: str + :param pair_style: Name of the current `pair_style` + :type pair_style: str + :raises ValueError: If the `atom_style` is not supported by LAMMPS + """ if atom_style is None: atom_style = self._default_potential_info[pair_style]['atom_style'] if atom_style not in self._default_atom_style_info: @@ -137,12 +253,52 @@ def validate_element(cls, element: str): raise ValueError(f'`{element}` is not a valid element.') def validate_units(self, units: str, pair_style: str): + """ + Validate the LAMMPS units. + + Checks that the provided units for the potential are LAMMPS compatible, + if no units are given default values are used instead. + + :param units: Name of the given units for the calculation. + :type units: str + :param pair_style: Name of the used pair_style + :type pair_style: str + :raises ValueError: If the `units` are not LAMMPS compatible. + """ if units is None: units = self._default_potential_info[pair_style]['units'] - if units not in ['si', 'lj', 'real', 'metal', 'cgs', 'electron', 'micro', 'nano']: - raise ValueError(f'The units "{units}" is not valie') + if units not in [ + 'si', 'lj', 'real', 'metal', 'cgs', 'electron', 'micro', 'nano' + ]: + raise ValueError(f'The units "{units}" is not valid') self.set_attribute('default_units', units) + def validate_extra_tags(self, extra_tags: dict): + """ + Validate the dictionary with the extra tags for the potential. + + It will take the given dictionary and check that the keys provided + correspond to the ones accepted by the class. It will also check that + the type of the entries are of the appropriate python type. If the + entries can take only a subset of values they are checked against them. + + :param extra_tags: dictionary with the extra tags that can be used to tag the potential + :type extra_tags: dict + :raises ValueError: If the type of the entry does not matches the expected + :raises ValueError: If the value of the entry does not match the possible values + """ + for key, value in self._extra_keys.items(): + _value = extra_tags.get(key, None) + _types = value.get('type', None) + _values = value.get('values', None) + if _value is not None: + if isinstance(_value, _types): + raise ValueError(f'Tag "{key}" is not of type "{_types}"') + if _values is not None and _value in _values: + raise ValueError( + f'Tag "{key}" is not in the accepted values "{_values}"' + ) + def set_file( self, source: typing.Union[str, pathlib.Path, typing.BinaryIO], @@ -151,8 +307,9 @@ def set_file( species: list = None, atom_style: str = None, units: str = None, + extras_tags: dict = None, **kwargs, - ): + ): """Set the file content. .. note:: this method will first analyse the type of the ``source`` and if it is a filepath will convert it to a binary stream of the content located at that filepath, which is then passed on to the superclass. This @@ -164,7 +321,19 @@ def set_file( the conversion over and over again. :param source: the source lammps potential content, either a binary stream, or a ``str`` or ``Path`` to the path of the file on disk, which can be relative or absolute. + :type source: typing.Union[str, pathlib.Path, typing.BinaryIO] :param filename: optional explicit filename to give to the file stored in the repository. + :type filename: str + :param pair_style: Type of potential according to LAMMPS + :type pair_style: str + :param species: Species that can be used for this potential. + :type species: list + :param atom_style: Type of treatment of the atoms according to LAMMPS. + :type atom_style: str + :param units: Default units to be used with this potential. + :type unite: str + :param extra_tags: Dictionary with extra information to tag the potential, based on the KIM schema. + :type extra_tags: dict :raises TypeError: if the source is not a ``str``, ``pathlib.Path`` instance or binary stream. :raises FileNotFoundError: if the source is a filepath but does not exist. """ @@ -173,11 +342,16 @@ def set_file( self.validate_species(species=species) self.validate_atom_style(atom_style=atom_style, pair_style=pair_style) self.validate_units(units=units, pair_style=pair_style) + if extras_tags is None: + extras_tags = dict() + if extras_tags is not None: + self.validate_extra_tags(extra_tags=extras_tags) + for key in self._extra_keys.keys(): + self.set_attribute(key, extras_tags.get(key, None)) super().set_file(source, filename, **kwargs) source.seek(0) self.md5 = md5_from_filelike(source) - def store(self, **kwargs): """Store the node verifying first that all required attributes are set. :raises :py:exc:`~aiida.common.StoringNotAllowed`: if no valid element has been defined. @@ -192,23 +366,179 @@ def store(self, **kwargs): @property def atom_style(self): + """ + Return the default `atomic_style` of this potential. + :return: the default `atomic_style` of this potential + :rtype: str + """ return self.get_attribute('atom_style') @property def pair_style(self): + """ + Return the `pair_style` of this potential according to the LAMMPS notation + :return: the `pair_style` of the potential + :rtype: str + """ return self.get_attribute('pair_style') @property def species(self): """Return the list of species which this potential can be used for. :return: The list of chemical species which are contained in this potential. + :rtype: list """ return self.get_attribute('species') @property def default_units(self): + """ + Return the default units associated with this potential. + :return: the default units associated with this potential + :rtype: str + """ return self.get_attribute('default_units') + @property + def content_origin(self): + """ + Return the place where this potential information can be found. + + As based in the KIM schema. A description and/or web address to the + online source where the material was obtained. + Possible examples include 'Original content', + 'Obtained from developer', 'Included in LAMMPS', + a link to the relevant NIST IPR page, or the URL/ID/Access Date of a + Materials Project entry. + + :return: the place where this potential information can be found. + :rtype: str + """ + return self.get_attribute('content_origin') + + @property + def content_other_locations(self): + """ + Return other locations where the potential can be found. + + As based in the KIM schema. A description of and/or web address(es) + to other location(s) where the content is available. + + :return: other locations where the potential can be found. + :rtype: str + """ + return self.get_attribute('content_other_locations') + + @property + def data_method(self): + """ + Return the data method used to generate the potential. + + As based in the KIM schema. The method used to generate an instance + of Reference Data. + Must be one of: experiment, computation, or unknown + + :return: data_method used to generate the potential + :rtype: str + """ + return self.get_attribute('data_method') + + @property + def description(self): + """ + Return a description of the potential. + + As based in the KIM schema. A short description describing its key + features including for example: type of model + (pair potential, 3-body potential, EAM, etc.), modeled elements + (Ac, Ag, …, Zr), intended purpose, origin, and so on. + + :return: description of the potential + :rtype: str + """ + return self.get_attribute('description') + + @property + def developer(self): + """ + Return the developer information of this potential. + + As based in the KIM schema. An array of strings, each of which is a KIM + user uuid corresponding to a "developer" of the item. + A developer of an item is someone who participated in creating the core + intellectual content of the digital object, e.g. the functional form + of an interatomic model or a specific parameter set for it. + + :return: developer information of this potential + :rtype: str + """ + return self.get_attribute('developer') + + @property + def disclaimer(self): + """ + Return a disclaimer regarding the usage of the potential. + + As based in the KIM schema. A short statement of applicability which + will accompany any results computed using it. A developer can use the + disclaimer to inform users of the intended use of this KIM Item. + + :return: disclaimer regarding the usage of this potential + :rtype: str + """ + return self.get_attribute('disclaimer') + + @property + def properties(self): + """ + Return the properties for which this potential was devised. + + As based in the KIM schema. A list of properties reported by a KIM Item. + + :return: properties fow which this potential was devised. + :rtype: str + """ + return self.get_attribute('properties') + + @property + def publication_year(self): + """ + Return the year of publication of this potential. + + As based in the KIM schema. Year this item was published on openkim.org. + + :return: year of publication of this potential + :rtype: str + """ + return self.get_attribute('publication_year') + + @property + def source_citations(self): + """ + Return the citation where the potential was originally published. + + As based in the KIM schema. An array of BibTeX-style EDN dictionaries + corresponding to primary published work(s) describing the KIM Item. + + :return: the citation where the potential was originally published. + :rtype: str. + """ + return self.get_attribute('source_citations') + + @property + def title(self): + """ + Return the title of the potential. + + As based in the KIM schema. Used when displaying a KIM Item on + openkim.org, as well as autogenerating its citation. + The title should not include an ending period. + + :return: the title of the potential + :rtype: str + """ + return self.get_attribute('title') + @property def md5(self) -> typing.Optional[int]: """Return the md5. diff --git a/aiida_lammps/data/lammps_potentials.json b/aiida_lammps/data/lammps_potentials.json index 690ccca..a8df82d 100644 --- a/aiida_lammps/data/lammps_potentials.json +++ b/aiida_lammps/data/lammps_potentials.json @@ -28,261 +28,261 @@ "wavepacket" ], "pair_style": { - "adp":{"units": "unknown", "atom_style": "atomic"}, - "agni":{"units": "unknown", "atom_style": "atomic"}, - "airebo":{"units": "unknown", "atom_style": "atomic"}, - "airebo/morse":{"units": "unknown", "atom_style": "atomic"}, - "rebo":{"units": "unknown", "atom_style": "atomic"}, - "atm":{"units": "unknown", "atom_style": "atomic"}, - "awpmd/cut":{"units": "unknown", "atom_style": "atomic"}, - "beck":{"units": "unknown", "atom_style": "atomic"}, - "body/nparticle":{"units": "unknown", "atom_style": "atomic"}, - "body/rounded/polygon":{"units": "unknown", "atom_style": "atomic"}, - "body/rounded/polyhedron":{"units": "unknown", "atom_style": "atomic"}, - "bop":{"units": "unknown", "atom_style": "atomic"}, - "born":{"units": "unknown", "atom_style": "atomic"}, - "born/coul/long":{"units": "unknown", "atom_style": "atomic"}, - "born/coul/msm":{"units": "unknown", "atom_style": "atomic"}, - "born/coul/wolf":{"units": "unknown", "atom_style": "atomic"}, - "born/coul/dsf":{"units": "unknown", "atom_style": "atomic"}, - "brownian":{"units": "unknown", "atom_style": "atomic"}, - "brownian/poly":{"units": "unknown", "atom_style": "atomic"}, - "buck":{"units": "unknown", "atom_style": "atomic"}, - "buck/coul/cut":{"units": "unknown", "atom_style": "atomic"}, - "buck/coul/long":{"units": "unknown", "atom_style": "atomic"}, - "buck/coul/msm":{"units": "unknown", "atom_style": "atomic"}, - "buck6d/coul/gauss/dsf":{"units": "unknown", "atom_style": "atomic"}, - "buck6d/coul/gauss/long":{"units": "unknown", "atom_style": "atomic"}, - "buck/long/coul/long":{"units": "unknown", "atom_style": "atomic"}, - "lj/charmm/coul/charmm":{"units": "metal", "atom_style": "atomic"}, - "lj/charmm/coul/charmm/implicit":{"units": "metal", "atom_style": "atomic"}, - "lj/charmm/coul/long":{"units": "metal", "atom_style": "atomic"}, - "lj/charmm/coul/msm":{"units": "metal", "atom_style": "atomic"}, - "lj/charmmfsw/coul/charmmfsh":{"units": "metal", "atom_style": "atomic"}, - "lj/charmmfsw/coul/long":{"units": "metal", "atom_style": "atomic"}, - "lj/class2":{"units": "metal", "atom_style": "atomic"}, - "lj/class2/coul/cut":{"units": "metal", "atom_style": "atomic"}, - "lj/class2/coul/long":{"units": "metal", "atom_style": "atomic"}, - "colloid":{"units": "unknown", "atom_style": "atomic"}, - "comb":{"units": "unknown", "atom_style": "atomic"}, - "comb3":{"units": "unknown", "atom_style": "atomic"}, - "cosine/squared":{"units": "unknown", "atom_style": "atomic"}, - "coul/cut":{"units": "unknown", "atom_style": "atomic"}, - "coul/debye":{"units": "unknown", "atom_style": "atomic"}, - "coul/dsf":{"units": "unknown", "atom_style": "atomic"}, - "coul/exclude":{"units": "unknown", "atom_style": "atomic"}, - "coul/cut/global":{"units": "unknown", "atom_style": "atomic"}, - "coul/long":{"units": "unknown", "atom_style": "atomic"}, - "coul/msm":{"units": "unknown", "atom_style": "atomic"}, - "coul/streitz":{"units": "unknown", "atom_style": "atomic"}, - "coul/wolf":{"units": "unknown", "atom_style": "atomic"}, - "tip4p/cut":{"units": "unknown", "atom_style": "atomic"}, - "tip4p/long":{"units": "unknown", "atom_style": "atomic"}, - "coul/diel":{"units": "unknown", "atom_style": "atomic"}, - "coul/shield":{"units": "unknown", "atom_style": "atomic"}, - "coul/slater":{"units": "unknown", "atom_style": "atomic"}, - "coul/slater/cut":{"units": "unknown", "atom_style": "atomic"}, - "coul/slater/long":{"units": "unknown", "atom_style": "atomic"}, - "coul/tt":{"units": "unknown", "atom_style": "atomic"}, - "born/coul/dsf/cs":{"units": "unknown", "atom_style": "atomic"}, - "born/coul/long/cs":{"units": "unknown", "atom_style": "atomic"}, - "born/coul/wolf/cs":{"units": "unknown", "atom_style": "atomic"}, - "buck/coul/long/cs":{"units": "unknown", "atom_style": "atomic"}, - "coul/long/cs":{"units": "unknown", "atom_style": "atomic"}, - "coul/wolf/cs":{"units": "unknown", "atom_style": "atomic"}, - "lj/cut/coul/long/cs":{"units": "metal", "atom_style": "atomic"}, - "lj/class2/coul/long/cs":{"units": "metal", "atom_style": "atomic"}, - "coul/cut/dielectric":{"units": "unknown", "atom_style": "atomic"}, - "coul/long/dielectric":{"units": "unknown", "atom_style": "atomic"}, - "lj/cut/coul/cut/dielectric":{"units": "metal", "atom_style": "atomic"}, - "lj/cut/coul/debye/dielectric":{"units": "metal", "atom_style": "atomic"}, - "lj/cut/coul/long/dielectric":{"units": "metal", "atom_style": "atomic"}, - "lj/cut/coul/msm/dielectric":{"units": "metal", "atom_style": "atomic"}, - "lj/long/coul/long/dielectric":{"units": "metal", "atom_style": "atomic"}, - "lj/cut/dipole/cut":{"units": "metal", "atom_style": "atomic"}, - "lj/sf/dipole/sf":{"units": "metal", "atom_style": "atomic"}, - "lj/cut/dipole/long":{"units": "metal", "atom_style": "atomic"}, - "lj/long/dipole/long":{"units": "metal", "atom_style": "atomic"}, - "dpd":{"units": "unknown", "atom_style": "atomic"}, - "dpd/tstat":{"units": "unknown", "atom_style": "atomic"}, - "dpd/ext":{"units": "unknown", "atom_style": "atomic"}, - "dpd/ext/tstat":{"units": "unknown", "atom_style": "atomic"}, - "dpd/fdt":{"units": "unknown", "atom_style": "atomic"}, - "dpd/fdt/energy":{"units": "unknown", "atom_style": "atomic"}, - "drip":{"units": "unknown", "atom_style": "atomic"}, - "dsmc":{"units": "unknown", "atom_style": "atomic"}, - "e3b":{"units": "unknown", "atom_style": "atomic"}, - "eam":{"units": "metal", "atom_style": "atomic"}, - "eam/alloy":{"units": "metal", "atom_style": "atomic"}, - "eam/cd":{"units": "metal", "atom_style": "atomic"}, - "eam/cd/old":{"units": "metal", "atom_style": "atomic"}, - "eam/fs":{"units": "metal", "atom_style": "atomic"}, - "eam/he":{"units": "metal", "atom_style": "atomic"}, - "edip":{"units": "unknown", "atom_style": "atomic"}, - "edip/multi":{"units": "unknown", "atom_style": "atomic"}, - "eff/cut":{"units": "unknown", "atom_style": "atomic"}, - "eim":{"units": "unknown", "atom_style": "atomic"}, - "exp6/rx":{"units": "unknown", "atom_style": "atomic"}, - "extep":{"units": "unknown", "atom_style": "atomic"}, - "lj/cut/soft":{"units": "metal", "atom_style": "atomic"}, - "lj/cut/coul/cut/soft":{"units": "metal", "atom_style": "atomic"}, - "lj/cut/coul/long/soft":{"units": "metal", "atom_style": "atomic"}, - "lj/cut/tip4p/long/soft":{"units": "metal", "atom_style": "atomic"}, - "lj/charmm/coul/long/soft":{"units": "metal", "atom_style": "atomic"}, - "lj/class2/soft":{"units": "metal", "atom_style": "atomic"}, - "lj/class2/coul/cut/soft":{"units": "metal", "atom_style": "atomic"}, - "lj/class2/coul/long/soft":{"units": "metal", "atom_style": "atomic"}, - "coul/cut/soft":{"units": "unknown", "atom_style": "atomic"}, - "coul/long/soft":{"units": "unknown", "atom_style": "atomic"}, - "tip4p/long/soft":{"units": "unknown", "atom_style": "atomic"}, - "morse/soft":{"units": "unknown", "atom_style": "atomic"}, - "gauss":{"units": "unknown", "atom_style": "atomic"}, - "gauss/cut":{"units": "unknown", "atom_style": "atomic"}, - "gayberne":{"units": "unknown", "atom_style": "atomic"}, - "gran/hooke":{"units": "unknown", "atom_style": "atomic"}, - "gran/hooke/history":{"units": "unknown", "atom_style": "atomic"}, - "gran/hertz/history":{"units": "unknown", "atom_style": "atomic"}, - "granular":{"units": "unknown", "atom_style": "atomic"}, - "lj/gromacs":{"units": "metal", "atom_style": "atomic"}, - "lj/gromacs/coul/gromacs":{"units": "metal", "atom_style": "atomic"}, - "gw":{"units": "unknown", "atom_style": "atomic"}, - "gw/zbl":{"units": "unknown", "atom_style": "atomic"}, - "hbond/dreiding/lj":{"units": "unknown", "atom_style": "atomic"}, - "hbond/dreiding/morse":{"units": "unknown", "atom_style": "atomic"}, - "hdnnp":{"units": "unknown", "atom_style": "atomic"}, - "hybrid":{"units": "unknown", "atom_style": "atomic"}, - "hybrid/overlay":{"units": "unknown", "atom_style": "atomic"}, - "hybrid/scaled":{"units": "unknown", "atom_style": "atomic"}, - "ilp/graphene/hbn":{"units": "unknown", "atom_style": "atomic"}, - "kim":{"units": "unknown", "atom_style": "atomic"}, - "kolmogorov/crespi/full":{"units": "unknown", "atom_style": "atomic"}, - "kolmogorov/crespi/z":{"units": "unknown", "atom_style": "atomic"}, - "lcbop":{"units": "unknown", "atom_style": "atomic"}, - "lebedeva/z":{"units": "unknown", "atom_style": "atomic"}, - "line/lj":{"units": "unknown", "atom_style": "atomic"}, - "list":{"units": "unknown", "atom_style": "atomic"}, - "lj/cut":{"units": "metal", "atom_style": "atomic"}, - "lj96/cut":{"units": "metal", "atom_style": "atomic"}, - "lj/cubic":{"units": "metal", "atom_style": "atomic"}, - "lj/cut/coul/cut":{"units": "metal", "atom_style": "atomic"}, - "lj/cut/coul/debye":{"units": "metal", "atom_style": "atomic"}, - "lj/cut/coul/dsf":{"units": "metal", "atom_style": "atomic"}, - "lj/cut/coul/long":{"units": "metal", "atom_style": "atomic"}, - "lj/cut/coul/msm":{"units": "metal", "atom_style": "atomic"}, - "lj/cut/coul/wolf":{"units": "metal", "atom_style": "atomic"}, - "lj/cut/tip4p/cut":{"units": "metal", "atom_style": "atomic"}, - "lj/cut/tip4p/long":{"units": "metal", "atom_style": "atomic"}, - "lj/expand":{"units": "metal", "atom_style": "atomic"}, - "lj/expand/coul/long":{"units": "metal", "atom_style": "atomic"}, - "lj/long/coul/long":{"units": "metal", "atom_style": "atomic"}, - "lj/long/tip4p/long":{"units": "metal", "atom_style": "atomic"}, - "lj/relres":{"units": "metal", "atom_style": "atomic"}, - "lj/smooth":{"units": "metal", "atom_style": "atomic"}, - "lj/smooth/linear":{"units": "metal", "atom_style": "atomic"}, - "lj/switch3/coulgauss/long":{"units": "metal", "atom_style": "atomic"}, - "mm3/switch3/coulgauss/long":{"units": "unknown", "atom_style": "atomic"}, - "local/density":{"units": "unknown", "atom_style": "atomic"}, - "lubricate":{"units": "unknown", "atom_style": "atomic"}, - "lubricate/poly":{"units": "unknown", "atom_style": "atomic"}, - "lubricateU":{"units": "unknown", "atom_style": "atomic"}, - "lubricateU/poly":{"units": "unknown", "atom_style": "atomic"}, - "lj/mdf":{"units": "metal", "atom_style": "atomic"}, - "buck/mdf":{"units": "unknown", "atom_style": "atomic"}, - "lennard/mdf":{"units": "unknown", "atom_style": "atomic"}, - "meam":{"units": "unknown", "atom_style": "atomic"}, - "meam/spline":{"units": "unknown", "atom_style": "atomic"}, - "meam/sw/spline":{"units": "unknown", "atom_style": "atomic"}, - "mesocnt":{"units": "unknown", "atom_style": "atomic"}, - "edpd":{"units": "unknown", "atom_style": "atomic"}, - "mdpd":{"units": "unknown", "atom_style": "atomic"}, - "mdpd/rhosum":{"units": "unknown", "atom_style": "atomic"}, - "tdpd":{"units": "unknown", "atom_style": "atomic"}, - "mesont/tpm":{"units": "unknown", "atom_style": "atomic"}, - "mgpt":{"units": "unknown", "atom_style": "atomic"}, - "mie/cut":{"units": "unknown", "atom_style": "atomic"}, - "mliap":{"units": "unknown", "atom_style": "atomic"}, - "momb":{"units": "unknown", "atom_style": "atomic"}, - "morse":{"units": "unknown", "atom_style": "atomic"}, - "morse/smooth/linear":{"units": "unknown", "atom_style": "atomic"}, - "multi/lucy":{"units": "unknown", "atom_style": "atomic"}, - "multi/lucy/rx":{"units": "unknown", "atom_style": "atomic"}, - "nb3b/harmonic":{"units": "unknown", "atom_style": "atomic"}, - "nm/cut":{"units": "unknown", "atom_style": "atomic"}, - "nm/cut/coul/cut":{"units": "unknown", "atom_style": "atomic"}, - "nm/cut/coul/long":{"units": "unknown", "atom_style": "atomic"}, - "none":{"units": "unknown", "atom_style": "atomic"}, - "oxdna/excv":{"units": "unknown", "atom_style": "atomic"}, - "oxdna/stk":{"units": "unknown", "atom_style": "atomic"}, - "oxdna/hbond":{"units": "unknown", "atom_style": "atomic"}, - "oxdna/xstk":{"units": "unknown", "atom_style": "atomic"}, - "oxdna/coaxstk":{"units": "unknown", "atom_style": "atomic"}, - "oxdna2/excv":{"units": "unknown", "atom_style": "atomic"}, - "oxdna2/stk":{"units": "unknown", "atom_style": "atomic"}, - "oxdna2/hbond":{"units": "unknown", "atom_style": "atomic"}, - "oxdna2/xstk":{"units": "unknown", "atom_style": "atomic"}, - "oxdna2/coaxstk":{"units": "unknown", "atom_style": "atomic"}, - "oxdna2/dh":{"units": "unknown", "atom_style": "atomic"}, - "oxrna2/excv":{"units": "unknown", "atom_style": "atomic"}, - "oxrna2/stk":{"units": "unknown", "atom_style": "atomic"}, - "oxrna2/hbond":{"units": "unknown", "atom_style": "atomic"}, - "oxrna2/xstk":{"units": "unknown", "atom_style": "atomic"}, - "oxrna2/coaxstk":{"units": "unknown", "atom_style": "atomic"}, - "oxrna2/dh":{"units": "unknown", "atom_style": "atomic"}, - "pace":{"units": "unknown", "atom_style": "atomic"}, - "peri/pmb":{"units": "unknown", "atom_style": "atomic"}, - "peri/lps":{"units": "unknown", "atom_style": "atomic"}, - "peri/ves":{"units": "unknown", "atom_style": "atomic"}, - "peri/eps":{"units": "unknown", "atom_style": "atomic"}, - "polymorphic":{"units": "unknown", "atom_style": "atomic"}, - "python":{"units": "unknown", "atom_style": "atomic"}, - "quip":{"units": "unknown", "atom_style": "atomic"}, - "rann":{"units": "unknown", "atom_style": "atomic"}, - "reaxff":{"units": "real", "atom_style": "charge"}, - "resquared":{"units": "unknown", "atom_style": "atomic"}, - "lj/sdk":{"units": "metal", "atom_style": "atomic"}, - "lj/sdk/coul/long":{"units": "metal", "atom_style": "atomic"}, - "lj/sdk/coul/msm":{"units": "metal", "atom_style": "atomic"}, - "sdpd/taitwater/isothermal":{"units": "unknown", "atom_style": "atomic"}, - "smd/hertz":{"units": "unknown", "atom_style": "atomic"}, - "smd/tlsph":{"units": "unknown", "atom_style": "atomic"}, - "smd/tri_surface":{"units": "unknown", "atom_style": "atomic"}, - "smd/ulsph":{"units": "unknown", "atom_style": "atomic"}, - "smtbq":{"units": "unknown", "atom_style": "atomic"}, - "snap":{"units": "unknown", "atom_style": "atomic"}, - "soft":{"units": "unknown", "atom_style": "atomic"}, - "sph/heatconduction":{"units": "unknown", "atom_style": "atomic"}, - "sph/idealgas":{"units": "unknown", "atom_style": "atomic"}, - "sph/lj":{"units": "unknown", "atom_style": "atomic"}, - "sph/rhosum":{"units": "unknown", "atom_style": "atomic"}, - "sph/taitwater":{"units": "unknown", "atom_style": "atomic"}, - "sph/taitwater/morris":{"units": "unknown", "atom_style": "atomic"}, - "spin/dipole/cut":{"units": "unknown", "atom_style": "atomic"}, - "spin/dipole/long":{"units": "unknown", "atom_style": "atomic"}, - "spin/dmi":{"units": "unknown", "atom_style": "atomic"}, - "spin/exchange":{"units": "unknown", "atom_style": "atomic"}, - "spin/exchange/biquadratic":{"units": "unknown", "atom_style": "atomic"}, - "spin/magelec":{"units": "unknown", "atom_style": "atomic"}, - "spin/neel":{"units": "unknown", "atom_style": "atomic"}, - "srp":{"units": "unknown", "atom_style": "atomic"}, - "sw":{"units": "unknown", "atom_style": "atomic"}, - "table":{"units": "unknown", "atom_style": "atomic"}, - "table/rx":{"units": "unknown", "atom_style": "atomic"}, - "tersoff":{"units": "metal", "atom_style": "atomic"}, - "tersoff/table":{"units": "metal", "atom_style": "atomic"}, - "tersoff/mod":{"units": "metal", "atom_style": "atomic"}, - "tersoff/mod/c":{"units": "metal", "atom_style": "atomic"}, - "tersoff/zbl":{"units": "metal", "atom_style": "atomic"}, - "thole":{"units": "unknown", "atom_style": "atomic"}, - "lj/cut/thole/long":{"units": "metal", "atom_style": "atomic"}, - "tracker":{"units": "unknown", "atom_style": "atomic"}, - "tri/lj":{"units": "unknown", "atom_style": "atomic"}, - "ufm":{"units": "unknown", "atom_style": "atomic"}, - "vashishta":{"units": "unknown", "atom_style": "atomic"}, - "vashishta/table":{"units": "unknown", "atom_style": "atomic"}, - "wf/cut":{"units": "unknown", "atom_style": "atomic"}, - "yukawa":{"units": "unknown", "atom_style": "atomic"}, - "yukawa/colloid":{"units": "unknown", "atom_style": "atomic"}, - "zbl":{"units": "unknown", "atom_style": "atomic"}, - "zero":{"units": "unknown", "atom_style": "atomic"} + "adp":{"units": "unknown", "atom_style": "atomic", "read_from_file": true}, + "agni":{"units": "unknown", "atom_style": "atomic", "read_from_file": true}, + "airebo":{"units": "unknown", "atom_style": "atomic", "read_from_file": true}, + "airebo/morse":{"units": "unknown", "atom_style": "atomic", "read_from_file": true}, + "rebo":{"units": "unknown", "atom_style": "atomic", "read_from_file": true}, + "atm":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "awpmd/cut":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "beck":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "body/nparticle":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "body/rounded/polygon":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "body/rounded/polyhedron":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "bop":{"units": "unknown", "atom_style": "atomic", "read_from_file": true}, + "born":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "born/coul/long":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "born/coul/msm":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "born/coul/wolf":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "born/coul/dsf":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "brownian":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "brownian/poly":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "buck":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "buck/coul/cut":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "buck/coul/long":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "buck/coul/msm":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "buck6d/coul/gauss/dsf":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "buck6d/coul/gauss/long":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "buck/long/coul/long":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "lj/charmm/coul/charmm":{"units": "metal", "atom_style": "atomic", "read_from_file": false}, + "lj/charmm/coul/charmm/implicit":{"units": "metal", "atom_style": "atomic", "read_from_file": false}, + "lj/charmm/coul/long":{"units": "metal", "atom_style": "atomic", "read_from_file": false}, + "lj/charmm/coul/msm":{"units": "metal", "atom_style": "atomic", "read_from_file": false}, + "lj/charmmfsw/coul/charmmfsh":{"units": "metal", "atom_style": "atomic", "read_from_file": false}, + "lj/charmmfsw/coul/long":{"units": "metal", "atom_style": "atomic", "read_from_file": false}, + "lj/class2":{"units": "metal", "atom_style": "atomic", "read_from_file": false}, + "lj/class2/coul/cut":{"units": "metal", "atom_style": "atomic", "read_from_file": false}, + "lj/class2/coul/long":{"units": "metal", "atom_style": "atomic", "read_from_file": false}, + "colloid":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "comb":{"units": "unknown", "atom_style": "atomic", "read_from_file": true}, + "comb3":{"units": "unknown", "atom_style": "atomic", "read_from_file": true}, + "cosine/squared":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "coul/cut":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "coul/debye":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "coul/dsf":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "coul/exclude":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "coul/cut/global":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "coul/long":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "coul/msm":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "coul/streitz":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "coul/wolf":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "tip4p/cut":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "tip4p/long":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "coul/diel":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "coul/shield":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "coul/slater":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "coul/slater/cut":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "coul/slater/long":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "coul/tt":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "born/coul/dsf/cs":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "born/coul/long/cs":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "born/coul/wolf/cs":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "buck/coul/long/cs":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "coul/long/cs":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "coul/wolf/cs":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "lj/cut/coul/long/cs":{"units": "metal", "atom_style": "atomic", "read_from_file": false}, + "lj/class2/coul/long/cs":{"units": "metal", "atom_style": "atomic", "read_from_file": false}, + "coul/cut/dielectric":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "coul/long/dielectric":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "lj/cut/coul/cut/dielectric":{"units": "metal", "atom_style": "atomic", "read_from_file": false}, + "lj/cut/coul/debye/dielectric":{"units": "metal", "atom_style": "atomic", "read_from_file": false}, + "lj/cut/coul/long/dielectric":{"units": "metal", "atom_style": "atomic", "read_from_file": false}, + "lj/cut/coul/msm/dielectric":{"units": "metal", "atom_style": "atomic", "read_from_file": false}, + "lj/long/coul/long/dielectric":{"units": "metal", "atom_style": "atomic", "read_from_file": false}, + "lj/cut/dipole/cut":{"units": "metal", "atom_style": "atomic", "read_from_file": false}, + "lj/sf/dipole/sf":{"units": "metal", "atom_style": "atomic", "read_from_file": false}, + "lj/cut/dipole/long":{"units": "metal", "atom_style": "atomic", "read_from_file": false}, + "lj/long/dipole/long":{"units": "metal", "atom_style": "atomic", "read_from_file": false}, + "dpd":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "dpd/tstat":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "dpd/ext":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "dpd/ext/tstat":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "dpd/fdt":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "dpd/fdt/energy":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "drip":{"units": "unknown", "atom_style": "atomic", "read_from_file": true}, + "dsmc":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "e3b":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "eam":{"units": "metal", "atom_style": "atomic", "read_from_file": true}, + "eam/alloy":{"units": "metal", "atom_style": "atomic", "read_from_file": true}, + "eam/cd":{"units": "metal", "atom_style": "atomic", "read_from_file": true}, + "eam/cd/old":{"units": "metal", "atom_style": "atomic", "read_from_file": true}, + "eam/fs":{"units": "metal", "atom_style": "atomic", "read_from_file": true}, + "eam/he":{"units": "metal", "atom_style": "atomic", "read_from_file": true}, + "edip":{"units": "unknown", "atom_style": "atomic", "read_from_file": true}, + "edip/multi":{"units": "unknown", "atom_style": "atomic", "read_from_file": true}, + "eff/cut":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "eim":{"units": "unknown", "atom_style": "atomic", "read_from_file": true}, + "exp6/rx":{"units": "unknown", "atom_style": "atomic", "read_from_file": true}, + "extep":{"units": "unknown", "atom_style": "atomic", "read_from_file": true}, + "lj/cut/soft":{"units": "metal", "atom_style": "atomic", "read_from_file": false}, + "lj/cut/coul/cut/soft":{"units": "metal", "atom_style": "atomic", "read_from_file": false}, + "lj/cut/coul/long/soft":{"units": "metal", "atom_style": "atomic", "read_from_file": false}, + "lj/cut/tip4p/long/soft":{"units": "metal", "atom_style": "atomic", "read_from_file": false}, + "lj/charmm/coul/long/soft":{"units": "metal", "atom_style": "atomic", "read_from_file": false}, + "lj/class2/soft":{"units": "metal", "atom_style": "atomic", "read_from_file": false}, + "lj/class2/coul/cut/soft":{"units": "metal", "atom_style": "atomic", "read_from_file": false}, + "lj/class2/coul/long/soft":{"units": "metal", "atom_style": "atomic", "read_from_file": false}, + "coul/cut/soft":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "coul/long/soft":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "tip4p/long/soft":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "morse/soft":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "gauss":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "gauss/cut":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "gayberne":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "gran/hooke":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "gran/hooke/history":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "gran/hertz/history":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "granular":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "lj/gromacs":{"units": "metal", "atom_style": "atomic", "read_from_file": false}, + "lj/gromacs/coul/gromacs":{"units": "metal", "atom_style": "atomic", "read_from_file": false}, + "gw":{"units": "unknown", "atom_style": "atomic", "read_from_file": true}, + "gw/zbl":{"units": "unknown", "atom_style": "atomic", "read_from_file": true}, + "hbond/dreiding/lj":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "hbond/dreiding/morse":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "hdnnp":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "hybrid":{"units": "unknown", "atom_style": "atomic", "read_from_file": true}, + "hybrid/overlay":{"units": "unknown", "atom_style": "atomic", "read_from_file": true}, + "hybrid/scaled":{"units": "unknown", "atom_style": "atomic", "read_from_file": true}, + "ilp/graphene/hbn":{"units": "unknown", "atom_style": "atomic", "read_from_file": true}, + "kim":{"units": "unknown", "atom_style": "atomic", "read_from_file": true}, + "kolmogorov/crespi/full":{"units": "unknown", "atom_style": "atomic", "read_from_file": true}, + "kolmogorov/crespi/z":{"units": "unknown", "atom_style": "atomic", "read_from_file": true}, + "lcbop":{"units": "unknown", "atom_style": "atomic", "read_from_file": true}, + "lebedeva/z":{"units": "unknown", "atom_style": "atomic", "read_from_file": true}, + "line/lj":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "list":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "lj/cut":{"units": "metal", "atom_style": "atomic", "read_from_file": false}, + "lj96/cut":{"units": "metal", "atom_style": "atomic", "read_from_file": false}, + "lj/cubic":{"units": "metal", "atom_style": "atomic", "read_from_file": false}, + "lj/cut/coul/cut":{"units": "metal", "atom_style": "atomic", "read_from_file": false}, + "lj/cut/coul/debye":{"units": "metal", "atom_style": "atomic", "read_from_file": false}, + "lj/cut/coul/dsf":{"units": "metal", "atom_style": "atomic", "read_from_file": false}, + "lj/cut/coul/long":{"units": "metal", "atom_style": "atomic", "read_from_file": false}, + "lj/cut/coul/msm":{"units": "metal", "atom_style": "atomic", "read_from_file": false}, + "lj/cut/coul/wolf":{"units": "metal", "atom_style": "atomic", "read_from_file": false}, + "lj/cut/tip4p/cut":{"units": "metal", "atom_style": "atomic", "read_from_file": false}, + "lj/cut/tip4p/long":{"units": "metal", "atom_style": "atomic", "read_from_file": false}, + "lj/expand":{"units": "metal", "atom_style": "atomic", "read_from_file": false}, + "lj/expand/coul/long":{"units": "metal", "atom_style": "atomic", "read_from_file": false}, + "lj/long/coul/long":{"units": "metal", "atom_style": "atomic", "read_from_file": false}, + "lj/long/tip4p/long":{"units": "metal", "atom_style": "atomic", "read_from_file": false}, + "lj/relres":{"units": "metal", "atom_style": "atomic", "read_from_file": false}, + "lj/smooth":{"units": "metal", "atom_style": "atomic", "read_from_file": false}, + "lj/smooth/linear":{"units": "metal", "atom_style": "atomic", "read_from_file": false}, + "lj/switch3/coulgauss/long":{"units": "metal", "atom_style": "atomic", "read_from_file": false}, + "mm3/switch3/coulgauss/long":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "local/density":{"units": "unknown", "atom_style": "atomic", "read_from_file": true}, + "lubricate":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "lubricate/poly":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "lubricateU":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "lubricateU/poly":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "lj/mdf":{"units": "metal", "atom_style": "atomic", "read_from_file": false}, + "buck/mdf":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "lennard/mdf":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "meam":{"units": "unknown", "atom_style": "atomic", "read_from_file": true}, + "meam/spline":{"units": "unknown", "atom_style": "atomic", "read_from_file": true}, + "meam/sw/spline":{"units": "unknown", "atom_style": "atomic", "read_from_file": true}, + "mesocnt":{"units": "unknown", "atom_style": "atomic", "read_from_file": true}, + "edpd":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "mdpd":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "mdpd/rhosum":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "tdpd":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "mesont/tpm":{"units": "unknown", "atom_style": "atomic", "read_from_file": true}, + "mgpt":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "mie/cut":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "mliap":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "momb":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "morse":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "morse/smooth/linear":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "multi/lucy":{"units": "unknown", "atom_style": "atomic", "read_from_file": true}, + "multi/lucy/rx":{"units": "unknown", "atom_style": "atomic", "read_from_file": true}, + "nb3b/harmonic":{"units": "unknown", "atom_style": "atomic", "read_from_file": true}, + "nm/cut":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "nm/cut/coul/cut":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "nm/cut/coul/long":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "none":{"units": "unknown", "atom_style": "atomic", "read_from_file": true}, + "oxdna/excv":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "oxdna/stk":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "oxdna/hbond":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "oxdna/xstk":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "oxdna/coaxstk":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "oxdna2/excv":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "oxdna2/stk":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "oxdna2/hbond":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "oxdna2/xstk":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "oxdna2/coaxstk":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "oxdna2/dh":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "oxrna2/excv":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "oxrna2/stk":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "oxrna2/hbond":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "oxrna2/xstk":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "oxrna2/coaxstk":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "oxrna2/dh":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "pace":{"units": "unknown", "atom_style": "atomic", "read_from_file": true}, + "peri/pmb":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "peri/lps":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "peri/ves":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "peri/eps":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "polymorphic":{"units": "unknown", "atom_style": "atomic", "read_from_file": true}, + "python":{"units": "unknown", "atom_style": "atomic", "read_from_file": true}, + "quip":{"units": "unknown", "atom_style": "atomic", "read_from_file": true}, + "rann":{"units": "unknown", "atom_style": "atomic", "read_from_file": true}, + "reaxff":{"units": "real", "atom_style": "charge", "read_from_file": true}, + "resquared":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "lj/sdk":{"units": "metal", "atom_style": "atomic", "read_from_file": false}, + "lj/sdk/coul/long":{"units": "metal", "atom_style": "atomic", "read_from_file": false}, + "lj/sdk/coul/msm":{"units": "metal", "atom_style": "atomic", "read_from_file": false}, + "sdpd/taitwater/isothermal":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "smd/hertz":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "smd/tlsph":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "smd/tri_surface":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "smd/ulsph":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "smtbq":{"units": "unknown", "atom_style": "atomic", "read_from_file": true}, + "snap":{"units": "unknown", "atom_style": "atomic", "read_from_file": true}, + "soft":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "sph/heatconduction":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "sph/idealgas":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "sph/lj":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "sph/rhosum":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "sph/taitwater":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "sph/taitwater/morris":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "spin/dipole/cut":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "spin/dipole/long":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "spin/dmi":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "spin/exchange":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "spin/exchange/biquadratic":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "spin/magelec":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "spin/neel":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "srp":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "sw":{"units": "unknown", "atom_style": "atomic", "read_from_file": true}, + "table":{"units": "unknown", "atom_style": "atomic", "read_from_file": true}, + "table/rx":{"units": "unknown", "atom_style": "atomic", "read_from_file": true}, + "tersoff":{"units": "metal", "atom_style": "atomic", "read_from_file": true}, + "tersoff/table":{"units": "metal", "atom_style": "atomic", "read_from_file": true}, + "tersoff/mod":{"units": "metal", "atom_style": "atomic", "read_from_file": true}, + "tersoff/mod/c":{"units": "metal", "atom_style": "atomic", "read_from_file": true}, + "tersoff/zbl":{"units": "metal", "atom_style": "atomic", "read_from_file": true}, + "thole":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "lj/cut/thole/long":{"units": "metal", "atom_style": "atomic", "read_from_file": false}, + "tracker":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "tri/lj":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "ufm":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "vashishta":{"units": "unknown", "atom_style": "atomic", "read_from_file": true}, + "vashishta/table":{"units": "unknown", "atom_style": "atomic", "read_from_file": true}, + "wf/cut":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "yukawa":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "yukawa/colloid":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "zbl":{"units": "unknown", "atom_style": "atomic", "read_from_file": false}, + "zero":{"units": "unknown", "atom_style": "atomic", "read_from_file": false} } } From a3dfff89e54dc4fc755505ec2ce124038d7cffb2 Mon Sep 17 00:00:00 2001 From: Jonathan Chico Date: Tue, 23 Nov 2021 10:52:55 +0100 Subject: [PATCH 14/70] (WIP) Improving the potential storage. Changes to ensure that the potential can be created via the get_or_create method. Improvement of docstrings. Adding any missing dosctrings. --- aiida_lammps/data/lammps_potential.py | 194 ++++++++++++++++---------- 1 file changed, 121 insertions(+), 73 deletions(-) diff --git a/aiida_lammps/data/lammps_potential.py b/aiida_lammps/data/lammps_potential.py index 1527736..7a078b2 100644 --- a/aiida_lammps/data/lammps_potential.py +++ b/aiida_lammps/data/lammps_potential.py @@ -1,13 +1,24 @@ """ -[summary] - -[extended_summary] +Base class for the LAMMPS potentials. + +This class allows the storage/recovering of LAMMPS potentials, it allows +one to store any LAMMPS potential as a ``SinglefileData`` object, which can +then be either written to the LAMMPS input script and/or to a file, where +it can be easily read by LAMMPS. This distinction depends on the assigned +``pair_style`` which require different ``pair_coeff`` entries in the input +file. + +Based on the +`pseudo `_ +class written by Sebaastian Huber. """ +# pylint: disable=arguments-differ, too-many-public-methods import io import os import pathlib import typing import json +import datetime from aiida import orm from aiida import plugins @@ -16,28 +27,22 @@ from aiida.common.files import md5_from_filelike -class LammpsPotentialData(orm.SinglefileData): - """ - [summary] - - [extended_summary] - - :param orm: [description] - :type orm: [type] - :raises TypeError: [description] - :raises ValueError: [description] - :raises TypeError: [description] - :raises KeyError: [description] - :raises TypeError: [description] - :raises ValueError: [description] - :raises ValueError: [description] - :raises ValueError: [description] - :raises ValueError: [description] - :raises ValueError: [description] - :raises StoringNotAllowed: [description] - :return: [description] - :rtype: [type] +class LammpsPotentialData(orm.SinglefileData): # pylint: disable=too-many-arguments, too-many-ancestors """ + Base class for the LAMMPS potentials. + + This class allows the storage/recovering of LAMMPS potentials, it allows + one to store any LAMMPS potential as a ``SinglefileData`` object, which can + then be either written to the LAMMPS input script and/or to a file, where + it can be easily read by LAMMPS. This distinction depends on the assigned + ``pair_style`` which require different ``pair_coeff`` entries in the input + file. + + Based on the + `pseudo `_ + class written by Sebaastian Huber. + """ # pylint: disable=line-too-long + _key_element = 'element' _key_md5 = 'md5' @@ -61,19 +66,19 @@ class LammpsPotentialData(orm.SinglefileData): 'type': str }, 'developer': { - 'type': str + 'type': (str, list) }, 'disclaimer': { 'type': str }, 'properties': { - 'type': str + 'type': (str, list) }, 'publication_year': { - 'type': str + 'type': (str, datetime.datetime, int) }, 'source_citations': { - 'type': str + 'type': (str, list) }, 'title': { 'type': str @@ -95,13 +100,31 @@ def get_or_create( atom_style: str = None, units: str = None, extra_tags: dict = None, - ): - """Get lammps potential data node from database with matching md5 checksum or create a new one if not existent. - :param source: the source potential content, either a binary stream, or a ``str`` or ``Path`` to the path - of the file on disk, which can be relative or absolute. + ): # pylint: disable=too-many-arguments + """Get lammps potential data node from database or create a new one. + + This will check if there is a potential data node with matching md5 + checksum and use that or create a new one if not existent. + + :param source: the source potential content, either a binary stream, + or a ``str`` or ``Path`` to the path of the file on disk, + which can be relative or absolute. :param filename: optional explicit filename to give to the file stored in the repository. - :return: instance of ``LammpsPotentialData``, stored if taken from database, unstored otherwise. - :raises TypeError: if the source is not a ``str``, ``pathlib.Path`` instance or binary stream. + :param pair_style: Type of potential according to LAMMPS + :type pair_style: str + :param species: Species that can be used for this potential. + :type species: list + :param atom_style: Type of treatment of the atoms according to LAMMPS. + :type atom_style: str + :param units: Default units to be used with this potential. + :type units: str + :param extra_tags: Dictionary with extra information to tag the + potential, based on the KIM schema. + :type extra_tags: dict + :return: instance of ``LammpsPotentialData``, stored if taken from + database, unstored otherwise. + :raises TypeError: if the source is not a ``str``, ``pathlib.Path`` + instance or binary stream. :raises FileNotFoundError: if the source is a filepath but does not exist. """ source = cls.prepare_source(source) @@ -118,16 +141,13 @@ def get_or_create( if existing: potential = existing[0] else: + cls.pair_style = pair_style + cls.species = species + cls.atom_style = atom_style + cls.units = units + cls.extra_tags = extra_tags source.seek(0) - potential = cls( - source, - filename, - pair_style, - species, - atom_style, - units, - extra_tags, - ) + potential = cls(source, filename) return potential @@ -144,9 +164,10 @@ def get_entry_point_name(cls): @staticmethod def is_readable_byte_stream(stream) -> bool: - """Return whether an object appears to be a readable filelike object in binary mode or stream of bytes. + """Return if object is a readable filelike object in binary mode or stream of bytes. :param stream: the object to analyse. - :returns: True if ``stream`` appears to be a readable filelike object in binary mode, False otherwise. + :returns: True if ``stream`` appears to be a readable filelike object + in binary mode, False otherwise. """ return (isinstance(stream, io.BytesIO) or (hasattr(stream, 'read') and hasattr(stream, 'mode') @@ -157,16 +178,18 @@ def prepare_source( cls, source: typing.Union[str, pathlib.Path, typing.BinaryIO] ) -> typing.BinaryIO: """Validate the ``source`` representing a file on disk or a byte stream. - .. note:: if the ``source`` is a valid file on disk, its content is read and returned as a stream of bytes. - :raises TypeError: if the source is not a ``str``, ``pathlib.Path`` instance or binary stream. + .. note:: if the ``source`` is a valid file on disk, its content is + read and returned as a stream of bytes. + :raises TypeError: if the source is not a ``str``, ``pathlib.Path`` + instance or binary stream. :raises FileNotFoundError: if the source is a filepath but does not exist. """ if not isinstance( source, (str, pathlib.Path)) and not cls.is_readable_byte_stream(source): raise TypeError( - f'`source` should be a `str` or `pathlib.Path` filepath on disk or a stream of bytes, got: {source}' - ) + '`source` should be a `str` or `pathlib.Path` filepath on ' + + f'disk or a stream of bytes, got: {source}') if isinstance(source, (str, pathlib.Path)): filename = pathlib.Path(source).name @@ -281,7 +304,6 @@ def validate_extra_tags(self, extra_tags: dict): correspond to the ones accepted by the class. It will also check that the type of the entries are of the appropriate python type. If the entries can take only a subset of values they are checked against them. - :param extra_tags: dictionary with the extra tags that can be used to tag the potential :type extra_tags: dict :raises ValueError: If the type of the entry does not matches the expected @@ -292,9 +314,11 @@ def validate_extra_tags(self, extra_tags: dict): _types = value.get('type', None) _values = value.get('values', None) if _value is not None: - if isinstance(_value, _types): - raise ValueError(f'Tag "{key}" is not of type "{_types}"') - if _values is not None and _value in _values: + if not isinstance(_value, _types): + raise ValueError( + f'Tag "{key}" with value "{_value}" is not of type "{_types}"' + ) + if _values is not None and _value not in _values: raise ValueError( f'Tag "{key}" is not in the accepted values "{_values}"' ) @@ -307,20 +331,27 @@ def set_file( species: list = None, atom_style: str = None, units: str = None, - extras_tags: dict = None, + extra_tags: dict = None, **kwargs, - ): + ): # pylint: disable=too-many-arguments """Set the file content. - .. note:: this method will first analyse the type of the ``source`` and if it is a filepath will convert it - to a binary stream of the content located at that filepath, which is then passed on to the superclass. This - needs to be done first, because it will properly set the file and filename attributes that are expected by - other methods. Straight after the superclass call, the source seeker needs to be reset to zero if it needs - to be read again, because the superclass most likely will have read the stream to the end. Finally it is - important that the ``prepare_source`` is called here before the superclass invocation, because this way the - conversion from filepath to byte stream will be performed only once. Otherwise, each subclass would perform - the conversion over and over again. - :param source: the source lammps potential content, either a binary stream, or a ``str`` or ``Path`` to the path - of the file on disk, which can be relative or absolute. + + .. note:: this method will first analyse the type of the ``source`` + and if it is a filepath will convert it to a binary stream of the + content located at that filepath, which is then passed on to the + superclass. This needs to be done first, because it will properly + set the file and filename attributes that are expected by other + methods. Straight after the superclass call, the source seeker + needs to be reset to zero if it needs to be read again, because the + superclass most likely will have read the stream to the end. + Finally it is important that the ``prepare_source`` is called here + before the superclass invocation, because this way the conversion + from filepath to byte stream will be performed only once. + Otherwise, each subclass would perform the conversion over and over again. + + :param source: the source lammps potential content, either a binary + stream, or a ``str`` or ``Path`` to the path of the file on disk, + which can be relative or absolute. :type source: typing.Union[str, pathlib.Path, typing.BinaryIO] :param filename: optional explicit filename to give to the file stored in the repository. :type filename: str @@ -332,22 +363,39 @@ def set_file( :type atom_style: str :param units: Default units to be used with this potential. :type unite: str - :param extra_tags: Dictionary with extra information to tag the potential, based on the KIM schema. + :param extra_tags: Dictionary with extra information to tag the + potential, based on the KIM schema. :type extra_tags: dict - :raises TypeError: if the source is not a ``str``, ``pathlib.Path`` instance or binary stream. + + :raises TypeError: if the source is not a ``str``, ``pathlib.Path`` + instance or binary stream. :raises FileNotFoundError: if the source is a filepath but does not exist. """ source = self.prepare_source(source) + + if self.pair_style is not None and pair_style is None: + pair_style = self.pair_style + if self.species is not None and species is None: + species = self.species + if self.atom_style is not None and atom_style is None: + atom_style = self.atom_style + if self.units is not None and units is None: + units = self.units + if self.extra_tags is not None and extra_tags is None: + extra_tags = self.extra_tags + self.validate_pair_style(pair_style=pair_style) self.validate_species(species=species) self.validate_atom_style(atom_style=atom_style, pair_style=pair_style) self.validate_units(units=units, pair_style=pair_style) - if extras_tags is None: - extras_tags = dict() - if extras_tags is not None: - self.validate_extra_tags(extra_tags=extras_tags) - for key in self._extra_keys.keys(): - self.set_attribute(key, extras_tags.get(key, None)) + + if extra_tags is None: + extra_tags = dict() + if extra_tags is not None: + self.validate_extra_tags(extra_tags=extra_tags) + for key in self._extra_keys: + self.set_attribute(key, extra_tags.get(key, None)) + super().set_file(source, filename, **kwargs) source.seek(0) self.md5 = md5_from_filelike(source) From d04660f99ff5037cb90f04a1e7fe93dc58af07a0 Mon Sep 17 00:00:00 2001 From: Jonathan Chico Date: Tue, 23 Nov 2021 12:48:34 +0100 Subject: [PATCH 15/70] (WIP) improving the generation of the input file. Added the control, potential, and structure to the validation schema. Several minor format changes. --- aiida_lammps/common/generate_input_files.py | 13 ++- aiida_lammps/common/input_generator.py | 38 ++++---- aiida_lammps/common/parse_trajectory.py | 16 ++-- aiida_lammps/common/utils.py | 5 +- .../validation/schemas/lammps_schema.json | 90 ++++++++++++++++++- 5 files changed, 122 insertions(+), 40 deletions(-) diff --git a/aiida_lammps/common/generate_input_files.py b/aiida_lammps/common/generate_input_files.py index b68d615..7e00334 100644 --- a/aiida_lammps/common/generate_input_files.py +++ b/aiida_lammps/common/generate_input_files.py @@ -34,16 +34,13 @@ def get_trajectory_txt(trajectory): lammps_data_file = '' for i, position_step in enumerate(trajectory.get_positions()): lammps_data_file += 'ITEM: TIMESTEP\n' - lammps_data_file += '{}\n'.format(ind[i]) + lammps_data_file += f'{ind[i]}\n' lammps_data_file += 'ITEM: NUMBER OF ATOMS\n' - lammps_data_file += '{}\n'.format(len(position_step)) + lammps_data_file += f'{len(position_step)}\n' lammps_data_file += 'ITEM: BOX BOUNDS xy xz yz pp pp pp\n' - lammps_data_file += '{0:20.10f} {1:20.10f} {2:20.10f}\n'.format( - xlo_bound, xhi_bound, xy) - lammps_data_file += '{0:20.10f} {1:20.10f} {2:20.10f}\n'.format( - ylo_bound, yhi_bound, xz) - lammps_data_file += '{0:20.10f} {1:20.10f} {2:20.10f}\n'.format( - zlo_bound, zhi_bound, yz) + lammps_data_file += f'{xlo_bound:20.10f} {xhi_bound:20.10f} {xy:20.10f}\n' + lammps_data_file += f'{ylo_bound:20.10f} {yhi_bound:20.10f} {yz:20.10f}\n' + lammps_data_file += f'{zlo_bound:20.10f} {zhi_bound:20.10f} {yz:20.10f}\n' lammps_data_file += 'ITEM: ATOMS x y z\n' for position in position_step: lammps_data_file += '{0:20.10f} {1:20.10f} {2:20.10f}\n'.format( diff --git a/aiida_lammps/common/input_generator.py b/aiida_lammps/common/input_generator.py index d456356..4f8eb7a 100644 --- a/aiida_lammps/common/input_generator.py +++ b/aiida_lammps/common/input_generator.py @@ -75,7 +75,7 @@ def write_potential_block( :param potential_file: filename for the potential to be used. :type str: :return: block with the information needed to setup the potential part of - the LAMMPS calculation. + the LAMMPS calculation. :rtype: str """ @@ -85,17 +85,17 @@ def write_potential_block( potential_block = '# ---- Start of Potential information ----\n' potential_block += f'pair_style {potential.pair_style}' - potential_block += f' {" ".join(parameters_potential.get("potential_style_options", ""))}\n' + potential_block += f' {" ".join(parameters_potential.get("potential_style_options", [""]))}\n' if default_potential[potential.pair_style].get('read_from_file'): potential_block += f'pair_coeff * * {potential_file} {" ".join(kind_symbols)}\n' if not default_potential[potential.pair_style].get('read_from_file'): potential_block += f'pair_coeff {potential.get_content()}\n' - if 'neighbor_update' in parameters_potential: - potential_block += f'neighbor {join_keywords(parameters_potential["neighbor_update"])}\n' - if 'neigh_modify' in parameters_potential: - potential_block += f'neigh_modify {(parameters_potential["neigh_modify"])}\n' + if 'neighbor' in parameters_potential: + potential_block += f'neighbor {join_keywords(parameters_potential["neighbor"])}\n' + if 'neighbor_modify' in parameters_potential: + potential_block += f'neigh_modify {(parameters_potential["neighbor_modify"])}\n' potential_block += '# ---- End of Potential information ----\n' return potential_block @@ -114,12 +114,12 @@ def write_structure_block( be used for different compute and/or fixes operations. :param parameters_structure: set of user defined parameters relating to the - structure. + structure. :type parameters_structure: dict :param structure: structure that will be studied :type structure: orm.StructureData :param structure_filename: name of the file where the structure will be - written so that LAMMPS can read it + written so that LAMMPS can read it :type structure_filename: str :return: block with the structural information and list of groups present :rtype: Union[str, list] @@ -168,7 +168,7 @@ def write_minimize_block(parameters_minimize: dict) -> str: If the user wishes to do a minimization calculation the parameters will be passed to this routine and the necessary block for the input file will be generated. - .. note: this mode is mutually exclusive with the md mode. + .. note:: this mode is mutually exclusive with the md mode. :param parameters_minimize: user defined parameters for the minimization :type parameters_minimize: dict @@ -194,11 +194,11 @@ def write_md_block(parameters_md: dict) -> str: If the user wishes to perform an MD run this will take the user defined parameters and set them in a LAMMPS compliant form. - .. note: For MD to function an integrator must be provided, this is done - by providing a fix in the fix part of the input. The existence of at least one - integrator is checked by the schema. + .. note:: For MD to function an integrator must be provided, this is done + by providing a fix in the fix part of the input. The existence of at least one + integrator is checked by the schema. - .. note: this mode is mutually exclusive with the minimize mode. + .. note:: this mode is mutually exclusive with the minimize mode. :param parameters_md: user defined parameters for the MD run :type parameters_md: dict @@ -231,16 +231,16 @@ def write_fix_block( selected by the user and are checked to exist with the previously defined groups in the structure setup. - ..note: fixes which are incompatible with the minimize option are checked by - the validation schema. + .. note:: fixes which are incompatible with the minimize option are checked by + the validation schema. - ..note: the md mode required one of the integrators (nve, nvt, etc) to be defined - their existence is checked by the schema. + .. note:: the md mode required one of the integrators (nve, nvt, etc) to be defined + their existence is checked by the schema. :param parameters_fix: fixes that will be applied to the calculation :type parameters_fix: dict :param group_names: list of groups names as defined during structure - generation, defaults to None + generation, defaults to None :type group_names: list, optional :return: block with the fixes information :rtype: str @@ -275,7 +275,7 @@ def write_compute_block( :param parameters_compute: computes that will be applied to the calculation :type parameters_compute: dict :param group_names: list of groups names as defined during structure - generation, defaults to None + generation, defaults to None :type group_names: list, optional :return: block with the computes information :rtype: str diff --git a/aiida_lammps/common/parse_trajectory.py b/aiida_lammps/common/parse_trajectory.py index 49cd37f..329751c 100644 --- a/aiida_lammps/common/parse_trajectory.py +++ b/aiida_lammps/common/parse_trajectory.py @@ -23,19 +23,18 @@ def iter_step_lines(file_obj): yield init_line, step_content -def parse_step(lines, intial_line=0): +def parse_step(lines, initial_line=0): if 'ITEM: TIMESTEP' not in lines[0]: - raise IOError('expected line {} to be TIMESTEP'.format(intial_line)) + raise IOError(f'expected line {initial_line} to be TIMESTEP') if 'ITEM: NUMBER OF ATOMS' not in lines[2]: raise IOError( - 'expected line {} to be NUMBER OF ATOMS'.format(intial_line + 2)) + f'expected line {initial_line + 2} to be NUMBER OF ATOMS') if 'ITEM: BOX BOUNDS xy xz yz' not in lines[4]: raise IOError( - 'expected line {} to be BOX BOUNDS xy xz yz'.format(intial_line + - 4)) + f'expected line {initial_line + 4} to be BOX BOUNDS xy xz yz') # TODO handle case when xy xz yz not present -> orthogonal box if 'ITEM: ATOMS' not in lines[8]: - raise IOError('expected line {} to be ATOMS'.format(intial_line + 8)) + raise IOError(f'expected line {initial_line + 8} to be ATOMS') timestep = int(lines[1]) number_of_atoms = int(lines[3]) @@ -98,8 +97,7 @@ def create_structure( ] if symbols != kind_symbols: raise ValueError( - 'original_structure has different symbols:: {} != {}'.format( - kind_symbols, symbols)) + f'original_structure has different symbols:: {kind_symbols} != {symbols}') structure = original_structure.clone() structure.reset_cell(traj_block.cell) structure.reset_sites_positions(positions) @@ -113,7 +111,7 @@ def create_structure( elif pbc == 'ff': pbcs.append(False) else: - raise NotImplementedError('pbc = {}'.format(traj_block.pbc)) + raise NotImplementedError(f'pbc = {traj_block.pbc}') structure = StructureData(cell=traj_block.cell, pbc=pbcs) for symbol, position in zip(symbols, positions): diff --git a/aiida_lammps/common/utils.py b/aiida_lammps/common/utils.py index 823535b..2674f8d 100644 --- a/aiida_lammps/common/utils.py +++ b/aiida_lammps/common/utils.py @@ -36,7 +36,7 @@ def join_keywords(dct, ignore=None): """ ignore = [] if not ignore else ignore return ' '.join([ - '{0} {1}'.format(k, _convert_values(dct[k])) + f'{k} {_convert_values(dct[k])}' for k in sorted(dct.keys()) if k not in ignore ]) @@ -47,8 +47,7 @@ def get_path(dct, path, default=None, raise_error=True): for i, key in enumerate(path): if not isinstance(subdct, dict) or key not in subdct: if raise_error: - raise KeyError('path does not exist in dct: {}'.format( - path[0:i + 1])) + raise KeyError(f'path does not exist in dct: {path[0:i + 1]}') else: return default subdct = subdct[key] diff --git a/aiida_lammps/validation/schemas/lammps_schema.json b/aiida_lammps/validation/schemas/lammps_schema.json index 10c76f2..1f23ab0 100644 --- a/aiida_lammps/validation/schemas/lammps_schema.json +++ b/aiida_lammps/validation/schemas/lammps_schema.json @@ -5,6 +5,9 @@ "type": "object", "propertyNames": { "enum": [ + "control", + "potential", + "structure", "compute", "minimize", "md", @@ -13,6 +16,88 @@ "dump" ] }, + "control": { + "type": "object", + "properties": { + "units": { + "type": "string", + "propertyNames": { + "enum": [ + "si", + "metal", + "lj", + "real", + "cgs", + "electron", + "micro", + "nano" + ] + } + }, + "newton": { + "type": "string", + "propertyNames": { + "enum": ["on", "off"] + } + }, + "processors": { + "type": "string" + }, + "timestep": { + "type": "numeric" + } + } + }, + "potential": { + "type": "object", + "properties": { + "potential_style_options": { + "type": "array" + }, + "neighbor": { + "type": "array" + }, + "neighbor_modify": { + "type": "array" + } + } + }, + "structure": { + "type": "object", + "properties": { + "atom_style": { + "type": "string", + "propertyNames": { + "enum": [ + "angle", + "atomic", + "body", + "bond", + "charge", + "dipole", + "dpd", + "edpd", + "electron", + "ellipsoid", + "full", + "line", + "mdpd", + "molecular", + "oxdna", + "peri", + "smd", + "sph", + "sphere", + "spin", + "tdpd", + "tri", + "template", + "hybrid" + ] + } + } + } + }, "properties": { "compute": { "$ref": "#/definitions/computes" @@ -24,7 +109,10 @@ "type": "string" }, "rspa_options": { - "type": "array" + "type": "array", + "propertyNames": { + "enum": ["verlet", "verlet/split", "respa"] + } }, "max_number_steps": { "type": "integer" From 6391d57309e1d7e049acd2052d585504e8ac4d36 Mon Sep 17 00:00:00 2001 From: Jonathan Chico Date: Tue, 23 Nov 2021 16:23:45 +0100 Subject: [PATCH 16/70] (WIP) Improving the potential. Adding a new tag to the potential, indicating how the potential was generated. Small changes to the format. --- aiida_lammps/calculations/lammps/md.py | 3 +- aiida_lammps/common/input_generator.py | 50 ++++++++------- aiida_lammps/common/parse_trajectory.py | 3 +- aiida_lammps/common/utils.py | 4 +- aiida_lammps/data/lammps_potential.py | 64 +++++++++++++------ .../validation/schemas/lammps_schema.json | 6 ++ 6 files changed, 83 insertions(+), 47 deletions(-) diff --git a/aiida_lammps/calculations/lammps/md.py b/aiida_lammps/calculations/lammps/md.py index b11c88b..3a00310 100644 --- a/aiida_lammps/calculations/lammps/md.py +++ b/aiida_lammps/calculations/lammps/md.py @@ -48,8 +48,7 @@ def create_main_input_content( pdict.get('lammps_version', '11 Aug 2017')) # Geometry Setup - lammps_input_file = 'units {0}\n'.format( - potential_data.default_units) + lammps_input_file = f'units {potential_data.default_units}\n' lammps_input_file += 'boundary p p p\n' lammps_input_file += 'box tilt large\n' lammps_input_file += 'atom_style {0}\n'.format( diff --git a/aiida_lammps/common/input_generator.py b/aiida_lammps/common/input_generator.py index 4f8eb7a..b1441d8 100644 --- a/aiida_lammps/common/input_generator.py +++ b/aiida_lammps/common/input_generator.py @@ -10,6 +10,7 @@ fixes block is never called, on the other hand the control block is always called since it is necessary for the functioning of LAMMPS. """ +from builtins import ValueError import os from typing import Union import json @@ -44,11 +45,11 @@ def write_control_block(parameters_control: dict) -> str: _time = default_timestep[parameters_control.get('units', 'si')] control_block = '# ---- Start of the Control information ----\n' control_block += 'clear\n' - control_block += f"units {parameters_control.get('units', 'si')}\n" - control_block += f"newton {parameters_control.get('newton', 'on')}\n" + control_block += f'units {parameters_control.get("units", "si")}\n' + control_block += f'newton {parameters_control.get("newton", "on")}\n' if 'processors' in parameters_control: - control_block += f"processors {join_keywords(parameters_control['processors'])}\n" - control_block += f"timestep {parameters_control.get('timestep', _time)}\n" + control_block += f'processors {join_keywords(parameters_control["processors"])}\n' + control_block += f'timestep {parameters_control.get("timestep", _time)}\n' control_block += '# ---- End of the Control information ----\n' return control_block @@ -133,14 +134,14 @@ def write_structure_block( kind_name_id_map[site.kind_name] = len(kind_name_id_map) + 1 structure_block = '# ---- Start of the Structure information ----\n' - structure_block += f"box tilt {parameters_structure.get('box_tilt','small')}\n" + structure_block += f'box tilt {parameters_structure.get("box_tilt", "small")}\n' - structure_block += f"dimension {structure.get_dimensionality()['dim']}\n" + structure_block += f'dimension {structure.get_dimensionality()["dim"]}\n' structure_block += 'boundary ' for _bound in ['pbc1', 'pbc2', 'pbc3']: - structure_block += f"{'p' if structure.attributes[_bound] else 'f'} " + structure_block += f'{"p" if structure.attributes[_bound] else "f"} ' structure_block += '\n' - structure_block += f"atom_style {parameters_structure['atom_style']}\n" + structure_block += f'atom_style {parameters_structure["atom_style"]}\n' structure_block += f'read_data {structure_filename}\n' # Set the groups which will be used for the calculations if 'groups' in parameters_structure: @@ -150,10 +151,11 @@ def write_structure_block( _subset = _group['args'][_group['args'].index('type') + 1:] - assert all(kind in kind_name_id_map.values() - for kind in _subset), 'atom type not defined' + if not all(kind in kind_name_id_map.values() + for kind in _subset): + raise ValueError('atom type not defined') # Set the current group - structure_block += f"group {_group['name']} {join_keywords(_group['args'])}\n" + structure_block += f'group {_group["name"]} {join_keywords(_group["args"])}\n' # Store the name of the group for later usage group_names.append(_group['name']) structure_block += '# ---- End of the Structure information ----\n' @@ -177,11 +179,11 @@ def write_minimize_block(parameters_minimize: dict) -> str: """ minimize_block = '# ---- Start of the Minimization information ----\n' - minimize_block += f"min_style {parameters_minimize.get('style', 'cg')}\n" - minimize_block += f"minimize {parameters_minimize.get('energy_tolerance', 1e-4)}" - minimize_block += f" {parameters_minimize.get('force_tolerance', 1e-4)}" - minimize_block += f" {parameters_minimize.get('max_iterations', 1000)}" - minimize_block += f" {parameters_minimize.get('max_evaluations', 1000)}\n" + minimize_block += f'min_style {parameters_minimize.get("style", "cg")}\n' + minimize_block += f'minimize {parameters_minimize.get("energy_tolerance", 1e-4)}' + minimize_block += f' {parameters_minimize.get("force_tolerance", 1e-4)}' + minimize_block += f' {parameters_minimize.get("max_iterations", 1000)}' + minimize_block += f' {parameters_minimize.get("max_evaluations", 1000)}\n' minimize_block += '# ---- End of the Minimization information ----\n' return minimize_block @@ -209,11 +211,11 @@ def write_md_block(parameters_md: dict) -> str: md_block = '# ---- Start of the MD information ----\n' md_block += 'reset_timestep 0\n' if parameters_md.get('run_style', 'verlet') == 'rspa': - md_block += f"run_style {parameters_md.get('run_style', 'verlet')} " - md_block += f"{join_keywords(parameters_md['rspa_options'])}\n" + md_block += f'run_style {parameters_md.get("run_style", "verlet")} ' + md_block += f'{join_keywords(parameters_md["rspa_options"])}\n' else: - md_block += f"run_style {parameters_md.get('run_style', 'verlet')}\n" - md_block += f"run {parameters_md.get('max_number_steps', 10)}\n" + md_block += f'run_style {parameters_md.get("run_style", "verlet")}\n' + md_block += f'run {parameters_md.get("max_number_steps", 10)}\n' md_block += '# ---- End of the MD information ----\n' return md_block @@ -253,7 +255,9 @@ def write_fix_block( for key, value in parameters_fix.items(): for entry in value: _group = entry.get('group', 'all') - assert _group in group_names + ['all'], 'group name not defined' + if _group not in group_names + ['all']: + raise ValueError( + f'group name "{_group}" is not the defined groups') fix_block += f'fix {generate_id_tag(key, _group)} {_group} {key} ' fix_block += f'{join_keywords(entry["type"])}\n' fix_block += '# ---- End of the Fix information ----\n' @@ -288,7 +292,9 @@ def write_compute_block( for key, value in parameters_compute.items(): for entry in value: _group = entry.get('group', 'all') - assert _group in group_names + ['all'], 'group name not defined' + if _group not in group_names + ['all']: + raise ValueError( + f'group name "{_group}" is not the defined groups') compute_block += f'compute {generate_id_tag(key, _group)} {_group} {key} ' compute_block += f'{join_keywords(entry["type"])}\n' compute_block += '# ---- End of the Compute information ----\n' diff --git a/aiida_lammps/common/parse_trajectory.py b/aiida_lammps/common/parse_trajectory.py index 329751c..f140536 100644 --- a/aiida_lammps/common/parse_trajectory.py +++ b/aiida_lammps/common/parse_trajectory.py @@ -97,7 +97,8 @@ def create_structure( ] if symbols != kind_symbols: raise ValueError( - f'original_structure has different symbols:: {kind_symbols} != {symbols}') + f'original_structure has different symbols:: {kind_symbols} != {symbols}' + ) structure = original_structure.clone() structure.reset_cell(traj_block.cell) structure.reset_sites_positions(positions) diff --git a/aiida_lammps/common/utils.py b/aiida_lammps/common/utils.py index 2674f8d..fc0cdc9 100644 --- a/aiida_lammps/common/utils.py +++ b/aiida_lammps/common/utils.py @@ -36,8 +36,8 @@ def join_keywords(dct, ignore=None): """ ignore = [] if not ignore else ignore return ' '.join([ - f'{k} {_convert_values(dct[k])}' - for k in sorted(dct.keys()) if k not in ignore + f'{k} {_convert_values(dct[k])}' for k in sorted(dct.keys()) + if k not in ignore ]) diff --git a/aiida_lammps/data/lammps_potential.py b/aiida_lammps/data/lammps_potential.py index 7a078b2..18e7e12 100644 --- a/aiida_lammps/data/lammps_potential.py +++ b/aiida_lammps/data/lammps_potential.py @@ -11,6 +11,10 @@ Based on the `pseudo `_ class written by Sebaastian Huber. + +The potentials are also tagged by following the KIM-API +`schema `_, as to make them more easy +to track and as compatible as possible to the KIM schema. """ # pylint: disable=arguments-differ, too-many-public-methods import io @@ -41,6 +45,10 @@ class LammpsPotentialData(orm.SinglefileData): # pylint: disable=too-many-argum Based on the `pseudo `_ class written by Sebaastian Huber. + + The potentials are also tagged by following the KIM-API + `schema `_, as to make them more easy + to track and as compatible as possible to the KIM schema. """ # pylint: disable=line-too-long _key_element = 'element' @@ -56,7 +64,7 @@ class written by Sebaastian Huber. 'type': str }, 'content_other_locations': { - 'type': str + 'type': (str, list) }, 'data_method': { 'type': str, @@ -71,6 +79,9 @@ class written by Sebaastian Huber. 'disclaimer': { 'type': str }, + 'generation_method': { + 'type': str + }, 'properties': { 'type': (str, list) }, @@ -413,7 +424,7 @@ def store(self, **kwargs): return super().store(**kwargs) @property - def atom_style(self): + def atom_style(self) -> str: """ Return the default `atomic_style` of this potential. :return: the default `atomic_style` of this potential @@ -422,7 +433,7 @@ def atom_style(self): return self.get_attribute('atom_style') @property - def pair_style(self): + def pair_style(self) -> str: """ Return the `pair_style` of this potential according to the LAMMPS notation :return: the `pair_style` of the potential @@ -431,7 +442,7 @@ def pair_style(self): return self.get_attribute('pair_style') @property - def species(self): + def species(self) -> list: """Return the list of species which this potential can be used for. :return: The list of chemical species which are contained in this potential. :rtype: list @@ -439,7 +450,7 @@ def species(self): return self.get_attribute('species') @property - def default_units(self): + def default_units(self) -> str: """ Return the default units associated with this potential. :return: the default units associated with this potential @@ -448,7 +459,7 @@ def default_units(self): return self.get_attribute('default_units') @property - def content_origin(self): + def content_origin(self) -> str: """ Return the place where this potential information can be found. @@ -465,7 +476,7 @@ def content_origin(self): return self.get_attribute('content_origin') @property - def content_other_locations(self): + def content_other_locations(self) -> typing.Union[str, list]: """ Return other locations where the potential can be found. @@ -473,12 +484,12 @@ def content_other_locations(self): to other location(s) where the content is available. :return: other locations where the potential can be found. - :rtype: str + :rtype: typing.Union[str, list] """ return self.get_attribute('content_other_locations') @property - def data_method(self): + def data_method(self) -> str: """ Return the data method used to generate the potential. @@ -492,7 +503,7 @@ def data_method(self): return self.get_attribute('data_method') @property - def description(self): + def description(self) -> str: """ Return a description of the potential. @@ -507,7 +518,7 @@ def description(self): return self.get_attribute('description') @property - def developer(self): + def developer(self) -> typing.Union[str, list]: """ Return the developer information of this potential. @@ -518,12 +529,12 @@ def developer(self): of an interatomic model or a specific parameter set for it. :return: developer information of this potential - :rtype: str + :rtype: typing.Union[str, list] """ return self.get_attribute('developer') @property - def disclaimer(self): + def disclaimer(self) -> str: """ Return a disclaimer regarding the usage of the potential. @@ -537,31 +548,31 @@ def disclaimer(self): return self.get_attribute('disclaimer') @property - def properties(self): + def properties(self) -> typing.Union[str, list]: """ Return the properties for which this potential was devised. As based in the KIM schema. A list of properties reported by a KIM Item. :return: properties fow which this potential was devised. - :rtype: str + :rtype: typing.Union[str, list] """ return self.get_attribute('properties') @property - def publication_year(self): + def publication_year(self) -> typing.Union[str, datetime.datetime, int]: """ Return the year of publication of this potential. As based in the KIM schema. Year this item was published on openkim.org. :return: year of publication of this potential - :rtype: str + :rtype: typing.Union[str, datetime.datetime, int] """ return self.get_attribute('publication_year') @property - def source_citations(self): + def source_citations(self) -> typing.Union[str, list]: """ Return the citation where the potential was originally published. @@ -569,12 +580,12 @@ def source_citations(self): corresponding to primary published work(s) describing the KIM Item. :return: the citation where the potential was originally published. - :rtype: str. + :rtype: typing.Union[str, list]. """ return self.get_attribute('source_citations') @property - def title(self): + def title(self) -> str: """ Return the title of the potential. @@ -594,6 +605,19 @@ def md5(self) -> typing.Optional[int]: """ return self.get_attribute(self._key_md5, None) + @property + def generation_method(self) -> str: + """ + Return the geneation method of the potential. + + In here one can describe how the potential itself was generated, if it + was done via ML, fitting via specific codes, analytical fitting, etc. + + :return: the generation method of the potential + :rtype: str + """ + return self.get_attribute('generation_method') + @md5.setter def md5(self, value: str): """Set the md5. diff --git a/aiida_lammps/validation/schemas/lammps_schema.json b/aiida_lammps/validation/schemas/lammps_schema.json index 1f23ab0..adb681b 100644 --- a/aiida_lammps/validation/schemas/lammps_schema.json +++ b/aiida_lammps/validation/schemas/lammps_schema.json @@ -95,6 +95,12 @@ "hybrid" ] } + }, + "box_tilt": { + "type": "string", + "propertyNames": { + "enum": ["small", "large"] + } } } }, From e3304a50ee86a9e82309edbd1000c26355ae2c4d Mon Sep 17 00:00:00 2001 From: Jonathan Chico Date: Thu, 25 Nov 2021 17:00:04 +0100 Subject: [PATCH 17/70] (WIP) Improvements on the input generation. Changes to ensure that the velocity can be read and properly parsed. Separated the integration from the fixes so that it is more compatible to the current version of the plugin. Created a function to automatically write the options for the integrations. --- aiida_lammps/common/input_generator.py | 116 ++++- aiida_lammps/data/lammps_potential.py | 12 +- .../validation/schemas/lammps_schema.json | 469 +++++++++--------- 3 files changed, 364 insertions(+), 233 deletions(-) diff --git a/aiida_lammps/common/input_generator.py b/aiida_lammps/common/input_generator.py index b1441d8..b30de4b 100644 --- a/aiida_lammps/common/input_generator.py +++ b/aiida_lammps/common/input_generator.py @@ -80,7 +80,7 @@ def write_potential_block( :rtype: str """ - default_potential = LammpsPotentialData._default_potential_info + default_potential = LammpsPotentialData.default_potential_info kind_symbols = [kind.symbol for kind in structure.kinds] @@ -96,7 +96,7 @@ def write_potential_block( if 'neighbor' in parameters_potential: potential_block += f'neighbor {join_keywords(parameters_potential["neighbor"])}\n' if 'neighbor_modify' in parameters_potential: - potential_block += f'neigh_modify {(parameters_potential["neighbor_modify"])}\n' + potential_block += f'neigh_modify {join_keywords(parameters_potential["neighbor_modify"])}\n' potential_block += '# ---- End of Potential information ----\n' return potential_block @@ -208,19 +208,126 @@ def write_md_block(parameters_md: dict) -> str: :rtype: str """ + integration_options = generate_integration_options( + style=parameters_md['integration'].get('style', 'nve'), + integration_parameters=parameters_md['integration'].get('constraints'), + ) + md_block = '# ---- Start of the MD information ----\n' + md_block += f'fix {parameters_md["integration"].get("style", "nve")}{integration_options}\n' md_block += 'reset_timestep 0\n' if parameters_md.get('run_style', 'verlet') == 'rspa': md_block += f'run_style {parameters_md.get("run_style", "verlet")} ' md_block += f'{join_keywords(parameters_md["rspa_options"])}\n' else: md_block += f'run_style {parameters_md.get("run_style", "verlet")}\n' - md_block += f'run {parameters_md.get("max_number_steps", 10)}\n' + md_block += f'run {parameters_md.get("max_number_steps", 100)}\n' md_block += '# ---- End of the MD information ----\n' return md_block +def generate_integration_options( + style: str, + integration_parameters: dict, +) -> str: + """ + Create a string with the integration options. + + This will check that the appropriate options are setup for each of the + supported integrators. These will be appended to a string which is then + passed to each of the integrators. + + :param style: Integration style performed in MD mode + :type style: str + :param integration_parameters: dictionary with the constraints for the integration + :type integration_parameters: dict + :return: string with the integration options. + :rtype: str + """ + + temperature_dependent = [ + 'nvt', + 'nvt/asphere', + 'nvt/body', + 'nvt/eff', + 'nvt/manifold/rattle', + 'nvt/sllod', + 'nvt/sllod/eff', + 'nvt/sphere', + 'nvt/uef', + 'nphug', + 'npt', + 'npt/asphere', + 'npt/body', + 'npt/cauchy', + 'npt/eff', + 'npt/sphere', + 'npt/uef', + ] + + pressure_dependent = [ + 'nph', + 'nph/asphere', + 'nph/body', + 'nph/eff', + 'nph/sphere', + 'nphug', + 'npt', + 'npt/asphere', + 'npt/body', + 'npt/cauchy', + 'npt/eff', + 'npt/sphere', + 'npt/uef', + ] + + uef_dependent = ['npt/uef', 'nvt/uef'] + + temperature_options = ['temp', 'tchain', 'tloop', 'drag'] + + pressure_options = [ + 'ani', 'iso', 'tri', 'x', 'y', 'z', 'xy', 'xz', 'yz', 'couple', + 'pchain', 'mtk', 'ploop', 'nreset', 'drag', 'dilate', 'scaleyz', + 'scalexz', 'scalexy', 'flip', 'fixedpoint', 'update' + ] + + uef_options = ['ext', 'erotate'] + + options = '' + + # Set the options that depend on the temperature + if style in temperature_dependent: + for _option in temperature_options: + if _option in integration_parameters: + _value = integration_parameters.get(_option) + _value = [str(val) for val in _value] + options += f' {_option} {" ".join(_value) if isinstance(_value, list) else _value} ' + # Set the options that depend on the pressure + if style in pressure_dependent: + for _option in pressure_options: + if _option in integration_parameters: + _value = integration_parameters.get(_option) + _value = [str(val) for val in _value] + options += f' {_option} {" ".join(_value) if isinstance(_value, list) else _value} ' + # Set the options that depend on the 'uef' parameters + if style in uef_dependent: + for _option in uef_options: + if _option in integration_parameters: + _value = integration_parameters.get(_option) + _value = [str(val) for val in _value] + options += f' {_option} {" ".join(_value) if isinstance(_value, list) else _value} ' + # Set the options that depend on the 'nve/limit' parameters + if style in ['nve/limit']: + options += f' {integration_parameters.get("xmax", 0.1)} ' + # Set the options that depend on the 'langevin' parameters + if style in ['nve/dotc/langevin']: + options += f' {integration_parameters.get("temp")}' + options += f' {integration_parameters.get("seed")}' + options += f' angmom {integration_parameters.get("angmom")}' + return options + + def write_fix_block( parameters_fix: dict, group_names: list = None, @@ -257,7 +364,8 @@ def write_fix_block( _group = entry.get('group', 'all') if _group not in group_names + ['all']: raise ValueError( - f'group name "{_group}" is not the defined groups') + f'group name "{_group}" is not the defined groups {group_names + ["all"]}' + ) fix_block += f'fix {generate_id_tag(key, _group)} {_group} {key} ' fix_block += f'{join_keywords(entry["type"])}\n' fix_block += '# ---- End of the Fix information ----\n' diff --git a/aiida_lammps/data/lammps_potential.py b/aiida_lammps/data/lammps_potential.py index 18e7e12..f5fb97c 100644 --- a/aiida_lammps/data/lammps_potential.py +++ b/aiida_lammps/data/lammps_potential.py @@ -98,8 +98,8 @@ class written by Sebaastian Huber. with open(_schema_file, 'r') as handler: _defaults = json.load(handler) - _default_potential_info = _defaults['pair_style'] - _default_atom_style_info = _defaults['atom_style'] + default_potential_info = _defaults['pair_style'] + default_atom_style_info = _defaults['atom_style'] @classmethod def get_or_create( @@ -237,7 +237,7 @@ def validate_pair_style(self, pair_style: str): if pair_style is None: raise TypeError( 'The pair_style of the potential must be provided.') - if pair_style not in self._default_potential_info.keys(): + if pair_style not in self.default_potential_info.keys(): raise KeyError(f'The pair_style "{pair_style}" is not valid') self.set_attribute('pair_style', pair_style) @@ -272,8 +272,8 @@ def validate_atom_style(self, atom_style: str, pair_style: str): :raises ValueError: If the `atom_style` is not supported by LAMMPS """ if atom_style is None: - atom_style = self._default_potential_info[pair_style]['atom_style'] - if atom_style not in self._default_atom_style_info: + atom_style = self.default_potential_info[pair_style]['atom_style'] + if atom_style not in self.default_atom_style_info: raise ValueError(f'The atom_style "{atom_style}" is not valid') self.set_attribute('atom_style', atom_style) @@ -300,7 +300,7 @@ def validate_units(self, units: str, pair_style: str): :raises ValueError: If the `units` are not LAMMPS compatible. """ if units is None: - units = self._default_potential_info[pair_style]['units'] + units = self.default_potential_info[pair_style]['units'] if units not in [ 'si', 'lj', 'real', 'metal', 'cgs', 'electron', 'micro', 'nano' ]: diff --git a/aiida_lammps/validation/schemas/lammps_schema.json b/aiida_lammps/validation/schemas/lammps_schema.json index adb681b..6445976 100644 --- a/aiida_lammps/validation/schemas/lammps_schema.json +++ b/aiida_lammps/validation/schemas/lammps_schema.json @@ -110,6 +110,7 @@ }, "md": { "type": "object", + "required": ["integration"], "properties": { "run_style": { "type": "string" @@ -122,6 +123,236 @@ }, "max_number_steps": { "type": "integer" + }, + "velocity": { + "type": "object", + "properties": { + "create": { + "type": "object", + "properties": { + "temp": { + "type":"number" + }, + "seed": { + "type": "integer" + } + } + }, + "set": { + "type": "object", + "properties": { + "vx": { + "type": "number" + }, + "vy": { + "type": "number" + }, + "vz": { + "type": "number" + } + } + }, + "scale": { + "type": "number" + }, + "ramp": { + "type": "object", + "properties": { + "vdim": { + "type": "string", + "enum": ["vx", "vy", "vz"] + }, + "vlo": { + "type": "number" + }, + "vhi": { + "type": "number" + }, + "dim": { + "type": "string", + "enum": ["x", "y", "z"] + }, + "clo": { + "type": "number" + }, + "chi": { + "type": "number" + } + } + }, + "zero": { + "type": "string", + "enum": ["linear", "angular"] + } + } + }, + "integration": { + "type": "object", + "properties": { + "style": { + "type": "string", + "enum": [ + "nph", + "nph/asphere", + "nph/body", + "nph/eff", + "nph/sphere", + "nphug", + "npt", + "npt/asphere", + "npt/body", + "npt/cauchy", + "npt/eff", + "npt/sphere", + "npt/uef", + "nve", + "nve/asphere", + "nve/ashphere/noforce", + "nve/awpmd", + "nve/body", + "nve/dot", + "nve/dotc/langevin", + "nve/eff", + "nve/limit", + "nve/line", + "nve/manifold/rattle", + "nve/noforce", + "nve/sphere", + "nve/spin", + "nve/tri", + "nvk", + "nvt", + "nvt/asphere", + "nvt/body", + "nvt/eff", + "nvt/manifold/rattle", + "nvt/sllod", + "nvt/sllod/eff", + "nvt/sphere", + "nvt/uef" + ] + }, + "constraints": { + "type": "object", + "properties": { + "temp": { + "$ref" : "#/definitions/int_constraint" + }, + "iso": { + "$ref" : "#/definitions/int_constraint" + }, + "tri": { + "$ref" : "#/definitions/int_constraint" + }, + "aniso": { + "$ref" : "#/definitions/int_constraint" + }, + "x": { + "$ref" : "#/definitions/int_constraint" + }, + "y": { + "$ref" : "#/definitions/int_constraint" + }, + "z": { + "$ref" : "#/definitions/int_constraint" + }, + "xy": { + "$ref" : "#/definitions/int_constraint" + }, + "xz": { + "$ref" : "#/definitions/int_constraint" + }, + "yz": { + "$ref" : "#/definitions/int_constraint" + }, + "couple": { + "type": "string", + "enum": ["none", "xyz", "xy", "yz", "xz"] + }, + "tchain": { + "type": "integer" + }, + "pchain": { + "type": "integer" + }, + "mtk": { + "type": "string", + "enum": ["yes", "no"] + }, + "tloop": { + "type": "integer" + }, + "ploop": { + "type": "integer" + }, + "nreset": { + "type": "integer" + }, + "drag": { + "type": "numeric" + }, + "ptemp": { + "type": "numeric" + }, + "dilate": { + "type": "string" + }, + "scalexy": { + "type": "string", + "enum": ["yes", "no"] + }, + "scalexz": { + "type": "string", + "enum": ["yes", "no"] + }, + "scaleyz": { + "type": "string", + "enum": ["yes", "no"] + }, + "flip": { + "type": "string", + "enum": ["yes", "no"] + }, + "fixedpoint": { + "type": "string", + "enum": ["x", "y", "z"] + }, + "update": { + "type": "string", + "enum": ["dipole", "dipole/dlm"] + }, + "ext": { + "type": "string", + "enum": ["x", "y", "z", "xy", "yz", "xz"] + }, + "erate": { + "type": "array", + "minItems": 2, + "maxItems": 2, + "items": [ + { + "description" : "strain rates in the x direction", + "type": "number" + }, + { + "description": "strain rates in the y direction", + "type": "number" + } + ] + }, + "seed": { + "type": "integer" + }, + "angmom": { + "type": "integer" + }, + "xmax": { + "type": "number" + } + } + } + }, + "required": ["style", "constraints"] } } }, @@ -572,45 +803,8 @@ "mvv/tdpd", "neb", "neb/spin", - "nph", - "nph/asphere", - "nph/body", - "nph/eff", - "nph/sphere", "nphug", - "npt", - "npt/asphere", - "npt/body", - "npt/cauchy", - "npt/eff", - "npt/sphere", - "npt/uef", "numdiff", - "nve", - "nve/asphere", - "nve/asphere/noforce", - "nve/awpmd", - "nve/body", - "nve/dot", - "nve/dotc/langevin", - "nve/eff", - "nve/limit", - "nve/line", - "nve/manifold/rattle", - "nve/noforce", - "nve/sphere", - "nve/spin", - "nve/tri", - "nvk", - "nvt", - "nvt/asphere", - "nvt/body", - "nvt/eff", - "nvt/manifold/rattle", - "nvt/sllod", - "nvt/sllod/eff", - "nvt/sphere", - "nvt/uef", "oneway", "orient/bcc", "orient/fcc", @@ -725,197 +919,26 @@ "^": { "$ref": "#/definitions/children" } - }, - "oneOf": [ - { - "required": [ - "nph" - ] - }, - { - "required": [ - "nph/asphere" - ] - }, - { - "required": [ - "nph/body" - ] - }, - { - "required": [ - "nph/eff" - ] - }, - { - "required": [ - "nph/sphere" - ] - }, - { - "required": [ - "nphug" - ] - }, - { - "required": [ - "npt" - ] - }, - { - "required": [ - "npt/asphere" - ] - }, - { - "required": [ - "npt/body" - ] - }, - { - "required": [ - "npt/cauchy" - ] - }, - { - "required": [ - "npt/eff" - ] - }, - { - "required": [ - "npt/sphere" - ] - }, - { - "required": [ - "npt/uef" - ] - }, - { - "required": [ - "nve" - ] - }, - { - "required": [ - "nve/asphere" - ] - }, - { - "required": [ - "nve/asphere/noforce" - ] - }, - { - "required": [ - "nve/awpmd" - ] - }, - { - "required": [ - "nve/body" - ] - }, - { - "required": [ - "nve/dot" - ] - }, - { - "required": [ - "nve/dotc/langevin" - ] - }, - { - "required": [ - "nve/eff" - ] - }, - { - "required": [ - "nve/limit" - ] - }, - { - "required": [ - "nve/line" - ] - }, - { - "required": [ - "nve/manifold/rattle" - ] - }, - { - "required": [ - "nve/noforce" - ] - }, - { - "required": [ - "nve/sphere" - ] - }, - { - "required": [ - "nve/spin" - ] - }, - { - "required": [ - "nve/tri" - ] - }, - { - "required": [ - "nvk" - ] - }, - { - "required": [ - "nvt" - ] - }, - { - "required": [ - "nvt/asphere" - ] - }, - { - "required": [ - "nvt/body" - ] - }, - { - "required": [ - "nvt/eff" - ] - }, - { - "required": [ - "nvt/manifold/rattle" - ] - }, - { - "required": [ - "nvt/sllod" - ] - }, + } + }, + "int_constraint": { + "description": "Define an integration constraint, for e.g. temperature, pressure, etc", + "type": "array", + "minItems": 3, + "maxItems": 3, + "items": [ { - "required": [ - "nvt/sllod/eff" - ] + "description": "external value at start of run", + "type": "number" }, { - "required": [ - "nvt/sphere" - ] + "description": "external value at end of run", + "type": "number" }, { - "required": [ - "nvt/uef" - ] + "description": "damping parameter (time units)", + "type": "number", + "minimum": 0 } ] }, From 92d417372e8529957dd073199bab62832a86d2fb Mon Sep 17 00:00:00 2001 From: Jonathan Chico Date: Fri, 26 Nov 2021 16:00:24 +0100 Subject: [PATCH 18/70] (WIP) Improvement of the input generation. Adding a more general way to pass the velocity to the md calculation. --- aiida_lammps/common/input_generator.py | 64 +++++++ .../validation/schemas/lammps_schema.json | 176 ++++++++++++------ 2 files changed, 185 insertions(+), 55 deletions(-) diff --git a/aiida_lammps/common/input_generator.py b/aiida_lammps/common/input_generator.py index b30de4b..77c53fc 100644 --- a/aiida_lammps/common/input_generator.py +++ b/aiida_lammps/common/input_generator.py @@ -14,6 +14,7 @@ import os from typing import Union import json +import numpy as np from aiida import orm from aiida_lammps.data.lammps_potential import LammpsPotentialData @@ -215,6 +216,8 @@ def write_md_block(parameters_md: dict) -> str: md_block = '# ---- Start of the MD information ----\n' md_block += f'fix {parameters_md["integration"].get("style", "nve")}{integration_options}\n' + if 'velocity' in parameters_md: + md_block += f'{generate_velocity_string(parameters_velocity=parameters_md["velocity"])}\n' md_block += 'reset_timestep 0\n' if parameters_md.get('run_style', 'verlet') == 'rspa': md_block += f'run_style {parameters_md.get("run_style", "verlet")} ' @@ -227,6 +230,67 @@ def write_md_block(parameters_md: dict) -> str: return md_block +def generate_velocity_string(parameters_velocity: dict) -> str: + """ + Generate the velocity string for the MD block. + + This takes the different possible velocity settings and generate a string + which is LAMMPS compatible. + + :param parameters_velocity: dictionary with the velocity parameters + :type parameters_velocity: dict + :return: string with the velocity options + :rtype: str + """ + options = '' + for entry in parameters_velocity: + _options = generate_velocity_options(entry) + if 'create' in entry: + options += f'velocity {entry.get("group", "all")} create' + options += f' {entry["create"].get("temp")}' + options += f' {entry["create"].get("seed", np.random.randint(9e9))} {_options}\n' + if 'set' in entry: + options += f'velocity {entry.get("group", "all")} set' + options += f' {entry["set"].get("vx", "NULL")}' + options += f' {entry["set"].get("vy", "NULL")}' + options += f' {entry["set"].get("vz", "NULL")} {_options}\n' + if 'scale' in entry: + options += f'velocity {entry.get("group", "all")} scale' + options += f' {entry["scale"]} {_options}\n' + if 'ramp' in entry: + options += f'velocity {entry.get("group", "all")} ramp' + options += f' {entry["ramp"].get("vdim")} {entry["ramp"].get("vlo")}' + options += f' {entry["ramp"].get("vhi")} {entry["ramp"].get("dim")}' + options += f' {entry["ramp"].get("clo")} {entry["ramp"].get("chi")} {_options}\n' + if 'zero' in entry: + options += f'velocity {entry.get("group", "all")} zero' + options += f' {entry["zero"]} {_options}\n' + return options + + +def generate_velocity_options(options_velocity: dict) -> str: + """ + Generate the options string for every velocity. + + Independent of the way in which one specifies the velocity there are several + options that are global, this functions allows them to be setup. + + :param options_velocity: dictionary with the velocity parameters + :type options_velocity: dict + :return: string with the velocity options + :rtype: str + """ + _options = [ + 'dist', 'sum', 'mom' + 'rot', 'temp', 'bias', 'loop', 'rigid', 'units' + ] + + velocity_option = '' + for _option in _options: + velocity_option += f' {_option} {options_velocity[_option]} ' + return velocity_option + + def generate_integration_options( style: str, integration_parameters: dict, diff --git a/aiida_lammps/validation/schemas/lammps_schema.json b/aiida_lammps/validation/schemas/lammps_schema.json index 6445976..191f278 100644 --- a/aiida_lammps/validation/schemas/lammps_schema.json +++ b/aiida_lammps/validation/schemas/lammps_schema.json @@ -113,78 +113,144 @@ "required": ["integration"], "properties": { "run_style": { - "type": "string" + "type": "string", + "enum": ["verlet", "verlet/split", "respa"] }, "rspa_options": { - "type": "array", - "propertyNames": { - "enum": ["verlet", "verlet/split", "respa"] - } + "type": "array" }, "max_number_steps": { "type": "integer" }, "velocity": { - "type": "object", - "properties": { - "create": { - "type": "object", - "properties": { - "temp": { - "type":"number" + "type": "array", + "items": { + "type": "object", + "properties": { + "create": { + "type": "object", + "properties": { + "temp": { + "type":"number" + }, + "seed": { + "type": "integer" + } }, - "seed": { - "type": "integer" + "required": ["temp", "seed"] + }, + "set": { + "type": "object", + "properties": { + "vx": { + "type": "number" + }, + "vy": { + "type": "number" + }, + "vz": { + "type": "number" + } } + }, + "scale": { + "type": "number" + }, + "ramp": { + "type": "object", + "properties": { + "vdim": { + "type": "string", + "enum": ["vx", "vy", "vz"] + }, + "vlo": { + "type": "number" + }, + "vhi": { + "type": "number" + }, + "dim": { + "type": "string", + "enum": ["x", "y", "z"] + }, + "clo": { + "type": "number" + }, + "chi": { + "type": "number" + } + } + }, + "zero": { + "type": "string", + "enum": ["linear", "angular"] + }, + "dist": {"type": "string", "enum": ["uniform", "gaussian"]}, + "sum": {"type": "string", "enum": ["yes", "no"]}, + "mom": {"type": "string", "enum": ["yes", "no"]}, + "rot": {"type": "string", "enum": ["yes", "no"]}, + "temp": {"type": "string"}, + "bias": {"type": "string", "enum": ["yes", "no"]}, + "loop": {"type": "string", "enum": ["all", "local", "geom"]}, + "rigid": {"type": "string"}, + "units": {"type": "string", "enum": ["box", "lattice"]}, + "group": { + "type": "string" + } + } + }, + "oneOf": [ + { + "required": [ + "create" + ], + "not": { + "required": [ + "set", "scale", "ramp", "zero" + ] } }, - "set": { - "type": "object", - "properties": { - "vx": { - "type": "number" - }, - "vy": { - "type": "number" - }, - "vz": { - "type": "number" - } + { + "required": [ + "set" + ], + "not": { + "required": [ + "create", "scale", "ramp", "zero" + ] } }, - "scale": { - "type": "number" + { + "required": [ + "scale" + ], + "not": { + "required": [ + "create", "set", "ramp", "zero" + ] + } }, - "ramp": { - "type": "object", - "properties": { - "vdim": { - "type": "string", - "enum": ["vx", "vy", "vz"] - }, - "vlo": { - "type": "number" - }, - "vhi": { - "type": "number" - }, - "dim": { - "type": "string", - "enum": ["x", "y", "z"] - }, - "clo": { - "type": "number" - }, - "chi": { - "type": "number" - } + { + "required": [ + "ramp" + ], + "not": { + "required": [ + "create", "scale", "set", "zero" + ] } }, - "zero": { - "type": "string", - "enum": ["linear", "angular"] + { + "required": [ + "zero" + ], + "not": { + "required": [ + "create", "scale", "ramp", "set" + ] + } } - } + ] }, "integration": { "type": "object", From 62a8636907cf869bb76cdc0ae8960fa1eb0788a4 Mon Sep 17 00:00:00 2001 From: Jonathan Chico Date: Mon, 29 Nov 2021 16:40:31 +0100 Subject: [PATCH 19/70] (WIP) Improving the input file generation. Fix smaller issues in the schema. Add a function for the schema validation. --- aiida_lammps/common/input_generator.py | 22 +++++++++++++++++++ .../validation/schemas/lammps_schema.json | 10 ++++----- 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/aiida_lammps/common/input_generator.py b/aiida_lammps/common/input_generator.py index 77c53fc..0ef341c 100644 --- a/aiida_lammps/common/input_generator.py +++ b/aiida_lammps/common/input_generator.py @@ -14,11 +14,33 @@ import os from typing import Union import json +import jsonschema import numpy as np from aiida import orm from aiida_lammps.data.lammps_potential import LammpsPotentialData +def validate_input_parameters(parameters: dict = None): + """ + Validate the input parameters and compares them against a schema. + + Takes the input parameters dictionaries that will be used to generate the + LAMMPS input parameter and will be checked against a schema for validation. + + :param parameters: dictionary with the input parameters, defaults to None + :type parameters: dict, optional + """ + _file = os.path.join( + os.path.dirname(os.path.abspath(__file__)), + '..', 'validation/schemas/lammps_schema.json', + ) + + with open(_file) as handler: + schema = json.load(handler) + + jsonschema.validate(schema=schema, instance=parameters) + + def write_control_block(parameters_control: dict) -> str: """ Generate the input block with global control options. diff --git a/aiida_lammps/validation/schemas/lammps_schema.json b/aiida_lammps/validation/schemas/lammps_schema.json index 191f278..ba361ad 100644 --- a/aiida_lammps/validation/schemas/lammps_schema.json +++ b/aiida_lammps/validation/schemas/lammps_schema.json @@ -44,7 +44,7 @@ "type": "string" }, "timestep": { - "type": "numeric" + "type": "number" } } }, @@ -355,10 +355,10 @@ "type": "integer" }, "drag": { - "type": "numeric" + "type": "number" }, "ptemp": { - "type": "numeric" + "type": "number" }, "dilate": { "type": "string" @@ -429,10 +429,10 @@ "type": "string" }, "energy_tolerance": { - "type": "numeric" + "type": "number" }, "force_tolerance": { - "type": "numeric" + "type": "number" }, "max_iterations": { "type": "integer" From afd09e22aaab744cfa116806ef243f7328754a74 Mon Sep 17 00:00:00 2001 From: Jonathan Chico Date: Tue, 30 Nov 2021 17:15:37 +0100 Subject: [PATCH 20/70] (WIP) Improvement of the dosctrings and format to make it compatible with the pre-commit style. --- .gitignore | 58 ++++-- aiida_lammps/calculations/lammps/force.py | 27 ++- aiida_lammps/calculations/lammps/optimize.py | 65 +++--- aiida_lammps/common/generate_input_files.py | 60 +++--- aiida_lammps/common/generate_structure.py | 96 ++++----- aiida_lammps/common/input_generator.py | 11 +- aiida_lammps/common/parse_trajectory.py | 104 +++++++--- aiida_lammps/common/raw_parsers.py | 70 +++++-- aiida_lammps/common/reaxff_convert.py | 2 +- aiida_lammps/common/utils.py | 9 +- aiida_lammps/data/lammps_potential.py | 10 +- aiida_lammps/data/potential.py | 25 ++- aiida_lammps/data/trajectory.py | 196 ++++++++++++------- aiida_lammps/parsers/lammps/base.py | 25 ++- aiida_lammps/parsers/lammps/force.py | 19 +- aiida_lammps/parsers/lammps/md.py | 6 +- aiida_lammps/parsers/lammps/md_multi.py | 9 +- aiida_lammps/parsers/lammps/optimize.py | 11 +- aiida_lammps/utils.py | 11 +- docs/source/conf.py | 14 +- 20 files changed, 550 insertions(+), 278 deletions(-) diff --git a/.gitignore b/.gitignore index cf6ec55..99c9807 100644 --- a/.gitignore +++ b/.gitignore @@ -1,21 +1,47 @@ -*.pyc -*.swo -*.swp -~* -*~ + build/ -dist/ -.project -*.egg* -.DS_Store -.idea/ -.tox/ -.pytest_cache/ -.idea/vcs.xml postgres*.log .aiida_envs.yaml -.vscode/ -docs/_build/ -pip-wheel-metadata/ example_inputs/ pytest_workdir/ + + +*.pyc +*~ +*.swp +*.project +*.pydevproject +.settings +.DS_Store +*/.DS_Store +*/*/.DS_Store +*/*/*/.DS_Store +.metadata +.ipynb_checkpoints +.project +.idea/vcs.xml + +/venv*/ +/.idea/ +*.egg-info +.eggs +.vscode +.tox + +# files created by coverage +.cache +.pytest_cache +.coverage +coverage.xml + +# Files created by RPN tests +**/polish_workchains/polish* + +# Build files +dist/ +pip-wheel-metadata + +# Docs +docs/_build/ +docs/build +docs/source/reference/apidoc diff --git a/aiida_lammps/calculations/lammps/force.py b/aiida_lammps/calculations/lammps/force.py index b6ddadc..fc1b26d 100644 --- a/aiida_lammps/calculations/lammps/force.py +++ b/aiida_lammps/calculations/lammps/force.py @@ -1,3 +1,4 @@ +"""Single point calculation of the energy in LAMMPS.""" from aiida.plugins import DataFactory from aiida_lammps.calculations.lammps import BaseLammpsCalculation @@ -6,6 +7,8 @@ class ForceCalculation(BaseLammpsCalculation): + """Calculation of a single point in LAMMPS, to obtain the energy of the system. + """ @classmethod def define(cls, spec): super(ForceCalculation, cls).define(spec) @@ -16,8 +19,6 @@ def define(cls, spec): default='lammps.force', ) - # spec.input('settings', valid_type=str, default='lammps.optimize') - spec.output( 'arrays', valid_type=DataFactory('array'), @@ -35,18 +36,16 @@ def create_main_input_content( system_filename, restart_filename, ): - + # pylint: disable=too-many-arguments, too-many-locals version_date = convert_date_string( parameter_data.get_attribute('lammps_version', '11 Aug 2017')) - lammps_input_file = 'units {0}\n'.format( - potential_data.default_units) + lammps_input_file = f'units {potential_data.default_units}\n' lammps_input_file += 'boundary p p p\n' lammps_input_file += 'box tilt large\n' - lammps_input_file += 'atom_style {0}\n'.format( - potential_data.atom_style) + lammps_input_file += f'atom_style {potential_data.atom_style}\n' - lammps_input_file += 'read_data {}\n'.format(structure_filename) + lammps_input_file += f'read_data {structure_filename}\n' lammps_input_file += potential_data.get_input_lines(kind_symbols) @@ -103,9 +102,19 @@ def create_main_input_content( return lammps_input_file @staticmethod - def validate_parameters(param_data, potential_object): + def validate_parameters(param_data): + """Validate the parameters for a force calculation. + + :param param_data: parameters for the LAMMPS force calculation + :type param_data: orm.Dict + """ if param_data is not None: validate_against_schema(param_data.get_dict(), 'force.schema.json') def get_retrieve_lists(self): + """Get list of files to be retrieved when the calculation is done. + + :return: list of files to be retrieved. + :rtype: list + """ return [self.options.trajectory_suffix], [] diff --git a/aiida_lammps/calculations/lammps/optimize.py b/aiida_lammps/calculations/lammps/optimize.py index 0c42897..8e13311 100644 --- a/aiida_lammps/calculations/lammps/optimize.py +++ b/aiida_lammps/calculations/lammps/optimize.py @@ -1,3 +1,7 @@ +"""Class describing the calculation of the optimization of a structure +using LAMMPS (minimize method). +""" +# pylint: disable=fixme from aiida.common.exceptions import InputValidationError from aiida.plugins import DataFactory @@ -7,6 +11,7 @@ class OptimizeCalculation(BaseLammpsCalculation): + """Calculation for the optimization of the structure in LAMMPS.""" @classmethod def define(cls, spec): super(OptimizeCalculation, cls).define(spec) @@ -40,18 +45,17 @@ def create_main_input_content( system_filename, restart_filename, ): + # pylint: disable=too-many-locals, too-many-arguments parameter_data = parameter_data.get_dict() version_date = convert_date_string( parameter_data.get('lammps_version', '11 Aug 2017')) - lammps_input_file = 'units {0}\n'.format( - potential_data.default_units) + lammps_input_file = f'units {potential_data.default_units}\n' lammps_input_file += 'boundary p p p\n' lammps_input_file += 'box tilt large\n' - lammps_input_file += 'atom_style {0}\n'.format( - potential_data.atom_style) - lammps_input_file += 'read_data {}\n'.format(structure_filename) + lammps_input_file += f'atom_style {potential_data.atom_style}\n' + lammps_input_file += f'read_data {structure_filename}\n' lammps_input_file += potential_data.get_input_lines(kind_symbols) @@ -68,16 +72,11 @@ def create_main_input_content( else: lammps_input_file += 'compute stpa all stress/atom NULL\n' - lammps_input_file += 'compute stgb all reduce sum c_stpa[1] c_stpa[2] c_stpa[3] c_stpa[4] c_stpa[5] c_stpa[6]\n' + lammps_input_file += 'compute stgb all reduce sum ' + lammps_input_file += 'c_stpa[1] c_stpa[2] c_stpa[3] c_stpa[4] c_stpa[5] c_stpa[6]\n' lammps_input_file += ( 'variable stress_pr equal -(c_stgb[1]+c_stgb[2]+c_stgb[3])/(3*vol)\n' ) - # lammps_input_file += "variable stress_xx equal c_stgb[1]\n" - # lammps_input_file += "variable stress_yy equal c_stgb[2]\n" - # lammps_input_file += "variable stress_zz equal c_stgb[3]\n" - # lammps_input_file += "variable stress_xy equal c_stgb[4]\n" - # lammps_input_file += "variable stress_xz equal c_stgb[5]\n" - # lammps_input_file += "variable stress_yz equal c_stgb[6]\n" thermo_keywords = [ 'step', @@ -85,12 +84,6 @@ def create_main_input_content( 'press', 'etotal', 'v_stress_pr', - # "c_stgb[1]", - # "c_stgb[2]", - # "c_stgb[3]", - # "c_stgb[4]", - # "c_stgb[5]", - # "c_stgb[6]", ] for kwd in parameter_data.get('thermo_keywords', []): if kwd not in thermo_keywords: @@ -99,10 +92,12 @@ def create_main_input_content( ' '.join(thermo_keywords)) if potential_data.atom_style == 'charge': - dump_variables = 'element x y z fx fy fz q c_stpa[1] c_stpa[2] c_stpa[3] c_stpa[4] c_stpa[5] c_stpa[6]' + dump_variables = 'element x y z fx fy fz q' + dump_variables += ' c_stpa[1] c_stpa[2] c_stpa[3] c_stpa[4] c_stpa[5] c_stpa[6]' dump_format = '%4s ' + ' '.join(['%16.10f'] * 13) else: - dump_variables = 'element x y z fx fy fz c_stpa[1] c_stpa[2] c_stpa[3] c_stpa[4] c_stpa[5] c_stpa[6]' + dump_variables = 'element x y z fx fy fz' + dump_variables += ' c_stpa[1] c_stpa[2] c_stpa[3] c_stpa[4] c_stpa[5] c_stpa[6]' dump_format = '%4s ' + ' '.join(['%16.10f'] * 12) lammps_input_file += 'dump aiida all custom 1 {0} {1}\n'.format( @@ -133,24 +128,31 @@ def create_main_input_content( variables = parameter_data.get('output_variables', []) for var in variables: var_alias = var.replace('[', '_').replace(']', '_') - lammps_input_file += 'variable {0} equal {1}\n'.format( - var_alias, var) + lammps_input_file += f'variable {var_alias} equal {var}\n' lammps_input_file += 'print "final_variable: {0} = ${{{0}}}"\n'.format( var_alias) lammps_input_file += 'variable final_energy equal etotal\n' lammps_input_file += 'print "final_energy: ${final_energy}"\n' - # lammps_input_file += 'print "final_variable: stress_pr = ${stress_pr}"\n' - # lammps_input_file += 'print "final_cell: $(xlo) $(xhi) $(xy) $(ylo) $(yhi) $(xz) $(zlo) $(zhi) $(yz)"\n' - # lammps_input_file += 'print "final_stress: ${stress_xx} ${stress_yy} ${stress_zz} ${stress_xy} ${stress_xz} ${stress_yz}"\n' - lammps_input_file += 'print "END_OF_COMP"\n' return lammps_input_file @staticmethod - def validate_parameters(param_data, potential_object): + def validate_parameters(param_data, potential_object) -> bool: + """Validate the inputs for an optimization calculation. + + :param param_data: input parameters for the optimization calculations + :type param_data: orm.Dict + :param potential_object: LAMMPS potential + :type potential_object: EmpiricalPotential + :raises InputValidationError: if there is no parameters data passed + :raises InputValidationError: if the units of the parameters and + the potential are different. + :return: whether the parameters are valid or not + :rtype: bool + """ if param_data is None: raise InputValidationError('parameter data not set') validate_against_schema(param_data.get_dict(), 'optimize.schema.json') @@ -161,10 +163,15 @@ def validate_parameters(param_data, potential_object): punits = param_data.get_dict()['units'] if not punits == potential_object.default_units: raise InputValidationError( - 'the units of the parameters ({}) and potential ({}) are different' - .format(punits, potential_object.default_units)) + f'the units of the parameters ({punits}) and potential ' + f'({potential_object.default_units}) are different') return True def get_retrieve_lists(self): + """Get the list of files that are supposed to be retrieved. + + :return: list with files that must be retrieved + :rtype: list + """ return [], [self.options.trajectory_suffix] diff --git a/aiida_lammps/common/generate_input_files.py b/aiida_lammps/common/generate_input_files.py index 7e00334..ca484e7 100644 --- a/aiida_lammps/common/generate_input_files.py +++ b/aiida_lammps/common/generate_input_files.py @@ -1,32 +1,40 @@ +"""Set of functions to generate dynaphopy compatible input files.""" import numpy as np -def get_trajectory_txt(trajectory): +def get_trajectory_txt(trajectory) -> str: + """Generate a trajectory file to be given to dynaphopy. + :param trajectory: lammps trajectories + :type trajectory: LammpsTrajectory + :return: trajectory string for dynaphopy + :rtype: str + """ + # pylint: disable=too-many-locals cell = trajectory.get_cells()[0] - a = np.linalg.norm(cell[0]) - b = np.linalg.norm(cell[1]) - c = np.linalg.norm(cell[2]) + alat = np.linalg.norm(cell[0]) + blat = np.linalg.norm(cell[1]) + clat = np.linalg.norm(cell[2]) - alpha = np.arccos(np.dot(cell[1], cell[2]) / (c * b)) - gamma = np.arccos(np.dot(cell[1], cell[0]) / (a * b)) - beta = np.arccos(np.dot(cell[2], cell[0]) / (a * c)) + alpha = np.arccos(np.dot(cell[1], cell[2]) / (clat * blat)) + gamma = np.arccos(np.dot(cell[1], cell[0]) / (alat * blat)) + beta = np.arccos(np.dot(cell[2], cell[0]) / (alat * clat)) - xhi = a - xy = b * np.cos(gamma) - xz = c * np.cos(beta) - yhi = np.sqrt(pow(b, 2) - pow(xy, 2)) - yz = (b * c * np.cos(alpha) - xy * xz) / yhi - zhi = np.sqrt(pow(c, 2) - pow(xz, 2) - pow(yz, 2)) + xhi = alat + xy_box = blat * np.cos(gamma) + xz_box = clat * np.cos(beta) + yhi = np.sqrt(pow(blat, 2) - pow(xy_box, 2)) + yz_box = (blat * clat * np.cos(alpha) - xy_box * xz_box) / yhi + zhi = np.sqrt(pow(clat, 2) - pow(xz_box, 2) - pow(yz_box, 2)) - xhi = xhi + max(0, 0, xy, xz, xy + xz) - yhi = yhi + max(0, 0, yz) + xhi = xhi + max(0, 0, xy_box, xz_box, xy_box + xz_box) + yhi = yhi + max(0, 0, yz_box) - xlo_bound = np.min([0.0, xy, xz, xy + xz]) - xhi_bound = xhi + np.max([0.0, xy, xz, xy + xz]) - ylo_bound = np.min([0.0, yz]) - yhi_bound = yhi + np.max([0.0, yz]) + xlo_bound = np.min([0.0, xy_box, xz_box, xy_box + xz_box]) + xhi_bound = xhi + np.max([0.0, xy_box, xz_box, xy_box + xz_box]) + ylo_bound = np.min([0.0, yz_box]) + yhi_bound = yhi + np.max([0.0, yz_box]) zlo_bound = 0 zhi_bound = zhi @@ -38,9 +46,9 @@ def get_trajectory_txt(trajectory): lammps_data_file += 'ITEM: NUMBER OF ATOMS\n' lammps_data_file += f'{len(position_step)}\n' lammps_data_file += 'ITEM: BOX BOUNDS xy xz yz pp pp pp\n' - lammps_data_file += f'{xlo_bound:20.10f} {xhi_bound:20.10f} {xy:20.10f}\n' - lammps_data_file += f'{ylo_bound:20.10f} {yhi_bound:20.10f} {yz:20.10f}\n' - lammps_data_file += f'{zlo_bound:20.10f} {zhi_bound:20.10f} {yz:20.10f}\n' + lammps_data_file += f'{xlo_bound:20.10f} {xhi_bound:20.10f} {xy_box:20.10f}\n' + lammps_data_file += f'{ylo_bound:20.10f} {yhi_bound:20.10f} {yz_box:20.10f}\n' + lammps_data_file += f'{zlo_bound:20.10f} {zhi_bound:20.10f} {yz_box:20.10f}\n' lammps_data_file += 'ITEM: ATOMS x y z\n' for position in position_step: lammps_data_file += '{0:20.10f} {1:20.10f} {2:20.10f}\n'.format( @@ -48,8 +56,14 @@ def get_trajectory_txt(trajectory): return lammps_data_file -def parameters_to_input_file(parameters_object): +def parameters_to_input_file(parameters_object: dict) -> str: + """Generate the input file for dynaphopy. + :param parameters_object: dictionary with inputs for dynaphopy. + :type parameters_object: dict + :return: dynaphopy string input + :rtype: str + """ parameters = parameters_object.get_dict() input_file = 'STRUCTURE FILE POSCAR\nPOSCAR\n\n' input_file += 'FORCE CONSTANTS\nFORCE_CONSTANTS\n\n' diff --git a/aiida_lammps/common/generate_structure.py b/aiida_lammps/common/generate_structure.py index 50fe755..fdebe88 100644 --- a/aiida_lammps/common/generate_structure.py +++ b/aiida_lammps/common/generate_structure.py @@ -1,20 +1,28 @@ -""" creation of the structure file content """ -# import ase +Creation of the structure file content. + +As allowing the users to create their lattices using LAMMPS' would be too +complex, one must ensure that the aiida StructureData is written to file in +a format that is compatible to LAMMPS. + +In the case of non-orthogonal structures, this will take care of generating +a triclinic cell compatible with what LAMMPS expects. +""" +import typing import numpy as np -def transform_cell(cell): - """transform the cell to an orientation, compatible with LAMMPS +def transform_cell(cell) -> typing.Union[np.array, np.array]: + """Transform the cell to an orientation, compatible with LAMMPS LAMMPS requires the simulation cell to be in the format of a lower triangular matrix (right-handed basis). Therefore the cell and positions may require rotation and inversion. See https://lammps.sandia.gov/doc/Howto_triclinic.html - :param cell: (3x3) lattice - :returns: (new_cell, transform) - + :param cell: crystal cell of the original structure + :returns: LAMMPS compatible cell, transformation between original and final cell + :rtype: typing.Union[np.array, np.array] """ cell = np.array(cell) transform, upper_tri = np.linalg.qr(cell.T, mode='complete') @@ -23,9 +31,9 @@ def transform_cell(cell): # LAMMPS also requires positive values on the diagonal of the, # so invert cell if necessary inversion = np.eye(3) - for i in range(3): - if new_cell[i][i] < 0.0: - inversion[i][i] = -1.0 + for entry in range(3): + if new_cell[entry, entry] < 0.0: + inversion[entry, entry] = -1.0 new_cell = np.dot(inversion, new_cell.T).T transform = np.dot(transform, inversion.T).T @@ -34,34 +42,30 @@ def transform_cell(cell): def generate_lammps_structure( structure, - atom_style='atomic', - charge_dict=None, - round_dp=None, - docstring='generated by aiida_lammps', -): - """create lammps input structure file content - - Parameters - ---------- - structure: StructureData - the structure to use - atom_style: str - the atomic style - charge_dict: dict - mapping of atom kind_name to charge - round_dp: None or int - round output values to a number of decimal places (used for testing) - docstring : str - docstring to put at top of file - - Returns - ------- - str: content - the structure file content - numpy.array: transform - the transformation matrix applied to the structure cell and coordinates - + atom_style: str = 'atomic', + charge_dict: dict = None, + round_dp: float = None, + docstring: str = 'generated by aiida_lammps', +) -> typing.Union[str, np.array]: + """Create lammps input structure file content. + + :param structure: the structure to use in the simulation + :type structure: orm.StructureData + :param atom_style: treatment of the particles accroding to lammps, defaults to 'atomic' + :type atom_style: str, optional + :param charge_dict: dictionary with the charge for the particles, defaults to None + :type charge_dict: dict, optional + :param round_dp: precision to which to round the postions, defaults to None + :type round_dp: float, optional + :param docstring: header for the structure file, defaults to 'generated by aiida_lammps' + :type docstring: str, optional + :raises ValueError: if the atom_style does not belong to either 'atomic' or 'charge' + :return: the structure file content, the transformation matrix applied to + the structure cell and coordinates + :rtype: typing.Union[str, np.array] """ + # pylint: disable=too-many-locals + if atom_style not in ['atomic', 'charge']: raise ValueError( f"atom_style must be in ['atomic', 'charge'], not '{atom_style}'") @@ -90,10 +94,10 @@ def generate_lammps_structure( cell = np.round(cell, round_dp) + 0.0 positions = np.round(positions, round_dp) + 0.0 - filestring += f'0.0 {cell[0][0]:20.10f} xlo xhi\n' - filestring += f'0.0 {cell[1][1]:20.10f} ylo yhi\n' - filestring += f'0.0 {cell[2][2]:20.10f} zlo zhi\n' - filestring += f'{cell[1][0]:20.10f} {cell[2][0]:20.10f} {cell[2][1]:20.10f} xy xz yz\n\n' + filestring += f'0.0 {cell[0, 0]:20.10f} xlo xhi\n' + filestring += f'0.0 {cell[1, 1]:20.10f} ylo yhi\n' + filestring += f'0.0 {cell[2, 2]:20.10f} zlo zhi\n' + filestring += f'{cell[1, 0]:20.10f} {cell[2, 0]:20.10f} {cell[2, 1]:20.10f} xy xz yz\n\n' filestring += 'Masses\n\n' for kind_name in sorted(list(kind_name_id_map.keys())): @@ -107,11 +111,11 @@ def generate_lammps_structure( kind_id = kind_name_id_map[site.kind_name] if atom_style == 'atomic': - filestring += f'{site_index + 1} {kind_id} {pos[0]:20.10f} {pos[1]:20.10f} {pos[2]:20.10f}\n' - elif atom_style == 'charge': + filestring += f'{site_index + 1} {kind_id}' + filestring += f' {pos[0]:20.10f} {pos[1]:20.10f} {pos[2]:20.10f}\n' + if atom_style == 'charge': charge = charge_dict.get(site.kind_name, 0.0) - filestring += f'{site_index + 1} {kind_id} {charge} {pos[0]:20.10f} {pos[1]:20.10f} {pos[2]:20.10f}\n' - else: - raise ValueError(f'atom_style unknown: {atom_style}') + filestring += f'{site_index + 1} {kind_id} {charge}' + filestring += f' {pos[0]:20.10f} {pos[1]:20.10f} {pos[2]:20.10f}\n' return filestring, coord_transform diff --git a/aiida_lammps/common/input_generator.py b/aiida_lammps/common/input_generator.py index 0ef341c..3ac14da 100644 --- a/aiida_lammps/common/input_generator.py +++ b/aiida_lammps/common/input_generator.py @@ -32,7 +32,8 @@ def validate_input_parameters(parameters: dict = None): """ _file = os.path.join( os.path.dirname(os.path.abspath(__file__)), - '..', 'validation/schemas/lammps_schema.json', + '..', + 'validation/schemas/lammps_schema.json', ) with open(_file) as handler: @@ -119,7 +120,8 @@ def write_potential_block( if 'neighbor' in parameters_potential: potential_block += f'neighbor {join_keywords(parameters_potential["neighbor"])}\n' if 'neighbor_modify' in parameters_potential: - potential_block += f'neigh_modify {join_keywords(parameters_potential["neighbor_modify"])}\n' + potential_block += 'neigh_modify' + potential_block += f' {join_keywords(parameters_potential["neighbor_modify"])}\n' potential_block += '# ---- End of Potential information ----\n' return potential_block @@ -128,6 +130,7 @@ def write_structure_block( parameters_structure: dict, structure: orm.StructureData, structure_filename: str, + restart_file: str = None, ) -> Union[str, list]: """ Generate the input block with the structure options. @@ -145,6 +148,8 @@ def write_structure_block( :param structure_filename: name of the file where the structure will be written so that LAMMPS can read it :type structure_filename: str + :param restart_file: Overwrite the structure generation with the restartfile + this will allow the final state of a previous calculation to be used. :return: block with the structural information and list of groups present :rtype: Union[str, list] """ @@ -181,6 +186,8 @@ def write_structure_block( structure_block += f'group {_group["name"]} {join_keywords(_group["args"])}\n' # Store the name of the group for later usage group_names.append(_group['name']) + if restart_file is not None: + structure_block += f'read_restart {restart_file} {parameters_structure["remap"]}' structure_block += '# ---- End of the Structure information ----\n' return structure_block, group_names diff --git a/aiida_lammps/common/parse_trajectory.py b/aiida_lammps/common/parse_trajectory.py index f140536..5fb3a7b 100644 --- a/aiida_lammps/common/parse_trajectory.py +++ b/aiida_lammps/common/parse_trajectory.py @@ -1,14 +1,23 @@ +"""Set of functions to parse the LAMMPS dump output. +""" +# pylint: disable=fixme from collections import namedtuple - -from aiida.orm import StructureData import numpy as np +from aiida import orm -TRAJ_BLOCK = namedtuple( +TrajectoryBlock = namedtuple( 'TRAJ_BLOCK', ['lines', 'timestep', 'natoms', 'cell', 'pbc', 'atom_fields']) def iter_step_lines(file_obj): + """Parse the lines containing the time step information + + :param file_obj: file object that is being parsed + :type file_obj: [type] + :yield: initial line to start the parsing, content of the time step line + :rtype: int, str + """ step_content = None init_line = 0 for i, line in enumerate(file_obj): @@ -23,7 +32,21 @@ def iter_step_lines(file_obj): yield init_line, step_content -def parse_step(lines, initial_line=0): +def parse_step(lines, initial_line=0) -> namedtuple: + """Parse a given trajectory step + + :param lines: subset fo the file content to be parsed. + :type lines: str + :param initial_line: place where the parsing starts, defaults to 0 + :type initial_line: int, optional + :raises IOError: if no timestep is found + :raises IOError: if no number of atoms is found + :raises IOError: if the box bounds are not found + :raises IOError: if the header for the atomic positions is not found + :return: [description] + :rtype: namedtuple + """ + # pylint: disable=too-many-locals if 'ITEM: TIMESTEP' not in lines[0]: raise IOError(f'expected line {initial_line} to be TIMESTEP') if 'ITEM: NUMBER OF ATOMS' not in lines[2]: @@ -47,19 +70,22 @@ def parse_step(lines, initial_line=0): if bounds.shape[1] == 2: bounds = np.append(bounds, np.array([0, 0, 0])[None].T, axis=1) - xy = bounds[0, 2] - xz = bounds[1, 2] - yz = bounds[2, 2] + box_xy = bounds[0, 2] + box_xz = bounds[1, 2] + box_yz = bounds[2, 2] - xlo = bounds[0, 0] - np.min([0.0, xy, xz, xy + xz]) - xhi = bounds[0, 1] - np.max([0.0, xy, xz, xy + xz]) - ylo = bounds[1, 0] - np.min([0.0, yz]) - yhi = bounds[1, 1] - np.max([0.0, yz]) + xlo = bounds[0, 0] - np.min([0.0, box_xy, box_xz, box_xy + box_xz]) + xhi = bounds[0, 1] - np.max([0.0, box_xy, box_xz, box_xy + box_xz]) + ylo = bounds[1, 0] - np.min([0.0, box_yz]) + yhi = bounds[1, 1] - np.max([0.0, box_yz]) zlo = bounds[2, 0] zhi = bounds[2, 1] - super_cell = np.array([[xhi - xlo, xy, xz], [0, yhi - ylo, yz], - [0, 0, zhi - zlo]]) + super_cell = np.array([ + [xhi - xlo, box_xy, box_xz], + [0.0, yhi - ylo, box_yz], + [0.0, 0.0, zhi - zlo], + ]) cell = super_cell.T field_names = lines[8].split()[2:] fields = [] @@ -71,7 +97,14 @@ def parse_step(lines, initial_line=0): np.array(fields).T) } - return TRAJ_BLOCK(lines, timestep, number_of_atoms, cell, pbc, atom_fields) + return TrajectoryBlock( + lines, + timestep, + number_of_atoms, + cell, + pbc, + atom_fields, + ) def iter_trajectories(file_obj): @@ -81,14 +114,33 @@ def iter_trajectories(file_obj): def create_structure( - traj_block, - symbol_field='element', - position_fields=('x', 'y', 'z'), - original_structure=None, -): - symbols = traj_block.atom_fields[symbol_field] - positions = np.array([traj_block.atom_fields[f] for f in position_fields], - dtype=float).T + trajectory_block: namedtuple, + symbol_field: str = 'element', + position_fields: tuple = ('x', 'y', 'z'), + original_structure: orm.StructureData = None, +) -> orm.StructureData: + """Generate a structure from the atomic positions at a given step. + + :param trajectory_block: block with the trajectory information + :type trajectory_block: namedtuple + :param symbol_field: field name where the element symbols are found, + defaults to 'element' + :type symbol_field: str, optional + :param position_fields: name of the files where the positions are found, + defaults to ('x', 'y', 'z') + :type position_fields: tuple, optional + :param original_structure: original structure of the calculation, defaults to None + :type original_structure: orm.StructureData, optional + :raises ValueError: if the symbols of the structure and of the trajectory + info differ + :raises NotImplementedError: If the boundary conditions are not periodic or free + :return: structure of the current time step + :rtype: orm.StructureData + """ + symbols = trajectory_block.atom_fields[symbol_field] + positions = np.array( + [trajectory_block.atom_fields[f] for f in position_fields], + dtype=float).T if original_structure is not None: kind_names = original_structure.get_site_kindnames() @@ -100,21 +152,21 @@ def create_structure( f'original_structure has different symbols:: {kind_symbols} != {symbols}' ) structure = original_structure.clone() - structure.reset_cell(traj_block.cell) + structure.reset_cell(trajectory_block.cell) structure.reset_sites_positions(positions) return structure pbcs = [] - for pbc in traj_block.pbc: + for pbc in trajectory_block.pbc: if pbc == 'pp': pbcs.append(True) elif pbc == 'ff': pbcs.append(False) else: - raise NotImplementedError(f'pbc = {traj_block.pbc}') + raise NotImplementedError(f'pbc = {trajectory_block.pbc}') - structure = StructureData(cell=traj_block.cell, pbc=pbcs) + structure = orm.StructureData(cell=trajectory_block.cell, pbc=pbcs) for symbol, position in zip(symbols, positions): structure.append_atom(position=position, symbols=symbol) diff --git a/aiida_lammps/common/raw_parsers.py b/aiida_lammps/common/raw_parsers.py index c6a5cda..0b2fdad 100644 --- a/aiida_lammps/common/raw_parsers.py +++ b/aiida_lammps/common/raw_parsers.py @@ -1,10 +1,14 @@ +"""Set of functions to parse the unformatted files generated by LAMMPS. +""" +# pylint: disable=fixme import re - +import yaml import numpy as np def read_log_file(logdata_txt, compute_stress=False): """Read the log.lammps file.""" + # pylint: disable= too-many-locals, too-many-branches data = logdata_txt.splitlines() if not data: @@ -18,7 +22,7 @@ def read_log_file(logdata_txt, compute_stress=False): cell_params = None stress_params = None found_end = False - for i, line in enumerate(data): + for _, line in enumerate(data): line = line.strip() if 'END_OF_COMP' in line: found_end = True @@ -30,7 +34,7 @@ def read_log_file(logdata_txt, compute_stress=False): # if line.strip().startswith("ERROR"): # data_dict.setdefault("errors", []).append(line.strip()) elif perf_regex.match(line): - ns_day, hr_ns, step_sec = perf_regex.match(line).groups() + _, _, step_sec = perf_regex.match(line).groups() data_dict.setdefault('steps_per_second', []).append(float(step_sec)) elif 'units' in line: @@ -56,16 +60,24 @@ def read_log_file(logdata_txt, compute_stress=False): if stress_params is None: raise IOError("'final_stress' could not be found") - xlo, xhi, xy, ylo, yhi, xz, zlo, zhi, yz = cell_params - super_cell = np.array([[xhi - xlo, xy, xz], [0, yhi - ylo, yz], - [0, 0, zhi - zlo]]) + xlo, xhi, box_xy, ylo, yhi, box_xz, zlo, zhi, box_yz = cell_params + super_cell = np.array([ + [xhi - xlo, box_xy, box_xz], + [0, yhi - ylo, box_yz], + [0, 0, zhi - zlo], + ]) cell = super_cell.T if np.linalg.det(cell) < 0: cell = -1.0 * cell volume = np.linalg.det(cell) - xx, yy, zz, xy, xz, yz = stress_params - stress = np.array([[xx, xy, xz], [xy, yy, yz], [xz, yz, zz]], dtype=float) + box_xx, box_yy, box_zz, box_xy, box_xz, box_yz = stress_params + stress = np.array([ + [box_xx, box_xy, box_xz], + [box_xy, box_yy, box_yz], + [box_xz, box_yz, box_zz], + ], + dtype=float) stress = -stress / volume # to get stress in units of pressure return { @@ -204,6 +216,20 @@ def get_units_dict(style, quantities, suffix='_units'): def convert_units(value, style, unit_type, out_units): + """Convert the units of the system from one set to another. + + :param value: value to be converted + :type value: float + :param style: LAMMPS unit style name + :type style: str + :param unit_type: what kind of unit is being converted + :type unit_type: str + :param out_units: what kind of units one wants to have after conversion + :type out_units: str + :raises NotImplementedError: if the type of unit to be converted is not "time" + :return: converted unit to the new unit type + :rtype: float + """ conversion = { 'seconds': 1, 'milliseconds': 1e-3, @@ -220,7 +246,13 @@ def convert_units(value, style, unit_type, out_units): def parse_quasiparticle_data(qp_file): - import yaml + """[summary] + + :param qp_file: [description] + :type qp_file: [type] + :return: [description] + :rtype: [type] + """ with open(qp_file, 'r') as handle: quasiparticle_data = yaml.load(handle) @@ -233,7 +265,14 @@ def parse_quasiparticle_data(qp_file): def parse_dynaphopy_output(file): + """[summary] + :param file: [description] + :type file: [type] + :return: [description] + :rtype: [type] + """ + # pylint: disable=too-many-locals thermal_properties = None with open(file, 'r') as handle: @@ -243,16 +282,17 @@ def parse_dynaphopy_output(file): q_points = [] for i, line in enumerate(data_lines): if 'Q-point' in line: - # print i, np.array(line.replace(']', '').replace('[', '').split()[4:8], dtype=float) indices.append(i) q_points.append( - np.array(line.replace(']', '').replace('[', '').split()[4:8], - dtype=float)) + np.array( + line.replace(']', '').replace('[', '').split()[4:8], + dtype=float, + )) indices.append(len(data_lines)) phonons = {} - for i, index in enumerate(indices[:-1]): + for i, _ in enumerate(indices[:-1]): fragment = data_lines[indices[i]:indices[i + 1]] if 'kipped' in fragment: @@ -271,7 +311,7 @@ def parse_dynaphopy_output(file): if 'Thermal' in line: free_energy = float(fragment[j + 4].split()[4]) entropy = float(fragment[j + 5].split()[3]) - cv = float(fragment[j + 6].split()[3]) + specific_heat = float(fragment[j + 6].split()[3]) total_energy = float(fragment[j + 7].split()[4]) temperature = float(fragment[j].split()[5].replace('(', '')) @@ -280,7 +320,7 @@ def parse_dynaphopy_output(file): 'temperature': temperature, 'free_energy': free_energy, 'entropy': entropy, - 'cv': cv, + 'cv': specific_heat, 'total_energy': total_energy, } diff --git a/aiida_lammps/common/reaxff_convert.py b/aiida_lammps/common/reaxff_convert.py index a04a875..0f424e9 100644 --- a/aiida_lammps/common/reaxff_convert.py +++ b/aiida_lammps/common/reaxff_convert.py @@ -1,6 +1,6 @@ """Module for parsing REAXFF input files. -Note: this module is copied directly from aiida-crystal17 v0.10.0b5 +.. note:: this module is copied directly from aiida-crystal17 v0.10.0b5 """ import copy import re diff --git a/aiida_lammps/common/utils.py b/aiida_lammps/common/utils.py index fc0cdc9..fdb5c47 100644 --- a/aiida_lammps/common/utils.py +++ b/aiida_lammps/common/utils.py @@ -1,3 +1,9 @@ +"""[summary] + +:raises KeyError: [description] +:return: [description] +:rtype: [type] +""" from datetime import datetime from dateutil.parser import parse as get_date @@ -48,7 +54,6 @@ def get_path(dct, path, default=None, raise_error=True): if not isinstance(subdct, dict) or key not in subdct: if raise_error: raise KeyError(f'path does not exist in dct: {path[0:i + 1]}') - else: - return default + return default subdct = subdct[key] return subdct diff --git a/aiida_lammps/data/lammps_potential.py b/aiida_lammps/data/lammps_potential.py index f5fb97c..d62ef85 100644 --- a/aiida_lammps/data/lammps_potential.py +++ b/aiida_lammps/data/lammps_potential.py @@ -31,7 +31,7 @@ class written by Sebaastian Huber. from aiida.common.files import md5_from_filelike -class LammpsPotentialData(orm.SinglefileData): # pylint: disable=too-many-arguments, too-many-ancestors +class LammpsPotentialData(orm.SinglefileData): """ Base class for the LAMMPS potentials. @@ -51,6 +51,7 @@ class written by Sebaastian Huber. to track and as compatible as possible to the KIM schema. """ # pylint: disable=line-too-long + # pylint: disable=too-many-arguments, too-many-ancestors _key_element = 'element' _key_md5 = 'md5' @@ -111,7 +112,7 @@ def get_or_create( atom_style: str = None, units: str = None, extra_tags: dict = None, - ): # pylint: disable=too-many-arguments + ): """Get lammps potential data node from database or create a new one. This will check if there is a potential data node with matching md5 @@ -138,6 +139,7 @@ def get_or_create( instance or binary stream. :raises FileNotFoundError: if the source is a filepath but does not exist. """ + # pylint: disable=too-many-arguments source = cls.prepare_source(source) query = orm.QueryBuilder() @@ -344,7 +346,7 @@ def set_file( units: str = None, extra_tags: dict = None, **kwargs, - ): # pylint: disable=too-many-arguments + ): """Set the file content. .. note:: this method will first analyse the type of the ``source`` @@ -382,6 +384,8 @@ def set_file( instance or binary stream. :raises FileNotFoundError: if the source is a filepath but does not exist. """ + # pylint: disable=too-many-arguments + source = self.prepare_source(source) if self.pair_style is not None and pair_style is None: diff --git a/aiida_lammps/data/potential.py b/aiida_lammps/data/potential.py index 4e7caba..8331028 100644 --- a/aiida_lammps/data/potential.py +++ b/aiida_lammps/data/potential.py @@ -1,3 +1,10 @@ +"""[summary] + +:raises ValueError: [description] +:raises ValueError: [description] +:return: [description] +:rtype: [type] +""" from hashlib import md5 from io import StringIO @@ -15,13 +22,25 @@ class EmpiricalPotential(Data): @classmethod def list_types(cls): + """[summary] + + :return: [description] + :rtype: [type] + """ return get_entry_point_names(cls.entry_name) @classmethod def load_type(cls, entry_name): + """[summary] + + :param entry_name: [description] + :type entry_name: [type] + :return: [description] + :rtype: [type] + """ return load_entry_point(cls.entry_name, entry_name) - def __init__(self, type, data=None, **kwargs): + def __init__(self, potential_type, data=None, **kwargs): """Empirical potential data, used to create LAMMPS input files. Parameters @@ -32,8 +51,8 @@ def __init__(self, type, data=None, **kwargs): data required to create the potential file and input lines """ - super(EmpiricalPotential, self).__init__(**kwargs) - self.set_data(type, data) + super().__init__(**kwargs) + self.set_data(potential_type, data) def set_data(self, potential_type, data=None): """Store the potential type (e.g. Tersoff, EAM, LJ, ..).""" diff --git a/aiida_lammps/data/trajectory.py b/aiida_lammps/data/trajectory.py index 3c57212..8eac628 100644 --- a/aiida_lammps/data/trajectory.py +++ b/aiida_lammps/data/trajectory.py @@ -1,8 +1,15 @@ +""" +Data structure for storing LAMMPS trajectories. + +The idea is that each of the steps of the simulation are stored as ZIP files +which can then be easily accessed by the user. +""" import io import tempfile from zipfile import ZIP_DEFLATED, ZipFile -from aiida.orm import Data +from aiida import orm +from aiida.common.exceptions import ValidationError from aiida_lammps.common.parse_trajectory import ( create_structure, @@ -11,7 +18,7 @@ ) -class LammpsTrajectory(Data): +class LammpsTrajectory(orm.Data): """Store a lammps trajectory file. Each trajectory step is stored as a separate file, within a compressed zip folder. @@ -20,23 +27,21 @@ class LammpsTrajectory(Data): """ _zip_prefix = 'step-' - _traj_filename = 'trajectory.zip' + _trajectory_filename = 'trajectory.zip' _timestep_filename = 'timesteps.txt' _compression_method = ZIP_DEFLATED def __init__(self, fileobj=None, aliases=None, **kwargs): """Store a lammps trajectory file. - Parameters - ---------- - fileobj : str or file-like - the file or path to the file - aliases : dict[str, list] or None - mapping of variable names to one or more lammps variables, - e.g. {"position": ["x", "y", "z"]} - + :param fileobj: the file or path to the file, defaults to None + :type fileobj: str, optional + :param aliases: mapping of variable names to one or more lammps variables, + e.g. {"position": ["x", "y", "z"]}, defaults to None + :type aliases: dict[str, list], optional """ - super(LammpsTrajectory, self).__init__(**kwargs) + + super().__init__(**kwargs) if fileobj is not None: if isinstance(fileobj, str): @@ -47,23 +52,25 @@ def __init__(self, fileobj=None, aliases=None, **kwargs): def _validate(self): """Validate that a trajectory has been set, before storing.""" - from aiida.common.exceptions import ValidationError - super(LammpsTrajectory, self)._validate() + super()._validate() if self.get_attribute('number_steps', None) is None: raise ValidationError('trajectory has not yet been set') def set_from_fileobj(self, fileobj, aliases=None): """Store a lammps trajectory file. - Parameters - ---------- - fileobj : file-like - aliases : dict[str, list] or None - mapping of variable names to one or more lammps variables, - e.g. {"position": ["x", "y", "z"]} - + :param fileobj: the file or path to the file + :type fileobj: str + :param aliases: mapping of variable names to one or more lammps variables, + e.g. {"position": ["x", "y", "z"]}, defaults to None + :type aliases: dict[str, list], optional + :raises ValueError: if the aliases are not of the correct type + :raises IOError: if a given step has more atoms than supposed to + :raises IOError: if a given step has incompatible field names + :raises IOError: if the timesteps are not present in the trajectory file """ + time_steps = [] elements = set() field_names = None @@ -76,32 +83,35 @@ def set_from_fileobj(self, fileobj, aliases=None): # Write the zip to a temporary file, and then add it to the node repository with tempfile.NamedTemporaryFile() as temp_handle: - with ZipFile(temp_handle, 'w', - self._compression_method) as zip_file: - for step_id, traj_step in enumerate( + with ZipFile( + temp_handle, + 'w', + self._compression_method, + ) as zip_file: + for step_id, trajectory_step in enumerate( iter_trajectories(fileobj)): # extract data to store in attributes - time_steps.append(traj_step.timestep) + time_steps.append(trajectory_step.timestep) if number_atoms is None: - number_atoms = traj_step.natoms - elif traj_step.natoms != number_atoms: + number_atoms = trajectory_step.natoms + elif trajectory_step.natoms != number_atoms: raise IOError( - 'step {} contains different number of atoms: {}'. - format(step_id, traj_step.natoms)) + f'step {step_id} contains different number of' + f' atoms: {trajectory_step.natoms}') if field_names is None: - field_names = list(traj_step.atom_fields.keys()) - elif field_names != list(traj_step.atom_fields.keys()): + field_names = list(trajectory_step.atom_fields.keys()) + elif field_names != list( + trajectory_step.atom_fields.keys()): raise IOError( - 'step {} contains different field names: {}'. - format(step_id, - list(traj_step.atom_fields.keys()))) - if 'element' in traj_step.atom_fields: - elements.update(traj_step.atom_fields['element']) + f'step {step_id} contains different field names:' + f' {list(trajectory_step.atom_fields.keys())}') + if 'element' in trajectory_step.atom_fields: + elements.update(trajectory_step.atom_fields['element']) # save content - content = '\n'.join(traj_step.lines) - zip_name = '{}{}'.format(self._zip_prefix, step_id) + content = '\n'.join(trajectory_step.lines) + zip_name = f'{self._zip_prefix}{step_id}' zip_file.writestr(zip_name, content) if not time_steps: @@ -113,19 +123,20 @@ def set_from_fileobj(self, fileobj, aliases=None): temp_handle.flush() temp_handle.seek(0) - self.put_object_from_filelike(temp_handle, - self._traj_filename, - mode='wb', - encoding=None) + self.put_object_from_filelike( + temp_handle, + self._trajectory_filename, + ) self.put_object_from_filelike( io.StringIO(' '.join([str(t) for t in time_steps])), - self._timestep_filename) + self._timestep_filename, + ) self.set_attribute('number_steps', len(time_steps)) self.set_attribute('number_atoms', number_atoms) self.set_attribute('field_names', list(sorted(field_names))) - self.set_attribute('traj_filename', self._traj_filename) + self.set_attribute('trajectory_filename', self._trajectory_filename) self.set_attribute('timestep_filename', self._timestep_filename) self.set_attribute('zip_prefix', self._zip_prefix) self.set_attribute('compression_method', self._compression_method) @@ -134,34 +145,64 @@ def set_from_fileobj(self, fileobj, aliases=None): @property def number_steps(self): + """Get the number of steps stored in the data. + + :return: number of steps stored in the data + :rtype: int + """ return self.get_attribute('number_steps') @property def time_steps(self): + """Get the simulation time steps stored in the data. + + :return: time steps stored in the data. + :rtype: list + """ with self.open(self.get_attribute('timestep_filename'), 'r') as handle: output = [int(i) for i in handle.readline().split()] return output @property def number_atoms(self): + """Get the number of atoms present in the simulation box. + + :return: number of atoms in the simulation box + :rtype: int + """ return self.get_attribute('number_atoms') @property def field_names(self): + """Get the name of the fields as written to file. + + :return: list of field names as written to file. + :rtype: list + """ return self.get_attribute('field_names') @property def aliases(self): + """Get the mapping of one or more lammps variables. + + :return: mapping of one or more lammps variables. + :rtype: list + """ return self.get_attribute('aliases') def get_step_string(self, step_idx): """Return the content string, for a specific trajectory step.""" step_idx = list(range(self.number_steps))[step_idx] - zip_name = '{}{}'.format(self.get_attribute('zip_prefix'), step_idx) - with self.open(self.get_attribute('traj_filename'), - mode='rb') as handle: - with ZipFile(handle, 'r', - self.get_attribute('compression_method')) as zip_file: + zip_name = f'{self.get_attribute("zip_prefix")}{step_idx}' + with self.open( + self.get_attribute('trajectory_filename'), + mode='rb', + ) as handle: + with ZipFile( + handle, + 'r', + self.get_attribute('compression_method'), + ) as zip_file: with zip_file.open(zip_name, 'r') as step_file: content = step_file.read() return content.decode('utf8') @@ -178,41 +219,45 @@ def iter_step_strings(self, steps=None): elif isinstance(steps, int): steps = range(0, self.number_steps, steps) - with self.open(self.get_attribute('traj_filename'), - mode='rb') as handle: - with ZipFile(handle, 'r', - self.get_attribute('compression_method')) as zip_file: + with self.open( + self.get_attribute('trajectory_filename'), + mode='rb', + ) as handle: + with ZipFile( + handle, + 'r', + self.get_attribute('compression_method'), + ) as zip_file: for step_idx in steps: - zip_name = '{}{}'.format(self.get_attribute('zip_prefix'), - step_idx) + zip_name = f'{self.get_attribute("zip_prefix")}{step_idx}' with zip_file.open(zip_name) as step_file: content = step_file.read() yield content def get_step_structure( - self, - step_idx, - symbol_field='element', - position_fields=('x', 'y', 'z'), - original_structure=None, - ): + self, + step_idx: int, + symbol_field: str = 'element', + position_fields: tuple = ('x', 'y', 'z'), + original_structure: orm.StructureData = None, + ) -> orm.StructureData: """Return a StructureData object, for a specific trajectory step. - Parameters - ---------- - step_idx : int - symbol_field : str - the variable field denoting the symbol for each atom - position_fields : tuple, optional - the variable fields denoting the x, y, z position for each atom - original_structure : aiida.orm.StructureData or None - a structure that will be used to define kinds for each atom - - Returns - ------- - aiida.orm.StructureData - + :param step_idx: trajectory step to be looked at + :type step_idx: int + :param symbol_field: the variable field denoting the symbol + for each atom, defaults to 'element' + :type symbol_field: str, optional + :param position_fields: tuple, the variable fields denoting + the x, y, z position for each atom, defaults to ('x', 'y', 'z') + :type position_fields: tuple, optional + :param original_structure: a structure that will be used to + define kinds for each atom, defaults to None + :type original_structure: orm.StructureData, optional + :return: structure of the simulation at the given time step + :rtype: orm.StructureData """ + data = self.get_step_data(step_idx) return create_structure( data, @@ -223,6 +268,7 @@ def get_step_structure( def write_as_lammps(self, handle, steps=None): """Write out the lammps trajectory to file. + :param handle: a file handle, opened in "wb" mode :param steps: a list of steps to write (default to all) """ diff --git a/aiida_lammps/parsers/lammps/base.py b/aiida_lammps/parsers/lammps/base.py index 9a60e2f..db5c941 100644 --- a/aiida_lammps/parsers/lammps/base.py +++ b/aiida_lammps/parsers/lammps/base.py @@ -1,3 +1,8 @@ +"""[summary] + +:return: [description] +:rtype: [type] +""" from collections import namedtuple from fnmatch import fnmatch import os @@ -18,12 +23,14 @@ class LAMMPSBaseParser(Parser): """Abstract Base Parser for LAMMPS, supplying common methods.""" def __init__(self, node): """Initialize the parser.""" - super(LAMMPSBaseParser, self).__init__(node) - - def get_parsing_resources(self, - kwargs, - traj_in_temp=False, - sys_in_temp=True): + super().__init__(node) + + def get_parsing_resources( + self, + kwargs, + traj_in_temp=False, + sys_in_temp=True, + ): """Check that all resources, required for parsing, are present.""" # Check for retrieved folder try: @@ -99,8 +106,10 @@ def parse_log_file(self, compute_stress=False): output_filename = self.node.get_option('output_filename') output_txt = self.retrieved.get_object_content(output_filename) try: - output_data = read_log_file(output_txt, - compute_stress=compute_stress) + output_data = read_log_file( + output_txt, + compute_stress=compute_stress, + ) except Exception: traceback.print_exc() return None, self.exit_codes.ERROR_LOG_PARSING diff --git a/aiida_lammps/parsers/lammps/force.py b/aiida_lammps/parsers/lammps/force.py index ef60017..985e159 100644 --- a/aiida_lammps/parsers/lammps/force.py +++ b/aiida_lammps/parsers/lammps/force.py @@ -1,7 +1,9 @@ -from aiida.orm import ArrayData, Dict +"""[summary] + +""" import numpy as np +from aiida.orm import ArrayData, Dict -from aiida_lammps.common.parse_trajectory import TRAJ_BLOCK # noqa: F401 from aiida_lammps.common.parse_trajectory import iter_trajectories from aiida_lammps.common.raw_parsers import get_units_dict from aiida_lammps.parsers.lammps.base import LAMMPSBaseParser @@ -11,7 +13,7 @@ class ForceParser(LAMMPSBaseParser): """Parser for LAMMPS single point energy calculation.""" def __init__(self, node): """Initialize the instance of Force Lammps Parser.""" - super(ForceParser, self).__init__(node) + super().__init__(node) def parse(self, **kwargs): """Parse the retrieved files and store results.""" @@ -57,8 +59,19 @@ def parse(self, **kwargs): if not log_data.get('found_end', False): return self.exit_codes.ERROR_RUN_INCOMPLETE + return None def parse_traj_file(self, trajectory_filename): + """[summary] + + :param trajectory_filename: [description] + :type trajectory_filename: [type] + :raises IOError: [description] + :raises IOError: [description] + :raises IOError: [description] + :return: [description] + :rtype: [type] + """ with self.retrieved.open(trajectory_filename, 'r') as handle: traj_steps = list(iter_trajectories(handle)) if not traj_steps: diff --git a/aiida_lammps/parsers/lammps/md.py b/aiida_lammps/parsers/lammps/md.py index 737b9ce..d581f8f 100644 --- a/aiida_lammps/parsers/lammps/md.py +++ b/aiida_lammps/parsers/lammps/md.py @@ -1,3 +1,5 @@ +"""[summary] +""" import traceback from aiida.orm import ArrayData, Dict @@ -12,10 +14,11 @@ class MdParser(LAMMPSBaseParser): """Parser for LAMMPS MD calculations.""" def __init__(self, node): """Initialize the instance of Lammps MD Parser.""" - super(MdParser, self).__init__(node) + super().__init__(node) def parse(self, **kwargs): """Parse the retrieved folder and store results.""" + # pylint: disable=too-many-locals, too-many-branches # retrieve resources resources = self.get_parsing_resources(kwargs, traj_in_temp=True) if resources.exit_code is not None: @@ -89,3 +92,4 @@ def parse(self, **kwargs): if not log_data.get('found_end', False): return self.exit_codes.ERROR_RUN_INCOMPLETE + return None diff --git a/aiida_lammps/parsers/lammps/md_multi.py b/aiida_lammps/parsers/lammps/md_multi.py index 3e3eafb..570a016 100644 --- a/aiida_lammps/parsers/lammps/md_multi.py +++ b/aiida_lammps/parsers/lammps/md_multi.py @@ -1,3 +1,8 @@ +"""[summary] + +:return: [description] +:rtype: [type] +""" import io import os import re @@ -15,10 +20,11 @@ class MdMultiParser(LAMMPSBaseParser): """Parser for LAMMPS MDMulti calculations.""" def __init__(self, node): """Initialize the instance of Lammps MD Parser.""" - super(MdMultiParser, self).__init__(node) + super().__init__(node) def parse(self, **kwargs): """Parse the retrieved folder and store results.""" + # pylint: disable= too-many-locals, too-many-branches, too-many-statements, too-many-return-statements # retrieve resources resources = self.get_parsing_resources(kwargs, traj_in_temp=True) if resources.exit_code is not None: @@ -116,3 +122,4 @@ def parse(self, **kwargs): if not log_data.get('found_end', False): return self.exit_codes.ERROR_RUN_INCOMPLETE + return None diff --git a/aiida_lammps/parsers/lammps/optimize.py b/aiida_lammps/parsers/lammps/optimize.py index fac2f8b..19635d9 100644 --- a/aiida_lammps/parsers/lammps/optimize.py +++ b/aiida_lammps/parsers/lammps/optimize.py @@ -1,3 +1,8 @@ +"""[summary] + +:return: [description] +:rtype: [type] +""" import traceback from aiida.orm import Dict @@ -11,7 +16,7 @@ class OptimizeParser(LAMMPSBaseParser): """Parser for LAMMPS optimization calculation.""" def __init__(self, node): """Initialize the instance of Optimize Lammps Parser.""" - super(OptimizeParser, self).__init__(node) + super().__init__(node) def parse(self, **kwargs): """Parses the datafolder, stores results.""" @@ -31,8 +36,7 @@ def parse(self, **kwargs): trajectory_data = LammpsTrajectory( resources.traj_paths[0], aliases={ - 'stresses': - ['c_stpa[{}]'.format(i + 1) for i in range(6)], + 'stresses': [f'c_stpa[{i+1}]' for i in range(6)], 'forces': ['fx', 'fy', 'fz'], }, ) @@ -71,3 +75,4 @@ def parse(self, **kwargs): if not log_data.get('found_end', False): return self.exit_codes.ERROR_RUN_INCOMPLETE + return None diff --git a/aiida_lammps/utils.py b/aiida_lammps/utils.py index 549c0bf..3ad694a 100644 --- a/aiida_lammps/utils.py +++ b/aiida_lammps/utils.py @@ -1,16 +1,17 @@ +"""[summary] +""" +from aiida import __version__ as aiida_version_ +from packaging import version + + def aiida_version(): """get the version of aiida in use :returns: packaging.version.Version """ - from aiida import __version__ as aiida_version_ - from packaging import version - return version.parse(aiida_version_) def cmp_version(string): """convert a version string to a packaging.version.Version""" - from packaging import version - return version.parse(string) diff --git a/docs/source/conf.py b/docs/source/conf.py index a86c117..bb8cc60 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -6,10 +6,10 @@ """ from aiida_lammps import __version__ -project = 'AiiDA LAMMPS' -copyright = '2021, AiiDA Team' -author = 'AiiDA Team' -version = __version__ +PROJECT = 'AiiDA LAMMPS' +COPYRIGHT = '2021, AiiDA Team' +AUTHOR = 'AiiDA Team' +VERSION = __version__ extensions = [ # read Markdown files @@ -18,9 +18,9 @@ 'sphinx_external_toc', ] -html_theme = 'furo' -html_title = f'v{__version__}' -html_logo = 'static/logo.png' +HTML_THEME = 'furo' +HTML_TITLE = f'v{__version__}' +HTML_LOGO = 'static/logo.png' html_theme_options = { 'announcement': 'This documentation is in development!', } From 9b22f21e453c1533789f7513ef4c5de78d6cbcb3 Mon Sep 17 00:00:00 2001 From: Jonathan Chico Date: Wed, 1 Dec 2021 16:58:08 +0100 Subject: [PATCH 21/70] (WIP) Fixing the format and docstrings so that they follow the pylint standard. --- .pre-commit-config.yaml | 6 +- aiida_lammps/__init__.py | 1 + aiida_lammps/calculations/dynaphopy.py | 48 +++--- aiida_lammps/calculations/lammps/__init__.py | 138 +++++++++++++++--- aiida_lammps/calculations/lammps/combinate.py | 44 ++++-- aiida_lammps/calculations/lammps/force.py | 3 +- aiida_lammps/calculations/lammps/md.py | 16 +- aiida_lammps/calculations/lammps/md_multi.py | 32 ++-- aiida_lammps/calculations/lammps/optimize.py | 2 +- aiida_lammps/common/raw_parsers.py | 26 ++-- aiida_lammps/common/reaxff_convert.py | 29 ++-- aiida_lammps/data/pot_plugins/base_plugin.py | 13 +- aiida_lammps/data/pot_plugins/eam.py | 4 +- .../data/pot_plugins/lennard_jones.py | 6 +- aiida_lammps/data/pot_plugins/reaxff.py | 35 ++++- aiida_lammps/data/pot_plugins/tersoff.py | 6 +- aiida_lammps/parsers/dynaphopy.py | 25 ++-- aiida_lammps/parsers/lammps/base.py | 6 +- aiida_lammps/parsers/lammps/force.py | 25 ++-- aiida_lammps/parsers/lammps/md.py | 9 +- aiida_lammps/parsers/lammps/md_multi.py | 7 +- aiida_lammps/parsers/lammps/optimize.py | 5 +- aiida_lammps/validation/utils.py | 2 +- conftest.py | 62 +++++--- setup.py | 24 +-- 25 files changed, 392 insertions(+), 182 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index b3f9409..739e8d3 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -4,7 +4,8 @@ exclude: > (?x)^( aiida_lammps/tests/input_files/.*| - aiida_lammps/tests/.*txt + aiida_lammps/tests/.*txt| + aiida_lammps/tests/ )$ repos: @@ -36,5 +37,6 @@ repos: language: system exclude: | (?x)( - ^examples/ + ^examples/| + ^tests/ ) diff --git a/aiida_lammps/__init__.py b/aiida_lammps/__init__.py index 32a90a3..eca28f0 100644 --- a/aiida_lammps/__init__.py +++ b/aiida_lammps/__init__.py @@ -1 +1,2 @@ +"""AiiDA plugin for the LAMMPS code""" __version__ = '0.8.0' diff --git a/aiida_lammps/calculations/dynaphopy.py b/aiida_lammps/calculations/dynaphopy.py index b7cbe44..ea7063f 100644 --- a/aiida_lammps/calculations/dynaphopy.py +++ b/aiida_lammps/calculations/dynaphopy.py @@ -1,9 +1,11 @@ +"""Base dynaphopy calculation""" +# pylint: disable=too-many-instance-attributes, abstract-method from aiida.common.datastructures import CalcInfo, CodeInfo from aiida.common.exceptions import InputValidationError from aiida.common.utils import classproperty from aiida.engine import CalcJob from aiida.orm import ArrayData, StructureData, TrajectoryData -from aiida_phonopy.common.raw_parsers import get_force_constants, get_poscar_txt +from aiida_phonopy.common.raw_parsers import get_force_constants, get_poscar_txt # pylint: disable=no-name-in-module from aiida_lammps.common.generate_input_files import ( get_trajectory_txt, @@ -18,29 +20,31 @@ class DynaphopyCalculation(CalcJob): Requirement: the node should be able to import phonopy """ def _init_internal_params(self): + # pylint: disable=super-with-arguments super(DynaphopyCalculation, self)._init_internal_params() - self._INPUT_FILE_NAME = 'input_dynaphopy' - self._INPUT_TRAJECTORY = 'trajectory' - self._INPUT_CELL = 'POSCAR' - self._INPUT_FORCE_CONSTANTS = 'FORCE_CONSTANTS' + self._INPUT_FILE_NAME = 'input_dynaphopy' # pylint: disable=invalid-name, attribute-defined-outside-init + self._INPUT_TRAJECTORY = 'trajectory' # pylint: disable=invalid-name, attribute-defined-outside-init + self._INPUT_CELL = 'POSCAR' # pylint: disable=invalid-name, attribute-defined-outside-init + self._INPUT_FORCE_CONSTANTS = 'FORCE_CONSTANTS' # pylint: disable=invalid-name, attribute-defined-outside-init - self._OUTPUT_FORCE_CONSTANTS = 'FORCE_CONSTANTS_OUT' - self._OUTPUT_FILE_NAME = 'OUTPUT' - self._OUTPUT_QUASIPARTICLES = 'quasiparticles_data.yaml' + self._OUTPUT_FORCE_CONSTANTS = 'FORCE_CONSTANTS_OUT' # pylint: disable=invalid-name, attribute-defined-outside-init + self._OUTPUT_FILE_NAME = 'OUTPUT' # pylint: disable=invalid-name, attribute-defined-outside-init + self._OUTPUT_QUASIPARTICLES = 'quasiparticles_data.yaml' # pylint: disable=invalid-name, attribute-defined-outside-init - self._default_parser = 'dynaphopy' + self._default_parser = 'dynaphopy' # pylint: disable=attribute-defined-outside-init @classproperty def _use_methods(cls): """ Additional use_* methods for the namelists class. """ - retdict = JobCalculation._use_methods + # pylint: disable=no-self-argument, no-self-use + retdict = JobCalculation._use_methods # pylint: disable=protected-access, undefined-variable retdict.update({ 'parameters': { 'valid_types': - ParameterData, + ParameterData, # pylint: disable=undefined-variable 'additional_parameter': None, 'linkname': @@ -87,41 +91,43 @@ def _prepare_for_submission(self, tempfolder, inputdict): :param inputdict: a dictionary with the input nodes, as they would be returned by get_inputdata_dict (without the Code!) """ - + # pylint: disable=too-many-locals, too-many-statements try: parameters_data = inputdict.pop(self.get_linkname('parameters')) except KeyError: pass # raise InputValidationError("No parameters specified for this " # "calculation") - if not isinstance(parameters_data, ParameterData): + if not isinstance(parameters_data, ParameterData): # pylint: disable=undefined-variable raise InputValidationError('parameters is not of type ' 'ParameterData') try: structure = inputdict.pop(self.get_linkname('structure')) - except KeyError: + except KeyError as key_error: raise InputValidationError( - 'no structure is specified for this calculation') + 'no structure is specified for this calculation' + ) from key_error try: trajectory = inputdict.pop(self.get_linkname('trajectory')) - except KeyError: + except KeyError as key_error: raise InputValidationError( - 'trajectory is specified for this calculation') + 'trajectory is specified for this calculation') from key_error try: force_constants = inputdict.pop( self.get_linkname('force_constants')) - except KeyError: + except KeyError as key_error: raise InputValidationError( - 'no force_constants is specified for this calculation') + 'no force_constants is specified for this calculation' + ) from key_error try: code = inputdict.pop(self.get_linkname('code')) - except KeyError: + except KeyError as key_error: raise InputValidationError( - 'no code is specified for this calculation') + 'no code is specified for this calculation') from key_error time_step = trajectory.get_times()[1] - trajectory.get_times()[0] diff --git a/aiida_lammps/calculations/lammps/__init__.py b/aiida_lammps/calculations/lammps/__init__.py index 439a8fa..a493e7e 100644 --- a/aiida_lammps/calculations/lammps/__init__.py +++ b/aiida_lammps/calculations/lammps/__init__.py @@ -1,17 +1,32 @@ +"""Base LAMMPS calculation for AiiDA. +""" +# pylint: disable=duplicate-code +import itertools +import numpy as np from aiida.common import CalcInfo, CodeInfo from aiida.common.exceptions import ValidationError from aiida.engine import CalcJob +from aiida import orm from aiida.orm import Dict, StructureData from aiida.plugins import DataFactory -import numpy as np from aiida_lammps.common.generate_structure import generate_lammps_structure from aiida_lammps.data.potential import EmpiricalPotential -def get_supercell(structure, supercell_shape): - import itertools +def get_supercell( + structure: orm.StructureData, + supercell_shape: orm.Dict, +) -> orm.StructureData: + """Generate a supercell from a given StructureData + :param structure: original structure that will be used to generate the supercell + :type structure: orm.StructureData + :param supercell_shape: dictionary with the supercell information + :type supercell_shape: orm.Dict + :return: generated supercell + :rtype: orm.StructureData + """ symbols = np.array([site.kind_name for site in structure.sites]) positions = np.array([site.position for site in structure.sites]) cell = np.array(structure.cell) @@ -21,16 +36,23 @@ def get_supercell(structure, supercell_shape): supercell = StructureData(cell=supercell_array) for k in range(positions.shape[0]): - for r in itertools.product(*[range(i) for i in supercell_shape[::-1]]): - position = positions[k, :] + np.dot(np.array(r[::-1]), cell) + for entry in itertools.product( + *[range(i) for i in supercell_shape[::-1]]): + position = positions[k, :] + np.dot(np.array(entry[::-1]), cell) symbol = symbols[k] supercell.append_atom(position=position, symbols=symbol) return supercell -def get_force_constants(force_constants): +def get_force_constants(force_constants: orm.ArrayData) -> str: + """Get the force constants in text format + :param force_constants: Array with the information needed for the force constants + :type force_constants: orm.ArrayData + :return: force constants in text + :rtype: str + """ force_constants = force_constants.get_array('force_constants') fc_shape = force_constants.shape @@ -44,10 +66,18 @@ def get_force_constants(force_constants): return fc_txt -def structure_to_poscar(structure): +def structure_to_poscar(structure: orm.StructureData) -> str: + """Write the structure into a POSCAR - atom_type_unique = np.unique([site.kind_name for site in structure.sites], - return_index=True)[1] + :param structure: structure used for the simulation + :type structure: orm.StructureData + :return: POSCAR format for the structure + :rtype: str + """ + atom_type_unique = np.unique( + [site.kind_name for site in structure.sites], + return_index=True, + )[1] labels = np.diff(np.append(atom_type_unique, [len(structure.sites)])) poscar = ' '.join(np.unique([site.kind_name for site in structure.sites])) @@ -66,8 +96,14 @@ def structure_to_poscar(structure): return poscar -def parameters_to_input_file(parameters_object): +def parameters_to_input_file(parameters_object: dict) -> str: + """Write input file for dynaphopy from the input parameters. + :param parameters_object: input parameters for the dynaphopy calculation + :type parameters_object: dict + :return: input file in string format for dynaphopy + :rtype: str + """ parameters = parameters_object.get_dict() input_file = 'STRUCTURE FILE POSCAR\nPOSCAR\n\n' input_file += 'FORCE CONSTANTS\nFORCE_CONSTANTS\n\n' @@ -106,14 +142,22 @@ class BaseLammpsCalculation(CalcJob): @classmethod def define(cls, spec): super(BaseLammpsCalculation, cls).define(spec) - spec.input('structure', valid_type=StructureData, help='the structure') - spec.input('potential', - valid_type=EmpiricalPotential, - help='lammps potential') - spec.input('parameters', - valid_type=Dict, - help='the parameters', - required=False) + spec.input( + 'structure', + valid_type=StructureData, + help='the structure', + ) + spec.input( + 'potential', + valid_type=EmpiricalPotential, + help='lammps potential', + ) + spec.input( + 'parameters', + valid_type=Dict, + help='the parameters', + required=False, + ) spec.input( 'metadata.options.cell_transform_filename', valid_type=str, @@ -148,7 +192,8 @@ def define(cls, spec): ) spec.default_output_node = 'results' - # Unrecoverable errors: resources like the retrieved folder or its expected contents are missing + # Unrecoverable errors: resources like the retrieved folder or + # its expected contents are missing spec.exit_code( 200, 'ERROR_NO_RETRIEVED_FOLDER', @@ -181,7 +226,8 @@ def define(cls, spec): message='the stderr output file was not found', ) - # Unrecoverable errors: required retrieved files could not be read, parsed or are otherwise incomplete + # Unrecoverable errors: required retrieved files could not be read, + # parsed or are otherwise incomplete spec.exit_code( 300, 'ERROR_LOG_PARSING', @@ -215,13 +261,39 @@ def define(cls, spec): ) @staticmethod - def validate_parameters(param_data, potential_object): + def validate_parameters(param_data, potential_object) -> bool: + """Validate the input parameters against a schema. + + :param param_data: input parameters to be checked + :type param_data: [type] + :param potential_object: LAMMPS potential object + :type potential_object: [type] + :return: whether or not the input parameters are valid + :rtype: bool + """ + # pylint: disable=unused-argument return True - def prepare_extra_files(self, tempfolder, potential_object): + def prepare_extra_files(self, tempfolder, potential_object) -> bool: + """Check if extra files need to be prepared for the calculation + + :param tempfolder: temporary folder for the calculation files + :type tempfolder: [type] + :param potential_object: LAMMPS potential + :type potential_object: [type] + :return: whether or not extra files need to be prepared for the calculation + :rtype: bool + """ + # pylint: disable=no-self-use, unused-argument return True - def get_retrieve_lists(self): + def get_retrieve_lists(self) -> list: + """Get the list of files to be retrieved. + + :return: list of files that should be retrieved + :rtype: list + """ + # pylint: disable=no-self-use return [], [] @staticmethod @@ -234,6 +306,25 @@ def create_main_input_content( system_filename, restart_filename, ): + """Generate the main input file for the lammps simulation. + + :param parameter_data: [description] + :type parameter_data: [type] + :param potential_data: [description] + :type potential_data: [type] + :param kind_symbols: [description] + :type kind_symbols: [type] + :param structure_filename: [description] + :type structure_filename: [type] + :param trajectory_filename: [description] + :type trajectory_filename: [type] + :param system_filename: [description] + :type system_filename: [type] + :param restart_filename: [description] + :type restart_filename: [type] + :raises NotImplementedError: [description] + """ + # pylint: disable=no-self-use, too-many-arguments, unused-argument, duplicate-code raise NotImplementedError def prepare_for_submission(self, tempfolder): @@ -242,6 +333,7 @@ def prepare_for_submission(self, tempfolder): :param tempfolder: an `aiida.common.folders.Folder` to temporarily write files on disk :return: `aiida.common.CalcInfo` instance """ + # pylint: disable=too-many-locals, arguments-renamed # assert that the potential and structure have the same kind elements if self.inputs.potential.allowed_element_names is not None and not set( k.symbol for k in self.inputs.structure.kinds).issubset( diff --git a/aiida_lammps/calculations/lammps/combinate.py b/aiida_lammps/calculations/lammps/combinate.py index f8330bb..e4dc20a 100644 --- a/aiida_lammps/calculations/lammps/combinate.py +++ b/aiida_lammps/calculations/lammps/combinate.py @@ -1,5 +1,6 @@ +"""Combined MD and Phonopy calculation""" # Not working with Aiida 1.0 - +# pylint: disable=no-name-in-module from aiida.common.exceptions import InputValidationError from aiida.orm import ArrayData, Dict from aiida_phonopy.common.raw_parsers import ( @@ -14,12 +15,28 @@ def generate_dynaphopy_input( parameters_object, - poscar_name='POSCAR', - force_constants_name='FORCE_CONSTANTS', - force_sets_filename='FORCE_SETS', - use_sets=False, -): - + poscar_name: str = 'POSCAR', + force_constants_name: str = 'FORCE_CONSTANTS', + force_sets_filename: str = 'FORCE_SETS', + use_sets: bool = False, +) -> str: + """Generates the input needed for the dynaphopy calculation. + + :param parameters_object: input parameters dictionary + :type parameters_object: dict + :param poscar_name: name of the POSCAR file, defaults to 'POSCAR' + :type poscar_name: str, optional + :param force_constants_name: name of the file with the force constants, + defaults to 'FORCE_CONSTANTS' + :type force_constants_name: str, optional + :param force_sets_filename: name of the file with the force sets, + defaults to 'FORCE_SETS' + :type force_sets_filename: str, optional + :param use_sets: whether or not to use the force sets, defaults to False + :type use_sets: bool, optional + :return: dynaphopy input file + :rtype: str + """ parameters = parameters_object.get_dict() input_file = 'STRUCTURE FILE POSCAR\n{}\n\n'.format(poscar_name) @@ -43,6 +60,7 @@ def generate_dynaphopy_input( class CombinateCalculation(BaseLammpsCalculation): + """Combined MD and Phonopy calculation""" _POSCAR_NAME = 'POSCAR' _INPUT_FORCE_CONSTANTS = 'FORCE_CONSTANTS' @@ -52,7 +70,8 @@ class CombinateCalculation(BaseLammpsCalculation): _OUTPUT_QUASIPARTICLES = 'quasiparticles_data.yaml' _OUTPUT_FILE_NAME = 'OUTPUT' - # self._retrieve_list = [self._OUTPUT_QUASIPARTICLES, self._OUTPUT_FORCE_CONSTANTS, self._OUTPUT_FILE_NAME] + # self._retrieve_list = [self._OUTPUT_QUASIPARTICLES, + # self._OUTPUT_FORCE_CONSTANTS, self._OUTPUT_FILE_NAME] @classmethod def define(cls, spec): @@ -84,7 +103,7 @@ def create_main_input_content( system_filename, restart_filename, ): - + # pylint: disable=too-many-arguments, arguments-renamed random_number = np.random.randint(10000000) lammps_input_file = 'units {0}\n'.format( @@ -113,7 +132,7 @@ def create_main_input_content( return lammps_input_file def prepare_extra_files(self, tempfolder, potential_object): - + # pylint: disable=too-many-locals if 'fore_constants' in self.inputs: force_constants = self.inputs.force_constants else: @@ -151,9 +170,10 @@ def prepare_extra_files(self, tempfolder, potential_object): try: parameters_data_dynaphopy = Dict.pop( self.get_linkname('parameters_dynaphopy')) - except KeyError: + except KeyError as key_error: raise InputValidationError( - 'No dynaphopy parameters specified for this calculation') + 'No dynaphopy parameters specified for this calculation' + ) from key_error parameters_dynaphopy_txt = generate_dynaphopy_input( parameters_data_dynaphopy, diff --git a/aiida_lammps/calculations/lammps/force.py b/aiida_lammps/calculations/lammps/force.py index fc1b26d..c78cb25 100644 --- a/aiida_lammps/calculations/lammps/force.py +++ b/aiida_lammps/calculations/lammps/force.py @@ -1,4 +1,5 @@ """Single point calculation of the energy in LAMMPS.""" +# pylint: disable=fixme, duplicate-code, useless-super-delegation from aiida.plugins import DataFactory from aiida_lammps.calculations.lammps import BaseLammpsCalculation @@ -102,7 +103,7 @@ def create_main_input_content( return lammps_input_file @staticmethod - def validate_parameters(param_data): + def validate_parameters(param_data, potential_object): """Validate the parameters for a force calculation. :param param_data: parameters for the LAMMPS force calculation diff --git a/aiida_lammps/calculations/lammps/md.py b/aiida_lammps/calculations/lammps/md.py index 3a00310..d6fcc50 100644 --- a/aiida_lammps/calculations/lammps/md.py +++ b/aiida_lammps/calculations/lammps/md.py @@ -1,3 +1,5 @@ +"""Single stage MD calculation in LAMMPS.""" +# pylint: disable=fixme, useless-super-delegation from aiida.common.exceptions import InputValidationError from aiida.plugins import DataFactory import numpy as np @@ -8,6 +10,7 @@ class MdCalculation(BaseLammpsCalculation): + """Calculation of a single MD stage in LAMMPS.""" @classmethod def define(cls, spec): super(MdCalculation, cls).define(spec) @@ -42,7 +45,7 @@ def create_main_input_content( system_filename, restart_filename, ): - + # pylint: disable=too-many-locals, too-many-arguments¸ too-many-branches, too-many-statements pdict = parameter_data.get_dict() version_date = convert_date_string( pdict.get('lammps_version', '11 Aug 2017')) @@ -150,12 +153,11 @@ def create_main_input_content( lammps_input_file += 'variable {0} equal {1}\n'.format( var_alias, var) if variables: - lammps_input_file += 'fix sys_info all print {0} "{1}" title "{2}" file {3} screen no\n'.format( - parameter_data.dict.dump_rate, - ' '.join(['${{{0}}}'.format(v) for v in var_aliases]), - ' '.join(var_aliases), - system_filename, - ) + lammps_input_file += 'fix sys_info all print' + lammps_input_file += f' {parameter_data.dict.dump_rate}' + lammps_input_file += f' "{" ".join(["${{{0}}}".format(v) for v in var_aliases])}"' + lammps_input_file += f' title "{" ".join(var_aliases)}"' + lammps_input_file += f' file {system_filename} screen no\n' lammps_input_file += 'run {}\n'.format( parameter_data.dict.total_steps) diff --git a/aiida_lammps/calculations/lammps/md_multi.py b/aiida_lammps/calculations/lammps/md_multi.py index 2499d1d..204bedb 100644 --- a/aiida_lammps/calculations/lammps/md_multi.py +++ b/aiida_lammps/calculations/lammps/md_multi.py @@ -1,3 +1,5 @@ +"""Run a multi-stage molecular dynamic simulation.""" +# pylint: disable=fixme from aiida.common.exceptions import InputValidationError from aiida.plugins import DataFactory @@ -43,6 +45,7 @@ def create_main_input_content( system_filename, restart_filename, ): + # pylint: disable=too-many-arguments, too-many-locals, too-many-branches, too-many-statements pdict = parameter_data.get_dict() version_date = convert_date_string( @@ -249,13 +252,16 @@ def get_retrieve_lists(self): ) -def sys_print_commands(variables, - dump_rate, - filename, - fix_name='sys_info', - append=True, - print_header=True): +def sys_print_commands( + variables, + dump_rate, + filename, + fix_name: str = 'sys_info', + append: bool = True, + print_header: bool = True, +): """Create commands to output required system variables to a file.""" + # pylint: disable=too-many-arguments commands = [] if not variables: @@ -288,10 +294,11 @@ def sys_ave_commands( ave_variables, dump_rate, filename, - fix_name='sys_info', - average_rate=None, + fix_name: str = 'sys_info', + average_rate: bool = None, ): """Create commands to output required system variables to a file.""" + # pylint: disable=too-many-arguments commands = [] if not (variables or ave_variables): @@ -350,8 +357,8 @@ def atom_info_commands( average_rate, filename, version_date, - dump_name='atom_info', - append=True, + dump_name: str = 'atom_info', + append: bool = True, ): """Create commands to output required atom variables to a file. @@ -374,6 +381,7 @@ def atom_info_commands( list[str] """ + # pylint: disable=too-many-arguments, too-many-locals, too-many-branches, unused-argument commands, computes, fixes = [], [], [] if atom_style == 'charge': @@ -396,12 +404,12 @@ def atom_info_commands( # work out which variables need to be computed avar_props = [ v for v in ave_variables - if not any([v.startswith(s) for s in ['c_', 'f_', 'v_']]) + if not any([v.startswith(s) for s in ['c_', 'f_', 'v_']]) # pylint: disable=use-a-generator ] avar_names = [] c_at_vars = 1 for ave_var in ave_variables: - if any([ave_var.startswith(s) for s in ['c_', 'f_', 'v_']]): + if any([ave_var.startswith(s) for s in ['c_', 'f_', 'v_']]): # pylint: disable=use-a-generator avar_names.append(ave_var) else: if len(avar_props) > 1: diff --git a/aiida_lammps/calculations/lammps/optimize.py b/aiida_lammps/calculations/lammps/optimize.py index 8e13311..956b6b7 100644 --- a/aiida_lammps/calculations/lammps/optimize.py +++ b/aiida_lammps/calculations/lammps/optimize.py @@ -1,7 +1,7 @@ """Class describing the calculation of the optimization of a structure using LAMMPS (minimize method). """ -# pylint: disable=fixme +# pylint: disable=fixme, duplicate-code, useless-super-delegation from aiida.common.exceptions import InputValidationError from aiida.plugins import DataFactory diff --git a/aiida_lammps/common/raw_parsers.py b/aiida_lammps/common/raw_parsers.py index 0b2fdad..9db570b 100644 --- a/aiida_lammps/common/raw_parsers.py +++ b/aiida_lammps/common/raw_parsers.py @@ -245,13 +245,13 @@ def convert_units(value, style, unit_type, out_units): return value * conversion[in_units] * (1.0 / conversion[out_units]) -def parse_quasiparticle_data(qp_file): - """[summary] +def parse_quasiparticle_data(qp_file: str) -> dict: + """Parse quasiparticle information from dynaphopy. - :param qp_file: [description] - :type qp_file: [type] - :return: [description] - :rtype: [type] + :param qp_file: file with the quasiparticle information + :type qp_file: str + :return: dictionary with the quasiparticle information + :rtype: dict """ with open(qp_file, 'r') as handle: @@ -264,18 +264,18 @@ def parse_quasiparticle_data(qp_file): return data_dict -def parse_dynaphopy_output(file): - """[summary] +def parse_dynaphopy_output(filename: str) -> dict: + """Parse output from a dynaphopy calculation. - :param file: [description] - :type file: [type] - :return: [description] - :rtype: [type] + :param filename: output file from the dynaphopy calculation. + :type file: str + :return: dictionary with the dynaphopy output + :rtype: dict """ # pylint: disable=too-many-locals thermal_properties = None - with open(file, 'r') as handle: + with open(filename, 'r') as handle: data_lines = handle.readlines() indices = [] diff --git a/aiida_lammps/common/reaxff_convert.py b/aiida_lammps/common/reaxff_convert.py index 0f424e9..1617edf 100644 --- a/aiida_lammps/common/reaxff_convert.py +++ b/aiida_lammps/common/reaxff_convert.py @@ -2,6 +2,7 @@ .. note:: this module is copied directly from aiida-crystal17 v0.10.0b5 """ +# pylint: disable=fixme import copy import re @@ -51,7 +52,8 @@ 'reaxff3_coa3', ) -# TODO some variables lammps sets as global are actually species dependant in GULP, how to handle these? +# TODO some variables lammps sets as global are actually species dependant +# in GULP, how to handle these? KEYS_1BODY = ( 'reaxff1_radii1', @@ -229,6 +231,7 @@ def read_lammps_format(lines, tolerances=None): - torsionprod: 1e-05 """ + # pylint: disable=too-many-locals, too-many-branches, too-many-statements output = { 'description': lines[0], 'global': {}, @@ -263,7 +266,7 @@ def read_lammps_format(lines, tolerances=None): num_species = int(lines[lineno].split()[0]) lineno += 3 idx = 1 - for i in range(num_species): + for _ in range(num_species): lineno += 1 symbol, values = lines[lineno].split(None, 1) if symbol == 'X': @@ -282,7 +285,7 @@ def read_lammps_format(lines, tolerances=None): 'number of values different than expected for species {0}, ' '{1} != {2}'.format(symbol, len(values), len(KEYS_1BODY))) - key_map = {k: v for k, v in zip(KEYS_1BODY, values)} + key_map = {k: v for k, v in zip(KEYS_1BODY, values)} # pylint: disable=unnecessary-comprehension key_map['reaxff1_lonepair1'] = 0.5 * (key_map['reaxff1_valence3'] - key_map['reaxff1_valence1']) @@ -308,7 +311,7 @@ def read_lammps_format(lines, tolerances=None): output['2body'][key_name] = { k: v - for k, v in zip(KEYS_2BODY_BONDS, values) + for k, v in zip(KEYS_2BODY_BONDS, values) # pylint: disable=unnecessary-comprehension } # two-body off-diagonal parameters @@ -329,7 +332,7 @@ def read_lammps_format(lines, tolerances=None): output['2body'].setdefault(key_name, {}).update( {k: v - for k, v in zip(KEYS_2BODY_OFFDIAG, values)}) + for k, v in zip(KEYS_2BODY_OFFDIAG, values)}) # pylint: disable=unnecessary-comprehension # three-body angle parameters num_lines = int(lines[lineno].split()[0]) @@ -350,7 +353,7 @@ def read_lammps_format(lines, tolerances=None): output['3body'].setdefault(key_name, {}).update( {k: v - for k, v in zip(KEYS_3BODY_ANGLES, values)}) + for k, v in zip(KEYS_3BODY_ANGLES, values)}) # pylint: disable=unnecessary-comprehension # four-body torsion parameters num_lines = int(lines[lineno].split()[0]) @@ -373,7 +376,7 @@ def read_lammps_format(lines, tolerances=None): output['4body'].setdefault(key_name, {}).update( {k: v - for k, v in zip(KEYS_4BODY_TORSION, values)}) + for k, v in zip(KEYS_4BODY_TORSION, values)}) # pylint: disable=unnecessary-comprehension # three-body h-bond parameters num_lines = int(lines[lineno].split()[0]) @@ -394,17 +397,25 @@ def read_lammps_format(lines, tolerances=None): output['3body'].setdefault(key_name, {}).update( {k: v - for k, v in zip(KEYS_3BODY_HBOND, values)}) + for k, v in zip(KEYS_3BODY_HBOND, values)}) # pylint: disable=unnecessary-comprehension return output def format_lammps_value(value): + """Set format for lammps value + + :param value: value to be formatted + :type value: float + :return: formatter value + :rtype: str + """ return '{:.4f}'.format(value) def write_lammps_format(data): """Write a reaxff file, in lammps format, from a standardised potential dictionary.""" + # pylint: disable=too-many-branches, too-many-statements # validate dictionary validate_against_schema(data, 'reaxff.schema.json') @@ -592,7 +603,7 @@ def filter_by_species(data, species): 'the filter set ({}) is not a subset of the available species ({})' .format(set(species), set(data['species']))) data = copy.deepcopy(data) - indices = set( + indices = set( # pylint: disable=consider-using-set-comprehension [str(i) for i, s in enumerate(data['species']) if s in species]) def convert_indices(key): diff --git a/aiida_lammps/data/pot_plugins/base_plugin.py b/aiida_lammps/data/pot_plugins/base_plugin.py index 2eb4616..7a9884e 100644 --- a/aiida_lammps/data/pot_plugins/base_plugin.py +++ b/aiida_lammps/data/pot_plugins/base_plugin.py @@ -1,3 +1,4 @@ +"""Abstract class for potential plugins.""" import abc @@ -10,6 +11,7 @@ def __init__(self, data): @abc.abstractmethod def validate_data(self, data): """Validate the input data.""" + # pylint: disable=unnecessary-pass pass @abc.abstractmethod @@ -25,6 +27,7 @@ def get_external_content(self): None or dict """ + # pylint: disable=unnecessary-pass pass @abc.abstractmethod @@ -42,22 +45,26 @@ def get_input_potential_lines(self, kind_elements=None): str """ + # pylint: disable=unnecessary-pass pass - @abc.abstractproperty + @property def default_units(self): """Return the default unit style to use.""" + # pylint: disable=unnecessary-pass pass - @abc.abstractproperty + @property def atom_style(self): """Return the atomic style to use.""" + # pylint: disable=unnecessary-pass pass - @abc.abstractproperty + @property def allowed_element_names(self): """Return the allowed element names. (used in ``pair_coeff`` to map atom types to elements). """ + # pylint: disable=unnecessary-pass pass diff --git a/aiida_lammps/data/pot_plugins/eam.py b/aiida_lammps/data/pot_plugins/eam.py index 218855d..caaaf42 100644 --- a/aiida_lammps/data/pot_plugins/eam.py +++ b/aiida_lammps/data/pot_plugins/eam.py @@ -1,3 +1,5 @@ +"""Class for creation of EAM potential inputs.""" +# pylint: disable=fixme from aiida_lammps.data.pot_plugins.base_plugin import PotentialAbstract @@ -23,7 +25,7 @@ def get_external_content(self): return {self.potential_fname: potential_file} - def get_input_potential_lines(self): + def get_input_potential_lines(self): # pylint: disable=arguments-differ lammps_input_text = 'pair_style eam/{}\n'.format( self.data['type']) diff --git a/aiida_lammps/data/pot_plugins/lennard_jones.py b/aiida_lammps/data/pot_plugins/lennard_jones.py index 93c3f26..2eee74c 100644 --- a/aiida_lammps/data/pot_plugins/lennard_jones.py +++ b/aiida_lammps/data/pot_plugins/lennard_jones.py @@ -1,5 +1,6 @@ +"""Class for creation of Lennard-Jones potential inputs.""" +# pylint: disable=fixme import numpy as np - from aiida_lammps.data.pot_plugins.base_plugin import PotentialAbstract @@ -7,12 +8,13 @@ class LennardJones(PotentialAbstract): """Class for creation of Lennard-Jones potential inputs.""" def validate_data(self, data): """Validate the input data.""" + # pylint: disable=unnecessary-pass pass def get_external_content(self): return None - def get_input_potential_lines(self): + def get_input_potential_lines(self): # pylint: disable=arguments-differ cut = np.max([float(i.split()[2]) for i in self.data.values()]) diff --git a/aiida_lammps/data/pot_plugins/reaxff.py b/aiida_lammps/data/pot_plugins/reaxff.py index 252e684..c9724e5 100644 --- a/aiida_lammps/data/pot_plugins/reaxff.py +++ b/aiida_lammps/data/pot_plugins/reaxff.py @@ -1,3 +1,5 @@ +"""Class for creation of ReaxFF potential inputs.""" +# pylint: disable=fixme from aiida_lammps.common.reaxff_convert import write_lammps_format from aiida_lammps.data.pot_plugins.base_plugin import PotentialAbstract from aiida_lammps.validation import validate_against_schema @@ -6,8 +8,8 @@ class Reaxff(PotentialAbstract): """Class for creation of ReaxFF potential inputs. - NOTE: to use c_reax[1] - c_reax[14], - c_reax[1] must be added to ``thermo_style custom``, to trigger the compute + .. note:: to use c_reax[1] - c_reax[14], + c_reax[1] must be added to ``thermo_style custom``, to trigger the compute The array values correspond to: @@ -36,15 +38,25 @@ def validate_data(self, data): validate_against_schema(data, 'reaxff.schema.json') def get_potential_file_content(self): + """Get the data from the potential file + + :return: reaxff potential file content + :rtype: str + """ if 'file_contents' in self.data: content = '' for line in self.data['file_contents']: - content += '{}'.format(line) + content += f'{line}' else: content = write_lammps_format(self.data) return content def get_control_file_content(self): + """Get the contents from the control file. + + :return: text information from the control file + :rtype: str + """ control = self.data.get('control', {}) global_dict = self.data.get('global', {}) content = [] @@ -58,7 +70,7 @@ def get_control_file_content(self): for key, name in tolerances.items(): if key in global_dict: - content.append('{} {}'.format(name, global_dict[key])) + content.append(f'{name} {global_dict[key]}') control_variables = [ 'simulation_name', @@ -71,7 +83,7 @@ def get_control_file_content(self): for name in control_variables: if name in control: - content.append('{} {}'.format(name, control[name])) + content.append(f'{name} {control[name]}') bool_to_int = { 'print_atom_info': 'atom_info', @@ -83,22 +95,31 @@ def get_control_file_content(self): for key, name in bool_to_int.items(): if key in control: - content.append('{} {}'.format(name, 1 if control[key] else 0)) + content.append(f'{name} {1 if control[key] else 0}') if content: return '\n'.join(content) return None def get_external_content(self): + """get information from extrenal sources + :return: dictionary with the potential file content and the control + file content + :rtype: dict + """ fmap = {self.potential_fname: self.get_potential_file_content()} content = self.get_control_file_content() if content: fmap[self.control_fname] = content return fmap - def get_input_potential_lines(self): + def get_input_potential_lines(self): # pylint: disable=arguments-differ + """Get the potential lines associated with the LAMMPS input file. + :return: lammps input text + :rtype: str + """ control = self.data.get('control', {}) lammps_input_text = 'pair_style reax/c {} '.format( diff --git a/aiida_lammps/data/pot_plugins/tersoff.py b/aiida_lammps/data/pot_plugins/tersoff.py index 5b8514c..62d3df4 100644 --- a/aiida_lammps/data/pot_plugins/tersoff.py +++ b/aiida_lammps/data/pot_plugins/tersoff.py @@ -1,3 +1,4 @@ +"""Class for creation of Tersoff potential inputs.""" from aiida_lammps.data.pot_plugins.base_plugin import PotentialAbstract @@ -8,17 +9,18 @@ class Tersoff(PotentialAbstract): def validate_data(self, data): """Validate the input data.""" + # pylint: disable=unnecessary-pass pass def get_external_content(self): potential_file = ('# Potential file generated by aiida plugin ' '(please check citation in the original file)\n') for key in sorted(self.data.keys()): - potential_file += '{} {}\n'.format(key, self.data[key]) + potential_file += f'{key} {self.data[key]}\n' return {self.potential_fname: potential_file} - def get_input_potential_lines(self): + def get_input_potential_lines(self): # pylint: disable=arguments-differ lammps_input_text = 'pair_style tersoff\n' lammps_input_text += 'pair_coeff * * {} {{kind_symbols}}\n'.format( diff --git a/aiida_lammps/parsers/dynaphopy.py b/aiida_lammps/parsers/dynaphopy.py index 2149765..f380d42 100644 --- a/aiida_lammps/parsers/dynaphopy.py +++ b/aiida_lammps/parsers/dynaphopy.py @@ -1,6 +1,7 @@ +"""Parser for dynaphopy calculations.""" # Not working with Aiida 1.0 - -from aiida.orm.data.parameter import ParameterData +# pylint: disable=useless-super-delegation, super-with-arguments +from aiida.orm.data.parameter import ParameterData # pylint: disable=no-name-in-module, import-error from aiida.parsers.parser import Parser from aiida_phonopy.common.raw_parsers import parse_FORCE_CONSTANTS @@ -31,7 +32,7 @@ def parse_with_retrieved(self, retrieved): # select the folder object # Check that the retrieved folder is there try: - out_folder = retrieved[self._calc._get_linkname_retrieved()] + out_folder = retrieved[self._calc._get_linkname_retrieved()] # pylint: disable=protected-access, no-member except KeyError: self.logger.error('No retrieved folder found') return False, () @@ -46,10 +47,10 @@ def parse_with_retrieved(self, retrieved): # return successful, () # Get file and do the parsing - outfile = out_folder.get_abs_path(self._calc._OUTPUT_FILE_NAME) + outfile = out_folder.get_abs_path(self._calc._OUTPUT_FILE_NAME) # pylint: disable=no-member, protected-access force_constants_file = out_folder.get_abs_path( - self._calc._OUTPUT_FORCE_CONSTANTS) - qp_file = out_folder.get_abs_path(self._calc._OUTPUT_QUASIPARTICLES) + self._calc._OUTPUT_FORCE_CONSTANTS) # pylint: disable=no-member, protected-access + qp_file = out_folder.get_abs_path(self._calc._OUTPUT_QUASIPARTICLES) # pylint: disable=no-member, protected-access try: thermal_properties = parse_dynaphopy_output(outfile) @@ -59,13 +60,14 @@ def parse_with_retrieved(self, retrieved): try: force_constants = parse_FORCE_CONSTANTS(force_constants_file) - except Exception: + except Exception: # pylint: disable=broad-except pass # look at warnings warnings = [] - with open(out_folder.get_abs_path(self._calc._SCHED_ERROR_FILE)) as f: - errors = f.read() + with open(out_folder.get_abs_path( + self._calc._SCHED_ERROR_FILE)) as _file: # pylint: disable=no-member, protected-access + errors = _file.read() if errors: warnings = [errors] @@ -93,7 +95,8 @@ def parse_with_retrieved(self, retrieved): pass # add the dictionary with warnings - new_nodes_list.append((self.get_linkname_outparams(), - ParameterData(dict={'warnings': warnings}))) + new_nodes_list.append(( + self.get_linkname_outparams(), # pylint: disable=no-member + ParameterData(dict={'warnings': warnings}))) return successful, new_nodes_list diff --git a/aiida_lammps/parsers/lammps/base.py b/aiida_lammps/parsers/lammps/base.py index db5c941..c352b70 100644 --- a/aiida_lammps/parsers/lammps/base.py +++ b/aiida_lammps/parsers/lammps/base.py @@ -23,7 +23,8 @@ class LAMMPSBaseParser(Parser): """Abstract Base Parser for LAMMPS, supplying common methods.""" def __init__(self, node): """Initialize the parser.""" - super().__init__(node) + # pylint: disable=super-with-arguments, useless-super-delegation + super(LAMMPSBaseParser, self).__init__(node) def get_parsing_resources( self, @@ -32,6 +33,7 @@ def get_parsing_resources( sys_in_temp=True, ): """Check that all resources, required for parsing, are present.""" + # pylint: disable=too-many-branches # Check for retrieved folder try: out_folder = self.retrieved @@ -110,7 +112,7 @@ def parse_log_file(self, compute_stress=False): output_txt, compute_stress=compute_stress, ) - except Exception: + except Exception: # pylint: disable=broad-except traceback.print_exc() return None, self.exit_codes.ERROR_LOG_PARSING return output_data, None diff --git a/aiida_lammps/parsers/lammps/force.py b/aiida_lammps/parsers/lammps/force.py index 985e159..b549af1 100644 --- a/aiida_lammps/parsers/lammps/force.py +++ b/aiida_lammps/parsers/lammps/force.py @@ -1,6 +1,4 @@ -"""[summary] - -""" +"""Parser for LAMMPS single point energy calculation.""" import numpy as np from aiida.orm import ArrayData, Dict @@ -13,7 +11,8 @@ class ForceParser(LAMMPSBaseParser): """Parser for LAMMPS single point energy calculation.""" def __init__(self, node): """Initialize the instance of Force Lammps Parser.""" - super().__init__(node) + # pylint: disable=super-with-arguments, useless-super-delegation + super(ForceParser, self).__init__(node) def parse(self, **kwargs): """Parse the retrieved files and store results.""" @@ -61,16 +60,16 @@ def parse(self, **kwargs): return self.exit_codes.ERROR_RUN_INCOMPLETE return None - def parse_traj_file(self, trajectory_filename): - """[summary] + def parse_traj_file(self, trajectory_filename: str) -> ArrayData: + """Parse the trajectory file. - :param trajectory_filename: [description] - :type trajectory_filename: [type] - :raises IOError: [description] - :raises IOError: [description] - :raises IOError: [description] - :return: [description] - :rtype: [type] + :param trajectory_filename: trajectory file for the single point calculation + :type trajectory_filename: str + :raises IOError: if the file is empty + :raises IOError: if the file has multiple steps instead of only one + :raises IOError: if a required field is not found + :return: array with the forces and charges (if present) for the calculation + :rtype: orm.ArrayData """ with self.retrieved.open(trajectory_filename, 'r') as handle: traj_steps = list(iter_trajectories(handle)) diff --git a/aiida_lammps/parsers/lammps/md.py b/aiida_lammps/parsers/lammps/md.py index d581f8f..5ad1d72 100644 --- a/aiida_lammps/parsers/lammps/md.py +++ b/aiida_lammps/parsers/lammps/md.py @@ -14,11 +14,12 @@ class MdParser(LAMMPSBaseParser): """Parser for LAMMPS MD calculations.""" def __init__(self, node): """Initialize the instance of Lammps MD Parser.""" - super().__init__(node) + # pylint: disable=super-with-arguments, useless-super-delegation + super(MdParser, self).__init__(node) def parse(self, **kwargs): """Parse the retrieved folder and store results.""" - # pylint: disable=too-many-locals, too-many-branches + # pylint: disable=too-many-locals, too-many-branches, too-many-return-statements # retrieve resources resources = self.get_parsing_resources(kwargs, traj_in_temp=True) if resources.exit_code is not None: @@ -36,7 +37,7 @@ def parse(self, **kwargs): try: trajectory_data = LammpsTrajectory(resources.traj_paths[0]) self.out('trajectory_data', trajectory_data) - except Exception as err: + except Exception as err: # pylint: disable=broad-except traceback.print_exc() self.logger.error(str(err)) traj_error = self.exit_codes.ERROR_TRAJ_PARSING @@ -74,7 +75,7 @@ def parse(self, **kwargs): unpack=True, ndmin=2)): sys_data.set_array(names[i], col) - except Exception: + except Exception: # pylint: disable=broad-except traceback.print_exc() sys_data_error = self.exit_codes.ERROR_INFO_PARSING sys_data.set_attribute('units_style', diff --git a/aiida_lammps/parsers/lammps/md_multi.py b/aiida_lammps/parsers/lammps/md_multi.py index 570a016..beb009f 100644 --- a/aiida_lammps/parsers/lammps/md_multi.py +++ b/aiida_lammps/parsers/lammps/md_multi.py @@ -20,7 +20,8 @@ class MdMultiParser(LAMMPSBaseParser): """Parser for LAMMPS MDMulti calculations.""" def __init__(self, node): """Initialize the instance of Lammps MD Parser.""" - super().__init__(node) + # pylint: disable=super-with-arguments, useless-super-delegation + super(MdMultiParser, self).__init__(node) def parse(self, **kwargs): """Parse the retrieved folder and store results.""" @@ -46,7 +47,7 @@ def parse(self, **kwargs): for traj_path in resources.traj_paths } self.out('trajectory', trajectories) - except Exception as err: + except Exception as err: # pylint: disable=broad-except traceback.print_exc() self.logger.error(str(err)) traj_error = self.exit_codes.ERROR_TRAJ_PARSING @@ -90,7 +91,7 @@ def parse(self, **kwargs): ndmin=2)): sys_data.set_array(names[i], col) arrays[stage_name] = sys_data - except Exception: + except Exception: # pylint: disable=broad-except traceback.print_exc() sys_data_error = self.exit_codes.ERROR_INFO_PARSING if arrays: diff --git a/aiida_lammps/parsers/lammps/optimize.py b/aiida_lammps/parsers/lammps/optimize.py index 19635d9..b5d260e 100644 --- a/aiida_lammps/parsers/lammps/optimize.py +++ b/aiida_lammps/parsers/lammps/optimize.py @@ -16,7 +16,8 @@ class OptimizeParser(LAMMPSBaseParser): """Parser for LAMMPS optimization calculation.""" def __init__(self, node): """Initialize the instance of Optimize Lammps Parser.""" - super().__init__(node) + # pylint: disable=super-with-arguments, useless-super-delegation + super(OptimizeParser, self).__init__(node) def parse(self, **kwargs): """Parses the datafolder, stores results.""" @@ -46,7 +47,7 @@ def parse(self, **kwargs): trajectory_data.get_step_structure( -1, original_structure=self.node.inputs.structure), ) - except Exception as err: + except Exception as err: # pylint: disable=broad-except traceback.print_exc() self.logger.error(str(err)) traj_error = self.exit_codes.ERROR_TRAJ_PARSING diff --git a/aiida_lammps/validation/utils.py b/aiida_lammps/validation/utils.py index 1e04cb6..a5a3762 100644 --- a/aiida_lammps/validation/utils.py +++ b/aiida_lammps/validation/utils.py @@ -56,7 +56,7 @@ def load_validator(schema): validator_cls.check_schema(schema) # by default, only validates lists - def is_array(checker, instance): + def is_array(checker, instance): # pylint: disable=unused-argument return isinstance(instance, (tuple, list)) type_checker = validator_cls.TYPE_CHECKER.redefine('array', is_array) diff --git a/conftest.py b/conftest.py index 03bd752..6121645 100644 --- a/conftest.py +++ b/conftest.py @@ -1,6 +1,7 @@ """ initialise a text database and profile """ +# pylint: disable=fixme, redefined-outer-name from collections import namedtuple import io import os @@ -12,6 +13,10 @@ import pytest from aiida_lammps.tests.utils import TEST_DIR, AiidaTestApp +from aiida_lammps.common.reaxff_convert import ( + filter_by_species, + read_lammps_format, +) pytest_plugins = ['aiida.manage.tests.pytest_fixtures'] @@ -82,6 +87,7 @@ def db_test_app(aiida_profile, pytestconfig): @pytest.fixture(scope='function') def get_structure_data(): + """get the structure data for the simulation.""" def _get_structure_data(pkey): """return test structure data""" if pkey == 'Fe': @@ -216,12 +222,17 @@ def _get_structure_data(pkey): return _get_structure_data -potential_data = namedtuple('PotentialTestData', - ['type', 'data', 'structure', 'output']) +PotentialData = namedtuple('PotentialTestData', + ['type', 'data', 'structure', 'output']) @pytest.fixture(scope='function') def get_potential_data(get_structure_data): + """Get the potnetial information for different types of potentials. + + :param get_structure_data: Structure to be used in the simulation + :type get_structure_data: orm.StructureData + """ def _get_potential_data(pkey): """return data to create a potential, and accompanying structure data and expected output data to test it with @@ -261,21 +272,29 @@ def _get_potential_data(pkey): potential_dict = { 'Ga Ga Ga': - '1.0 0.007874 1.846 1.918000 0.75000 -0.301300 1.0 1.0 1.44970 410.132 2.87 0.15 1.60916 535.199', + '1.0 0.007874 1.846 1.918000 0.75000 -0.301300 '+\ + '1.0 1.0 1.44970 410.132 2.87 0.15 1.60916 535.199', 'N N N': - '1.0 0.766120 0.000 0.178493 0.20172 -0.045238 1.0 1.0 2.38426 423.769 2.20 0.20 3.55779 1044.77', + '1.0 0.766120 0.000 0.178493 0.20172 -0.045238 '+\ + '1.0 1.0 2.38426 423.769 2.20 0.20 3.55779 1044.77', 'Ga Ga N': - '1.0 0.001632 0.000 65.20700 2.82100 -0.518000 1.0 0.0 0.00000 0.00000 2.90 0.20 0.00000 0.00000', + '1.0 0.001632 0.000 65.20700 2.82100 -0.518000 '+\ + '1.0 0.0 0.00000 0.00000 2.90 0.20 0.00000 0.00000', 'Ga N N': - '1.0 0.001632 0.000 65.20700 2.82100 -0.518000 1.0 1.0 2.63906 3864.27 2.90 0.20 2.93516 6136.44', + '1.0 0.001632 0.000 65.20700 2.82100 -0.518000 '+\ + '1.0 1.0 2.63906 3864.27 2.90 0.20 2.93516 6136.44', 'N Ga Ga': - '1.0 0.001632 0.000 65.20700 2.82100 -0.518000 1.0 1.0 2.63906 3864.27 2.90 0.20 2.93516 6136.44', + '1.0 0.001632 0.000 65.20700 2.82100 -0.518000 '+\ + '1.0 1.0 2.63906 3864.27 2.90 0.20 2.93516 6136.44', 'N Ga N ': - '1.0 0.766120 0.000 0.178493 0.20172 -0.045238 1.0 0.0 0.00000 0.00000 2.20 0.20 0.00000 0.00000', + '1.0 0.766120 0.000 0.178493 0.20172 -0.045238 '+\ + '1.0 0.0 0.00000 0.00000 2.20 0.20 0.00000 0.00000', 'N N Ga': - '1.0 0.001632 0.000 65.20700 2.82100 -0.518000 1.0 0.0 0.00000 0.00000 2.90 0.20 0.00000 0.00000', + '1.0 0.001632 0.000 65.20700 2.82100 -0.518000 '+\ + '1.0 0.0 0.00000 0.00000 2.90 0.20 0.00000 0.00000', 'Ga N Ga': - '1.0 0.007874 1.846 1.918000 0.75000 -0.301300 1.0 0.0 0.00000 0.00000 2.87 0.15 0.00000 0.00000', + '1.0 0.007874 1.846 1.918000 0.75000 -0.301300 '+\ + '1.0 0.0 0.00000 0.00000 2.87 0.15 0.00000 0.00000', } pair_style = 'tersoff' @@ -284,11 +303,6 @@ def _get_potential_data(pkey): elif pkey == 'reaxff': - from aiida_lammps.common.reaxff_convert import ( - filter_by_species, - read_lammps_format, - ) - pair_style = 'reaxff' with io.open( os.path.join(TEST_DIR, 'input_files', @@ -297,8 +311,10 @@ def _get_potential_data(pkey): handle.read().splitlines(), tolerances={'hbonddist': 7.0}) potential_dict = filter_by_species(potential_dict, ['Fe core', 'S core']) - for n in ['anglemin', 'angleprod', 'hbondmin', 'torsionprod']: - potential_dict['global'].pop(n) + for name in [ + 'anglemin', 'angleprod', 'hbondmin', 'torsionprod' + ]: + potential_dict['global'].pop(name) potential_dict['control'] = {'safezone': 1.6} # potential_dict = { # "file_contents": handle.readlines(), @@ -315,9 +331,13 @@ def _get_potential_data(pkey): } else: - raise ValueError('Unknown potential key: {}'.format(pkey)) - - return potential_data(pair_style, potential_dict, structure, - output_dict) + raise ValueError(f'Unknown potential key: {pkey}') + + return PotentialData( + pair_style, + potential_dict, + structure, + output_dict, + ) return _get_potential_data diff --git a/setup.py b/setup.py index 932082b..5fd04ba 100644 --- a/setup.py +++ b/setup.py @@ -1,16 +1,22 @@ #!/usr/bin/env python - -from __future__ import absolute_import - +"""Define the setup for the `aiida-lammps` plugin.""" import json from setuptools import find_packages, setup if __name__ == '__main__': - with open('setup.json', 'r') as info: - kwargs = json.load(info) + FILENAME_SETUP_JSON = 'setup.json' + FILENAME_DESCRIPTION = 'README.md' + + with open(FILENAME_SETUP_JSON, 'r') as handle: + setup_json = json.load(handle) + + with open(FILENAME_DESCRIPTION, 'r') as handle: + description = handle.read() - setup(packages=find_packages(), - long_description=open('README.md').read(), - long_description_content_type='text/markdown', - **kwargs) + setup( + packages=find_packages(), + long_description=description, + long_description_content_type='text/markdown', + **setup_json, + ) From 0aaeed6de47988d14d5fe0d569bcf32c89d0a13f Mon Sep 17 00:00:00 2001 From: Jonathan Chico Date: Wed, 1 Dec 2021 17:15:20 +0100 Subject: [PATCH 22/70] (WIP) Updating the pre-commit packages --- .github/workflows/tests.yml | 2 +- setup.json | 10 ++++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 4166e84..d456ee4 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -82,7 +82,7 @@ jobs: - name: Installation run: | - pip install -e .[testing] + pip install -e .[testing, pre-commit] reentry scan - name: Run pytest diff --git a/setup.json b/setup.json index ad66f20..c4323ef 100644 --- a/setup.json +++ b/setup.json @@ -66,8 +66,14 @@ "pytest-timeout", "pytest-regressions" ], - "code_style": [ - "pre-commit~=2.6" + "pre-commit": [ + "mypy==0.910", + "packaging==20.3", + "pre-commit~=2.2", + "pylint~=2.11.1", + "pylint-aiida~=0.1.1", + "pylint-django", + "sqlalchemy2-stubs" ], "docs": [ "myst-parser~=0.15.0", From 2b9a59288cc866343f4b0ac15ed55c06baa51858 Mon Sep 17 00:00:00 2001 From: Jonathan Chico Date: Wed, 1 Dec 2021 17:20:28 +0100 Subject: [PATCH 23/70] (WIP) setting so that the correct pre-commit runs --- .github/workflows/tests.yml | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index d456ee4..21b8b0e 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -18,7 +18,29 @@ jobs: uses: actions/setup-python@v1 with: python-version: 3.8 - - uses: pre-commit/action@v2.0.0 + id: cache-pip + - uses: actions/cache@v1 + with: + path: ~/.cache/pip + key: pip-${{ matrix.python-version }}-tests-${{ hashFiles('**/setup.json') }} + restore-keys: + pip-${{ matrix.python-version }}-tests + - name: Set up Python + uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python }} + - name: Upgrade pip + run: | + pip install --upgrade pip + pip --version + - name: Install wheel + run: pip install wheel + - name: Install AiiDA-VASP + run: | + pip install -e .[testing,pre-commit] + pip freeze + - name: Run pre-commit + run: pre-commit run --all-files || ( git diff; git status; exit 1; ) tests: From e4578d2ea54150f113421d2165358359e02db2ff Mon Sep 17 00:00:00 2001 From: Jonathan Chico Date: Fri, 3 Dec 2021 12:53:52 +0100 Subject: [PATCH 24/70] (WIP) Trying to fix the format to fit the pre-commit standard. --- .pre-commit-config.yaml | 3 +- aiida_lammps/calculations/dynaphopy.py | 10 +- aiida_lammps/calculations/lammps/__init__.py | 36 ++- aiida_lammps/calculations/lammps/combinate.py | 102 ++++---- aiida_lammps/calculations/lammps/force.py | 19 +- aiida_lammps/calculations/lammps/md.py | 85 +++--- aiida_lammps/calculations/lammps/md_multi.py | 139 +++++----- aiida_lammps/calculations/lammps/optimize.py | 44 ++-- aiida_lammps/common/generate_input_files.py | 24 +- aiida_lammps/common/input_generator.py | 1 + aiida_lammps/common/raw_parsers.py | 18 +- aiida_lammps/data/lammps_potential.py | 4 +- aiida_lammps/data/pot_plugins/eam.py | 9 +- .../data/pot_plugins/lennard_jones.py | 5 +- aiida_lammps/data/pot_plugins/reaxff.py | 9 +- aiida_lammps/data/potential.py | 30 +-- aiida_lammps/data/trajectory.py | 1 + aiida_lammps/parsers/dynaphopy.py | 4 +- aiida_lammps/parsers/lammps/md.py | 4 +- aiida_lammps/parsers/lammps/md_multi.py | 7 +- aiida_lammps/tests/test_calculations.py | 246 +++++++++++++----- aiida_lammps/tests/test_generate_structure.py | 13 +- aiida_lammps/tests/test_parsers.py | 67 +++-- aiida_lammps/tests/test_potential_data.py | 38 ++- aiida_lammps/tests/test_reaxff_parse.py | 5 + aiida_lammps/tests/test_trajectory.py | 20 +- aiida_lammps/tests/utils.py | 99 ++++--- aiida_lammps/validation/utils.py | 4 +- conftest.py | 22 +- setup.py | 1 + 30 files changed, 633 insertions(+), 436 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 739e8d3..bcbca06 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -5,7 +5,8 @@ exclude: > (?x)^( aiida_lammps/tests/input_files/.*| aiida_lammps/tests/.*txt| - aiida_lammps/tests/ + aiida_lammps/tests/| + .pre-commit/check_version.py )$ repos: diff --git a/aiida_lammps/calculations/dynaphopy.py b/aiida_lammps/calculations/dynaphopy.py index ea7063f..0134d98 100644 --- a/aiida_lammps/calculations/dynaphopy.py +++ b/aiida_lammps/calculations/dynaphopy.py @@ -1,11 +1,11 @@ """Base dynaphopy calculation""" -# pylint: disable=too-many-instance-attributes, abstract-method +# pylint: disable=too-many-instance-attributes, abstract-method, unspecified-encoding from aiida.common.datastructures import CalcInfo, CodeInfo from aiida.common.exceptions import InputValidationError from aiida.common.utils import classproperty from aiida.engine import CalcJob from aiida.orm import ArrayData, StructureData, TrajectoryData -from aiida_phonopy.common.raw_parsers import get_force_constants, get_poscar_txt # pylint: disable=no-name-in-module +from aiida_phonopy.common.raw_parsers import get_force_constants, get_poscar_txt # pylint: disable=no-name-in-module, import-error from aiida_lammps.common.generate_input_files import ( get_trajectory_txt, @@ -186,7 +186,7 @@ def _prepare_for_submission(self, tempfolder, inputdict): self._INPUT_FILE_NAME, self._INPUT_TRAJECTORY, '-ts', - '{}'.format(time_step), + f'{time_step}', '--silent', '-sfc', self._OUTPUT_FORCE_CONSTANTS, @@ -199,8 +199,8 @@ def _prepare_for_submission(self, tempfolder, inputdict): if 'temperature' in parameters_data.get_dict(): codeinfo.cmdline_params.append('--temperature') - codeinfo.cmdline_params.append('{}'.format( - parameters_data.dict.temperature)) + codeinfo.cmdline_params.append( + f'{parameters_data.dict.temperature}') if 'md_commensurate' in parameters_data.get_dict(): if parameters_data.dict.md_commensurate: diff --git a/aiida_lammps/calculations/lammps/__init__.py b/aiida_lammps/calculations/lammps/__init__.py index a493e7e..322f3b6 100644 --- a/aiida_lammps/calculations/lammps/__init__.py +++ b/aiida_lammps/calculations/lammps/__init__.py @@ -1,6 +1,5 @@ -"""Base LAMMPS calculation for AiiDA. -""" -# pylint: disable=duplicate-code +"""Base LAMMPS calculation for AiiDA.""" +# pylint: disable=duplicate-code, unspecified-encoding import itertools import numpy as np from aiida.common import CalcInfo, CodeInfo @@ -84,14 +83,15 @@ def structure_to_poscar(structure: orm.StructureData) -> str: poscar += '\n1.0\n' cell = structure.cell for row in cell: - poscar += '{0: 22.16f} {1: 22.16f} {2: 22.16f}\n'.format(*row) + poscar += f'{row[0]: 22.16f} {row[1]: 22.16f} {row[2]: 22.16f}\n' poscar += ' '.join(np.unique([site.kind_name for site in structure.sites])) + '\n' poscar += ' '.join(np.array(labels, dtype=str)) + '\n' poscar += 'Cartesian\n' for site in structure.sites: - poscar += '{0: 22.16f} {1: 22.16f} {2: 22.16f}\n'.format( - *site.position) + poscar += f'{site.position[0]: 22.16f} ' + poscar += f'{site.position[1]: 22.16f} ' + poscar += f'{site.position[2]: 22.16f}\n' return poscar @@ -108,14 +108,26 @@ def parameters_to_input_file(parameters_object: dict) -> str: input_file = 'STRUCTURE FILE POSCAR\nPOSCAR\n\n' input_file += 'FORCE CONSTANTS\nFORCE_CONSTANTS\n\n' input_file += 'PRIMITIVE MATRIX\n' - input_file += ('{} {} {} \n').format(*np.array(parameters['primitive'])[0]) - input_file += ('{} {} {} \n').format(*np.array(parameters['primitive'])[1]) - input_file += ('{} {} {} \n').format(*np.array(parameters['primitive'])[2]) + input_file += f'{np.array(parameters["primitive"])[0, 0]} ' + input_file += f'{np.array(parameters["primitive"])[0, 1]} ' + input_file += f'{np.array(parameters["primitive"])[0, 2]} \n' + input_file += f'{np.array(parameters["primitive"])[1, 0]} ' + input_file += f'{np.array(parameters["primitive"])[1, 1]} ' + input_file += f'{np.array(parameters["primitive"])[1, 2]} \n' + input_file += f'{np.array(parameters["primitive"])[2, 0]} ' + input_file += f'{np.array(parameters["primitive"])[2, 1]} ' + input_file += f'{np.array(parameters["primitive"])[2, 2]} \n' input_file += '\n' input_file += 'SUPERCELL MATRIX PHONOPY\n' - input_file += ('{} {} {} \n').format(*np.array(parameters['supercell'])[0]) - input_file += ('{} {} {} \n').format(*np.array(parameters['supercell'])[1]) - input_file += ('{} {} {} \n').format(*np.array(parameters['supercell'])[2]) + input_file += f'{np.array(parameters["supercell"])[0, 0]} ' + input_file += f'{np.array(parameters["supercell"])[0, 1]} ' + input_file += f'{np.array(parameters["supercell"])[0, 2]} \n' + input_file += f'{np.array(parameters["supercell"])[1, 0]} ' + input_file += f'{np.array(parameters["supercell"])[1, 1]} ' + input_file += f'{np.array(parameters["supercell"])[1, 2]} \n' + input_file += f'{np.array(parameters["supercell"])[2, 0]} ' + input_file += f'{np.array(parameters["supercell"])[2, 1]} ' + input_file += f'{np.array(parameters["supercell"])[2, 2]} \n' input_file += '\n' return input_file diff --git a/aiida_lammps/calculations/lammps/combinate.py b/aiida_lammps/calculations/lammps/combinate.py index e4dc20a..7b3995b 100644 --- a/aiida_lammps/calculations/lammps/combinate.py +++ b/aiida_lammps/calculations/lammps/combinate.py @@ -1,12 +1,10 @@ """Combined MD and Phonopy calculation""" # Not working with Aiida 1.0 -# pylint: disable=no-name-in-module +# pylint: disable=no-name-in-module, unspecified-encoding from aiida.common.exceptions import InputValidationError -from aiida.orm import ArrayData, Dict -from aiida_phonopy.common.raw_parsers import ( - get_force_constants, - get_FORCE_SETS_txt, - get_poscar_txt, +from aiida import orm +from aiida_phonopy.common.raw_parsers import ( # pylint: disable=import-error + get_force_constants, get_FORCE_SETS_txt, get_poscar_txt, ) import numpy as np @@ -38,22 +36,34 @@ def generate_dynaphopy_input( :rtype: str """ parameters = parameters_object.get_dict() - input_file = 'STRUCTURE FILE POSCAR\n{}\n\n'.format(poscar_name) + input_file = f'STRUCTURE FILE POSCAR\n{poscar_name}\n\n' if use_sets: - input_file += 'FORCE SETS\n{}\n\n'.format(force_sets_filename) + input_file += f'FORCE SETS\n{force_sets_filename}\n\n' else: - input_file += 'FORCE CONSTANTS\n{}\n\n'.format(force_constants_name) + input_file += f'FORCE CONSTANTS\n{force_constants_name}\n\n' input_file += 'PRIMITIVE MATRIX\n' - input_file += '{} {} {} \n'.format(*np.array(parameters['primitive'])[0]) - input_file += '{} {} {} \n'.format(*np.array(parameters['primitive'])[1]) - input_file += '{} {} {} \n'.format(*np.array(parameters['primitive'])[2]) + input_file += f'{np.array(parameters["primitive"])[0, 0]} ' + input_file += f'{np.array(parameters["primitive"])[1, 1]} ' + input_file += f'{np.array(parameters["primitive"])[2, 2]} \n' + input_file += f'{np.array(parameters["primitive"])[0, 0]} ' + input_file += f'{np.array(parameters["primitive"])[1, 1]} ' + input_file += f'{np.array(parameters["primitive"])[2, 2]} \n' + input_file += f'{np.array(parameters["primitive"])[0, 0]} ' + input_file += f'{np.array(parameters["primitive"])[1, 1]} ' + input_file += f'{np.array(parameters["primitive"])[2, 2]} \n' input_file += '\n' input_file += 'SUPERCELL MATRIX PHONOPY\n' - input_file += '{} {} {} \n'.format(*np.array(parameters['supercell'])[0]) - input_file += '{} {} {} \n'.format(*np.array(parameters['supercell'])[1]) - input_file += '{} {} {} \n'.format(*np.array(parameters['supercell'])[2]) + input_file += f'{np.array(parameters["supercell"])[0, 0]} ' + input_file += f'{np.array(parameters["supercell"])[0, 1]} ' + input_file += f'{np.array(parameters["supercell"])[0, 2]} \n' + input_file += f'{np.array(parameters["supercell"])[1, 0]} ' + input_file += f'{np.array(parameters["supercell"])[1, 1]} ' + input_file += f'{np.array(parameters["supercell"])[1, 2]} \n' + input_file += f'{np.array(parameters["supercell"])[2, 0]} ' + input_file += f'{np.array(parameters["supercell"])[2, 1]} ' + input_file += f'{np.array(parameters["supercell"])[2, 2]} \n' input_file += '\n' return input_file @@ -81,15 +91,21 @@ def define(cls, spec): valid_type=str, default='dynaphopy', ) - spec.input('parameters_dynaphopy', - valid_type=Dict, - help='dynaphopy parameters') - spec.input('force_constants', - valid_type=ArrayData, - help='harmonic force constants') - spec.input('force_sets', - valid_type=ArrayData, - help='phonopy force sets') + spec.input( + 'parameters_dynaphopy', + valid_type=orm.Dict, + help='dynaphopy parameters', + ) + spec.input( + 'force_constants', + valid_type=orm.ArrayData, + help='harmonic force constants', + ) + spec.input( + 'force_sets', + valid_type=orm.ArrayData, + help='phonopy force sets', + ) # spec.input('settings', valid_type=str, default='lammps.optimize') @@ -106,28 +122,26 @@ def create_main_input_content( # pylint: disable=too-many-arguments, arguments-renamed random_number = np.random.randint(10000000) - lammps_input_file = 'units {0}\n'.format( - potential_data.default_units) + lammps_input_file = f'units {potential_data.default_units}\n' lammps_input_file += 'boundary p p p\n' lammps_input_file += 'box tilt large\n' - lammps_input_file += 'atom_style {0}\n'.format( - potential_data.atom_style) - lammps_input_file += 'read_data {}\n'.format(structure_filename) + lammps_input_file += f'atom_style {potential_data.atom_style}\n' + lammps_input_file += f'read_data {structure_filename}\n' lammps_input_file += potential_data.get_input_lines(structure_data) lammps_input_file += 'neighbor 0.3 bin\n' lammps_input_file += 'neigh_modify every 1 delay 0 check no\n' - lammps_input_file += ( - 'velocity all create {0} {1} dist gaussian mom yes\n'. - format(parameter_data.dict.temperature, random_number)) - lammps_input_file += 'velocity all scale {}\n'.format( - parameter_data.dict.temperature) + lammps_input_file += 'velocity all create ' + lammps_input_file += f'{parameter_data.dict.temperature} {random_number} ' + lammps_input_file += 'dist gaussian mom yes\n' + lammps_input_file += f'velocity all scale {parameter_data.dict.temperature}\n' - lammps_input_file += 'fix int all nvt temp {0} {0} {1}\n'.format( - parameter_data.dict.temperature, - parameter_data.dict.thermostat_variable) + lammps_input_file += 'fix int all nvt temp ' + lammps_input_file += f'{parameter_data.dict.temperature} ' + lammps_input_file += f'{parameter_data.dict.temperature} ' + lammps_input_file += f'{parameter_data.dict.thermostat_variable}\n' return lammps_input_file @@ -168,7 +182,7 @@ def prepare_extra_files(self, tempfolder, potential_object): ) try: - parameters_data_dynaphopy = Dict.pop( + parameters_data_dynaphopy = orm.Dict.pop( self.get_linkname('parameters_dynaphopy')) except KeyError as key_error: raise InputValidationError( @@ -198,13 +212,13 @@ def prepare_extra_files(self, tempfolder, potential_object): self._INPUT_FILE_NAME_DYNA, '--run_lammps', self._INPUT_FILE_NAME, - '{}'.format(total_time), - '{}'.format(time_step), - '{}'.format(equilibrium_time), + f'{total_time}', + f'{time_step}', + f'{equilibrium_time}', '--dim', - '{}'.format(md_supercell[0]), - '{}'.format(md_supercell[1]), - '{}'.format(md_supercell[2]), + f'{md_supercell[0]}', + f'{md_supercell[1]}', + f'{md_supercell[2]}', '--silent', '-sfc', self._OUTPUT_FORCE_CONSTANTS, diff --git a/aiida_lammps/calculations/lammps/force.py b/aiida_lammps/calculations/lammps/force.py index c78cb25..3dffbb3 100644 --- a/aiida_lammps/calculations/lammps/force.py +++ b/aiida_lammps/calculations/lammps/force.py @@ -57,8 +57,7 @@ def create_main_input_content( for kwd in parameter_data.get_attribute('thermo_keywords', []): if kwd not in thermo_keywords: thermo_keywords.append(kwd) - lammps_input_file += 'thermo_style custom {}\n'.format( - ' '.join(thermo_keywords)) + lammps_input_file += f'thermo_style custom {" ".join(thermo_keywords)}\n' if potential_data.atom_style == 'charge': dump_variables = 'element x y z fx fy fz q' @@ -69,8 +68,8 @@ def create_main_input_content( dump_variables = 'element x y z fx fy fz' dump_format = '%4s %16.10f %16.10f %16.10f %16.10f %16.10f %16.10f' - lammps_input_file += 'dump aiida all custom 1 {0} {1}\n'.format( - trajectory_filename, dump_variables) + lammps_input_file += 'dump aiida all custom 1' + lammps_input_file += f' {trajectory_filename} {dump_variables}\n' # TODO find exact version when changes were made if version_date <= convert_date_string('10 Feb 2015'): @@ -78,22 +77,18 @@ def create_main_input_content( else: dump_mod_cmnd = 'format line' - lammps_input_file += 'dump_modify aiida {0} "{1}"\n'.format( - dump_mod_cmnd, dump_format) + lammps_input_file += f'dump_modify aiida {dump_mod_cmnd} "{dump_format}"\n' lammps_input_file += 'dump_modify aiida sort id\n' - lammps_input_file += 'dump_modify aiida element {}\n'.format( - ' '.join(kind_symbols)) + lammps_input_file += f'dump_modify aiida element {" ".join(kind_symbols)}\n' lammps_input_file += 'run 0\n' variables = parameter_data.get_attribute('output_variables', []) for var in variables: var_alias = var.replace('[', '_').replace(']', '_') - lammps_input_file += 'variable {0} equal {1}\n'.format( - var_alias, var) - lammps_input_file += 'print "final_variable: {0} = ${{{0}}}"\n'.format( - var_alias) + lammps_input_file += f'variable {var_alias} equal {var}\n' + lammps_input_file += f'print "final_variable: {var_alias} = ${{{var_alias}}}"\n' lammps_input_file += 'variable final_energy equal etotal\n' lammps_input_file += 'print "final_energy: ${final_energy}"\n' diff --git a/aiida_lammps/calculations/lammps/md.py b/aiida_lammps/calculations/lammps/md.py index d6fcc50..8226f7e 100644 --- a/aiida_lammps/calculations/lammps/md.py +++ b/aiida_lammps/calculations/lammps/md.py @@ -1,8 +1,8 @@ """Single stage MD calculation in LAMMPS.""" # pylint: disable=fixme, useless-super-delegation +import numpy as np from aiida.common.exceptions import InputValidationError from aiida.plugins import DataFactory -import numpy as np from aiida_lammps.calculations.lammps import BaseLammpsCalculation from aiida_lammps.common.utils import convert_date_string, get_path, join_keywords @@ -54,9 +54,8 @@ def create_main_input_content( lammps_input_file = f'units {potential_data.default_units}\n' lammps_input_file += 'boundary p p p\n' lammps_input_file += 'box tilt large\n' - lammps_input_file += 'atom_style {0}\n'.format( - potential_data.atom_style) - lammps_input_file += 'read_data {}\n'.format(structure_filename) + lammps_input_file += f'atom_style {potential_data.atom_style}\n' + lammps_input_file += f'read_data {structure_filename}\n' # Potential Specification lammps_input_file += potential_data.get_input_lines(kind_symbols) @@ -64,30 +63,25 @@ def create_main_input_content( # Pairwise neighbour list creation if 'neighbor' in pdict: # neighbor skin_dist bin/nsq/multi - lammps_input_file += 'neighbor {0} {1}\n'.format( - pdict['neighbor'][0], pdict['neighbor'][1]) + lammps_input_file += f'neighbor {pdict["neighbor"][0]} {pdict["neighbor"][1]}\n' if 'neigh_modify' in pdict: # e.g. 'neigh_modify every 1 delay 0 check no\n' - lammps_input_file += 'neigh_modify {}\n'.format( - join_keywords(pdict['neigh_modify'])) - + lammps_input_file += f'neigh_modify {join_keywords(pdict["neigh_modify"])}\n' # Define Timestep - lammps_input_file += 'timestep {}\n'.format(pdict['timestep']) + lammps_input_file += f'timestep {pdict["timestep"]}\n' # Define computation/printing of thermodynamic info thermo_keywords = ['step', 'temp', 'epair', 'emol', 'etotal', 'press'] for kwd in pdict.get('thermo_keywords', []): if kwd not in thermo_keywords: thermo_keywords.append(kwd) - lammps_input_file += 'thermo_style custom {}\n'.format( - ' '.join(thermo_keywords)) + lammps_input_file += f'thermo_style custom {" ".join(thermo_keywords)}\n' lammps_input_file += 'thermo 1000\n' # Define output of restart file restart = pdict.get('restart', False) if restart: - lammps_input_file += 'restart {0} {1}\n'.format( - restart, restart_filename) + lammps_input_file += f'restart {restart} {restart_filename}\n' # Set the initial velocities of atoms, if a temperature is set initial_temp, _, _ = get_path( @@ -97,26 +91,32 @@ def create_main_input_content( raise_error=False, ) if initial_temp is not None: - lammps_input_file += ( - 'velocity all create {0} {1} dist gaussian mom yes\n'. - format(initial_temp, - pdict.get('rand_seed', np.random.randint(10000000)))) - lammps_input_file += 'velocity all scale {}\n'.format( - initial_temp) + lammps_input_file += f'velocity all create {initial_temp} ' + lammps_input_file += f'{pdict.get("rand_seed", np.random.randint(10000000))} ' + lammps_input_file += 'dist gaussian mom yes\n' + lammps_input_file += f'velocity all scale {initial_temp}\n' # Define Equilibration Stage - lammps_input_file += 'fix int all {0} {1} {2}\n'.format( - get_path(pdict, ['integration', 'style']), - join_keywords( - get_path(pdict, ['integration', 'constraints'], {}, - raise_error=False)), - join_keywords( - get_path(pdict, ['integration', 'keywords'], {}, - raise_error=False)), - ) - - lammps_input_file += 'run {}\n'.format( - parameter_data.dict.equilibrium_steps) + lammps_input_file += 'fix int all ' + lammps_input_file += f'{get_path(pdict, ["integration", "style"])} ' + _temp = join_keywords( + get_path( + pdict, + ['integration', 'constraints'], + {}, + raise_error=False, + )) + lammps_input_file += f'{_temp} ' + _temp = join_keywords( + get_path( + pdict, + ['integration', 'keywords'], + {}, + raise_error=False, + )) + lammps_input_file += f'{_temp}\n' + + lammps_input_file += f'run {parameter_data.dict.equilibrium_steps}\n' lammps_input_file += 'reset_timestep 0\n' if potential_data.atom_style == 'charge': @@ -126,8 +126,9 @@ def create_main_input_content( dump_variables = 'element x y z' dump_format = '%4s %16.10f %16.10f %16.10f' - lammps_input_file += 'dump aiida all custom {0} {1} {2}\n'.format( - parameter_data.dict.dump_rate, trajectory_filename, dump_variables) + lammps_input_file += 'dump aiida all custom ' + lammps_input_file += f'{parameter_data.dict.dump_rate} ' + lammps_input_file += f'{trajectory_filename} {dump_variables}\n' # TODO find exact version when changes were made if version_date <= convert_date_string('10 Feb 2015'): @@ -135,11 +136,9 @@ def create_main_input_content( else: dump_mod_cmnd = 'format line' - lammps_input_file += 'dump_modify aiida {0} "{1}"\n'.format( - dump_mod_cmnd, dump_format) + lammps_input_file += f'dump_modify aiida {dump_mod_cmnd} "{dump_format}"\n' lammps_input_file += 'dump_modify aiida sort id\n' - lammps_input_file += 'dump_modify aiida element {}\n'.format( - ' '.join(kind_symbols)) + lammps_input_file += f'dump_modify aiida element {" ".join(kind_symbols)}\n' variables = pdict.get('output_variables', []) if variables and 'step' not in variables: @@ -150,8 +149,7 @@ def create_main_input_content( for var in variables: var_alias = var.replace('[', '_').replace(']', '_') var_aliases.append(var_alias) - lammps_input_file += 'variable {0} equal {1}\n'.format( - var_alias, var) + lammps_input_file += f'variable {var_alias} equal {var}\n' if variables: lammps_input_file += 'fix sys_info all print' lammps_input_file += f' {parameter_data.dict.dump_rate}' @@ -159,8 +157,7 @@ def create_main_input_content( lammps_input_file += f' title "{" ".join(var_aliases)}"' lammps_input_file += f' file {system_filename} screen no\n' - lammps_input_file += 'run {}\n'.format( - parameter_data.dict.total_steps) + lammps_input_file += f'run {parameter_data.dict.total_steps}\n' lammps_input_file += 'variable final_energy equal etotal\n' lammps_input_file += 'print "final_energy: ${final_energy}"\n' @@ -180,8 +177,8 @@ def validate_parameters(param_data, potential_object): punits = param_data.get_dict()['units'] if not punits == potential_object.default_units: raise InputValidationError( - 'the units of the parameters ({}) and potential ({}) are different' - .format(punits, potential_object.default_units)) + f'the units of the parameters ({punits}) and potential ' + f'({potential_object.default_units}) are different') return True diff --git a/aiida_lammps/calculations/lammps/md_multi.py b/aiida_lammps/calculations/lammps/md_multi.py index 204bedb..82e4006 100644 --- a/aiida_lammps/calculations/lammps/md_multi.py +++ b/aiida_lammps/calculations/lammps/md_multi.py @@ -52,18 +52,15 @@ def create_main_input_content( pdict.get('lammps_version', '11 Aug 2017')) lammps_input_file = '' - lammps_input_file += '# Input written to comply with LAMMPS {}\n'.format( - version_date) + lammps_input_file += f'# Input written to comply with LAMMPS {version_date}\n' # Configuration setup lammps_input_file += '\n# Atomic Configuration\n' - lammps_input_file += 'units {0}\n'.format( - potential_data.default_units) + lammps_input_file += f'units {potential_data.default_units}\n' lammps_input_file += 'boundary p p p\n' # TODO allow non-periodic lammps_input_file += 'box tilt large\n' - lammps_input_file += 'atom_style {0}\n'.format( - potential_data.atom_style) - lammps_input_file += 'read_data {}\n'.format(structure_filename) + lammps_input_file += f'atom_style {potential_data.atom_style}\n' + lammps_input_file += f'read_data {structure_filename}\n' # Potential specification lammps_input_file += '\n# Potential Setup\n' @@ -73,14 +70,12 @@ def create_main_input_content( lammps_input_file += '\n# General Setup\n' if 'neighbor' in pdict: # neighbor skin_dist bin/nsq/multi - lammps_input_file += 'neighbor {0} {1}\n'.format( - pdict['neighbor'][0], pdict['neighbor'][1]) + lammps_input_file += f'neighbor {pdict["neighbor"][0]} {pdict["neighbor"][1]}\n' if 'neigh_modify' in pdict: # e.g. 'neigh_modify every 1 delay 0 check no\n' - lammps_input_file += 'neigh_modify {}\n'.format( - join_keywords(pdict['neigh_modify'])) + lammps_input_file += f'neigh_modify {join_keywords(pdict["neigh_modify"])}\n' # Define Timestep - lammps_input_file += 'timestep {}\n'.format(pdict['timestep']) + lammps_input_file += f'timestep {pdict["timestep"]}\n' # Define computation/printing of thermodynamic info lammps_input_file += '\n# Thermodynamic Information Output\n' @@ -88,19 +83,16 @@ def create_main_input_content( for kwd in pdict.get('thermo_keywords', []): if kwd not in thermo_keywords: thermo_keywords.append(kwd) - lammps_input_file += 'thermo_style custom {}\n'.format( - ' '.join(thermo_keywords)) + lammps_input_file += f'thermo_style custom {" ".join(thermo_keywords)}\n' lammps_input_file += 'thermo 1000\n' # TODO make variable? # Setup initial velocities of atoms if 'velocity' in pdict: lammps_input_file += '\n# Intial Atom Velocity\n' for vdict in pdict.get('velocity', []): - lammps_input_file += 'velocity all {0} {1} {2}\n'.format( - vdict['style'], - ' '.join([str(a) for a in vdict['args']]), - join_keywords(vdict.get('keywords', {})), - ) + lammps_input_file += f'velocity all {vdict["style"]} ' + lammps_input_file += f'{" ".join([str(a) for a in vdict["args"]])} ' + lammps_input_file += f'{join_keywords(vdict.get("keywords", {}))}\n' stage_names = [] current_fixes = [] @@ -111,25 +103,23 @@ def create_main_input_content( stage_name = stage_dict.get('name') if stage_name in stage_names: - raise ValueError( - 'non-unique stage name: {}'.format(stage_name)) + raise ValueError(f'non-unique stage name: {stage_name}') stage_names.append(stage_name) - lammps_input_file += '\n# Stage {}: {}\n'.format( - stage_id, stage_name) + lammps_input_file += f'\n# Stage {stage_id}: {stage_name}\n' # clear timestep # lammps_input_file += "reset_timestep 0\n" # Clear fixes, dumps and computes for fix in current_fixes: - lammps_input_file += 'unfix {}\n'.format(fix) + lammps_input_file += f'unfix {fix}\n' current_fixes = [] for dump in current_dumps: - lammps_input_file += 'undump {}\n'.format(dump) + lammps_input_file += f'undump {dump}\n' current_dumps = [] for compute in current_computes: - lammps_input_file += 'uncompute {}\n'.format(compute) + lammps_input_file += f'uncompute {compute}\n' current_computes = [] # Define Computes @@ -137,8 +127,7 @@ def create_main_input_content( c_id = compute['id'] c_style = compute['style'] c_args = ' '.join([str(a) for a in compute.get('args', [])]) - lammps_input_file += 'compute {0} all {1} {2}\n'.format( - c_id, c_style, c_args) + lammps_input_file += f'compute {c_id} all {c_style} {c_args}\n' current_computes.append(c_id) # Define Atom Level Outputs @@ -178,43 +167,44 @@ def create_main_input_content( # Define restart if stage_dict.get('restart_rate', 0): - lammps_input_file += 'restart {0} {1}\n'.format( - stage_dict.get('restart_rate', 0), - '{}-{}'.format(stage_name, restart_filename), - ) + lammps_input_file += 'restart ' + lammps_input_file += f'{stage_dict.get("restart_rate", 0)} ' + lammps_input_file += f'{"{}-{}".format(stage_name, restart_filename)}\n' else: lammps_input_file += 'restart 0\n' # Define time integration method - lammps_input_file += 'fix int all {0} {1} {2}\n'.format( - get_path(stage_dict, ['integration', 'style']), - join_keywords( - get_path( - stage_dict, - ['integration', 'constraints'], - {}, - raise_error=False, - )), - join_keywords( - get_path(stage_dict, ['integration', 'keywords'], {}, - raise_error=False)), - ) + lammps_input_file += 'fix int all ' + lammps_input_file += f'{get_path(stage_dict, ["integration", "style"])} ' + _temp = join_keywords( + get_path( + stage_dict, + ['integration', 'constraints'], + {}, + raise_error=False, + )) + lammps_input_file += f'{_temp} ' + _temp = join_keywords( + get_path(stage_dict, ['integration', 'keywords'], {}, + raise_error=False)) + lammps_input_file += f'{_temp}\n' current_fixes.append('int') # Run - lammps_input_file += 'run {}\n'.format( - stage_dict.get('steps', 0)) + lammps_input_file += f'run {stage_dict.get("steps", 0)}\n' # check compute/fix/dump ids are unique if len(current_computes) != len(set(current_computes)): - raise ValueError('Stage {}: Non-unique compute ids; {}'.format( - stage_name, current_computes)) + raise ValueError( + f'Stage {stage_name}: Non-unique compute ids; {current_computes}' + ) if len(current_fixes) != len(set(current_fixes)): - raise ValueError('Stage {}: Non-unique fix ids; {}'.format( - stage_name, current_fixes)) + raise ValueError( + f'Stage {stage_name}: Non-unique fix ids; {current_fixes}') if len(current_dumps) != len(set(current_dumps)): - raise ValueError('Stage {}: Non-unique dump ids; {}'.format( - stage_name, current_dumps)) + raise ValueError( + f'Stage {stage_name}: Non-unique dump ids; {current_dumps}' + ) lammps_input_file += '\n# Final Commands\n' # output final energy @@ -236,8 +226,8 @@ def validate_parameters(param_data, potential_object): punits = param_data.get_dict()['units'] if not punits == potential_object.default_units: raise InputValidationError( - 'the units of the parameters ({}) and potential ({}) are different' - .format(punits, potential_object.default_units)) + f'the units of the parameters ({punits}) and potential ' + f'({potential_object.default_units}) are different') return True @@ -275,9 +265,9 @@ def sys_print_commands( for var in variables: var_alias = var.replace('[', '_').replace(']', '_') var_aliases.append(var_alias) - commands.append('variable {0} equal {1}'.format(var_alias, var)) + commands.append(f'variable {var_alias} equal {var}') - commands.append('fix {0} all print {1} "{2}" {3} {4} {5} screen no'.format( + commands.append('fix {0} all print {1} "{2}" {3} {4} {5} screen no'.format( # pylint: disable=consider-using-f-string fix_name, dump_rate, ' '.join(['${{{0}}}'.format(v) for v in var_aliases]), @@ -306,15 +296,15 @@ def sys_ave_commands( if set(variables).intersection(ave_variables): raise ValueError( - "variables cannot be in both 'variables' and 'ave_variables': {}". - format(set(variables).intersection(ave_variables))) + 'variables cannot be in both "variables" and "ave_variables": ' + f'{set(variables).intersection(ave_variables)}') # Note step is included, by default, as the first arg var_aliases = [] for var in variables + ave_variables: var_alias = var.replace('[', '_').replace(']', '_') var_aliases.append(var_alias) - commands.append('variable {0} equal {1}'.format(var_alias, var)) + commands.append(f'variable {var_alias} equal {var}') if not ave_variables: nevery = dump_rate @@ -322,8 +312,8 @@ def sys_ave_commands( else: if dump_rate % average_rate != 0 or average_rate > dump_rate: raise ValueError( - 'The dump rate ({}) must be a multiple of the average_rate ({})' - .format(dump_rate, average_rate)) + f'The dump rate ({dump_rate}) must be a multiple of the ' + f'average_rate ({average_rate})') nevery = average_rate nrep = int(dump_rate / average_rate) @@ -331,7 +321,7 @@ def sys_ave_commands( {variables} & {non_ave} & title1 "step {header}" & - file {filename}""".format( + file {filename}""".format( # pylint: disable=consider-using-f-string fid=fix_name, nevery=nevery, # compute variables every n steps nfreq= @@ -396,8 +386,8 @@ def atom_info_commands( if ave_variables: if dump_rate % average_rate != 0 or average_rate > dump_rate: raise ValueError( - 'The dump rate ({}) must be a multiple of the average_rate ({})' - .format(dump_rate, average_rate)) + f'The dump rate ({dump_rate}) must be a multiple of ' + f'the average_rate ({average_rate})') nevery = average_rate nrep = int(dump_rate / average_rate) @@ -413,21 +403,21 @@ def atom_info_commands( avar_names.append(ave_var) else: if len(avar_props) > 1: - avar_names.append('c_at_vars[{}]'.format(c_at_vars)) + avar_names.append(f'c_at_vars[{c_at_vars}]') c_at_vars += 1 else: avar_names.append('c_at_vars') # compute required variables if avar_props: - commands.append('compute at_vars all property/atom {}'.format( - ' '.join(avar_props))) + commands.append( + f'compute at_vars all property/atom {" ".join(avar_props)}') computes.append('at_vars') # compute means for variables commands.append( 'fix at_means all ave/atom {nevery} {nrepeat} {nfreq} {variables}'. - format( + format( # pylint: disable=consider-using-f-string nevery=nevery, # compute variables every n steps nfreq= dump_rate, # nfreq is the dump rate and must be a multiple of nevery @@ -445,19 +435,18 @@ def atom_info_commands( commands.append( 'dump {dump_id} all custom {rate} {fname} {variables} {ave_vars}'. - format( + format( # pylint: disable=consider-using-f-string dump_id=dump_name, rate=dump_rate, fname=filename, variables=' '.join(dump_variables), - ave_vars=' '.join(['v_ave_{}'.format(v) for v in ave_variables]), + ave_vars=' '.join([f'v_ave_{v}' for v in ave_variables]), )) if append: - commands.append('dump_modify {0} append yes'.format(dump_name)) + commands.append(f'dump_modify {dump_name} append yes') commands.extend([ - 'dump_modify {0} sort id'.format(dump_name), - 'dump_modify {0} element {1}'.format(dump_name, - ' '.join(kind_symbols)), + f'dump_modify {dump_name} sort id', + f'dump_modify {dump_name} element {" ".join(kind_symbols)}', ]) return commands, computes, fixes diff --git a/aiida_lammps/calculations/lammps/optimize.py b/aiida_lammps/calculations/lammps/optimize.py index 956b6b7..ab1ec0a 100644 --- a/aiida_lammps/calculations/lammps/optimize.py +++ b/aiida_lammps/calculations/lammps/optimize.py @@ -45,7 +45,7 @@ def create_main_input_content( system_filename, restart_filename, ): - # pylint: disable=too-many-locals, too-many-arguments + # pylint: disable=too-many-locals, too-many-arguments, too-many-statements parameter_data = parameter_data.get_dict() version_date = convert_date_string( @@ -59,12 +59,12 @@ def create_main_input_content( lammps_input_file += potential_data.get_input_lines(kind_symbols) - lammps_input_file += 'fix int all box/relax {} {} {}\n'.format( - parameter_data['relax']['type'], - parameter_data['relax']['pressure'], - join_keywords(parameter_data['relax'], ignore=['type', - 'pressure']), - ) + lammps_input_file += 'fix int all box/relax' + lammps_input_file += f' {parameter_data["relax"]["type"]}' + lammps_input_file += f' {parameter_data["relax"]["pressure"]}' + _temp = join_keywords(parameter_data['relax'], + ignore=['type', 'pressure']) + lammps_input_file += f' {_temp}\n' # TODO find exact version when changes were made if version_date <= convert_date_string('11 Nov 2013'): @@ -88,8 +88,7 @@ def create_main_input_content( for kwd in parameter_data.get('thermo_keywords', []): if kwd not in thermo_keywords: thermo_keywords.append(kwd) - lammps_input_file += 'thermo_style custom {}\n'.format( - ' '.join(thermo_keywords)) + lammps_input_file += f'thermo_style custom {" ".join(thermo_keywords)}\n' if potential_data.atom_style == 'charge': dump_variables = 'element x y z fx fy fz q' @@ -100,8 +99,8 @@ def create_main_input_content( dump_variables += ' c_stpa[1] c_stpa[2] c_stpa[3] c_stpa[4] c_stpa[5] c_stpa[6]' dump_format = '%4s ' + ' '.join(['%16.10f'] * 12) - lammps_input_file += 'dump aiida all custom 1 {0} {1}\n'.format( - trajectory_filename, dump_variables) + lammps_input_file += 'dump aiida all custom 1 ' + lammps_input_file += f'{trajectory_filename} {dump_variables}\n' # TODO find exact version when changes were made if version_date <= convert_date_string('10 Feb 2015'): @@ -109,28 +108,23 @@ def create_main_input_content( else: dump_mod_cmnd = 'format line' - lammps_input_file += 'dump_modify aiida {0} "{1}"\n'.format( - dump_mod_cmnd, dump_format) + lammps_input_file += f'dump_modify aiida {dump_mod_cmnd} "{dump_format}"\n' lammps_input_file += 'dump_modify aiida sort id\n' - lammps_input_file += 'dump_modify aiida element {}\n'.format( - ' '.join(kind_symbols)) - lammps_input_file += 'min_style {}\n'.format( - parameter_data['minimize']['style']) + lammps_input_file += f'dump_modify aiida element {" ".join(kind_symbols)}\n' + lammps_input_file += f'min_style {parameter_data["minimize"]["style"]}\n' # lammps_input_file += 'min_style cg\n' - lammps_input_file += 'minimize {} {} {} {}\n'.format( - parameter_data['minimize']['energy_tolerance'], - parameter_data['minimize']['force_tolerance'], - parameter_data['minimize']['max_iterations'], - parameter_data['minimize']['max_evaluations'], - ) + lammps_input_file += 'minimize ' + lammps_input_file += f'{parameter_data["minimize"]["energy_tolerance"]} ' + lammps_input_file += f'{parameter_data["minimize"]["force_tolerance"]} ' + lammps_input_file += f'{parameter_data["minimize"]["max_iterations"]} ' + lammps_input_file += f'{parameter_data["minimize"]["max_evaluations"]}\n' variables = parameter_data.get('output_variables', []) for var in variables: var_alias = var.replace('[', '_').replace(']', '_') lammps_input_file += f'variable {var_alias} equal {var}\n' - lammps_input_file += 'print "final_variable: {0} = ${{{0}}}"\n'.format( - var_alias) + lammps_input_file += f'print "final_variable: {var_alias} = ${{{var_alias}}}"\n' lammps_input_file += 'variable final_energy equal etotal\n' lammps_input_file += 'print "final_energy: ${final_energy}"\n' diff --git a/aiida_lammps/common/generate_input_files.py b/aiida_lammps/common/generate_input_files.py index ca484e7..5a03044 100644 --- a/aiida_lammps/common/generate_input_files.py +++ b/aiida_lammps/common/generate_input_files.py @@ -68,14 +68,26 @@ def parameters_to_input_file(parameters_object: dict) -> str: input_file = 'STRUCTURE FILE POSCAR\nPOSCAR\n\n' input_file += 'FORCE CONSTANTS\nFORCE_CONSTANTS\n\n' input_file += 'PRIMITIVE MATRIX\n' - input_file += ('{} {} {} \n').format(*np.array(parameters['primitive'])[0]) - input_file += ('{} {} {} \n').format(*np.array(parameters['primitive'])[1]) - input_file += ('{} {} {} \n').format(*np.array(parameters['primitive'])[2]) + input_file += f'{np.array(parameters["primitive"])[0, 0]} ' + input_file += f'{np.array(parameters["primitive"])[0, 1]} ' + input_file += f'{np.array(parameters["primitive"])[0, 2]} \n' + input_file += f'{np.array(parameters["primitive"])[1, 0]} ' + input_file += f'{np.array(parameters["primitive"])[1, 1]} ' + input_file += f'{np.array(parameters["primitive"])[1, 2]} \n' + input_file += f'{np.array(parameters["primitive"])[2, 0]} ' + input_file += f'{np.array(parameters["primitive"])[2, 1]} ' + input_file += f'{np.array(parameters["primitive"])[2, 2]} \n' input_file += '\n' input_file += 'SUPERCELL MATRIX PHONOPY\n' - input_file += ('{} {} {} \n').format(*np.array(parameters['supercell'])[0]) - input_file += ('{} {} {} \n').format(*np.array(parameters['supercell'])[1]) - input_file += ('{} {} {} \n').format(*np.array(parameters['supercell'])[2]) + input_file += f'{np.array(parameters["supercell"])[0, 0]} ' + input_file += f'{np.array(parameters["supercell"])[0, 1]} ' + input_file += f'{np.array(parameters["supercell"])[0, 2]} \n' + input_file += f'{np.array(parameters["supercell"])[1, 0]} ' + input_file += f'{np.array(parameters["supercell"])[1, 1]} ' + input_file += f'{np.array(parameters["supercell"])[1, 2]} \n' + input_file += f'{np.array(parameters["supercell"])[2, 0]} ' + input_file += f'{np.array(parameters["supercell"])[2, 1]} ' + input_file += f'{np.array(parameters["supercell"])[2, 2]} \n' input_file += '\n' return input_file diff --git a/aiida_lammps/common/input_generator.py b/aiida_lammps/common/input_generator.py index 3ac14da..74ff7ad 100644 --- a/aiida_lammps/common/input_generator.py +++ b/aiida_lammps/common/input_generator.py @@ -10,6 +10,7 @@ fixes block is never called, on the other hand the control block is always called since it is necessary for the functioning of LAMMPS. """ +# pylint: disable=unspecified-encoding from builtins import ValueError import os from typing import Union diff --git a/aiida_lammps/common/raw_parsers.py b/aiida_lammps/common/raw_parsers.py index 9db570b..ba73cfd 100644 --- a/aiida_lammps/common/raw_parsers.py +++ b/aiida_lammps/common/raw_parsers.py @@ -1,6 +1,6 @@ """Set of functions to parse the unformatted files generated by LAMMPS. """ -# pylint: disable=fixme +# pylint: disable=fixme, unspecified-encoding import re import yaml import numpy as np @@ -72,12 +72,14 @@ def read_log_file(logdata_txt, compute_stress=False): volume = np.linalg.det(cell) box_xx, box_yy, box_zz, box_xy, box_xz, box_yz = stress_params - stress = np.array([ - [box_xx, box_xy, box_xz], - [box_xy, box_yy, box_yz], - [box_xz, box_yz, box_zz], - ], - dtype=float) + stress = np.array( + [ + [box_xx, box_xy, box_xz], + [box_xy, box_yy, box_yz], + [box_xz, box_yz, box_zz], + ], + dtype=float, + ) stress = -stress / volume # to get stress in units of pressure return { @@ -259,7 +261,7 @@ def parse_quasiparticle_data(qp_file: str) -> dict: data_dict = {} for i, data in enumerate(quasiparticle_data): - data_dict['q_point_{}'.format(i)] = data + data_dict[f'q_point_{i}'] = data return data_dict diff --git a/aiida_lammps/data/lammps_potential.py b/aiida_lammps/data/lammps_potential.py index d62ef85..3243b78 100644 --- a/aiida_lammps/data/lammps_potential.py +++ b/aiida_lammps/data/lammps_potential.py @@ -16,7 +16,7 @@ class written by Sebaastian Huber. `schema `_, as to make them more easy to track and as compatible as possible to the KIM schema. """ -# pylint: disable=arguments-differ, too-many-public-methods +# pylint: disable=arguments-differ, too-many-public-methods, unspecified-encoding import io import os import pathlib @@ -405,7 +405,7 @@ def set_file( self.validate_units(units=units, pair_style=pair_style) if extra_tags is None: - extra_tags = dict() + extra_tags = {} if extra_tags is not None: self.validate_extra_tags(extra_tags=extra_tags) for key in self._extra_keys: diff --git a/aiida_lammps/data/pot_plugins/eam.py b/aiida_lammps/data/pot_plugins/eam.py index caaaf42..571f2db 100644 --- a/aiida_lammps/data/pot_plugins/eam.py +++ b/aiida_lammps/data/pot_plugins/eam.py @@ -21,16 +21,15 @@ def get_external_content(self): # ) potential_file = '' for line in self.data['file_contents']: - potential_file += '{}'.format(line) + potential_file += f'{line}' return {self.potential_fname: potential_file} def get_input_potential_lines(self): # pylint: disable=arguments-differ - lammps_input_text = 'pair_style eam/{}\n'.format( - self.data['type']) - lammps_input_text += 'pair_coeff * * {0} {{kind_symbols}}\n'.format( - self.potential_fname) + lammps_input_text = f'pair_style eam/{self.data["type"]}\n' + lammps_input_text += f'pair_coeff * * {self.potential_fname} ' + lammps_input_text += '{{kind_symbols}}\n' return lammps_input_text diff --git a/aiida_lammps/data/pot_plugins/lennard_jones.py b/aiida_lammps/data/pot_plugins/lennard_jones.py index 2eee74c..8b05fd5 100644 --- a/aiida_lammps/data/pot_plugins/lennard_jones.py +++ b/aiida_lammps/data/pot_plugins/lennard_jones.py @@ -18,13 +18,12 @@ def get_input_potential_lines(self): # pylint: disable=arguments-differ cut = np.max([float(i.split()[2]) for i in self.data.values()]) - lammps_input_text = 'pair_style lj/cut {}\n'.format(cut) + lammps_input_text = f'pair_style lj/cut {cut}\n' # TODO how to map kinds to pair coefficient for lj? for key in sorted(self.data.keys()): - lammps_input_text += 'pair_coeff {} {}\n'.format( - key, self.data[key]) + lammps_input_text += f'pair_coeff {key} {self.data[key]}\n' return lammps_input_text @property diff --git a/aiida_lammps/data/pot_plugins/reaxff.py b/aiida_lammps/data/pot_plugins/reaxff.py index c9724e5..404ae5d 100644 --- a/aiida_lammps/data/pot_plugins/reaxff.py +++ b/aiida_lammps/data/pot_plugins/reaxff.py @@ -122,13 +122,12 @@ def get_input_potential_lines(self): # pylint: disable=arguments-differ """ control = self.data.get('control', {}) - lammps_input_text = 'pair_style reax/c {} '.format( - self.control_fname if self.get_control_file_content() else 'NULL') + lammps_input_text = 'pair_style reax/c ' + lammps_input_text += f'{self.control_fname if self.get_control_file_content() else "NULL"} ' if 'safezone' in control: - lammps_input_text += 'safezone {0} '.format(control['safezone']) + lammps_input_text += f'safezone {control["safezone"]} ' lammps_input_text += '\n' - lammps_input_text += 'pair_coeff * * {} {{kind_symbols}}\n'.format( - self.potential_fname) + lammps_input_text += f'pair_coeff * * {self.potential_fname} {{kind_symbols}}\n' lammps_input_text += 'fix qeq all qeq/reax 1 0.0 10.0 1e-6 reax/c\n' if control.get('fix_modify_qeq', True): # TODO #15 in conda-forge/osx-64::lammps-2019.06.05-py36_openmpi_5, diff --git a/aiida_lammps/data/potential.py b/aiida_lammps/data/potential.py index 8331028..c3b45e3 100644 --- a/aiida_lammps/data/potential.py +++ b/aiida_lammps/data/potential.py @@ -1,10 +1,4 @@ -"""[summary] - -:raises ValueError: [description] -:raises ValueError: [description] -:return: [description] -:rtype: [type] -""" +"""Store the empirical potential data""" from hashlib import md5 from io import StringIO @@ -22,21 +16,19 @@ class EmpiricalPotential(Data): @classmethod def list_types(cls): - """[summary] + """Get the types of potentials supported by the plugin. - :return: [description] - :rtype: [type] + :return: potential types + :rtype: list """ return get_entry_point_names(cls.entry_name) @classmethod def load_type(cls, entry_name): - """[summary] + """Load the entry point for a given potential type. - :param entry_name: [description] - :type entry_name: [type] - :return: [description] - :rtype: [type] + :param entry_name: name of the entry point + :type entry_name: str """ return load_entry_point(cls.entry_name, entry_name) @@ -57,10 +49,10 @@ def __init__(self, potential_type, data=None, **kwargs): def set_data(self, potential_type, data=None): """Store the potential type (e.g. Tersoff, EAM, LJ, ..).""" if potential_type is None: - raise ValueError("'potential_type' must be provided") + raise ValueError('"potential_type" must be provided') if potential_type not in self.list_types(): - raise ValueError("'potential_type' must be in: {}".format( - self.list_types())) + raise ValueError( + f'"potential_type" must be in: {self.list_types()}') pot_class = self.load_type(potential_type)(data or {}) atom_style = pot_class.atom_style @@ -89,7 +81,7 @@ def set_data(self, potential_type, data=None): external_files = [] for fname, content in external_contents.items(): self.set_attribute( - 'md5|{}'.format(fname.replace('.', '_')), + f'md5|{fname.replace(".", "_")}', md5(content.encode('utf-8')).hexdigest(), ) self.put_object_from_filelike(StringIO(content), fname) diff --git a/aiida_lammps/data/trajectory.py b/aiida_lammps/data/trajectory.py index 8eac628..e520d84 100644 --- a/aiida_lammps/data/trajectory.py +++ b/aiida_lammps/data/trajectory.py @@ -4,6 +4,7 @@ The idea is that each of the steps of the simulation are stored as ZIP files which can then be easily accessed by the user. """ +# pylint: disable=unspecified-encoding import io import tempfile from zipfile import ZIP_DEFLATED, ZipFile diff --git a/aiida_lammps/parsers/dynaphopy.py b/aiida_lammps/parsers/dynaphopy.py index f380d42..03053f2 100644 --- a/aiida_lammps/parsers/dynaphopy.py +++ b/aiida_lammps/parsers/dynaphopy.py @@ -1,9 +1,9 @@ """Parser for dynaphopy calculations.""" # Not working with Aiida 1.0 -# pylint: disable=useless-super-delegation, super-with-arguments +# pylint: disable=useless-super-delegation, super-with-arguments, unspecified-encoding from aiida.orm.data.parameter import ParameterData # pylint: disable=no-name-in-module, import-error from aiida.parsers.parser import Parser -from aiida_phonopy.common.raw_parsers import parse_FORCE_CONSTANTS +from aiida_phonopy.common.raw_parsers import parse_FORCE_CONSTANTS # pylint: disable=import-error from aiida_lammps.common.raw_parsers import ( parse_dynaphopy_output, diff --git a/aiida_lammps/parsers/lammps/md.py b/aiida_lammps/parsers/lammps/md.py index 5ad1d72..cc34bde 100644 --- a/aiida_lammps/parsers/lammps/md.py +++ b/aiida_lammps/parsers/lammps/md.py @@ -1,5 +1,5 @@ -"""[summary] -""" +"""Parser for LAMMPS MD calculations.""" +# pylint: disable=unspecified-encoding import traceback from aiida.orm import ArrayData, Dict diff --git a/aiida_lammps/parsers/lammps/md_multi.py b/aiida_lammps/parsers/lammps/md_multi.py index beb009f..677712b 100644 --- a/aiida_lammps/parsers/lammps/md_multi.py +++ b/aiida_lammps/parsers/lammps/md_multi.py @@ -1,8 +1,5 @@ -"""[summary] - -:return: [description] -:rtype: [type] -""" +"""Parser for LAMMPS MDMulti calculations.""" +# pylint: disable=unspecified-encoding import io import os import re diff --git a/aiida_lammps/tests/test_calculations.py b/aiida_lammps/tests/test_calculations.py index 33adcbb..e8468bf 100644 --- a/aiida_lammps/tests/test_calculations.py +++ b/aiida_lammps/tests/test_calculations.py @@ -1,3 +1,4 @@ +"""Test the aiida-lammps calculations.""" from aiida.cmdline.utils.common import get_calcjob_report from aiida.engine import run_get_node from aiida.orm import Dict @@ -8,11 +9,27 @@ def get_lammps_version(code): + """Get the version of the lammps code""" exec_path = code.get_remote_exec_path() return tests.lammps_version(exec_path) def get_calc_parameters(lammps_version, plugin_name, units, potential_type): + """ + Get the calculation parameters for a given test + + :param lammps_version: version of the lammps code + :type lammps_version: str + :param plugin_name: name of the plugin + :type plugin_name: str + :param units: name of the units for the calculation + :type units: str + :param potential_type: name of the potential type + :type potential_type: str + :raises ValueError: [description] + :return: dictionary with the calculation parameters + :rtype: orm.Dict + """ if potential_type == 'reaxff': output_variables = ['temp', 'etotal', 'c_reax[1]'] @@ -177,14 +194,27 @@ def sanitize_results(results_dict, round_dp_all=None, round_energy=None): ('reaxff', 'lammps.md.multi'), ], ) -def test_input_creation(db_test_app, get_potential_data, calc_type, - potential_type, file_regression): +def test_input_creation( + db_test_app, # pylint: disable=unused-argument + get_potential_data, + calc_type, + potential_type, + file_regression, +): + """ + Test the generation of the input file for lammps + """ pot_data = get_potential_data(potential_type) - potential_data = DataFactory('lammps.potential')(type=pot_data.type, - data=pot_data.data) - parameter_data = get_calc_parameters('17 Aug 2017', calc_type, - potential_data.default_units, - potential_type) + potential_data = DataFactory('lammps.potential')( + type=pot_data.type, + data=pot_data.data, + ) + parameter_data = get_calc_parameters( + '17 Aug 2017', + calc_type, + potential_data.default_units, + potential_type, + ) calc = CalculationFactory(calc_type) content = calc.create_main_input_content( @@ -199,18 +229,33 @@ def test_input_creation(db_test_app, get_potential_data, calc_type, file_regression.check(content) -@pytest.mark.parametrize('potential_type', - ['lennard-jones', 'tersoff', 'eam', 'reaxff']) -def test_force_submission(db_test_app, get_potential_data, potential_type): +@pytest.mark.parametrize( + 'potential_type', + ['lennard-jones', 'tersoff', 'eam', 'reaxff'], +) +def test_force_submission( + db_test_app, + get_potential_data, + potential_type, +): + """ + Test the submission of the force-type calculations. + """ calc_plugin = 'lammps.force' code = db_test_app.get_or_create_code(calc_plugin) pot_data = get_potential_data(potential_type) - potential = DataFactory('lammps.potential')(type=pot_data.type, - data=pot_data.data) - parameters = get_calc_parameters(get_lammps_version(code), calc_plugin, - potential.default_units, potential_type) + potential = DataFactory('lammps.potential')( + type=pot_data.type, + data=pot_data.data, + ) + parameters = get_calc_parameters( + get_lammps_version(code), + calc_plugin, + potential.default_units, + potential_type, + ) builder = code.get_builder() - builder._update({ + builder._update({ # pylint: disable=protected-access 'metadata': tests.get_default_metadata(), 'code': code, 'structure': pot_data.structure, @@ -226,18 +271,29 @@ def test_force_submission(db_test_app, get_potential_data, potential_type): ['input.data', 'input.in']) -@pytest.mark.parametrize('potential_type', - ['lennard-jones', 'tersoff', 'eam', 'reaxff']) +@pytest.mark.parametrize( + 'potential_type', + ['lennard-jones', 'tersoff', 'eam', 'reaxff'], +) def test_optimize_submission(db_test_app, get_potential_data, potential_type): + """ + Test the submission of the optimize type of calculation + """ calc_plugin = 'lammps.optimize' code = db_test_app.get_or_create_code(calc_plugin) pot_data = get_potential_data(potential_type) - potential = DataFactory('lammps.potential')(type=pot_data.type, - data=pot_data.data) - parameters = get_calc_parameters(get_lammps_version(code), calc_plugin, - potential.default_units, potential_type) + potential = DataFactory('lammps.potential')( + type=pot_data.type, + data=pot_data.data, + ) + parameters = get_calc_parameters( + get_lammps_version(code), + calc_plugin, + potential.default_units, + potential_type, + ) builder = code.get_builder() - builder._update({ + builder._update({ # pylint: disable=protected-access 'metadata': tests.get_default_metadata(), 'code': code, 'structure': pot_data.structure, @@ -253,18 +309,27 @@ def test_optimize_submission(db_test_app, get_potential_data, potential_type): ['input.data', 'input.in']) -@pytest.mark.parametrize('potential_type', - ['lennard-jones', 'tersoff', 'eam', 'reaxff']) +@pytest.mark.parametrize( + 'potential_type', + ['lennard-jones', 'tersoff', 'eam', 'reaxff'], +) def test_md_submission(db_test_app, get_potential_data, potential_type): + """Test the submission of the md type of calculation""" calc_plugin = 'lammps.md' code = db_test_app.get_or_create_code(calc_plugin) pot_data = get_potential_data(potential_type) - potential = DataFactory('lammps.potential')(type=pot_data.type, - data=pot_data.data) - parameters = get_calc_parameters(get_lammps_version(code), calc_plugin, - potential.default_units, potential_type) + potential = DataFactory('lammps.potential')( + type=pot_data.type, + data=pot_data.data, + ) + parameters = get_calc_parameters( + get_lammps_version(code), + calc_plugin, + potential.default_units, + potential_type, + ) builder = code.get_builder() - builder._update({ + builder._update({ # pylint: disable=protected-access 'metadata': tests.get_default_metadata(), 'code': code, 'structure': pot_data.structure, @@ -281,19 +346,32 @@ def test_md_submission(db_test_app, get_potential_data, potential_type): @pytest.mark.lammps_call -@pytest.mark.parametrize('potential_type', - ['lennard-jones', 'tersoff', 'eam', 'reaxff']) -def test_force_process(db_test_app, get_potential_data, potential_type, - data_regression): +@pytest.mark.parametrize( + 'potential_type', + ['lennard-jones', 'tersoff', 'eam', 'reaxff'], +) +def test_force_process( + db_test_app, + get_potential_data, + potential_type, + data_regression, +): + """Test the functionality of the force calculation type""" calc_plugin = 'lammps.force' code = db_test_app.get_or_create_code(calc_plugin) pot_data = get_potential_data(potential_type) - potential = DataFactory('lammps.potential')(type=pot_data.type, - data=pot_data.data) - parameters = get_calc_parameters(get_lammps_version(code), calc_plugin, - potential.default_units, potential_type) + potential = DataFactory('lammps.potential')( + type=pot_data.type, + data=pot_data.data, + ) + parameters = get_calc_parameters( + get_lammps_version(code), + calc_plugin, + potential.default_units, + potential_type, + ) builder = code.get_builder() - builder._update({ + builder._update({ # pylint: disable=protected-access 'metadata': tests.get_default_metadata(), 'code': code, 'structure': pot_data.structure, @@ -326,19 +404,32 @@ def test_force_process(db_test_app, get_potential_data, potential_type, @pytest.mark.lammps_call -@pytest.mark.parametrize('potential_type', - ['lennard-jones', 'tersoff', 'eam', 'reaxff']) -def test_optimize_process(db_test_app, get_potential_data, potential_type, - data_regression): +@pytest.mark.parametrize( + 'potential_type', + ['lennard-jones', 'tersoff', 'eam', 'reaxff'], +) +def test_optimize_process( + db_test_app, + get_potential_data, + potential_type, + data_regression, +): + """Test the functionality of the optimization calculation type""" calc_plugin = 'lammps.optimize' code = db_test_app.get_or_create_code(calc_plugin) pot_data = get_potential_data(potential_type) - potential = DataFactory('lammps.potential')(type=pot_data.type, - data=pot_data.data) - parameters = get_calc_parameters(get_lammps_version(code), calc_plugin, - potential.default_units, potential_type) + potential = DataFactory('lammps.potential')( + type=pot_data.type, + data=pot_data.data, + ) + parameters = get_calc_parameters( + get_lammps_version(code), + calc_plugin, + potential.default_units, + potential_type, + ) builder = code.get_builder() - builder._update({ + builder._update({ # pylint: disable=protected-access 'metadata': tests.get_default_metadata(), 'code': code, 'structure': pot_data.structure, @@ -380,9 +471,17 @@ def test_optimize_process(db_test_app, get_potential_data, potential_type, @pytest.mark.lammps_call -@pytest.mark.parametrize('potential_type', ['lennard-jones', 'tersoff', 'eam']) -def test_md_process(db_test_app, get_potential_data, potential_type, - data_regression): +@pytest.mark.parametrize( + 'potential_type', + ['lennard-jones', 'tersoff', 'eam'], +) +def test_md_process( + db_test_app, + get_potential_data, + potential_type, + data_regression, +): + """Test the functionality of the md calculation type""" calc_plugin = 'lammps.md' code = db_test_app.get_or_create_code(calc_plugin) pot_data = get_potential_data(potential_type) @@ -390,10 +489,14 @@ def test_md_process(db_test_app, get_potential_data, potential_type, data=pot_data.data) version = get_lammps_version(code) version_year = version[-4:] - parameters = get_calc_parameters(version, calc_plugin, - potential.default_units, potential_type) + parameters = get_calc_parameters( + version, + calc_plugin, + potential.default_units, + potential_type, + ) builder = code.get_builder() - builder._update({ + builder._update({ # pylint: disable=protected-access 'metadata': tests.get_default_metadata(), 'code': code, 'structure': pot_data.structure, @@ -417,8 +520,10 @@ def test_md_process(db_test_app, get_potential_data, potential_type, data_regression.check( { 'results': - sanitize_results(calc_node.outputs.results.get_dict(), - round_energy=1), + sanitize_results( + calc_node.outputs.results.get_dict(), + round_energy=1, + ), 'system_data': calc_node.outputs.system_data.attributes, 'trajectory_data': @@ -429,19 +534,32 @@ def test_md_process(db_test_app, get_potential_data, potential_type, @pytest.mark.lammps_call -@pytest.mark.parametrize('potential_type', - ['lennard-jones', 'tersoff', 'eam', 'reaxff']) -def test_md_multi_process(db_test_app, get_potential_data, potential_type, - data_regression): +@pytest.mark.parametrize( + 'potential_type', + ['lennard-jones', 'tersoff', 'eam', 'reaxff'], +) +def test_md_multi_process( + db_test_app, + get_potential_data, + potential_type, + data_regression, +): + """Test the functionality of the multi-stage md calculation type""" calc_plugin = 'lammps.md.multi' code = db_test_app.get_or_create_code(calc_plugin) pot_data = get_potential_data(potential_type) - potential = DataFactory('lammps.potential')(type=pot_data.type, - data=pot_data.data) - parameters = get_calc_parameters(get_lammps_version(code), calc_plugin, - potential.default_units, potential_type) + potential = DataFactory('lammps.potential')( + type=pot_data.type, + data=pot_data.data, + ) + parameters = get_calc_parameters( + get_lammps_version(code), + calc_plugin, + potential.default_units, + potential_type, + ) builder = code.get_builder() - builder._update({ + builder._update({ # pylint: disable=protected-access 'metadata': tests.get_default_metadata(), 'code': code, 'structure': pot_data.structure, diff --git a/aiida_lammps/tests/test_generate_structure.py b/aiida_lammps/tests/test_generate_structure.py index e68c0a5..9adcc1c 100644 --- a/aiida_lammps/tests/test_generate_structure.py +++ b/aiida_lammps/tests/test_generate_structure.py @@ -1,11 +1,14 @@ +"""Test the structure generation in aiida-lammps""" import pytest - from aiida_lammps.common.generate_structure import generate_lammps_structure -@pytest.mark.parametrize('structure', - ['Fe', 'pyrite', 'fes_cubic-zincblende', 'greigite']) -def test_generate(db_test_app, get_structure_data, structure, file_regression): +@pytest.mark.parametrize( + 'structure', + ['Fe', 'pyrite', 'fes_cubic-zincblende', 'greigite'], +) +def test_generate(db_test_app, get_structure_data, structure, file_regression): # pylint: disable=unused-argument + """Test the structure generation in aiida-lammps""" structure = get_structure_data(structure) - text, transform = generate_lammps_structure(structure, round_dp=8) + text, _ = generate_lammps_structure(structure, round_dp=8) file_regression.check(text) diff --git a/aiida_lammps/tests/test_parsers.py b/aiida_lammps/tests/test_parsers.py index 9baecce..f2b6021 100644 --- a/aiida_lammps/tests/test_parsers.py +++ b/aiida_lammps/tests/test_parsers.py @@ -1,3 +1,6 @@ +""" +Tests to aiida-lammps parsers. +""" from io import StringIO from textwrap import dedent @@ -8,6 +11,7 @@ def get_log(): + """Get the reference values for the log parser""" return dedent("""\ units metal final_energy: 2.0 @@ -17,6 +21,7 @@ def get_log(): def get_traj_force(): + """Get the reference values for the trajectory parser""" return dedent("""\ ITEM: TIMESTEP 0 @@ -40,14 +45,16 @@ def get_traj_force(): 'plugin_name', ['lammps.force', 'lammps.optimize', 'lammps.md', 'lammps.md.multi']) def test_missing_log(db_test_app, plugin_name): - + """Check if the log file is produced during calculation.""" retrieved = FolderData() calc_node = db_test_app.generate_calcjob_node(plugin_name, retrieved) parser = ParserFactory(plugin_name) with db_test_app.sandbox_folder() as temp_path: - results, calcfunction = parser.parse_from_node( - calc_node, retrieved_temporary_folder=temp_path.abspath) + results, calcfunction = parser.parse_from_node( # pylint: disable=unused-variable + calc_node, + retrieved_temporary_folder=temp_path.abspath, + ) assert calcfunction.is_finished, calcfunction.exception assert calcfunction.is_failed, calcfunction.exit_status @@ -59,7 +66,7 @@ def test_missing_log(db_test_app, plugin_name): 'plugin_name', ['lammps.force', 'lammps.optimize', 'lammps.md', 'lammps.md.multi']) def test_missing_traj(db_test_app, plugin_name): - + """Check if the trajectory file is produced during calculation.""" retrieved = FolderData() retrieved.put_object_from_filelike(StringIO(get_log()), 'log.lammps') retrieved.put_object_from_filelike(StringIO(''), '_scheduler-stdout.txt') @@ -68,8 +75,10 @@ def test_missing_traj(db_test_app, plugin_name): calc_node = db_test_app.generate_calcjob_node(plugin_name, retrieved) parser = ParserFactory(plugin_name) with db_test_app.sandbox_folder() as temp_path: - results, calcfunction = parser.parse_from_node( - calc_node, retrieved_temporary_folder=temp_path.abspath) + results, calcfunction = parser.parse_from_node( # pylint: disable=unused-variable + calc_node, + retrieved_temporary_folder=temp_path.abspath, + ) assert calcfunction.is_finished, calcfunction.exception assert calcfunction.is_failed, calcfunction.exit_status @@ -81,7 +90,7 @@ def test_missing_traj(db_test_app, plugin_name): 'plugin_name', ['lammps.force', 'lammps.optimize', 'lammps.md', 'lammps.md.multi']) def test_empty_log(db_test_app, plugin_name): - + """Check if the lammps log is empty.""" retrieved = FolderData() for filename in [ 'log.lammps', @@ -97,8 +106,10 @@ def test_empty_log(db_test_app, plugin_name): with db_test_app.sandbox_folder() as temp_path: with temp_path.open('x-trajectory.lammpstrj', 'w'): pass - results, calcfunction = parser.parse_from_node( - calc_node, retrieved_temporary_folder=temp_path.abspath) + results, calcfunction = parser.parse_from_node( # pylint: disable=unused-variable + calc_node, + retrieved_temporary_folder=temp_path.abspath, + ) assert calcfunction.is_finished, calcfunction.exception assert calcfunction.is_failed, calcfunction.exit_status @@ -110,7 +121,7 @@ def test_empty_log(db_test_app, plugin_name): 'plugin_name', ['lammps.force', 'lammps.optimize', 'lammps.md', 'lammps.md.multi']) def test_empty_traj(db_test_app, plugin_name): - + """Check if the lammps trajectory file is empty.""" retrieved = FolderData() retrieved.put_object_from_filelike(StringIO(get_log()), 'log.lammps') for filename in [ @@ -125,8 +136,10 @@ def test_empty_traj(db_test_app, plugin_name): with db_test_app.sandbox_folder() as temp_path: with temp_path.open('x-trajectory.lammpstrj', 'w'): pass - results, calcfunction = parser.parse_from_node( - calc_node, retrieved_temporary_folder=temp_path.abspath) + results, calcfunction = parser.parse_from_node( # pylint: disable=unused-variable + calc_node, + retrieved_temporary_folder=temp_path.abspath, + ) assert calcfunction.is_finished, calcfunction.exception assert calcfunction.is_failed, calcfunction.exit_status @@ -138,14 +151,24 @@ def test_empty_traj(db_test_app, plugin_name): 'plugin_name', ['lammps.force', 'lammps.optimize', 'lammps.md', 'lammps.md.multi']) def test_run_error(db_test_app, plugin_name): - + """Check if the parser runs without producing errors.""" retrieved = FolderData() - retrieved.put_object_from_filelike(StringIO(get_log()), 'log.lammps') - retrieved.put_object_from_filelike(StringIO(get_traj_force()), - 'x-trajectory.lammpstrj') - retrieved.put_object_from_filelike(StringIO('ERROR description'), - '_scheduler-stdout.txt') - retrieved.put_object_from_filelike(StringIO(''), '_scheduler-stderr.txt') + retrieved.put_object_from_filelike( + StringIO(get_log()), + 'log.lammps', + ) + retrieved.put_object_from_filelike( + StringIO(get_traj_force()), + 'x-trajectory.lammpstrj', + ) + retrieved.put_object_from_filelike( + StringIO('ERROR description'), + '_scheduler-stdout.txt', + ) + retrieved.put_object_from_filelike( + StringIO(''), + '_scheduler-stderr.txt', + ) calc_node = db_test_app.generate_calcjob_node(plugin_name, retrieved) parser = ParserFactory(plugin_name) @@ -153,8 +176,10 @@ def test_run_error(db_test_app, plugin_name): with db_test_app.sandbox_folder() as temp_path: with temp_path.open('x-trajectory.lammpstrj', 'w') as handle: handle.write(get_traj_force()) - results, calcfunction = parser.parse_from_node( - calc_node, retrieved_temporary_folder=temp_path.abspath) + results, calcfunction = parser.parse_from_node( # pylint: disable=unused-variable + calc_node, + retrieved_temporary_folder=temp_path.abspath, + ) print(get_calcjob_report(calc_node)) diff --git a/aiida_lammps/tests/test_potential_data.py b/aiida_lammps/tests/test_potential_data.py index aba6373..ba71a5d 100644 --- a/aiida_lammps/tests/test_potential_data.py +++ b/aiida_lammps/tests/test_potential_data.py @@ -1,38 +1,56 @@ -import pytest +"""Test the functionality of the lammps potential data object""" +import pytest from aiida_lammps.data.potential import EmpiricalPotential def test_list_potentials(): + """Test that all the supported potential types are recognized.""" assert set(EmpiricalPotential.list_types()).issuperset( ['eam', 'lennard_jones', 'reaxff', 'tersoff']) def test_load_type(): + """Test that an specific potential can be loaded""" EmpiricalPotential.load_type('eam') @pytest.mark.parametrize('potential_type', ['lennard-jones', 'tersoff', 'eam', 'reaxff']) -def test_init(db_test_app, get_potential_data, potential_type, - data_regression): +def test_init( + db_test_app, # pylint: disable=unused-argument + get_potential_data, + potential_type, + data_regression, +): + """Test that the potential can be generated""" potential = get_potential_data(potential_type) - node = EmpiricalPotential(type=potential.type, data=potential.data) + node = EmpiricalPotential(type=potential.type, data=potential.data) # pylint: disable=no-value-for-parameter data_regression.check(node.attributes) @pytest.mark.parametrize('potential_type', ['tersoff']) -def test_potential_files(db_test_app, get_potential_data, potential_type, - file_regression): +def test_potential_files( + db_test_app, # pylint: disable=unused-argument + get_potential_data, + potential_type, + file_regression, +): + """Test that one can read the potential content.""" potential = get_potential_data(potential_type) - node = EmpiricalPotential(type=potential.type, data=potential.data) + node = EmpiricalPotential(type=potential.type, data=potential.data) # pylint: disable=no-value-for-parameter file_regression.check(node.get_object_content('potential.pot', 'r')) @pytest.mark.parametrize('potential_type', ['lennard-jones', 'tersoff', 'eam', 'reaxff']) -def test_input_lines(db_test_app, get_potential_data, potential_type, - file_regression): +def test_input_lines( + db_test_app, # pylint: disable=unused-argument + get_potential_data, + potential_type, + file_regression, +): + """Test that one can get the potential lines for a given aiida-lammps potential""" potential = get_potential_data(potential_type) - node = EmpiricalPotential(type=potential.type, data=potential.data) + node = EmpiricalPotential(type=potential.type, data=potential.data) # pylint: disable=no-value-for-parameter file_regression.check(node.get_input_lines()) diff --git a/aiida_lammps/tests/test_reaxff_parse.py b/aiida_lammps/tests/test_reaxff_parse.py index a8fec5f..0f61a84 100644 --- a/aiida_lammps/tests/test_reaxff_parse.py +++ b/aiida_lammps/tests/test_reaxff_parse.py @@ -1,3 +1,4 @@ +"""Test the reaxff parser""" from textwrap import dedent from aiida_lammps.common.reaxff_convert import read_lammps_format, write_lammps_format @@ -425,22 +426,26 @@ def test_read_lammps_format(data_regression): + """Check that the reaxff potential is compatible with the lammps format""" output = read_lammps_format(lammps_file1.splitlines()) data_regression.check(output) def test_round_trip_lammps_format(file_regression): + """Check that one can write the reaxff potential""" data = read_lammps_format(lammps_file1.splitlines()) output = write_lammps_format(data) file_regression.check(output) def test_read_lammps_format2(data_regression): + """Check that the reaxff potential is compatible with the second lammps format""" output = read_lammps_format(lammps_file2.splitlines()) data_regression.check(output) def test_round_trip_lammps_format2(file_regression): + """Check that one can write the reaxff potential in the second format""" data = read_lammps_format(lammps_file2.splitlines()) output = write_lammps_format(data) file_regression.check(output) diff --git a/aiida_lammps/tests/test_trajectory.py b/aiida_lammps/tests/test_trajectory.py index 4714cd0..b9fb1b3 100644 --- a/aiida_lammps/tests/test_trajectory.py +++ b/aiida_lammps/tests/test_trajectory.py @@ -1,3 +1,4 @@ +"""Tests for the aiida-lammps trajectory data type""" import io import os @@ -7,6 +8,7 @@ def test_iter_trajectories(data_regression): + """Test that one can iterate over the trajectory steps""" path = os.path.join(TEST_DIR, 'input_files', 'trajectory.lammpstrj') output = [] with io.open(path) as handle: @@ -18,7 +20,8 @@ def test_iter_trajectories(data_regression): data_regression.check(output) -def test_create_structure(db_test_app, data_regression): +def test_create_structure(db_test_app, data_regression): # pylint: disable=unused-argument + """Test that one can create an structure from a trajectory step""" path = os.path.join(TEST_DIR, 'input_files', 'trajectory.lammpstrj') with io.open(path) as handle: traj_block = next(iter_trajectories(handle)) @@ -28,19 +31,22 @@ def test_create_structure(db_test_app, data_regression): recursive_round(structure.attributes, 2, apply_lists=True)) -def test_lammps_trajectory_data(db_test_app, data_regression): +def test_lammps_trajectory_data(db_test_app, data_regression): # pylint: disable=unused-argument + """Test that one can generate a trajectory from a file""" path = os.path.join(TEST_DIR, 'input_files', 'trajectory.lammpstrj') data = LammpsTrajectory(path) data_regression.check(data.attributes) -def test_lammpstraj_get_step_string(db_test_app, file_regression): +def test_lammpstraj_get_step_string(db_test_app, file_regression): # pylint: disable=unused-argument + """Get the step information from a trajectory data file""" path = os.path.join(TEST_DIR, 'input_files', 'trajectory.lammpstrj') data = LammpsTrajectory(path) file_regression.check(data.get_step_string(-1)) -def test_lammpstraj_get_step_struct(db_test_app, data_regression): +def test_lammpstraj_get_step_struct(db_test_app, data_regression): # pylint: disable=unused-argument + """Get the structure data for a given trajectory step""" path = os.path.join(TEST_DIR, 'input_files', 'trajectory.lammpstrj') data = LammpsTrajectory(path) data_regression.check( @@ -49,7 +55,8 @@ def test_lammpstraj_get_step_struct(db_test_app, data_regression): apply_lists=True)) -def test_lammpstraj_timesteps(db_test_app): +def test_lammpstraj_timesteps(db_test_app): # pylint: disable=unused-argument + """Get the list of timesteps for the trajectory data""" path = os.path.join(TEST_DIR, 'input_files', 'trajectory.lammpstrj') data = LammpsTrajectory(path) assert data.time_steps == [ @@ -77,7 +84,8 @@ def test_lammpstraj_timesteps(db_test_app): ] -def test_write_as_lammps(db_test_app, tmp_path): +def test_write_as_lammps(db_test_app, tmp_path): # pylint: disable=unused-argument + """Test that one can write the trajectory in a lammps compatible format""" path = os.path.join(TEST_DIR, 'input_files', 'trajectory.lammpstrj') data = LammpsTrajectory(path) with tmp_path.joinpath('trajectory.lammpstrj').open(mode='wb') as handle: diff --git a/aiida_lammps/tests/utils.py b/aiida_lammps/tests/utils.py index e28ac5e..2b3d5be 100644 --- a/aiida_lammps/tests/utils.py +++ b/aiida_lammps/tests/utils.py @@ -1,3 +1,4 @@ +"""Set of functions to test the aiida-lammps functionality.""" from collections.abc import Mapping from contextlib import contextmanager import distutils.spawn @@ -6,6 +7,15 @@ import subprocess import sys +from aiida.common import NotExistent +from aiida.orm import Computer, Code, CalcJobNode +from aiida.plugins import ParserFactory, CalculationFactory, DataFactory +from aiida.engine.utils import instantiate_process +from aiida.manage.manager import get_manager +from aiida.common.links import LinkType +from aiida.plugins.entry_point import format_entry_point_string +from aiida.common.folders import SandboxFolder + TEST_DIR = os.path.dirname(os.path.realpath(__file__)) @@ -70,8 +80,6 @@ def get_or_create_local_computer(work_directory, name='localhost'): aiida.orm.computers.Computer """ - from aiida.common import NotExistent - from aiida.orm import Computer try: computer = Computer.objects.get(label=name) @@ -93,14 +101,12 @@ def get_or_create_local_computer(work_directory, name='localhost'): def get_or_create_code(entry_point, computer, executable, exec_path=None): """Setup code on localhost computer""" - from aiida.common import NotExistent - from aiida.orm import Code, Computer if isinstance(computer, str): computer = Computer.objects.get(label=computer) try: - code = Code.objects.get( + code = Code.objects.get( # pylint: disable=no-member label='{}-{}-{}'.format(entry_point, executable, computer.label)) except NotExistent: if exec_path is None: @@ -142,19 +148,26 @@ def get_default_metadata( } -def recursive_round(ob, dp, apply_lists=False): - """ map a function on to all values of a nested dictionary """ - if isinstance(ob, Mapping): - return {k: recursive_round(v, dp, apply_lists) for k, v in ob.items()} - elif apply_lists and isinstance(ob, (list, tuple)): - return [recursive_round(v, dp, apply_lists) for v in ob] - elif isinstance(ob, float): - return round(ob, dp) - else: - return ob +def recursive_round(check_object, precision, apply_lists=False): + """Map a function on to all values of a nested dictionary """ + if isinstance(check_object, Mapping): + return { + k: recursive_round(v, precision, apply_lists) + for k, v in check_object.items() + } + if apply_lists and isinstance(check_object, (list, tuple)): + return [ + recursive_round(v, precision, apply_lists) for v in check_object + ] + if isinstance(check_object, float): + return round(check_object, precision) + return check_object class AiidaTestApp(object): + """A class providing methods for testing purposes""" + + # pylint: disable=useless-object-inheritance def __init__(self, work_directory, executable_map, environment=None): """a class providing methods for testing purposes @@ -193,19 +206,25 @@ def get_or_create_code(self, entry_point, computer_name='localhost'): try: executable = self._executables[entry_point] - except KeyError: + except KeyError as key_error: raise KeyError( - 'Entry point {} not recognized. Allowed values: {}'.format( - entry_point, self._executables.keys())) + f'Entry point {entry_point} not recognized. ' + f'Allowed values: {self._executables.keys()}') from key_error return get_or_create_code(entry_point, computer, executable) @staticmethod - def get_default_metadata(max_num_machines=1, - max_wallclock_seconds=1800, - with_mpi=False): - return get_default_metadata(max_num_machines, max_wallclock_seconds, - with_mpi) + def get_default_metadata( + max_num_machines=1, + max_wallclock_seconds=1800, + with_mpi=False, + ): + """Get the metadata for a calculation""" + return get_default_metadata( + max_num_machines, + max_wallclock_seconds, + with_mpi, + ) @staticmethod def get_parser_cls(entry_point_name): @@ -221,7 +240,6 @@ def get_parser_cls(entry_point_name): aiida.parsers.parser.Parser """ - from aiida.plugins import ParserFactory return ParserFactory(entry_point_name) @@ -239,7 +257,6 @@ def get_data_node(entry_point_name, **kwargs): aiida.orm.nodes.data.Data """ - from aiida.plugins import DataFactory return DataFactory(entry_point_name)(**kwargs) @@ -253,15 +270,16 @@ def get_calc_cls(entry_point_name): entry point name of the data node class """ - from aiida.plugins import CalculationFactory return CalculationFactory(entry_point_name) - def generate_calcjob_node(self, - entry_point_name, - retrieved, - computer_name='localhost', - attributes=None): + def generate_calcjob_node( + self, + entry_point_name, + retrieved, + computer_name='localhost', + attributes=None, + ): """Fixture to generate a mock `CalcJobNode` for testing parsers. Parameters @@ -281,9 +299,6 @@ def generate_calcjob_node(self, instance with the `retrieved` node linked as outgoing """ - from aiida.common.links import LinkType - from aiida.orm import CalcJobNode - from aiida.plugins.entry_point import format_entry_point_string process = self.get_calc_cls(entry_point_name) computer = self.get_or_create_computer(computer_name) @@ -302,19 +317,21 @@ def generate_calcjob_node(self, node.set_option('max_wallclock_seconds', 1800) if attributes: - node.set_attributes(attributes) + node.set_attributes(attributes) # pylint: disable=no-member node.store() - retrieved.add_incoming(node, - link_type=LinkType.CREATE, - link_label='retrieved') + retrieved.add_incoming( + node, + link_type=LinkType.CREATE, + link_label='retrieved', + ) retrieved.store() return node @contextmanager - def sandbox_folder(self): + def sandbox_folder(self): # pylint: disable=no-self-use """AiiDA folder object context. Yields @@ -322,7 +339,6 @@ def sandbox_folder(self): aiida.common.folders.SandboxFolder """ - from aiida.common.folders import SandboxFolder with SandboxFolder() as folder: yield folder @@ -342,9 +358,6 @@ def generate_calcinfo(entry_point_name, folder, inputs=None): inputs: dict or None """ - from aiida.engine.utils import instantiate_process - from aiida.manage.manager import get_manager - from aiida.plugins import CalculationFactory manager = get_manager() runner = manager.get_runner() diff --git a/aiida_lammps/validation/utils.py b/aiida_lammps/validation/utils.py index a5a3762..911156a 100644 --- a/aiida_lammps/validation/utils.py +++ b/aiida_lammps/validation/utils.py @@ -1,6 +1,7 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- """Utility functions for validating JSON objects against schemas.""" +# pylint: disable=unspecified-encoding import io import json import os @@ -95,8 +96,7 @@ def validate_against_schema(data, schema): errors = sorted(validator.iter_errors(data), key=lambda e: e.path) if errors: raise jsonschema.ValidationError('\n'.join([ - "- {} [key path: '{}']".format( - error.message, '/'.join([str(p) for p in error.path])) + f'- {error.message} [key path: "{"/".join([str(p) for p in error.path])}"]' for error in errors ])) diff --git a/conftest.py b/conftest.py index 6121645..3ff7298 100644 --- a/conftest.py +++ b/conftest.py @@ -1,7 +1,7 @@ """ initialise a text database and profile """ -# pylint: disable=fixme, redefined-outer-name +# pylint: disable=fixme, redefined-outer-name, unspecified-encoding from collections import namedtuple import io import os @@ -53,10 +53,8 @@ def get_work_directory(config): def pytest_report_header(config): """Add header information for pytest execution.""" return [ - 'LAMMPS Executable: {}'.format( - shutil.which(config.getoption('lammps_exec') or 'lammps')), - 'LAMMPS Work Directory: {}'.format( - config.getoption('lammps_workdir') or ''), + f'LAMMPS Executable: {shutil.which(config.getoption("lammps_exec") or "lammps")}', + f'LAMMPS Work Directory: {config.getoption("lammps_workdir") or ""}' ] @@ -117,8 +115,10 @@ def _get_structure_data(pkey): symbols = names = ['Ar'] * 2 - positions = [(0.33333, 0.66666, 0.25000), - (0.66667, 0.33333, 0.75000)] + positions = [ + (0.33333, 0.66666, 0.25000), + (0.66667, 0.33333, 0.75000), + ] fractional = True elif pkey == 'GaN': @@ -208,7 +208,7 @@ def _get_structure_data(pkey): ] else: - raise ValueError('Unknown structure key: {}'.format(pkey)) + raise ValueError(f'Unknown structure key: {pkey}') # create structure structure = DataFactory('structure')(cell=cell) @@ -222,8 +222,10 @@ def _get_structure_data(pkey): return _get_structure_data -PotentialData = namedtuple('PotentialTestData', - ['type', 'data', 'structure', 'output']) +PotentialData = namedtuple( + 'PotentialTestData', + ['type', 'data', 'structure', 'output'], +) @pytest.fixture(scope='function') diff --git a/setup.py b/setup.py index 5fd04ba..504180b 100644 --- a/setup.py +++ b/setup.py @@ -1,5 +1,6 @@ #!/usr/bin/env python """Define the setup for the `aiida-lammps` plugin.""" +# pylint: disable=unspecified-encoding import json from setuptools import find_packages, setup From f1379d614b401e34cc38d78f274e07fc92e54e31 Mon Sep 17 00:00:00 2001 From: Jonathan Chico Date: Fri, 3 Dec 2021 12:59:55 +0100 Subject: [PATCH 25/70] Setting the version of pylint to 2.5 --- .github/workflows/tests.yml | 2 +- setup.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 21b8b0e..b2ea232 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -35,7 +35,7 @@ jobs: pip --version - name: Install wheel run: pip install wheel - - name: Install AiiDA-VASP + - name: Install AiiDA-LAMMPS run: | pip install -e .[testing,pre-commit] pip freeze diff --git a/setup.json b/setup.json index c4323ef..dcdbeb1 100644 --- a/setup.json +++ b/setup.json @@ -70,7 +70,7 @@ "mypy==0.910", "packaging==20.3", "pre-commit~=2.2", - "pylint~=2.11.1", + "pylint~=2.5.0", "pylint-aiida~=0.1.1", "pylint-django", "sqlalchemy2-stubs" From ad59d3fa875f12741c2d3bdcc85b9313512b1a15 Mon Sep 17 00:00:00 2001 From: Jonathan Chico Date: Fri, 3 Dec 2021 13:16:32 +0100 Subject: [PATCH 26/70] (WIP) Fixing formatting issues with pylint. --- aiida_lammps/calculations/dynaphopy.py | 3 +-- aiida_lammps/calculations/lammps/__init__.py | 4 ++-- aiida_lammps/calculations/lammps/combinate.py | 8 ++++---- aiida_lammps/calculations/lammps/md_multi.py | 8 ++++---- aiida_lammps/common/input_generator.py | 1 - aiida_lammps/common/raw_parsers.py | 2 +- aiida_lammps/data/lammps_potential.py | 2 +- aiida_lammps/data/trajectory.py | 1 - aiida_lammps/parsers/dynaphopy.py | 2 +- aiida_lammps/parsers/lammps/base.py | 2 +- aiida_lammps/parsers/lammps/force.py | 2 +- aiida_lammps/parsers/lammps/md.py | 3 +-- aiida_lammps/parsers/lammps/md_multi.py | 3 +-- aiida_lammps/parsers/lammps/optimize.py | 2 +- aiida_lammps/validation/utils.py | 1 - conftest.py | 2 +- setup.py | 1 - 17 files changed, 20 insertions(+), 27 deletions(-) diff --git a/aiida_lammps/calculations/dynaphopy.py b/aiida_lammps/calculations/dynaphopy.py index 0134d98..3dc361a 100644 --- a/aiida_lammps/calculations/dynaphopy.py +++ b/aiida_lammps/calculations/dynaphopy.py @@ -1,5 +1,5 @@ """Base dynaphopy calculation""" -# pylint: disable=too-many-instance-attributes, abstract-method, unspecified-encoding +# pylint: disable=too-many-instance-attributes, abstract-method from aiida.common.datastructures import CalcInfo, CodeInfo from aiida.common.exceptions import InputValidationError from aiida.common.utils import classproperty @@ -20,7 +20,6 @@ class DynaphopyCalculation(CalcJob): Requirement: the node should be able to import phonopy """ def _init_internal_params(self): - # pylint: disable=super-with-arguments super(DynaphopyCalculation, self)._init_internal_params() self._INPUT_FILE_NAME = 'input_dynaphopy' # pylint: disable=invalid-name, attribute-defined-outside-init diff --git a/aiida_lammps/calculations/lammps/__init__.py b/aiida_lammps/calculations/lammps/__init__.py index 322f3b6..957d33f 100644 --- a/aiida_lammps/calculations/lammps/__init__.py +++ b/aiida_lammps/calculations/lammps/__init__.py @@ -1,5 +1,5 @@ """Base LAMMPS calculation for AiiDA.""" -# pylint: disable=duplicate-code, unspecified-encoding +# pylint: disable=duplicate-code import itertools import numpy as np from aiida.common import CalcInfo, CodeInfo @@ -345,7 +345,7 @@ def prepare_for_submission(self, tempfolder): :param tempfolder: an `aiida.common.folders.Folder` to temporarily write files on disk :return: `aiida.common.CalcInfo` instance """ - # pylint: disable=too-many-locals, arguments-renamed + # pylint: disable=too-many-locals # assert that the potential and structure have the same kind elements if self.inputs.potential.allowed_element_names is not None and not set( k.symbol for k in self.inputs.structure.kinds).issubset( diff --git a/aiida_lammps/calculations/lammps/combinate.py b/aiida_lammps/calculations/lammps/combinate.py index 7b3995b..d50133f 100644 --- a/aiida_lammps/calculations/lammps/combinate.py +++ b/aiida_lammps/calculations/lammps/combinate.py @@ -1,12 +1,12 @@ """Combined MD and Phonopy calculation""" # Not working with Aiida 1.0 -# pylint: disable=no-name-in-module, unspecified-encoding +# pylint: disable=no-name-in-module +import numpy as np from aiida.common.exceptions import InputValidationError from aiida import orm from aiida_phonopy.common.raw_parsers import ( # pylint: disable=import-error get_force_constants, get_FORCE_SETS_txt, get_poscar_txt, ) -import numpy as np from aiida_lammps.calculations.lammps import BaseLammpsCalculation @@ -119,7 +119,7 @@ def create_main_input_content( system_filename, restart_filename, ): - # pylint: disable=too-many-arguments, arguments-renamed + # pylint: disable=too-many-arguments random_number = np.random.randint(10000000) lammps_input_file = f'units {potential_data.default_units}\n' @@ -182,7 +182,7 @@ def prepare_extra_files(self, tempfolder, potential_object): ) try: - parameters_data_dynaphopy = orm.Dict.pop( + parameters_data_dynaphopy = orm.Dict.pop( # pylint: disable=no-member self.get_linkname('parameters_dynaphopy')) except KeyError as key_error: raise InputValidationError( diff --git a/aiida_lammps/calculations/lammps/md_multi.py b/aiida_lammps/calculations/lammps/md_multi.py index 82e4006..ae95dfd 100644 --- a/aiida_lammps/calculations/lammps/md_multi.py +++ b/aiida_lammps/calculations/lammps/md_multi.py @@ -267,7 +267,7 @@ def sys_print_commands( var_aliases.append(var_alias) commands.append(f'variable {var_alias} equal {var}') - commands.append('fix {0} all print {1} "{2}" {3} {4} {5} screen no'.format( # pylint: disable=consider-using-f-string + commands.append('fix {0} all print {1} "{2}" {3} {4} {5} screen no'.format( fix_name, dump_rate, ' '.join(['${{{0}}}'.format(v) for v in var_aliases]), @@ -321,7 +321,7 @@ def sys_ave_commands( {variables} & {non_ave} & title1 "step {header}" & - file {filename}""".format( # pylint: disable=consider-using-f-string + file {filename}""".format( fid=fix_name, nevery=nevery, # compute variables every n steps nfreq= @@ -417,7 +417,7 @@ def atom_info_commands( # compute means for variables commands.append( 'fix at_means all ave/atom {nevery} {nrepeat} {nfreq} {variables}'. - format( # pylint: disable=consider-using-f-string + format( nevery=nevery, # compute variables every n steps nfreq= dump_rate, # nfreq is the dump rate and must be a multiple of nevery @@ -435,7 +435,7 @@ def atom_info_commands( commands.append( 'dump {dump_id} all custom {rate} {fname} {variables} {ave_vars}'. - format( # pylint: disable=consider-using-f-string + format( dump_id=dump_name, rate=dump_rate, fname=filename, diff --git a/aiida_lammps/common/input_generator.py b/aiida_lammps/common/input_generator.py index 74ff7ad..3ac14da 100644 --- a/aiida_lammps/common/input_generator.py +++ b/aiida_lammps/common/input_generator.py @@ -10,7 +10,6 @@ fixes block is never called, on the other hand the control block is always called since it is necessary for the functioning of LAMMPS. """ -# pylint: disable=unspecified-encoding from builtins import ValueError import os from typing import Union diff --git a/aiida_lammps/common/raw_parsers.py b/aiida_lammps/common/raw_parsers.py index ba73cfd..da314e9 100644 --- a/aiida_lammps/common/raw_parsers.py +++ b/aiida_lammps/common/raw_parsers.py @@ -1,6 +1,6 @@ """Set of functions to parse the unformatted files generated by LAMMPS. """ -# pylint: disable=fixme, unspecified-encoding +# pylint: disable=fixme import re import yaml import numpy as np diff --git a/aiida_lammps/data/lammps_potential.py b/aiida_lammps/data/lammps_potential.py index 3243b78..b1e8c79 100644 --- a/aiida_lammps/data/lammps_potential.py +++ b/aiida_lammps/data/lammps_potential.py @@ -16,7 +16,7 @@ class written by Sebaastian Huber. `schema `_, as to make them more easy to track and as compatible as possible to the KIM schema. """ -# pylint: disable=arguments-differ, too-many-public-methods, unspecified-encoding +# pylint: disable=arguments-differ, too-many-public-methods import io import os import pathlib diff --git a/aiida_lammps/data/trajectory.py b/aiida_lammps/data/trajectory.py index e520d84..8eac628 100644 --- a/aiida_lammps/data/trajectory.py +++ b/aiida_lammps/data/trajectory.py @@ -4,7 +4,6 @@ The idea is that each of the steps of the simulation are stored as ZIP files which can then be easily accessed by the user. """ -# pylint: disable=unspecified-encoding import io import tempfile from zipfile import ZIP_DEFLATED, ZipFile diff --git a/aiida_lammps/parsers/dynaphopy.py b/aiida_lammps/parsers/dynaphopy.py index 03053f2..a8bd1bb 100644 --- a/aiida_lammps/parsers/dynaphopy.py +++ b/aiida_lammps/parsers/dynaphopy.py @@ -1,6 +1,6 @@ """Parser for dynaphopy calculations.""" # Not working with Aiida 1.0 -# pylint: disable=useless-super-delegation, super-with-arguments, unspecified-encoding +# pylint: disable=useless-super-delegation from aiida.orm.data.parameter import ParameterData # pylint: disable=no-name-in-module, import-error from aiida.parsers.parser import Parser from aiida_phonopy.common.raw_parsers import parse_FORCE_CONSTANTS # pylint: disable=import-error diff --git a/aiida_lammps/parsers/lammps/base.py b/aiida_lammps/parsers/lammps/base.py index c352b70..faa6c05 100644 --- a/aiida_lammps/parsers/lammps/base.py +++ b/aiida_lammps/parsers/lammps/base.py @@ -23,7 +23,7 @@ class LAMMPSBaseParser(Parser): """Abstract Base Parser for LAMMPS, supplying common methods.""" def __init__(self, node): """Initialize the parser.""" - # pylint: disable=super-with-arguments, useless-super-delegation + # pylint: disable=useless-super-delegation super(LAMMPSBaseParser, self).__init__(node) def get_parsing_resources( diff --git a/aiida_lammps/parsers/lammps/force.py b/aiida_lammps/parsers/lammps/force.py index b549af1..3c59c2b 100644 --- a/aiida_lammps/parsers/lammps/force.py +++ b/aiida_lammps/parsers/lammps/force.py @@ -11,7 +11,7 @@ class ForceParser(LAMMPSBaseParser): """Parser for LAMMPS single point energy calculation.""" def __init__(self, node): """Initialize the instance of Force Lammps Parser.""" - # pylint: disable=super-with-arguments, useless-super-delegation + # pylint: disable=useless-super-delegation super(ForceParser, self).__init__(node) def parse(self, **kwargs): diff --git a/aiida_lammps/parsers/lammps/md.py b/aiida_lammps/parsers/lammps/md.py index cc34bde..b393500 100644 --- a/aiida_lammps/parsers/lammps/md.py +++ b/aiida_lammps/parsers/lammps/md.py @@ -1,5 +1,4 @@ """Parser for LAMMPS MD calculations.""" -# pylint: disable=unspecified-encoding import traceback from aiida.orm import ArrayData, Dict @@ -14,7 +13,7 @@ class MdParser(LAMMPSBaseParser): """Parser for LAMMPS MD calculations.""" def __init__(self, node): """Initialize the instance of Lammps MD Parser.""" - # pylint: disable=super-with-arguments, useless-super-delegation + # pylint: disable=useless-super-delegation super(MdParser, self).__init__(node) def parse(self, **kwargs): diff --git a/aiida_lammps/parsers/lammps/md_multi.py b/aiida_lammps/parsers/lammps/md_multi.py index 677712b..0fa424c 100644 --- a/aiida_lammps/parsers/lammps/md_multi.py +++ b/aiida_lammps/parsers/lammps/md_multi.py @@ -1,5 +1,4 @@ """Parser for LAMMPS MDMulti calculations.""" -# pylint: disable=unspecified-encoding import io import os import re @@ -17,7 +16,7 @@ class MdMultiParser(LAMMPSBaseParser): """Parser for LAMMPS MDMulti calculations.""" def __init__(self, node): """Initialize the instance of Lammps MD Parser.""" - # pylint: disable=super-with-arguments, useless-super-delegation + # pylint: disable=useless-super-delegation super(MdMultiParser, self).__init__(node) def parse(self, **kwargs): diff --git a/aiida_lammps/parsers/lammps/optimize.py b/aiida_lammps/parsers/lammps/optimize.py index b5d260e..0e6941a 100644 --- a/aiida_lammps/parsers/lammps/optimize.py +++ b/aiida_lammps/parsers/lammps/optimize.py @@ -16,7 +16,7 @@ class OptimizeParser(LAMMPSBaseParser): """Parser for LAMMPS optimization calculation.""" def __init__(self, node): """Initialize the instance of Optimize Lammps Parser.""" - # pylint: disable=super-with-arguments, useless-super-delegation + # pylint: disable=useless-super-delegation super(OptimizeParser, self).__init__(node) def parse(self, **kwargs): diff --git a/aiida_lammps/validation/utils.py b/aiida_lammps/validation/utils.py index 911156a..54884a1 100644 --- a/aiida_lammps/validation/utils.py +++ b/aiida_lammps/validation/utils.py @@ -1,7 +1,6 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- """Utility functions for validating JSON objects against schemas.""" -# pylint: disable=unspecified-encoding import io import json import os diff --git a/conftest.py b/conftest.py index 3ff7298..a711c89 100644 --- a/conftest.py +++ b/conftest.py @@ -1,7 +1,7 @@ """ initialise a text database and profile """ -# pylint: disable=fixme, redefined-outer-name, unspecified-encoding +# pylint: disable=fixme, redefined-outer-name from collections import namedtuple import io import os diff --git a/setup.py b/setup.py index 504180b..5fd04ba 100644 --- a/setup.py +++ b/setup.py @@ -1,6 +1,5 @@ #!/usr/bin/env python """Define the setup for the `aiida-lammps` plugin.""" -# pylint: disable=unspecified-encoding import json from setuptools import find_packages, setup From d75db2152d65cea0179f969f3171b124acada364 Mon Sep 17 00:00:00 2001 From: Jonathan Chico Date: Fri, 3 Dec 2021 13:38:12 +0100 Subject: [PATCH 27/70] (WIP) Fixing issues with pylint formatting. Increasing pylint version to 2.6 --- aiida_lammps/calculations/lammps/__init__.py | 4 ++-- aiida_lammps/calculations/lammps/combinate.py | 4 ++-- aiida_lammps/calculations/lammps/md_multi.py | 4 ++-- aiida_lammps/common/parse_trajectory.py | 11 +++++++---- aiida_lammps/parsers/lammps/md.py | 2 +- aiida_lammps/parsers/lammps/md_multi.py | 4 +--- aiida_lammps/tests/test_calculations.py | 2 +- aiida_lammps/tests/test_parsers.py | 2 +- aiida_lammps/tests/test_potential_data.py | 12 ++++++++---- aiida_lammps/utils.py | 5 ++--- conftest.py | 6 ++---- setup.json | 2 +- 12 files changed, 30 insertions(+), 28 deletions(-) diff --git a/aiida_lammps/calculations/lammps/__init__.py b/aiida_lammps/calculations/lammps/__init__.py index 957d33f..14b1f3f 100644 --- a/aiida_lammps/calculations/lammps/__init__.py +++ b/aiida_lammps/calculations/lammps/__init__.py @@ -336,10 +336,10 @@ def create_main_input_content( :type restart_filename: [type] :raises NotImplementedError: [description] """ - # pylint: disable=no-self-use, too-many-arguments, unused-argument, duplicate-code + # pylint: disable=no-self-use, too-many-arguments, unused-argument, duplicate-code, arguments-differ raise NotImplementedError - def prepare_for_submission(self, tempfolder): + def prepare_for_submission(self, tempfolder): # pylint: disable=arguments-differ """Create the input files from the input nodes passed to this instance of the `CalcJob`. :param tempfolder: an `aiida.common.folders.Folder` to temporarily write files on disk diff --git a/aiida_lammps/calculations/lammps/combinate.py b/aiida_lammps/calculations/lammps/combinate.py index d50133f..2dd95c1 100644 --- a/aiida_lammps/calculations/lammps/combinate.py +++ b/aiida_lammps/calculations/lammps/combinate.py @@ -119,7 +119,7 @@ def create_main_input_content( system_filename, restart_filename, ): - # pylint: disable=too-many-arguments + # pylint: disable=too-many-arguments, arguments-differ random_number = np.random.randint(10000000) lammps_input_file = f'units {potential_data.default_units}\n' @@ -182,7 +182,7 @@ def prepare_extra_files(self, tempfolder, potential_object): ) try: - parameters_data_dynaphopy = orm.Dict.pop( # pylint: disable=no-member + parameters_data_dynaphopy = orm.Dict.pop( # pylint: disable=no-member self.get_linkname('parameters_dynaphopy')) except KeyError as key_error: raise InputValidationError( diff --git a/aiida_lammps/calculations/lammps/md_multi.py b/aiida_lammps/calculations/lammps/md_multi.py index ae95dfd..40df385 100644 --- a/aiida_lammps/calculations/lammps/md_multi.py +++ b/aiida_lammps/calculations/lammps/md_multi.py @@ -394,12 +394,12 @@ def atom_info_commands( # work out which variables need to be computed avar_props = [ v for v in ave_variables - if not any([v.startswith(s) for s in ['c_', 'f_', 'v_']]) # pylint: disable=use-a-generator + if not any([v.startswith(s) for s in ['c_', 'f_', 'v_']]) ] avar_names = [] c_at_vars = 1 for ave_var in ave_variables: - if any([ave_var.startswith(s) for s in ['c_', 'f_', 'v_']]): # pylint: disable=use-a-generator + if any([ave_var.startswith(s) for s in ['c_', 'f_', 'v_']]): avar_names.append(ave_var) else: if len(avar_props) > 1: diff --git a/aiida_lammps/common/parse_trajectory.py b/aiida_lammps/common/parse_trajectory.py index 5fb3a7b..6609175 100644 --- a/aiida_lammps/common/parse_trajectory.py +++ b/aiida_lammps/common/parse_trajectory.py @@ -157,16 +157,19 @@ def create_structure( return structure - pbcs = [] + boundary_conditions = [] for pbc in trajectory_block.pbc: if pbc == 'pp': - pbcs.append(True) + boundary_conditions.append(True) elif pbc == 'ff': - pbcs.append(False) + boundary_conditions.append(False) else: raise NotImplementedError(f'pbc = {trajectory_block.pbc}') - structure = orm.StructureData(cell=trajectory_block.cell, pbc=pbcs) + structure = orm.StructureData( + cell=trajectory_block.cell, + pbc=boundary_conditions, + ) for symbol, position in zip(symbols, positions): structure.append_atom(position=position, symbols=symbol) diff --git a/aiida_lammps/parsers/lammps/md.py b/aiida_lammps/parsers/lammps/md.py index b393500..9770010 100644 --- a/aiida_lammps/parsers/lammps/md.py +++ b/aiida_lammps/parsers/lammps/md.py @@ -1,8 +1,8 @@ """Parser for LAMMPS MD calculations.""" import traceback +import numpy as np from aiida.orm import ArrayData, Dict -import numpy as np from aiida_lammps.common.raw_parsers import convert_units, get_units_dict from aiida_lammps.data.trajectory import LammpsTrajectory diff --git a/aiida_lammps/parsers/lammps/md_multi.py b/aiida_lammps/parsers/lammps/md_multi.py index 0fa424c..b936929 100644 --- a/aiida_lammps/parsers/lammps/md_multi.py +++ b/aiida_lammps/parsers/lammps/md_multi.py @@ -3,10 +3,8 @@ import os import re import traceback - -from aiida.orm import ArrayData, Dict import numpy as np - +from aiida.orm import ArrayData, Dict from aiida_lammps.common.raw_parsers import convert_units, get_units_dict from aiida_lammps.data.trajectory import LammpsTrajectory from aiida_lammps.parsers.lammps.base import LAMMPSBaseParser diff --git a/aiida_lammps/tests/test_calculations.py b/aiida_lammps/tests/test_calculations.py index e8468bf..0d8f956 100644 --- a/aiida_lammps/tests/test_calculations.py +++ b/aiida_lammps/tests/test_calculations.py @@ -1,9 +1,9 @@ """Test the aiida-lammps calculations.""" +import pytest from aiida.cmdline.utils.common import get_calcjob_report from aiida.engine import run_get_node from aiida.orm import Dict from aiida.plugins import CalculationFactory, DataFactory -import pytest import aiida_lammps.tests.utils as tests diff --git a/aiida_lammps/tests/test_parsers.py b/aiida_lammps/tests/test_parsers.py index f2b6021..2e5aced 100644 --- a/aiida_lammps/tests/test_parsers.py +++ b/aiida_lammps/tests/test_parsers.py @@ -3,11 +3,11 @@ """ from io import StringIO from textwrap import dedent +import pytest from aiida.cmdline.utils.common import get_calcjob_report from aiida.orm import FolderData from aiida.plugins import ParserFactory -import pytest def get_log(): diff --git a/aiida_lammps/tests/test_potential_data.py b/aiida_lammps/tests/test_potential_data.py index ba71a5d..f895c86 100644 --- a/aiida_lammps/tests/test_potential_data.py +++ b/aiida_lammps/tests/test_potential_data.py @@ -15,8 +15,10 @@ def test_load_type(): EmpiricalPotential.load_type('eam') -@pytest.mark.parametrize('potential_type', - ['lennard-jones', 'tersoff', 'eam', 'reaxff']) +@pytest.mark.parametrize( + 'potential_type', + ['lennard-jones', 'tersoff', 'eam', 'reaxff'], +) def test_init( db_test_app, # pylint: disable=unused-argument get_potential_data, @@ -42,8 +44,10 @@ def test_potential_files( file_regression.check(node.get_object_content('potential.pot', 'r')) -@pytest.mark.parametrize('potential_type', - ['lennard-jones', 'tersoff', 'eam', 'reaxff']) +@pytest.mark.parametrize( + 'potential_type', + ['lennard-jones', 'tersoff', 'eam', 'reaxff'], +) def test_input_lines( db_test_app, # pylint: disable=unused-argument get_potential_data, diff --git a/aiida_lammps/utils.py b/aiida_lammps/utils.py index 3ad694a..703b9fc 100644 --- a/aiida_lammps/utils.py +++ b/aiida_lammps/utils.py @@ -1,7 +1,6 @@ -"""[summary] -""" -from aiida import __version__ as aiida_version_ +"""General utility functions for aiida-lammps""" from packaging import version +from aiida import __version__ as aiida_version_ def aiida_version(): diff --git a/conftest.py b/conftest.py index a711c89..48486d7 100644 --- a/conftest.py +++ b/conftest.py @@ -7,11 +7,9 @@ import os import shutil import tempfile - -from aiida.plugins import DataFactory -import numpy as np import pytest - +import numpy as np +from aiida.plugins import DataFactory from aiida_lammps.tests.utils import TEST_DIR, AiidaTestApp from aiida_lammps.common.reaxff_convert import ( filter_by_species, diff --git a/setup.json b/setup.json index dcdbeb1..e48de32 100644 --- a/setup.json +++ b/setup.json @@ -70,7 +70,7 @@ "mypy==0.910", "packaging==20.3", "pre-commit~=2.2", - "pylint~=2.5.0", + "pylint~=2.6.0", "pylint-aiida~=0.1.1", "pylint-django", "sqlalchemy2-stubs" From 57af6135cf6c4d0e4446e0aa4ba7256d50998089 Mon Sep 17 00:00:00 2001 From: Jonathan Chico Date: Fri, 3 Dec 2021 14:13:29 +0100 Subject: [PATCH 28/70] (WIP) Trying to fix the issues with pylint checking for duplicate code --- .pre-commit-config.yaml | 1 + aiida_lammps/calculations/dynaphopy.py | 2 +- aiida_lammps/calculations/lammps/__init__.py | 2 +- aiida_lammps/calculations/lammps/combinate.py | 2 +- aiida_lammps/calculations/lammps/force.py | 2 +- aiida_lammps/calculations/lammps/md.py | 4 ++-- aiida_lammps/calculations/lammps/md_multi.py | 2 +- aiida_lammps/calculations/lammps/optimize.py | 2 +- aiida_lammps/data/potential.py | 1 + aiida_lammps/data/trajectory.py | 1 + aiida_lammps/parsers/dynaphopy.py | 2 +- aiida_lammps/parsers/lammps/base.py | 7 ++----- aiida_lammps/parsers/lammps/force.py | 2 +- aiida_lammps/parsers/lammps/md.py | 2 +- aiida_lammps/parsers/lammps/md_multi.py | 2 +- aiida_lammps/parsers/lammps/optimize.py | 2 +- 16 files changed, 18 insertions(+), 18 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index bcbca06..578a95c 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -35,6 +35,7 @@ repos: name: pylint entry: pylint types: [python] + args: ['-d duplicate-code'] language: system exclude: | (?x)( diff --git a/aiida_lammps/calculations/dynaphopy.py b/aiida_lammps/calculations/dynaphopy.py index 3dc361a..4d81050 100644 --- a/aiida_lammps/calculations/dynaphopy.py +++ b/aiida_lammps/calculations/dynaphopy.py @@ -1,5 +1,5 @@ """Base dynaphopy calculation""" -# pylint: disable=too-many-instance-attributes, abstract-method +# pylint: disable=too-many-instance-attributes, abstract-method, super-with-arguments from aiida.common.datastructures import CalcInfo, CodeInfo from aiida.common.exceptions import InputValidationError from aiida.common.utils import classproperty diff --git a/aiida_lammps/calculations/lammps/__init__.py b/aiida_lammps/calculations/lammps/__init__.py index 14b1f3f..3fa8cb4 100644 --- a/aiida_lammps/calculations/lammps/__init__.py +++ b/aiida_lammps/calculations/lammps/__init__.py @@ -1,5 +1,5 @@ """Base LAMMPS calculation for AiiDA.""" -# pylint: disable=duplicate-code +# pylint: disable=duplicate-code, super-with-arguments, duplicate-code import itertools import numpy as np from aiida.common import CalcInfo, CodeInfo diff --git a/aiida_lammps/calculations/lammps/combinate.py b/aiida_lammps/calculations/lammps/combinate.py index 2dd95c1..c8e8ae7 100644 --- a/aiida_lammps/calculations/lammps/combinate.py +++ b/aiida_lammps/calculations/lammps/combinate.py @@ -1,6 +1,6 @@ """Combined MD and Phonopy calculation""" # Not working with Aiida 1.0 -# pylint: disable=no-name-in-module +# pylint: disable=no-name-in-module, super-with-arguments, duplicate-code import numpy as np from aiida.common.exceptions import InputValidationError from aiida import orm diff --git a/aiida_lammps/calculations/lammps/force.py b/aiida_lammps/calculations/lammps/force.py index 3dffbb3..368eacb 100644 --- a/aiida_lammps/calculations/lammps/force.py +++ b/aiida_lammps/calculations/lammps/force.py @@ -1,5 +1,5 @@ """Single point calculation of the energy in LAMMPS.""" -# pylint: disable=fixme, duplicate-code, useless-super-delegation +# pylint: disable=fixme, duplicate-code, useless-super-delegation, super-with-arguments from aiida.plugins import DataFactory from aiida_lammps.calculations.lammps import BaseLammpsCalculation diff --git a/aiida_lammps/calculations/lammps/md.py b/aiida_lammps/calculations/lammps/md.py index 8226f7e..9dbd6dc 100644 --- a/aiida_lammps/calculations/lammps/md.py +++ b/aiida_lammps/calculations/lammps/md.py @@ -1,5 +1,5 @@ """Single stage MD calculation in LAMMPS.""" -# pylint: disable=fixme, useless-super-delegation +# pylint: disable=fixme, useless-super-delegation, super-with-arguments, duplicate-code import numpy as np from aiida.common.exceptions import InputValidationError from aiida.plugins import DataFactory @@ -45,7 +45,7 @@ def create_main_input_content( system_filename, restart_filename, ): - # pylint: disable=too-many-locals, too-many-arguments¸ too-many-branches, too-many-statements + # pylint: disable=too-many-locals, too-many-arguments¸ too-many-branches, too-many-statements, duplicate-code pdict = parameter_data.get_dict() version_date = convert_date_string( pdict.get('lammps_version', '11 Aug 2017')) diff --git a/aiida_lammps/calculations/lammps/md_multi.py b/aiida_lammps/calculations/lammps/md_multi.py index 40df385..5bbb2fc 100644 --- a/aiida_lammps/calculations/lammps/md_multi.py +++ b/aiida_lammps/calculations/lammps/md_multi.py @@ -1,5 +1,5 @@ """Run a multi-stage molecular dynamic simulation.""" -# pylint: disable=fixme +# pylint: disable=fixme, super-with-arguments from aiida.common.exceptions import InputValidationError from aiida.plugins import DataFactory diff --git a/aiida_lammps/calculations/lammps/optimize.py b/aiida_lammps/calculations/lammps/optimize.py index ab1ec0a..f1244d8 100644 --- a/aiida_lammps/calculations/lammps/optimize.py +++ b/aiida_lammps/calculations/lammps/optimize.py @@ -1,7 +1,7 @@ """Class describing the calculation of the optimization of a structure using LAMMPS (minimize method). """ -# pylint: disable=fixme, duplicate-code, useless-super-delegation +# pylint: disable=fixme, duplicate-code, useless-super-delegation, super-with-arguments from aiida.common.exceptions import InputValidationError from aiida.plugins import DataFactory diff --git a/aiida_lammps/data/potential.py b/aiida_lammps/data/potential.py index c3b45e3..73456eb 100644 --- a/aiida_lammps/data/potential.py +++ b/aiida_lammps/data/potential.py @@ -1,4 +1,5 @@ """Store the empirical potential data""" +# pylint: disable=too-many-ancestors from hashlib import md5 from io import StringIO diff --git a/aiida_lammps/data/trajectory.py b/aiida_lammps/data/trajectory.py index 8eac628..c2618f4 100644 --- a/aiida_lammps/data/trajectory.py +++ b/aiida_lammps/data/trajectory.py @@ -4,6 +4,7 @@ The idea is that each of the steps of the simulation are stored as ZIP files which can then be easily accessed by the user. """ +# pylint: disable=too-many-ancestors import io import tempfile from zipfile import ZIP_DEFLATED, ZipFile diff --git a/aiida_lammps/parsers/dynaphopy.py b/aiida_lammps/parsers/dynaphopy.py index a8bd1bb..8e95933 100644 --- a/aiida_lammps/parsers/dynaphopy.py +++ b/aiida_lammps/parsers/dynaphopy.py @@ -1,6 +1,6 @@ """Parser for dynaphopy calculations.""" # Not working with Aiida 1.0 -# pylint: disable=useless-super-delegation +# pylint: disable=useless-super-delegation, super-with-arguments from aiida.orm.data.parameter import ParameterData # pylint: disable=no-name-in-module, import-error from aiida.parsers.parser import Parser from aiida_phonopy.common.raw_parsers import parse_FORCE_CONSTANTS # pylint: disable=import-error diff --git a/aiida_lammps/parsers/lammps/base.py b/aiida_lammps/parsers/lammps/base.py index faa6c05..50fd427 100644 --- a/aiida_lammps/parsers/lammps/base.py +++ b/aiida_lammps/parsers/lammps/base.py @@ -1,7 +1,4 @@ -"""[summary] - -:return: [description] -:rtype: [type] +"""Abstract Base Parser for LAMMPS, supplying common methods. """ from collections import namedtuple from fnmatch import fnmatch @@ -23,7 +20,7 @@ class LAMMPSBaseParser(Parser): """Abstract Base Parser for LAMMPS, supplying common methods.""" def __init__(self, node): """Initialize the parser.""" - # pylint: disable=useless-super-delegation + # pylint: disable=useless-super-delegation, super-with-arguments super(LAMMPSBaseParser, self).__init__(node) def get_parsing_resources( diff --git a/aiida_lammps/parsers/lammps/force.py b/aiida_lammps/parsers/lammps/force.py index 3c59c2b..2c39876 100644 --- a/aiida_lammps/parsers/lammps/force.py +++ b/aiida_lammps/parsers/lammps/force.py @@ -11,7 +11,7 @@ class ForceParser(LAMMPSBaseParser): """Parser for LAMMPS single point energy calculation.""" def __init__(self, node): """Initialize the instance of Force Lammps Parser.""" - # pylint: disable=useless-super-delegation + # pylint: disable=useless-super-delegation, super-with-arguments super(ForceParser, self).__init__(node) def parse(self, **kwargs): diff --git a/aiida_lammps/parsers/lammps/md.py b/aiida_lammps/parsers/lammps/md.py index 9770010..0a1ff4f 100644 --- a/aiida_lammps/parsers/lammps/md.py +++ b/aiida_lammps/parsers/lammps/md.py @@ -13,7 +13,7 @@ class MdParser(LAMMPSBaseParser): """Parser for LAMMPS MD calculations.""" def __init__(self, node): """Initialize the instance of Lammps MD Parser.""" - # pylint: disable=useless-super-delegation + # pylint: disable=useless-super-delegation, super-with-arguments super(MdParser, self).__init__(node) def parse(self, **kwargs): diff --git a/aiida_lammps/parsers/lammps/md_multi.py b/aiida_lammps/parsers/lammps/md_multi.py index b936929..4d311b3 100644 --- a/aiida_lammps/parsers/lammps/md_multi.py +++ b/aiida_lammps/parsers/lammps/md_multi.py @@ -14,7 +14,7 @@ class MdMultiParser(LAMMPSBaseParser): """Parser for LAMMPS MDMulti calculations.""" def __init__(self, node): """Initialize the instance of Lammps MD Parser.""" - # pylint: disable=useless-super-delegation + # pylint: disable=useless-super-delegation, super-with-arguments super(MdMultiParser, self).__init__(node) def parse(self, **kwargs): diff --git a/aiida_lammps/parsers/lammps/optimize.py b/aiida_lammps/parsers/lammps/optimize.py index 0e6941a..7b695cd 100644 --- a/aiida_lammps/parsers/lammps/optimize.py +++ b/aiida_lammps/parsers/lammps/optimize.py @@ -16,7 +16,7 @@ class OptimizeParser(LAMMPSBaseParser): """Parser for LAMMPS optimization calculation.""" def __init__(self, node): """Initialize the instance of Optimize Lammps Parser.""" - # pylint: disable=useless-super-delegation + # pylint: disable=useless-super-delegation, super-with-arguments super(OptimizeParser, self).__init__(node) def parse(self, **kwargs): From 4e2ad56839f81285d44e8443b66367be8727d7d2 Mon Sep 17 00:00:00 2001 From: Jonathan Chico Date: Fri, 3 Dec 2021 14:23:49 +0100 Subject: [PATCH 29/70] (WIP) Removing pre-commit from the installation of the tests --- .github/workflows/tests.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index b2ea232..8a924bf 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -37,7 +37,7 @@ jobs: run: pip install wheel - name: Install AiiDA-LAMMPS run: | - pip install -e .[testing,pre-commit] + pip install -e .[testing, pre-commit] pip freeze - name: Run pre-commit run: pre-commit run --all-files || ( git diff; git status; exit 1; ) @@ -104,7 +104,7 @@ jobs: - name: Installation run: | - pip install -e .[testing, pre-commit] + pip install -e .[testing] reentry scan - name: Run pytest From 1317df53e7538dd2a8d04c08deea32a615100e9f Mon Sep 17 00:00:00 2001 From: Jonathan Chico Date: Fri, 3 Dec 2021 14:33:44 +0100 Subject: [PATCH 30/70] (WIP) Fixing an issue with github actions. --- .github/workflows/tests.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 8a924bf..0700e30 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -37,7 +37,7 @@ jobs: run: pip install wheel - name: Install AiiDA-LAMMPS run: | - pip install -e .[testing, pre-commit] + pip install -e .[testing,pre-commit] pip freeze - name: Run pre-commit run: pre-commit run --all-files || ( git diff; git status; exit 1; ) @@ -104,7 +104,7 @@ jobs: - name: Installation run: | - pip install -e .[testing] + pip install -e .[testing,pre-commit] reentry scan - name: Run pytest @@ -122,7 +122,7 @@ jobs: publish: name: Publish to PyPi - needs: [pre-commit, tests] + needs: [pre-commit,test] if: github.event_name == 'push' && startsWith(github.event.ref, 'refs/tags') runs-on: ubuntu-latest steps: From f75fef02d03d96138e92a11167a8b5521049db5b Mon Sep 17 00:00:00 2001 From: Jonathan Chico Date: Fri, 3 Dec 2021 14:34:39 +0100 Subject: [PATCH 31/70] (WIP) Fixing an issue with github actions. --- .github/workflows/tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 0700e30..a6189c9 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -122,7 +122,7 @@ jobs: publish: name: Publish to PyPi - needs: [pre-commit,test] + needs: [pre-commit, tests] if: github.event_name == 'push' && startsWith(github.event.ref, 'refs/tags') runs-on: ubuntu-latest steps: From 955767dd662182a17a125650c4b07aa8a4680655 Mon Sep 17 00:00:00 2001 From: Jonathan Chico Date: Fri, 3 Dec 2021 14:49:52 +0100 Subject: [PATCH 32/70] (WIP) Fixing the tests so that they correctly refer to potential_type instead of type. --- aiida_lammps/tests/test_calculations.py | 12 ++++++------ aiida_lammps/tests/test_potential_data.py | 6 +++--- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/aiida_lammps/tests/test_calculations.py b/aiida_lammps/tests/test_calculations.py index 0d8f956..2b77722 100644 --- a/aiida_lammps/tests/test_calculations.py +++ b/aiida_lammps/tests/test_calculations.py @@ -206,7 +206,7 @@ def test_input_creation( """ pot_data = get_potential_data(potential_type) potential_data = DataFactory('lammps.potential')( - type=pot_data.type, + potential_type=pot_data.type, data=pot_data.data, ) parameter_data = get_calc_parameters( @@ -245,7 +245,7 @@ def test_force_submission( code = db_test_app.get_or_create_code(calc_plugin) pot_data = get_potential_data(potential_type) potential = DataFactory('lammps.potential')( - type=pot_data.type, + potential_type=pot_data.type, data=pot_data.data, ) parameters = get_calc_parameters( @@ -283,7 +283,7 @@ def test_optimize_submission(db_test_app, get_potential_data, potential_type): code = db_test_app.get_or_create_code(calc_plugin) pot_data = get_potential_data(potential_type) potential = DataFactory('lammps.potential')( - type=pot_data.type, + potential_type=pot_data.type, data=pot_data.data, ) parameters = get_calc_parameters( @@ -361,7 +361,7 @@ def test_force_process( code = db_test_app.get_or_create_code(calc_plugin) pot_data = get_potential_data(potential_type) potential = DataFactory('lammps.potential')( - type=pot_data.type, + potential_type=pot_data.type, data=pot_data.data, ) parameters = get_calc_parameters( @@ -419,7 +419,7 @@ def test_optimize_process( code = db_test_app.get_or_create_code(calc_plugin) pot_data = get_potential_data(potential_type) potential = DataFactory('lammps.potential')( - type=pot_data.type, + potential_type=pot_data.type, data=pot_data.data, ) parameters = get_calc_parameters( @@ -549,7 +549,7 @@ def test_md_multi_process( code = db_test_app.get_or_create_code(calc_plugin) pot_data = get_potential_data(potential_type) potential = DataFactory('lammps.potential')( - type=pot_data.type, + potential_type=pot_data.type, data=pot_data.data, ) parameters = get_calc_parameters( diff --git a/aiida_lammps/tests/test_potential_data.py b/aiida_lammps/tests/test_potential_data.py index f895c86..24a38c3 100644 --- a/aiida_lammps/tests/test_potential_data.py +++ b/aiida_lammps/tests/test_potential_data.py @@ -27,7 +27,7 @@ def test_init( ): """Test that the potential can be generated""" potential = get_potential_data(potential_type) - node = EmpiricalPotential(type=potential.type, data=potential.data) # pylint: disable=no-value-for-parameter + node = EmpiricalPotential(potential_type=potential.type, data=potential.data) # pylint: disable=no-value-for-parameter data_regression.check(node.attributes) @@ -40,7 +40,7 @@ def test_potential_files( ): """Test that one can read the potential content.""" potential = get_potential_data(potential_type) - node = EmpiricalPotential(type=potential.type, data=potential.data) # pylint: disable=no-value-for-parameter + node = EmpiricalPotential(potential_type=potential.type, data=potential.data) # pylint: disable=no-value-for-parameter file_regression.check(node.get_object_content('potential.pot', 'r')) @@ -56,5 +56,5 @@ def test_input_lines( ): """Test that one can get the potential lines for a given aiida-lammps potential""" potential = get_potential_data(potential_type) - node = EmpiricalPotential(type=potential.type, data=potential.data) # pylint: disable=no-value-for-parameter + node = EmpiricalPotential(potential_type=potential.type, data=potential.data) # pylint: disable=no-value-for-parameter file_regression.check(node.get_input_lines()) From 124199430bb39aaa8191135eb5f2bf168cbf5bd4 Mon Sep 17 00:00:00 2001 From: Jonathan Chico Date: Fri, 3 Dec 2021 15:03:21 +0100 Subject: [PATCH 33/70] (WIP) Fixing an issue with the kind_symbols not being properly replaced in the string. --- aiida_lammps/data/pot_plugins/eam.py | 2 +- aiida_lammps/data/pot_plugins/tersoff.py | 4 ++-- aiida_lammps/tests/test_calculations.py | 13 +++++-------- aiida_lammps/tests/test_potential_data.py | 15 ++++++++++++--- 4 files changed, 20 insertions(+), 14 deletions(-) diff --git a/aiida_lammps/data/pot_plugins/eam.py b/aiida_lammps/data/pot_plugins/eam.py index 571f2db..e5aa558 100644 --- a/aiida_lammps/data/pot_plugins/eam.py +++ b/aiida_lammps/data/pot_plugins/eam.py @@ -29,7 +29,7 @@ def get_input_potential_lines(self): # pylint: disable=arguments-differ lammps_input_text = f'pair_style eam/{self.data["type"]}\n' lammps_input_text += f'pair_coeff * * {self.potential_fname} ' - lammps_input_text += '{{kind_symbols}}\n' + lammps_input_text += '{kind_symbols}\n' return lammps_input_text diff --git a/aiida_lammps/data/pot_plugins/tersoff.py b/aiida_lammps/data/pot_plugins/tersoff.py index 62d3df4..d0f1134 100644 --- a/aiida_lammps/data/pot_plugins/tersoff.py +++ b/aiida_lammps/data/pot_plugins/tersoff.py @@ -23,8 +23,8 @@ def get_external_content(self): def get_input_potential_lines(self): # pylint: disable=arguments-differ lammps_input_text = 'pair_style tersoff\n' - lammps_input_text += 'pair_coeff * * {} {{kind_symbols}}\n'.format( - self.potential_fname) + lammps_input_text += f'pair_coeff * * {self.potential_fname} ' + lammps_input_text += '{kind_symbols}\n' return lammps_input_text diff --git a/aiida_lammps/tests/test_calculations.py b/aiida_lammps/tests/test_calculations.py index 2b77722..5900c7d 100644 --- a/aiida_lammps/tests/test_calculations.py +++ b/aiida_lammps/tests/test_calculations.py @@ -319,7 +319,7 @@ def test_md_submission(db_test_app, get_potential_data, potential_type): code = db_test_app.get_or_create_code(calc_plugin) pot_data = get_potential_data(potential_type) potential = DataFactory('lammps.potential')( - type=pot_data.type, + potential_type=pot_data.type, data=pot_data.data, ) parameters = get_calc_parameters( @@ -443,8 +443,7 @@ def test_optimize_process( if not calc_node.is_finished_ok: print(calc_node.attributes) print(get_calcjob_report(calc_node)) - raise Exception('finished with exit message: {}'.format( - calc_node.exit_message)) + raise Exception(f'finished with exit message: {calc_node.exit_message}') link_labels = calc_node.get_outgoing().all_link_labels() assert set(link_labels).issuperset( @@ -486,7 +485,7 @@ def test_md_process( code = db_test_app.get_or_create_code(calc_plugin) pot_data = get_potential_data(potential_type) potential = DataFactory('lammps.potential')(type=pot_data.type, - data=pot_data.data) + data=pot_data.data,) version = get_lammps_version(code) version_year = version[-4:] parameters = get_calc_parameters( @@ -510,8 +509,7 @@ def test_md_process( if not calc_node.is_finished_ok: print(calc_node.attributes) print(get_calcjob_report(calc_node)) - raise Exception('finished with exit message: {}'.format( - calc_node.exit_message)) + raise Exception(f'finished with exit message: {calc_node.exit_message}') link_labels = calc_node.get_outgoing().all_link_labels() assert set(link_labels).issuperset( @@ -573,8 +571,7 @@ def test_md_multi_process( if not calc_node.is_finished_ok: print(calc_node.attributes) print(get_calcjob_report(calc_node)) - raise Exception('finished with exit message: {}'.format( - calc_node.exit_message)) + raise Exception(f'finished with exit message: {calc_node.exit_message}') link_labels = calc_node.get_outgoing().all_link_labels() assert set(link_labels).issuperset([ diff --git a/aiida_lammps/tests/test_potential_data.py b/aiida_lammps/tests/test_potential_data.py index 24a38c3..c3bb520 100644 --- a/aiida_lammps/tests/test_potential_data.py +++ b/aiida_lammps/tests/test_potential_data.py @@ -27,7 +27,10 @@ def test_init( ): """Test that the potential can be generated""" potential = get_potential_data(potential_type) - node = EmpiricalPotential(potential_type=potential.type, data=potential.data) # pylint: disable=no-value-for-parameter + node = EmpiricalPotential( + potential_type=potential.type, + data=potential.data, + ) data_regression.check(node.attributes) @@ -40,7 +43,10 @@ def test_potential_files( ): """Test that one can read the potential content.""" potential = get_potential_data(potential_type) - node = EmpiricalPotential(potential_type=potential.type, data=potential.data) # pylint: disable=no-value-for-parameter + node = EmpiricalPotential( + potential_type=potential.type, + data=potential.data, + ) file_regression.check(node.get_object_content('potential.pot', 'r')) @@ -56,5 +62,8 @@ def test_input_lines( ): """Test that one can get the potential lines for a given aiida-lammps potential""" potential = get_potential_data(potential_type) - node = EmpiricalPotential(potential_type=potential.type, data=potential.data) # pylint: disable=no-value-for-parameter + node = EmpiricalPotential( + potential_type=potential.type, + data=potential.data, + ) file_regression.check(node.get_input_lines()) From f80f15e9957657e61e96216f78718eeb85134f19 Mon Sep 17 00:00:00 2001 From: Jonathan Chico Date: Fri, 3 Dec 2021 15:17:53 +0100 Subject: [PATCH 34/70] (WIP) Fixing issues with the tests. --- aiida_lammps/parsers/lammps/force.py | 2 +- aiida_lammps/tests/test_calculations.py | 15 ++++++++++----- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/aiida_lammps/parsers/lammps/force.py b/aiida_lammps/parsers/lammps/force.py index 2c39876..2ed3138 100644 --- a/aiida_lammps/parsers/lammps/force.py +++ b/aiida_lammps/parsers/lammps/force.py @@ -84,7 +84,7 @@ def parse_traj_file(self, trajectory_filename: str) -> ArrayData: for field in ['fx', 'fy', 'fz']: if field not in traj_step.atom_fields: raise IOError( - 'trajectory file does not contain fields {}'.format(field)) + f'trajectory file does not contain fields {field}') array_data = ArrayData() diff --git a/aiida_lammps/tests/test_calculations.py b/aiida_lammps/tests/test_calculations.py index 5900c7d..39fe00c 100644 --- a/aiida_lammps/tests/test_calculations.py +++ b/aiida_lammps/tests/test_calculations.py @@ -443,7 +443,8 @@ def test_optimize_process( if not calc_node.is_finished_ok: print(calc_node.attributes) print(get_calcjob_report(calc_node)) - raise Exception(f'finished with exit message: {calc_node.exit_message}') + raise Exception( + f'finished with exit message: {calc_node.exit_message}') link_labels = calc_node.get_outgoing().all_link_labels() assert set(link_labels).issuperset( @@ -484,8 +485,10 @@ def test_md_process( calc_plugin = 'lammps.md' code = db_test_app.get_or_create_code(calc_plugin) pot_data = get_potential_data(potential_type) - potential = DataFactory('lammps.potential')(type=pot_data.type, - data=pot_data.data,) + potential = DataFactory('lammps.potential')( + potential_type=pot_data.type, + data=pot_data.data, + ) version = get_lammps_version(code) version_year = version[-4:] parameters = get_calc_parameters( @@ -509,7 +512,8 @@ def test_md_process( if not calc_node.is_finished_ok: print(calc_node.attributes) print(get_calcjob_report(calc_node)) - raise Exception(f'finished with exit message: {calc_node.exit_message}') + raise Exception( + f'finished with exit message: {calc_node.exit_message}') link_labels = calc_node.get_outgoing().all_link_labels() assert set(link_labels).issuperset( @@ -571,7 +575,8 @@ def test_md_multi_process( if not calc_node.is_finished_ok: print(calc_node.attributes) print(get_calcjob_report(calc_node)) - raise Exception(f'finished with exit message: {calc_node.exit_message}') + raise Exception( + f'finished with exit message: {calc_node.exit_message}') link_labels = calc_node.get_outgoing().all_link_labels() assert set(link_labels).issuperset([ From 36e73ec1012519e08b20fc504a604e7e9dd97c6d Mon Sep 17 00:00:00 2001 From: Jonathan Chico Date: Fri, 3 Dec 2021 15:26:44 +0100 Subject: [PATCH 35/70] (WIP) Making the trajectory generation compatible with aiida-core 1.65 --- aiida_lammps/data/trajectory.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aiida_lammps/data/trajectory.py b/aiida_lammps/data/trajectory.py index c2618f4..9568443 100644 --- a/aiida_lammps/data/trajectory.py +++ b/aiida_lammps/data/trajectory.py @@ -47,7 +47,7 @@ def __init__(self, fileobj=None, aliases=None, **kwargs): if fileobj is not None: if isinstance(fileobj, str): with io.open(fileobj) as handle: - self.set_from_fileobj(handle, aliases) + self.set_from_fileobj(handle.read(), aliases) else: self.set_from_fileobj(fileobj, aliases) From 1426d3ad4649e0c7f6906aa7546aeded8d485336 Mon Sep 17 00:00:00 2001 From: Jonathan Chico Date: Fri, 3 Dec 2021 16:27:00 +0100 Subject: [PATCH 36/70] (WIP) Fixing trajectories to make them compatible to aiida-core 1.65 --- aiida_lammps/data/trajectory.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aiida_lammps/data/trajectory.py b/aiida_lammps/data/trajectory.py index 9568443..5f22bbd 100644 --- a/aiida_lammps/data/trajectory.py +++ b/aiida_lammps/data/trajectory.py @@ -47,7 +47,7 @@ def __init__(self, fileobj=None, aliases=None, **kwargs): if fileobj is not None: if isinstance(fileobj, str): with io.open(fileobj) as handle: - self.set_from_fileobj(handle.read(), aliases) + self.set_from_fileobj(handle.readlines(), aliases) else: self.set_from_fileobj(fileobj, aliases) From 9ce3960d3d660a9ddd003a02957ea6f405aff0ae Mon Sep 17 00:00:00 2001 From: Jonathan Chico Date: Mon, 6 Dec 2021 12:49:01 +0100 Subject: [PATCH 37/70] (WIP) Fixing an issue in which the trajectories could not be properly sotred in 1.65. Added a temporary exception to handle the 2.x cases --- aiida_lammps/data/trajectory.py | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/aiida_lammps/data/trajectory.py b/aiida_lammps/data/trajectory.py index 5f22bbd..eec9736 100644 --- a/aiida_lammps/data/trajectory.py +++ b/aiida_lammps/data/trajectory.py @@ -124,10 +124,18 @@ def set_from_fileobj(self, fileobj, aliases=None): temp_handle.flush() temp_handle.seek(0) - self.put_object_from_filelike( - temp_handle, - self._trajectory_filename, - ) + try: + self.put_object_from_filelike( + temp_handle, + self._trajectory_filename, + mode="wb", + encoding=None, + ) + except TypeError: + self.put_object_from_filelike( + temp_handle, + self._trajectory_filename, + ) self.put_object_from_filelike( io.StringIO(' '.join([str(t) for t in time_steps])), From a749b595c88cfe40ae9f72cb6fb2c9eead356359 Mon Sep 17 00:00:00 2001 From: Jonathan Chico Date: Mon, 6 Dec 2021 13:02:11 +0100 Subject: [PATCH 38/70] (WIP) Fixing a small issue with the formatting. --- aiida_lammps/data/trajectory.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aiida_lammps/data/trajectory.py b/aiida_lammps/data/trajectory.py index eec9736..66165d7 100644 --- a/aiida_lammps/data/trajectory.py +++ b/aiida_lammps/data/trajectory.py @@ -128,7 +128,7 @@ def set_from_fileobj(self, fileobj, aliases=None): self.put_object_from_filelike( temp_handle, self._trajectory_filename, - mode="wb", + mode='wb', encoding=None, ) except TypeError: From 658c1908b6627fe3482383526a549de3d45854f5 Mon Sep 17 00:00:00 2001 From: Jonathan Chico Date: Mon, 6 Dec 2021 13:14:42 +0100 Subject: [PATCH 39/70] (WIP) Fixing an issue in which the trajectory_filename is not being properly referenced by the tests. --- .../tests/test_calculations/test_md_multi_process_eam_.yml | 4 ++-- .../test_md_multi_process_lennard_jones_.yml | 4 ++-- .../tests/test_calculations/test_md_multi_process_reaxff_.yml | 4 ++-- .../test_calculations/test_md_multi_process_tersoff_.yml | 4 ++-- .../tests/test_calculations/test_md_process-eam-2019.yml | 2 +- .../tests/test_calculations/test_md_process-eam-2020.yml | 2 +- .../test_calculations/test_md_process-lennard-jones-2019.yml | 2 +- .../test_calculations/test_md_process-lennard-jones-2020.yml | 2 +- .../tests/test_calculations/test_md_process-tersoff-2019.yml | 2 +- .../tests/test_calculations/test_md_process-tersoff-2020.yml | 2 +- .../tests/test_calculations/test_optimize_process_eam_.yml | 2 +- .../test_optimize_process_lennard_jones_.yml | 2 +- .../tests/test_calculations/test_optimize_process_reaxff_.yml | 2 +- .../test_calculations/test_optimize_process_tersoff_.yml | 2 +- .../tests/test_trajectory/test_lammps_trajectory_data.yml | 2 +- 15 files changed, 19 insertions(+), 19 deletions(-) diff --git a/aiida_lammps/tests/test_calculations/test_md_multi_process_eam_.yml b/aiida_lammps/tests/test_calculations/test_md_multi_process_eam_.yml index a71a4cc..38159fe 100644 --- a/aiida_lammps/tests/test_calculations/test_md_multi_process_eam_.yml +++ b/aiida_lammps/tests/test_calculations/test_md_multi_process_eam_.yml @@ -49,7 +49,7 @@ trajectory__equilibrate: number_atoms: 2 number_steps: 5 timestep_filename: timesteps.txt - traj_filename: trajectory.zip + trajectory_filename: trajectory.zip zip_prefix: step- trajectory__thermalise: aliases: null @@ -64,5 +64,5 @@ trajectory__thermalise: number_atoms: 2 number_steps: 11 timestep_filename: timesteps.txt - traj_filename: trajectory.zip + trajectory_filename: trajectory.zip zip_prefix: step- diff --git a/aiida_lammps/tests/test_calculations/test_md_multi_process_lennard_jones_.yml b/aiida_lammps/tests/test_calculations/test_md_multi_process_lennard_jones_.yml index a919a28..ec0df94 100644 --- a/aiida_lammps/tests/test_calculations/test_md_multi_process_lennard_jones_.yml +++ b/aiida_lammps/tests/test_calculations/test_md_multi_process_lennard_jones_.yml @@ -49,7 +49,7 @@ trajectory__equilibrate: number_atoms: 2 number_steps: 5 timestep_filename: timesteps.txt - traj_filename: trajectory.zip + trajectory_filename: trajectory.zip zip_prefix: step- trajectory__thermalise: aliases: null @@ -64,5 +64,5 @@ trajectory__thermalise: number_atoms: 2 number_steps: 11 timestep_filename: timesteps.txt - traj_filename: trajectory.zip + trajectory_filename: trajectory.zip zip_prefix: step- diff --git a/aiida_lammps/tests/test_calculations/test_md_multi_process_reaxff_.yml b/aiida_lammps/tests/test_calculations/test_md_multi_process_reaxff_.yml index 9381206..e593061 100644 --- a/aiida_lammps/tests/test_calculations/test_md_multi_process_reaxff_.yml +++ b/aiida_lammps/tests/test_calculations/test_md_multi_process_reaxff_.yml @@ -55,7 +55,7 @@ trajectory__equilibrate: number_atoms: 12 number_steps: 5 timestep_filename: timesteps.txt - traj_filename: trajectory.zip + trajectory_filename: trajectory.zip zip_prefix: step- trajectory__thermalise: aliases: null @@ -72,5 +72,5 @@ trajectory__thermalise: number_atoms: 12 number_steps: 11 timestep_filename: timesteps.txt - traj_filename: trajectory.zip + trajectory_filename: trajectory.zip zip_prefix: step- diff --git a/aiida_lammps/tests/test_calculations/test_md_multi_process_tersoff_.yml b/aiida_lammps/tests/test_calculations/test_md_multi_process_tersoff_.yml index 27a6de0..2e6a2bd 100644 --- a/aiida_lammps/tests/test_calculations/test_md_multi_process_tersoff_.yml +++ b/aiida_lammps/tests/test_calculations/test_md_multi_process_tersoff_.yml @@ -50,7 +50,7 @@ trajectory__equilibrate: number_atoms: 4 number_steps: 5 timestep_filename: timesteps.txt - traj_filename: trajectory.zip + trajectory_filename: trajectory.zip zip_prefix: step- trajectory__thermalise: aliases: null @@ -66,5 +66,5 @@ trajectory__thermalise: number_atoms: 4 number_steps: 11 timestep_filename: timesteps.txt - traj_filename: trajectory.zip + trajectory_filename: trajectory.zip zip_prefix: step- diff --git a/aiida_lammps/tests/test_calculations/test_md_process-eam-2019.yml b/aiida_lammps/tests/test_calculations/test_md_process-eam-2019.yml index 5063c65..d84d37b 100644 --- a/aiida_lammps/tests/test_calculations/test_md_process-eam-2019.yml +++ b/aiida_lammps/tests/test_calculations/test_md_process-eam-2019.yml @@ -28,5 +28,5 @@ trajectory_data: number_atoms: 2 number_steps: 101 timestep_filename: timesteps.txt - traj_filename: trajectory.zip + trajectory_filename: trajectory.zip zip_prefix: step- diff --git a/aiida_lammps/tests/test_calculations/test_md_process-eam-2020.yml b/aiida_lammps/tests/test_calculations/test_md_process-eam-2020.yml index f53067f..8ee9b9c 100644 --- a/aiida_lammps/tests/test_calculations/test_md_process-eam-2020.yml +++ b/aiida_lammps/tests/test_calculations/test_md_process-eam-2020.yml @@ -28,5 +28,5 @@ trajectory_data: number_atoms: 2 number_steps: 101 timestep_filename: timesteps.txt - traj_filename: trajectory.zip + trajectory_filename: trajectory.zip zip_prefix: step- diff --git a/aiida_lammps/tests/test_calculations/test_md_process-lennard-jones-2019.yml b/aiida_lammps/tests/test_calculations/test_md_process-lennard-jones-2019.yml index e65e0a8..0d4e2af 100644 --- a/aiida_lammps/tests/test_calculations/test_md_process-lennard-jones-2019.yml +++ b/aiida_lammps/tests/test_calculations/test_md_process-lennard-jones-2019.yml @@ -28,5 +28,5 @@ trajectory_data: number_atoms: 2 number_steps: 101 timestep_filename: timesteps.txt - traj_filename: trajectory.zip + trajectory_filename: trajectory.zip zip_prefix: step- diff --git a/aiida_lammps/tests/test_calculations/test_md_process-lennard-jones-2020.yml b/aiida_lammps/tests/test_calculations/test_md_process-lennard-jones-2020.yml index ad11d0e..d84dfc4 100644 --- a/aiida_lammps/tests/test_calculations/test_md_process-lennard-jones-2020.yml +++ b/aiida_lammps/tests/test_calculations/test_md_process-lennard-jones-2020.yml @@ -28,5 +28,5 @@ trajectory_data: number_atoms: 2 number_steps: 101 timestep_filename: timesteps.txt - traj_filename: trajectory.zip + trajectory_filename: trajectory.zip zip_prefix: step- diff --git a/aiida_lammps/tests/test_calculations/test_md_process-tersoff-2019.yml b/aiida_lammps/tests/test_calculations/test_md_process-tersoff-2019.yml index 4677403..7a7b829 100644 --- a/aiida_lammps/tests/test_calculations/test_md_process-tersoff-2019.yml +++ b/aiida_lammps/tests/test_calculations/test_md_process-tersoff-2019.yml @@ -29,5 +29,5 @@ trajectory_data: number_atoms: 4 number_steps: 101 timestep_filename: timesteps.txt - traj_filename: trajectory.zip + trajectory_filename: trajectory.zip zip_prefix: step- diff --git a/aiida_lammps/tests/test_calculations/test_md_process-tersoff-2020.yml b/aiida_lammps/tests/test_calculations/test_md_process-tersoff-2020.yml index 8623818..e1abc5e 100644 --- a/aiida_lammps/tests/test_calculations/test_md_process-tersoff-2020.yml +++ b/aiida_lammps/tests/test_calculations/test_md_process-tersoff-2020.yml @@ -29,5 +29,5 @@ trajectory_data: number_atoms: 4 number_steps: 101 timestep_filename: timesteps.txt - traj_filename: trajectory.zip + trajectory_filename: trajectory.zip zip_prefix: step- diff --git a/aiida_lammps/tests/test_calculations/test_optimize_process_eam_.yml b/aiida_lammps/tests/test_calculations/test_optimize_process_eam_.yml index 121816e..7847415 100644 --- a/aiida_lammps/tests/test_calculations/test_optimize_process_eam_.yml +++ b/aiida_lammps/tests/test_calculations/test_optimize_process_eam_.yml @@ -46,5 +46,5 @@ trajectory_data: - z number_atoms: 2 timestep_filename: timesteps.txt - traj_filename: trajectory.zip + trajectory_filename: trajectory.zip zip_prefix: step- diff --git a/aiida_lammps/tests/test_calculations/test_optimize_process_lennard_jones_.yml b/aiida_lammps/tests/test_calculations/test_optimize_process_lennard_jones_.yml index 3acd81e..445dd88 100644 --- a/aiida_lammps/tests/test_calculations/test_optimize_process_lennard_jones_.yml +++ b/aiida_lammps/tests/test_calculations/test_optimize_process_lennard_jones_.yml @@ -45,5 +45,5 @@ trajectory_data: - z number_atoms: 2 timestep_filename: timesteps.txt - traj_filename: trajectory.zip + trajectory_filename: trajectory.zip zip_prefix: step- diff --git a/aiida_lammps/tests/test_calculations/test_optimize_process_reaxff_.yml b/aiida_lammps/tests/test_calculations/test_optimize_process_reaxff_.yml index 2115ed3..1d38888 100644 --- a/aiida_lammps/tests/test_calculations/test_optimize_process_reaxff_.yml +++ b/aiida_lammps/tests/test_calculations/test_optimize_process_reaxff_.yml @@ -49,5 +49,5 @@ trajectory_data: - z number_atoms: 12 timestep_filename: timesteps.txt - traj_filename: trajectory.zip + trajectory_filename: trajectory.zip zip_prefix: step- diff --git a/aiida_lammps/tests/test_calculations/test_optimize_process_tersoff_.yml b/aiida_lammps/tests/test_calculations/test_optimize_process_tersoff_.yml index 805dd68..17ff504 100644 --- a/aiida_lammps/tests/test_calculations/test_optimize_process_tersoff_.yml +++ b/aiida_lammps/tests/test_calculations/test_optimize_process_tersoff_.yml @@ -47,5 +47,5 @@ trajectory_data: - z number_atoms: 4 timestep_filename: timesteps.txt - traj_filename: trajectory.zip + trajectory_filename: trajectory.zip zip_prefix: step- diff --git a/aiida_lammps/tests/test_trajectory/test_lammps_trajectory_data.yml b/aiida_lammps/tests/test_trajectory/test_lammps_trajectory_data.yml index 1f7d900..5339e1d 100644 --- a/aiida_lammps/tests/test_trajectory/test_lammps_trajectory_data.yml +++ b/aiida_lammps/tests/test_trajectory/test_lammps_trajectory_data.yml @@ -12,5 +12,5 @@ field_names: number_atoms: 12 number_steps: 21 timestep_filename: timesteps.txt -traj_filename: trajectory.zip +trajectory_filename: trajectory.zip zip_prefix: step- From d78fc54de75b62b316559bc2cd39f98e750a48ec Mon Sep 17 00:00:00 2001 From: Jonathan Chico Date: Mon, 6 Dec 2021 16:54:42 +0100 Subject: [PATCH 40/70] (WIP) Adding test files for the new potential data format. --- .../FeW_MO_737567242631_000.eam.alloy | 8757 +++++++++++++++++ .../FeW_MO_737567242631_000.eam.alloy.yaml | 28 + .../Fe_MO_137964310702_004.tersoff | 3 + .../Fe_MO_137964310702_004.tersoff.yaml | 28 + .../input_files/Fe_MO_331285495617_004.morse | 53 + .../Fe_MO_331285495617_004.morse.yaml | 30 + .../input_files/Fe_MO_492310898779_001.meam | 11 + .../Fe_MO_492310898779_001.meam.yaml | 29 + aiida_lammps/tests/test_potential_data.py | 16 + conftest.py | 26 +- 10 files changed, 8980 insertions(+), 1 deletion(-) create mode 100644 aiida_lammps/tests/input_files/FeW_MO_737567242631_000.eam.alloy create mode 100644 aiida_lammps/tests/input_files/FeW_MO_737567242631_000.eam.alloy.yaml create mode 100644 aiida_lammps/tests/input_files/Fe_MO_137964310702_004.tersoff create mode 100644 aiida_lammps/tests/input_files/Fe_MO_137964310702_004.tersoff.yaml create mode 100644 aiida_lammps/tests/input_files/Fe_MO_331285495617_004.morse create mode 100644 aiida_lammps/tests/input_files/Fe_MO_331285495617_004.morse.yaml create mode 100644 aiida_lammps/tests/input_files/Fe_MO_492310898779_001.meam create mode 100644 aiida_lammps/tests/input_files/Fe_MO_492310898779_001.meam.yaml diff --git a/aiida_lammps/tests/input_files/FeW_MO_737567242631_000.eam.alloy b/aiida_lammps/tests/input_files/FeW_MO_737567242631_000.eam.alloy new file mode 100644 index 0000000..5890ae5 --- /dev/null +++ b/aiida_lammps/tests/input_files/FeW_MO_737567242631_000.eam.alloy @@ -0,0 +1,8757 @@ + Potential not stiffened for cascades + G. Bonny et al, J. Phys. Condens. Matter. 25 (2013) 315401 + Contact: gbonny@sckcen.be giovanni.bonny@gmail.com + 2 Fe W + 5000 1.0000000000000000E-003 5000 1.0600000000000000E-003 5.2999999999999998 + 1 55.844999999999999 2.8553246300000001 bcc + 0.000000000000E+00 -0.159164765840E+00 -0.223304015223E+00 -0.271809632851E+00 + -0.312222923603E+00 -0.347464948431E+00 -0.379033805229E+00 -0.407819432864E+00 + -0.434401675737E+00 -0.459183295148E+00 -0.482457539144E+00 -0.504445786317E+00 + -0.525320025809E+00 -0.545217031558E+00 -0.564247699345E+00 -0.582503423197E+00 + -0.600060583572E+00 -0.616983788858E+00 -0.633328268979E+00 -0.649141677389E+00 + -0.664465470934E+00 -0.679335982485E+00 -0.693785266042E+00 -0.707841770647E+00 + -0.721530883682E+00 -0.734875373213E+00 -0.747895751411E+00 -0.760610575601E+00 + -0.773036699548E+00 -0.785189484676E+00 -0.797082978763E+00 -0.808730068035E+00 + -0.820142607338E+00 -0.831331532133E+00 -0.842306955330E+00 -0.853078251383E+00 + -0.863654129647E+00 -0.874042698625E+00 -0.884251522450E+00 -0.894287670711E+00 + -0.904157762573E+00 -0.913868005960E+00 -0.923424232456E+00 -0.932831928494E+00 + -0.942096263298E+00 -0.951222113976E+00 -0.960214088123E+00 -0.969076544223E+00 + -0.977813610108E+00 -0.986429199688E+00 -0.994927028162E+00 -0.100331062586E+01 + -0.101158335088E+01 -0.101974840059E+01 -0.102780882227E+01 -0.103576752271E+01 + -0.104362727717E+01 -0.105139073754E+01 -0.105906043990E+01 -0.106663881147E+01 + -0.107412817703E+01 -0.108153076490E+01 -0.108884871243E+01 -0.109608407113E+01 + -0.110323881139E+01 -0.111031482695E+01 -0.111731393898E+01 -0.112423789991E+01 + -0.113108839702E+01 -0.113786705578E+01 -0.114457544298E+01 -0.115121506964E+01 + -0.115778739376E+01 -0.116429382288E+01 -0.117073571651E+01 -0.117711438836E+01 + -0.118343110852E+01 -0.118968710542E+01 -0.119588356772E+01 -0.120202164611E+01 + -0.120810245500E+01 -0.121412707405E+01 -0.122009654971E+01 -0.122601189661E+01 + -0.123187409894E+01 -0.123768411165E+01 -0.124344286169E+01 -0.124915124915E+01 + -0.125481014834E+01 -0.126042040876E+01 -0.126598285616E+01 -0.127149829337E+01 + -0.127696750127E+01 -0.128239123955E+01 -0.128777024752E+01 -0.129310524490E+01 + -0.129839693252E+01 -0.130364599299E+01 -0.130885309138E+01 -0.131401887584E+01 + -0.131914397820E+01 -0.132422901450E+01 -0.132927458560E+01 -0.133428127767E+01 + -0.133924966266E+01 -0.134418029882E+01 -0.134907373115E+01 -0.135393049180E+01 + -0.135875110055E+01 -0.136353606513E+01 -0.136828588169E+01 -0.137300103512E+01 + -0.137768199940E+01 -0.138232923796E+01 -0.138694320400E+01 -0.139152434081E+01 + -0.139607308205E+01 -0.140058985207E+01 -0.140507506616E+01 -0.140952913083E+01 + -0.141395244407E+01 -0.141834539560E+01 -0.142270836710E+01 -0.142704173244E+01 + -0.143134585791E+01 -0.143562110243E+01 -0.143986781777E+01 -0.144408634870E+01 + -0.144827703325E+01 -0.145244020285E+01 -0.145657618250E+01 -0.146068529099E+01 + -0.146476784103E+01 -0.146882413940E+01 -0.147285448715E+01 -0.147685917971E+01 + -0.148083850705E+01 -0.148479275382E+01 -0.148872219949E+01 -0.149262711846E+01 + -0.149650778023E+01 -0.150036444947E+01 -0.150419738619E+01 -0.150800684580E+01 + -0.151179307928E+01 -0.151555633325E+01 -0.151929685008E+01 -0.152301486800E+01 + -0.152671062120E+01 -0.153038433993E+01 -0.153403625055E+01 -0.153766657568E+01 + -0.154127553426E+01 -0.154486334163E+01 -0.154843020962E+01 -0.155197634661E+01 + -0.155550195764E+01 -0.155900724448E+01 -0.156249240567E+01 -0.156595763661E+01 + -0.156940312967E+01 -0.157282907418E+01 -0.157623565655E+01 -0.157962306031E+01 + -0.158299146619E+01 -0.158634105217E+01 -0.158967199353E+01 -0.159298446291E+01 + -0.159627863038E+01 -0.159955466348E+01 -0.160281272726E+01 -0.160605298438E+01 + -0.160927559510E+01 -0.161248071735E+01 -0.161566850679E+01 -0.161883911686E+01 + -0.162199269879E+01 -0.162512940167E+01 -0.162824937250E+01 -0.163135275620E+01 + -0.163443969568E+01 -0.163751033186E+01 -0.164056480373E+01 -0.164360324835E+01 + -0.164662580095E+01 -0.164963259487E+01 -0.165262376171E+01 -0.165559943125E+01 + -0.165855973157E+01 -0.166150478904E+01 -0.166443472837E+01 -0.166734967260E+01 + -0.167024974321E+01 -0.167313506005E+01 -0.167600574146E+01 -0.167886190424E+01 + -0.168170366368E+01 -0.168453113363E+01 -0.168734442648E+01 -0.169014365321E+01 + -0.169292892339E+01 -0.169570034525E+01 -0.169845802565E+01 -0.170120207015E+01 + -0.170393258299E+01 -0.170664966716E+01 -0.170935342437E+01 -0.171204395512E+01 + -0.171472135867E+01 -0.171738573312E+01 -0.172003717537E+01 -0.172267578119E+01 + -0.172530164521E+01 -0.172791486093E+01 -0.173051552077E+01 -0.173310371606E+01 + -0.173567953710E+01 -0.173824307311E+01 -0.174079441229E+01 -0.174333364184E+01 + -0.174586084797E+01 -0.174837611589E+01 -0.175087952987E+01 -0.175337117322E+01 + -0.175585112832E+01 -0.175831947662E+01 -0.176077629870E+01 -0.176322167421E+01 + -0.176565568194E+01 -0.176807839982E+01 -0.177048990494E+01 -0.177289027352E+01 + -0.177527958099E+01 -0.177765790195E+01 -0.178002531020E+01 -0.178238187877E+01 + -0.178472767989E+01 -0.178706278505E+01 -0.178938726496E+01 -0.179170118960E+01 + -0.179400462824E+01 -0.179629764939E+01 -0.179858032087E+01 -0.180085270981E+01 + -0.180311488264E+01 -0.180536690510E+01 -0.180760884228E+01 -0.180984075859E+01 + -0.181206271781E+01 -0.181427478305E+01 -0.181647701681E+01 -0.181866948096E+01 + -0.182085223675E+01 -0.182302534482E+01 -0.182518886523E+01 -0.182734285742E+01 + -0.182948738027E+01 -0.183162249209E+01 -0.183374825060E+01 -0.183586471297E+01 + -0.183797193584E+01 -0.184006997528E+01 -0.184215888683E+01 -0.184423872550E+01 + -0.184630954579E+01 -0.184837140166E+01 -0.185042434659E+01 -0.185246843354E+01 + -0.185450371497E+01 -0.185653024288E+01 -0.185854806874E+01 -0.186055724359E+01 + -0.186255781797E+01 -0.186454984198E+01 -0.186653336523E+01 -0.186850843690E+01 + -0.187047510572E+01 -0.187243341999E+01 -0.187438342754E+01 -0.187632517581E+01 + -0.187825871180E+01 -0.188018408207E+01 -0.188210133280E+01 -0.188401050973E+01 + -0.188591165823E+01 -0.188780482325E+01 -0.188969004934E+01 -0.189156738067E+01 + -0.189343686103E+01 -0.189529853383E+01 -0.189715244209E+01 -0.189899862848E+01 + -0.190083713529E+01 -0.190266800444E+01 -0.190449127752E+01 -0.190630699575E+01 + -0.190811519999E+01 -0.190991593078E+01 -0.191170922831E+01 -0.191349513241E+01 + -0.191527368261E+01 -0.191704491809E+01 -0.191880887772E+01 -0.192056560004E+01 + -0.192231512327E+01 -0.192405748532E+01 -0.192579272379E+01 -0.192752087598E+01 + -0.192924197885E+01 -0.193095606912E+01 -0.193266318316E+01 -0.193436335708E+01 + -0.193605662669E+01 -0.193774302750E+01 -0.193942259476E+01 -0.194109536343E+01 + -0.194276136817E+01 -0.194442064341E+01 -0.194607322327E+01 -0.194771914162E+01 + -0.194935843207E+01 -0.195099112796E+01 -0.195261726236E+01 -0.195423686810E+01 + -0.195584997775E+01 -0.195745662362E+01 -0.195905683779E+01 -0.196065065208E+01 + -0.196223809808E+01 -0.196381920712E+01 -0.196539401031E+01 -0.196696253851E+01 + -0.196852482236E+01 -0.197008089226E+01 -0.197163077840E+01 -0.197317451071E+01 + -0.197471211892E+01 -0.197624363255E+01 -0.197776908088E+01 -0.197928849297E+01 + -0.198080189769E+01 -0.198230932368E+01 -0.198381079937E+01 -0.198530635300E+01 + -0.198679601258E+01 -0.198827980592E+01 -0.198975776066E+01 -0.199122990420E+01 + -0.199269626376E+01 -0.199415686636E+01 -0.199561173885E+01 -0.199706090785E+01 + -0.199850439981E+01 -0.199994224101E+01 -0.200137445751E+01 -0.200280107520E+01 + -0.200422211980E+01 -0.200563761684E+01 -0.200704759166E+01 -0.200845206944E+01 + -0.200985107518E+01 -0.201124463370E+01 -0.201263276966E+01 -0.201401550754E+01 + -0.201539287165E+01 -0.201676488614E+01 -0.201813157500E+01 -0.201949296204E+01 + -0.202084907092E+01 -0.202219992514E+01 -0.202354554803E+01 -0.202488596277E+01 + -0.202622119239E+01 -0.202755125975E+01 -0.202887618757E+01 -0.203019599841E+01 + -0.203151071470E+01 -0.203282035868E+01 -0.203412495248E+01 -0.203542451807E+01 + -0.203671907727E+01 -0.203800865178E+01 -0.203929326312E+01 -0.204057293269E+01 + -0.204184768177E+01 -0.204311753146E+01 -0.204438250276E+01 -0.204564261650E+01 + -0.204689789341E+01 -0.204814835407E+01 -0.204939401893E+01 -0.205063490829E+01 + -0.205187104235E+01 -0.205310244118E+01 -0.205432912469E+01 -0.205555111269E+01 + -0.205676842488E+01 -0.205798108079E+01 -0.205918909986E+01 -0.206039250141E+01 + -0.206159130462E+01 -0.206278552856E+01 -0.206397519219E+01 -0.206516031434E+01 + -0.206634091371E+01 -0.206751700892E+01 -0.206868861846E+01 -0.206985576068E+01 + -0.207101845385E+01 -0.207217671613E+01 -0.207333056554E+01 -0.207448002001E+01 + -0.207562509736E+01 -0.207676581530E+01 -0.207790219144E+01 -0.207903424326E+01 + -0.208016198816E+01 -0.208128544343E+01 -0.208240462625E+01 -0.208351955370E+01 + -0.208463024276E+01 -0.208573671031E+01 -0.208683897311E+01 -0.208793704786E+01 + -0.208903095113E+01 -0.209012069940E+01 -0.209120630906E+01 -0.209228779640E+01 + -0.209336517760E+01 -0.209443846878E+01 -0.209550768592E+01 -0.209657284496E+01 + -0.209763396170E+01 -0.209869105187E+01 -0.209974413111E+01 -0.210079321498E+01 + -0.210183831892E+01 -0.210287945831E+01 -0.210391664842E+01 -0.210494990447E+01 + -0.210597924154E+01 -0.210700467467E+01 -0.210802621879E+01 -0.210904388875E+01 + -0.211005769933E+01 -0.211106766521E+01 -0.211207380100E+01 -0.211307612120E+01 + -0.211407464028E+01 -0.211506937258E+01 -0.211606033238E+01 -0.211704753389E+01 + -0.211803099123E+01 -0.211901071844E+01 -0.211998672949E+01 -0.212095903827E+01 + -0.212192765860E+01 -0.212289260420E+01 -0.212385388874E+01 -0.212481152582E+01 + -0.212576552894E+01 -0.212671591155E+01 -0.212766268701E+01 -0.212860586862E+01 + -0.212954546960E+01 -0.213048150311E+01 -0.213141398223E+01 -0.213234291996E+01 + -0.213326832926E+01 -0.213419022299E+01 -0.213510861396E+01 -0.213602351491E+01 + -0.213693493850E+01 -0.213784289734E+01 -0.213874740396E+01 -0.213964847083E+01 + -0.214054611035E+01 -0.214144033487E+01 -0.214233115665E+01 -0.214321858791E+01 + -0.214410264079E+01 -0.214498332737E+01 -0.214586065968E+01 -0.214673464968E+01 + -0.214760530925E+01 -0.214847265023E+01 -0.214933668440E+01 -0.215019742347E+01 + -0.215105487908E+01 -0.215190906285E+01 -0.215275998629E+01 -0.215360766089E+01 + -0.215445209805E+01 -0.215529330915E+01 -0.215613130547E+01 -0.215696609827E+01 + -0.215779769873E+01 -0.215862611799E+01 -0.215945136711E+01 -0.216027345711E+01 + -0.216109239897E+01 -0.216190820358E+01 -0.216272088181E+01 -0.216353044446E+01 + -0.216433690226E+01 -0.216514026593E+01 -0.216594054609E+01 -0.216673775333E+01 + -0.216753189820E+01 -0.216832299118E+01 -0.216911104270E+01 -0.216989606313E+01 + -0.217067806282E+01 -0.217145705205E+01 -0.217223304103E+01 -0.217300603997E+01 + -0.217377605898E+01 -0.217454310814E+01 -0.217530719750E+01 -0.217606833704E+01 + -0.217682653669E+01 -0.217758180635E+01 -0.217833415585E+01 -0.217908359500E+01 + -0.217983013353E+01 -0.218057378116E+01 -0.218131454753E+01 -0.218205244226E+01 + -0.218278747491E+01 -0.218351965499E+01 -0.218424899199E+01 -0.218497549533E+01 + -0.218569917440E+01 -0.218642003854E+01 -0.218713809704E+01 -0.218785335915E+01 + -0.218856583410E+01 -0.218927553103E+01 -0.218998245909E+01 -0.219068662735E+01 + -0.219138804485E+01 -0.219208672059E+01 -0.219278266353E+01 -0.219347588258E+01 + -0.219416638662E+01 -0.219485418447E+01 -0.219553928494E+01 -0.219622169677E+01 + -0.219690142869E+01 -0.219757848935E+01 -0.219825288740E+01 -0.219892463143E+01 + -0.219959373000E+01 -0.220026019161E+01 -0.220092402476E+01 -0.220158523788E+01 + -0.220224383937E+01 -0.220289983759E+01 -0.220355324088E+01 -0.220420405752E+01 + -0.220485229577E+01 -0.220549796384E+01 -0.220614106990E+01 -0.220678162211E+01 + -0.220741962857E+01 -0.220805509734E+01 -0.220868803647E+01 -0.220931845395E+01 + -0.220994635775E+01 -0.221057175580E+01 -0.221119465599E+01 -0.221181506617E+01 + -0.221243299418E+01 -0.221304844781E+01 -0.221366143481E+01 -0.221427196291E+01 + -0.221488003979E+01 -0.221548567312E+01 -0.221608887051E+01 -0.221668963956E+01 + -0.221728798782E+01 -0.221788392282E+01 -0.221847745205E+01 -0.221906858298E+01 + -0.221965732302E+01 -0.222024367958E+01 -0.222082766002E+01 -0.222140927168E+01 + -0.222198852185E+01 -0.222256541782E+01 -0.222313996681E+01 -0.222371217604E+01 + -0.222428205269E+01 -0.222484960391E+01 -0.222541483682E+01 -0.222597775850E+01 + -0.222653837602E+01 -0.222709669640E+01 -0.222765272664E+01 -0.222820647372E+01 + -0.222875794458E+01 -0.222930714613E+01 -0.222985408526E+01 -0.223039876881E+01 + -0.223094120362E+01 -0.223148139649E+01 -0.223201935418E+01 -0.223255508345E+01 + -0.223308859100E+01 -0.223361988353E+01 -0.223414896768E+01 -0.223467585011E+01 + -0.223520053740E+01 -0.223572303615E+01 -0.223624335290E+01 -0.223676149417E+01 + -0.223727746647E+01 -0.223779127628E+01 -0.223830293002E+01 -0.223881243414E+01 + -0.223931979501E+01 -0.223982501901E+01 -0.224032811248E+01 -0.224082908174E+01 + -0.224132793307E+01 -0.224182467276E+01 -0.224231930703E+01 -0.224281184211E+01 + -0.224330228419E+01 -0.224379063943E+01 -0.224427691398E+01 -0.224476111395E+01 + -0.224524324545E+01 -0.224572331454E+01 -0.224620132726E+01 -0.224667728964E+01 + -0.224715120768E+01 -0.224762308736E+01 -0.224809293461E+01 -0.224856075539E+01 + -0.224902655558E+01 -0.224949034107E+01 -0.224995211771E+01 -0.225041189136E+01 + -0.225086966782E+01 -0.225132545287E+01 -0.225177925230E+01 -0.225223107184E+01 + -0.225268091722E+01 -0.225312879415E+01 -0.225357470829E+01 -0.225401866532E+01 + -0.225446067086E+01 -0.225490073054E+01 -0.225533884994E+01 -0.225577503464E+01 + -0.225620929019E+01 -0.225664162212E+01 -0.225707203594E+01 -0.225750053713E+01 + -0.225792713116E+01 -0.225835182348E+01 -0.225877461952E+01 -0.225919552467E+01 + -0.225961454433E+01 -0.226003168385E+01 -0.226044694859E+01 -0.226086034387E+01 + -0.226127187499E+01 -0.226168154723E+01 -0.226208936587E+01 -0.226249533614E+01 + -0.226289946327E+01 -0.226330175247E+01 -0.226370220893E+01 -0.226410083781E+01 + -0.226449764426E+01 -0.226489263341E+01 -0.226528581037E+01 -0.226567718023E+01 + -0.226606674807E+01 -0.226645451894E+01 -0.226684049787E+01 -0.226722468989E+01 + -0.226760709999E+01 -0.226798773315E+01 -0.226836659433E+01 -0.226874368849E+01 + -0.226911902054E+01 -0.226949259540E+01 -0.226986441795E+01 -0.227023449307E+01 + -0.227060282562E+01 -0.227096942042E+01 -0.227133428231E+01 -0.227169741608E+01 + -0.227205882653E+01 -0.227241851841E+01 -0.227277649648E+01 -0.227313276548E+01 + -0.227348733013E+01 -0.227384019511E+01 -0.227419136513E+01 -0.227454084484E+01 + -0.227488863890E+01 -0.227523475193E+01 -0.227557918857E+01 -0.227592195340E+01 + -0.227626305102E+01 -0.227660248599E+01 -0.227694026287E+01 -0.227727638619E+01 + -0.227761086047E+01 -0.227794369022E+01 -0.227827487994E+01 -0.227860443408E+01 + -0.227893235712E+01 -0.227925865348E+01 -0.227958332761E+01 -0.227990638390E+01 + -0.228022782676E+01 -0.228054766057E+01 -0.228086588970E+01 -0.228118251848E+01 + -0.228149755127E+01 -0.228181099237E+01 -0.228212284610E+01 -0.228243311675E+01 + -0.228274180859E+01 -0.228304892588E+01 -0.228335447287E+01 -0.228365845380E+01 + -0.228396087287E+01 -0.228426173430E+01 -0.228456104227E+01 -0.228485880096E+01 + -0.228515501453E+01 -0.228544968713E+01 -0.228574282288E+01 -0.228603442590E+01 + -0.228632450031E+01 -0.228661305019E+01 -0.228690007961E+01 -0.228718559264E+01 + -0.228746959334E+01 -0.228775208573E+01 -0.228803307384E+01 -0.228831256168E+01 + -0.228859055324E+01 -0.228886705250E+01 -0.228914206344E+01 -0.228941559000E+01 + -0.228968763614E+01 -0.228995820577E+01 -0.229022730283E+01 -0.229049493120E+01 + -0.229076109479E+01 -0.229102579746E+01 -0.229128904308E+01 -0.229155083551E+01 + -0.229181117858E+01 -0.229207007612E+01 -0.229232753195E+01 -0.229258354986E+01 + -0.229283813365E+01 -0.229309128709E+01 -0.229334301394E+01 -0.229359331797E+01 + -0.229384220290E+01 -0.229408967247E+01 -0.229433573038E+01 -0.229458038036E+01 + -0.229482362607E+01 -0.229506547122E+01 -0.229530591946E+01 -0.229554497444E+01 + -0.229578263983E+01 -0.229601891923E+01 -0.229625381628E+01 -0.229648733459E+01 + -0.229671947775E+01 -0.229695024935E+01 -0.229717965296E+01 -0.229740769215E+01 + -0.229763437046E+01 -0.229785969145E+01 -0.229808365862E+01 -0.229830627552E+01 + -0.229852754563E+01 -0.229874747246E+01 -0.229896605950E+01 -0.229918331020E+01 + -0.229939922805E+01 -0.229961381648E+01 -0.229982707894E+01 -0.230003901886E+01 + -0.230024963966E+01 -0.230045894474E+01 -0.230066693751E+01 -0.230087362134E+01 + -0.230107899963E+01 -0.230128307573E+01 -0.230148585299E+01 -0.230168733477E+01 + -0.230188752439E+01 -0.230208642519E+01 -0.230228404047E+01 -0.230248037354E+01 + -0.230267542770E+01 -0.230286920621E+01 -0.230306171237E+01 -0.230325294943E+01 + -0.230344292064E+01 -0.230363162924E+01 -0.230381907848E+01 -0.230400527156E+01 + -0.230419021171E+01 -0.230437390213E+01 -0.230455634601E+01 -0.230473754654E+01 + -0.230491750688E+01 -0.230509623021E+01 -0.230527371968E+01 -0.230544997842E+01 + -0.230562500959E+01 -0.230579881630E+01 -0.230597140167E+01 -0.230614276880E+01 + -0.230631292080E+01 -0.230648186076E+01 -0.230664959174E+01 -0.230681611683E+01 + -0.230698143908E+01 -0.230714556154E+01 -0.230730848726E+01 -0.230747021927E+01 + -0.230763076059E+01 -0.230779011424E+01 -0.230794828322E+01 -0.230810527053E+01 + -0.230826107916E+01 -0.230841571209E+01 -0.230856917228E+01 -0.230872146270E+01 + -0.230887258631E+01 -0.230902254604E+01 -0.230917134483E+01 -0.230931898560E+01 + -0.230946547129E+01 -0.230961080478E+01 -0.230975498899E+01 -0.230989802681E+01 + -0.231003992112E+01 -0.231018067480E+01 -0.231032029071E+01 -0.231045877170E+01 + -0.231059612065E+01 -0.231073234037E+01 -0.231086743371E+01 -0.231100140349E+01 + -0.231113425253E+01 -0.231126598364E+01 -0.231139659962E+01 -0.231152610326E+01 + -0.231165449734E+01 -0.231178178465E+01 -0.231190796794E+01 -0.231203304999E+01 + -0.231215703353E+01 -0.231227992133E+01 -0.231240171611E+01 -0.231252242060E+01 + -0.231264203752E+01 -0.231276056959E+01 -0.231287801952E+01 -0.231299438999E+01 + -0.231310968370E+01 -0.231322390333E+01 -0.231333705156E+01 -0.231344913106E+01 + -0.231356014447E+01 -0.231367009446E+01 -0.231377898367E+01 -0.231388681473E+01 + -0.231399359028E+01 -0.231409931294E+01 -0.231420398531E+01 -0.231430761002E+01 + -0.231441018965E+01 -0.231451172680E+01 -0.231461222406E+01 -0.231471168401E+01 + -0.231481010920E+01 -0.231490750222E+01 -0.231500386561E+01 -0.231509920192E+01 + -0.231519351370E+01 -0.231528680348E+01 -0.231537907379E+01 -0.231547032714E+01 + -0.231556056606E+01 -0.231564979305E+01 -0.231573801061E+01 -0.231582522123E+01 + -0.231591142740E+01 -0.231599663160E+01 -0.231608083630E+01 -0.231616404397E+01 + -0.231624625706E+01 -0.231632747803E+01 -0.231640770932E+01 -0.231648695337E+01 + -0.231656521261E+01 -0.231664248947E+01 -0.231671878636E+01 -0.231679410571E+01 + -0.231686844990E+01 -0.231694182135E+01 -0.231701422245E+01 -0.231708565557E+01 + -0.231715612311E+01 -0.231722562742E+01 -0.231729417088E+01 -0.231736175586E+01 + -0.231742838469E+01 -0.231749405973E+01 -0.231755878333E+01 -0.231762255780E+01 + -0.231768538549E+01 -0.231774726872E+01 -0.231780820979E+01 -0.231786821103E+01 + -0.231792727472E+01 -0.231798540318E+01 -0.231804259869E+01 -0.231809886353E+01 + -0.231815419999E+01 -0.231820861034E+01 -0.231826209684E+01 -0.231831466175E+01 + -0.231836630733E+01 -0.231841703583E+01 -0.231846684949E+01 -0.231851575054E+01 + -0.231856374122E+01 -0.231861082376E+01 -0.231865700036E+01 -0.231870227325E+01 + -0.231874664463E+01 -0.231879011670E+01 -0.231883269165E+01 -0.231887437169E+01 + -0.231891515898E+01 -0.231895505572E+01 -0.231899406407E+01 -0.231903218619E+01 + -0.231906942426E+01 -0.231910578042E+01 -0.231914125683E+01 -0.231917585563E+01 + -0.231920957896E+01 -0.231924242895E+01 -0.231927440773E+01 -0.231930551742E+01 + -0.231933576013E+01 -0.231936513799E+01 -0.231939365309E+01 -0.231942130754E+01 + -0.231944810343E+01 -0.231947404284E+01 -0.231949912787E+01 -0.231952336059E+01 + -0.231954674308E+01 -0.231956927740E+01 -0.231959096561E+01 -0.231961180978E+01 + -0.231963181195E+01 -0.231965097417E+01 -0.231966929848E+01 -0.231968678693E+01 + -0.231970344153E+01 -0.231971926432E+01 -0.231973425732E+01 -0.231974842254E+01 + -0.231976176199E+01 -0.231977427768E+01 -0.231978597162E+01 -0.231979684578E+01 + -0.231980690217E+01 -0.231981614277E+01 -0.231982456955E+01 -0.231983218451E+01 + -0.231983898959E+01 -0.231984498678E+01 -0.231985017803E+01 -0.231985456529E+01 + -0.231985815052E+01 -0.231986093566E+01 -0.231986292265E+01 -0.231986411343E+01 + -0.231986450993E+01 -0.231986411407E+01 -0.231986292778E+01 -0.231986095297E+01 + -0.231985819156E+01 -0.231985464544E+01 -0.231985031653E+01 -0.231984520673E+01 + -0.231983931791E+01 -0.231983265198E+01 -0.231982521081E+01 -0.231981699629E+01 + -0.231980801028E+01 -0.231979825466E+01 -0.231978773130E+01 -0.231977644205E+01 + -0.231976438876E+01 -0.231975157330E+01 -0.231973799750E+01 -0.231972366321E+01 + -0.231970857226E+01 -0.231969272650E+01 -0.231967612774E+01 -0.231965877781E+01 + -0.231964067853E+01 -0.231962183172E+01 -0.231960223919E+01 -0.231958190273E+01 + -0.231956082417E+01 -0.231953900528E+01 -0.231951644788E+01 -0.231949315373E+01 + -0.231946912464E+01 -0.231944436237E+01 -0.231941886871E+01 -0.231939264543E+01 + -0.231936569429E+01 -0.231933801706E+01 -0.231930961549E+01 -0.231928049135E+01 + -0.231925064637E+01 -0.231922008231E+01 -0.231918880091E+01 -0.231915680391E+01 + -0.231912409303E+01 -0.231909067002E+01 -0.231905653659E+01 -0.231902169447E+01 + -0.231898614537E+01 -0.231894989100E+01 -0.231891293308E+01 -0.231887527331E+01 + -0.231883691339E+01 -0.231879785502E+01 -0.231875809989E+01 -0.231871764968E+01 + -0.231867650609E+01 -0.231863467079E+01 -0.231859214547E+01 -0.231854893178E+01 + -0.231850503141E+01 -0.231846044602E+01 -0.231841517726E+01 -0.231836922680E+01 + -0.231832259629E+01 -0.231827528737E+01 -0.231822730170E+01 -0.231817864092E+01 + -0.231812930665E+01 -0.231807930054E+01 -0.231802862422E+01 -0.231797727931E+01 + -0.231792526743E+01 -0.231787259021E+01 -0.231781924925E+01 -0.231776524618E+01 + -0.231771058259E+01 -0.231765526009E+01 -0.231759928028E+01 -0.231754264476E+01 + -0.231748535512E+01 -0.231742741294E+01 -0.231736881982E+01 -0.231730957734E+01 + -0.231724968706E+01 -0.231718915057E+01 -0.231712796944E+01 -0.231706614524E+01 + -0.231700367952E+01 -0.231694057385E+01 -0.231687682978E+01 -0.231681244887E+01 + -0.231674743266E+01 -0.231668178271E+01 -0.231661550054E+01 -0.231654858771E+01 + -0.231648104574E+01 -0.231641287618E+01 -0.231634408053E+01 -0.231627466034E+01 + -0.231620461712E+01 -0.231613395239E+01 -0.231606266766E+01 -0.231599076444E+01 + -0.231591824424E+01 -0.231584510857E+01 -0.231577135893E+01 -0.231569699680E+01 + -0.231562202369E+01 -0.231554644109E+01 -0.231547025048E+01 -0.231539345335E+01 + -0.231531605117E+01 -0.231523804543E+01 -0.231515943759E+01 -0.231508022913E+01 + -0.231500042152E+01 -0.231492001621E+01 -0.231483901468E+01 -0.231475741837E+01 + -0.231467522874E+01 -0.231459244724E+01 -0.231450907532E+01 -0.231442511442E+01 + -0.231434056599E+01 -0.231425543145E+01 -0.231416971225E+01 -0.231408340982E+01 + -0.231399652559E+01 -0.231390906097E+01 -0.231382101740E+01 -0.231373239629E+01 + -0.231364319906E+01 -0.231355342711E+01 -0.231346308187E+01 -0.231337216473E+01 + -0.231328067710E+01 -0.231318862037E+01 -0.231309599596E+01 -0.231300280524E+01 + -0.231290904961E+01 -0.231281473046E+01 -0.231271984918E+01 -0.231262440714E+01 + -0.231252840572E+01 -0.231243184630E+01 -0.231233473026E+01 -0.231223705895E+01 + -0.231213883376E+01 -0.231204005604E+01 -0.231194072715E+01 -0.231184084846E+01 + -0.231174042131E+01 -0.231163944706E+01 -0.231153792705E+01 -0.231143586264E+01 + -0.231133325517E+01 -0.231123010597E+01 -0.231112641639E+01 -0.231102218776E+01 + -0.231091742141E+01 -0.231081211866E+01 -0.231070628086E+01 -0.231059990931E+01 + -0.231049300534E+01 -0.231038557027E+01 -0.231027760540E+01 -0.231016911206E+01 + -0.231006009156E+01 -0.230995054518E+01 -0.230984047425E+01 -0.230972988007E+01 + -0.230961876392E+01 -0.230950712710E+01 -0.230939497092E+01 -0.230928229664E+01 + -0.230916910558E+01 -0.230905539899E+01 -0.230894117818E+01 -0.230882644441E+01 + -0.230871119897E+01 -0.230859544312E+01 -0.230847917814E+01 -0.230836240529E+01 + -0.230824512585E+01 -0.230812734106E+01 -0.230800905220E+01 -0.230789026051E+01 + -0.230777096726E+01 -0.230765117369E+01 -0.230753088106E+01 -0.230741009061E+01 + -0.230728880358E+01 -0.230716702122E+01 -0.230704474476E+01 -0.230692197545E+01 + -0.230679871451E+01 -0.230667496317E+01 -0.230655072267E+01 -0.230642599423E+01 + -0.230630077907E+01 -0.230617507842E+01 -0.230604889349E+01 -0.230592222550E+01 + -0.230579507566E+01 -0.230566744518E+01 -0.230553933527E+01 -0.230541074714E+01 + -0.230528168198E+01 -0.230515214101E+01 -0.230502212541E+01 -0.230489163639E+01 + -0.230476067513E+01 -0.230462924283E+01 -0.230449734067E+01 -0.230436496985E+01 + -0.230423213154E+01 -0.230409882693E+01 -0.230396505719E+01 -0.230383082350E+01 + -0.230369612704E+01 -0.230356096897E+01 -0.230342535047E+01 -0.230328927270E+01 + -0.230315273682E+01 -0.230301574400E+01 -0.230287829540E+01 -0.230274039217E+01 + -0.230260203547E+01 -0.230246322645E+01 -0.230232396626E+01 -0.230218425605E+01 + -0.230204409696E+01 -0.230190349014E+01 -0.230176243673E+01 -0.230162093786E+01 + -0.230147899468E+01 -0.230133660831E+01 -0.230119377988E+01 -0.230105051053E+01 + -0.230090680139E+01 -0.230076265357E+01 -0.230061806821E+01 -0.230047304641E+01 + -0.230032758930E+01 -0.230018169800E+01 -0.230003537361E+01 -0.229988861725E+01 + -0.229974143003E+01 -0.229959381306E+01 -0.229944576743E+01 -0.229929729425E+01 + -0.229914839462E+01 -0.229899906964E+01 -0.229884932041E+01 -0.229869914802E+01 + -0.229854855355E+01 -0.229839753810E+01 -0.229824610276E+01 -0.229809424861E+01 + -0.229794197673E+01 -0.229778928820E+01 -0.229763618411E+01 -0.229748266552E+01 + -0.229732873352E+01 -0.229717438917E+01 -0.229701963354E+01 -0.229686446771E+01 + -0.229670889274E+01 -0.229655290968E+01 -0.229639651961E+01 -0.229623972358E+01 + -0.229608252265E+01 -0.229592491787E+01 -0.229576691031E+01 -0.229560850100E+01 + -0.229544969100E+01 -0.229529048135E+01 -0.229513087310E+01 -0.229497086730E+01 + -0.229481046498E+01 -0.229464966718E+01 -0.229448847494E+01 -0.229432688930E+01 + -0.229416491128E+01 -0.229400254191E+01 -0.229383978224E+01 -0.229367663327E+01 + -0.229351309605E+01 -0.229334917158E+01 -0.229318486090E+01 -0.229302016501E+01 + -0.229285508495E+01 -0.229268962171E+01 -0.229252377632E+01 -0.229235754978E+01 + -0.229219094310E+01 -0.229202395730E+01 -0.229185659338E+01 -0.229168885233E+01 + -0.229152073516E+01 -0.229135224288E+01 -0.229118337647E+01 -0.229101413693E+01 + -0.229084452526E+01 -0.229067454245E+01 -0.229050418949E+01 -0.229033346736E+01 + -0.229016237705E+01 -0.228999091955E+01 -0.228981909583E+01 -0.228964690689E+01 + -0.228947435369E+01 -0.228930143721E+01 -0.228912815844E+01 -0.228895451833E+01 + -0.228878051786E+01 -0.228860615801E+01 -0.228843143973E+01 -0.228825636400E+01 + -0.228808093178E+01 -0.228790514402E+01 -0.228772900170E+01 -0.228755250576E+01 + -0.228737565716E+01 -0.228719845687E+01 -0.228702090583E+01 -0.228684300498E+01 + -0.228666475529E+01 -0.228648615770E+01 -0.228630721316E+01 -0.228612792260E+01 + -0.228594828698E+01 -0.228576830722E+01 -0.228558798428E+01 -0.228540731908E+01 + -0.228522631256E+01 -0.228504496566E+01 -0.228486327930E+01 -0.228468125442E+01 + -0.228449889195E+01 -0.228431619280E+01 -0.228413315792E+01 -0.228394978820E+01 + -0.228376608459E+01 -0.228358204800E+01 -0.228339767934E+01 -0.228321297954E+01 + -0.228302794951E+01 -0.228284259015E+01 -0.228265690238E+01 -0.228247088712E+01 + -0.228228454526E+01 -0.228209787772E+01 -0.228191088539E+01 -0.228172356918E+01 + -0.228153593000E+01 -0.228134796874E+01 -0.228115968629E+01 -0.228097108356E+01 + -0.228078216143E+01 -0.228059292081E+01 -0.228040336258E+01 -0.228021348763E+01 + -0.228002329686E+01 -0.227983279113E+01 -0.227964197135E+01 -0.227945083839E+01 + -0.227925939313E+01 -0.227906763646E+01 -0.227887556925E+01 -0.227868319237E+01 + -0.227849050671E+01 -0.227829751314E+01 -0.227810421252E+01 -0.227791060574E+01 + -0.227771669364E+01 -0.227752247712E+01 -0.227732795702E+01 -0.227713313421E+01 + -0.227693800956E+01 -0.227674258393E+01 -0.227654685817E+01 -0.227635083314E+01 + -0.227615450970E+01 -0.227595788870E+01 -0.227576097100E+01 -0.227556375745E+01 + -0.227536624889E+01 -0.227516844617E+01 -0.227497035015E+01 -0.227477196167E+01 + -0.227457328157E+01 -0.227437431069E+01 -0.227417504987E+01 -0.227397549996E+01 + -0.227377566179E+01 -0.227357553619E+01 -0.227337512401E+01 -0.227317442607E+01 + -0.227297344321E+01 -0.227277217625E+01 -0.227257062603E+01 -0.227236879337E+01 + -0.227216667910E+01 -0.227196428405E+01 -0.227176160903E+01 -0.227155865487E+01 + -0.227135542238E+01 -0.227115191239E+01 -0.227094812571E+01 -0.227074406316E+01 + -0.227053972556E+01 -0.227033511371E+01 -0.227013022842E+01 -0.226992507051E+01 + -0.226971964079E+01 -0.226951394006E+01 -0.226930796912E+01 -0.226910172879E+01 + -0.226889521986E+01 -0.226868844313E+01 -0.226848139942E+01 -0.226827408950E+01 + -0.226806651419E+01 -0.226785867427E+01 -0.226765057054E+01 -0.226744220380E+01 + -0.226723357483E+01 -0.226702468442E+01 -0.226681553337E+01 -0.226660612247E+01 + -0.226639645249E+01 -0.226618652422E+01 -0.226597633844E+01 -0.226576589595E+01 + -0.226555519751E+01 -0.226534424391E+01 -0.226513303592E+01 -0.226492157432E+01 + -0.226470985989E+01 -0.226449789340E+01 -0.226428567563E+01 -0.226407320733E+01 + -0.226386048929E+01 -0.226364752227E+01 -0.226343430704E+01 -0.226322084436E+01 + -0.226300713500E+01 -0.226279317973E+01 -0.226257897930E+01 -0.226236453447E+01 + -0.226214984600E+01 -0.226193491466E+01 -0.226171974119E+01 -0.226150432636E+01 + -0.226128867092E+01 -0.226107277561E+01 -0.226085664120E+01 -0.226064026842E+01 + -0.226042365804E+01 -0.226020681079E+01 -0.225998972743E+01 -0.225977240870E+01 + -0.225955485534E+01 -0.225933706809E+01 -0.225911904770E+01 -0.225890079491E+01 + -0.225868231045E+01 -0.225846359506E+01 -0.225824464948E+01 -0.225802547444E+01 + -0.225780607068E+01 -0.225758643893E+01 -0.225736657992E+01 -0.225714649438E+01 + -0.225692618303E+01 -0.225670564662E+01 -0.225648488585E+01 -0.225626390146E+01 + -0.225604269418E+01 -0.225582126471E+01 -0.225559961379E+01 -0.225537774214E+01 + -0.225515565047E+01 -0.225493333950E+01 -0.225471080995E+01 -0.225448806253E+01 + -0.225426509796E+01 -0.225404191695E+01 -0.225381852021E+01 -0.225359490845E+01 + -0.225337108238E+01 -0.225314704272E+01 -0.225292279015E+01 -0.225269832541E+01 + -0.225247364917E+01 -0.225224876216E+01 -0.225202366507E+01 -0.225179835860E+01 + -0.225157284345E+01 -0.225134712033E+01 -0.225112118992E+01 -0.225089505293E+01 + -0.225066871005E+01 -0.225044216198E+01 -0.225021540940E+01 -0.224998845301E+01 + -0.224976129350E+01 -0.224953393156E+01 -0.224930636788E+01 -0.224907860314E+01 + -0.224885063803E+01 -0.224862247324E+01 -0.224839410945E+01 -0.224816554734E+01 + -0.224793678759E+01 -0.224770783088E+01 -0.224747867790E+01 -0.224724932932E+01 + -0.224701978582E+01 -0.224679004807E+01 -0.224656011675E+01 -0.224632999253E+01 + -0.224609967609E+01 -0.224586916809E+01 -0.224563846921E+01 -0.224540758012E+01 + -0.224517650148E+01 -0.224494523396E+01 -0.224471377823E+01 -0.224448213496E+01 + -0.224425030479E+01 -0.224401828841E+01 -0.224378608647E+01 -0.224355369963E+01 + -0.224332112855E+01 -0.224308837388E+01 -0.224285543630E+01 -0.224262231644E+01 + -0.224238901498E+01 -0.224215553256E+01 -0.224192186983E+01 -0.224168802745E+01 + -0.224145400606E+01 -0.224121980633E+01 -0.224098542889E+01 -0.224075087440E+01 + -0.224051614350E+01 -0.224028123683E+01 -0.224004615505E+01 -0.223981089879E+01 + -0.223957546871E+01 -0.223933986543E+01 -0.223910408960E+01 -0.223886814186E+01 + -0.223863202285E+01 -0.223839573321E+01 -0.223815927357E+01 -0.223792264457E+01 + -0.223768584684E+01 -0.223744888101E+01 -0.223721174772E+01 -0.223697444761E+01 + -0.223673698129E+01 -0.223649934940E+01 -0.223626155257E+01 -0.223602359142E+01 + -0.223578546658E+01 -0.223554717868E+01 -0.223530872834E+01 -0.223507011619E+01 + -0.223483134284E+01 -0.223459240892E+01 -0.223435331505E+01 -0.223411406184E+01 + -0.223387464992E+01 -0.223363507991E+01 -0.223339535241E+01 -0.223315546805E+01 + -0.223291542744E+01 -0.223267523120E+01 -0.223243487992E+01 -0.223219437424E+01 + -0.223195371476E+01 -0.223171290208E+01 -0.223147193682E+01 -0.223123081958E+01 + -0.223098955098E+01 -0.223074813161E+01 -0.223050656208E+01 -0.223026484300E+01 + -0.223002297497E+01 -0.222978095859E+01 -0.222953879446E+01 -0.222929648318E+01 + -0.222905402535E+01 -0.222881142157E+01 -0.222856867244E+01 -0.222832577855E+01 + -0.222808274051E+01 -0.222783955889E+01 -0.222759623430E+01 -0.222735276733E+01 + -0.222710915857E+01 -0.222686540861E+01 -0.222662151805E+01 -0.222637748747E+01 + -0.222613331745E+01 -0.222588900859E+01 -0.222564456147E+01 -0.222539997669E+01 + -0.222515525481E+01 -0.222491039643E+01 -0.222466540212E+01 -0.222442027248E+01 + -0.222417500808E+01 -0.222392960950E+01 -0.222368407732E+01 -0.222343841211E+01 + -0.222319261446E+01 -0.222294668495E+01 -0.222270062414E+01 -0.222245443261E+01 + -0.222220811093E+01 -0.222196165969E+01 -0.222171507944E+01 -0.222146837077E+01 + -0.222122153423E+01 -0.222097457041E+01 -0.222072747986E+01 -0.222048026316E+01 + -0.222023292088E+01 -0.221998545357E+01 -0.221973786181E+01 -0.221949014615E+01 + -0.221924230717E+01 -0.221899434542E+01 -0.221874626146E+01 -0.221849805586E+01 + -0.221824972918E+01 -0.221800128197E+01 -0.221775271479E+01 -0.221750402820E+01 + -0.221725522276E+01 -0.221700629901E+01 -0.221675725753E+01 -0.221650809885E+01 + -0.221625882354E+01 -0.221600943214E+01 -0.221575992521E+01 -0.221551030330E+01 + -0.221526056695E+01 -0.221501071672E+01 -0.221476075315E+01 -0.221451067679E+01 + -0.221426048819E+01 -0.221401018789E+01 -0.221375977644E+01 -0.221350925438E+01 + -0.221325862226E+01 -0.221300788061E+01 -0.221275702998E+01 -0.221250607090E+01 + -0.221225500393E+01 -0.221200382959E+01 -0.221175254843E+01 -0.221150116098E+01 + -0.221124966778E+01 -0.221099806936E+01 -0.221074636627E+01 -0.221049455903E+01 + -0.221024264817E+01 -0.220999063424E+01 -0.220973851776E+01 -0.220948629926E+01 + -0.220923397927E+01 -0.220898155833E+01 -0.220872903696E+01 -0.220847641568E+01 + -0.220822369503E+01 -0.220797087554E+01 -0.220771795772E+01 -0.220746494210E+01 + -0.220721182922E+01 -0.220695861957E+01 -0.220670531371E+01 -0.220645191213E+01 + -0.220619841537E+01 -0.220594482394E+01 -0.220569113837E+01 -0.220543735916E+01 + -0.220518348685E+01 -0.220492952194E+01 -0.220467546496E+01 -0.220442131641E+01 + -0.220416707682E+01 -0.220391274669E+01 -0.220365832654E+01 -0.220340381689E+01 + -0.220314921823E+01 -0.220289453110E+01 -0.220263975599E+01 -0.220238489341E+01 + -0.220212994387E+01 -0.220187490789E+01 -0.220161978596E+01 -0.220136457860E+01 + -0.220110928631E+01 -0.220085390959E+01 -0.220059844895E+01 -0.220034290490E+01 + -0.220008727793E+01 -0.219983156855E+01 -0.219957577725E+01 -0.219931990455E+01 + -0.219906395093E+01 -0.219880791691E+01 -0.219855180296E+01 -0.219829560961E+01 + -0.219803933733E+01 -0.219778298663E+01 -0.219752655800E+01 -0.219727005194E+01 + -0.219701346894E+01 -0.219675680950E+01 -0.219650007410E+01 -0.219624326324E+01 + -0.219598637741E+01 -0.219572941711E+01 -0.219547238281E+01 -0.219521527501E+01 + -0.219495809420E+01 -0.219470084086E+01 -0.219444351549E+01 -0.219418611856E+01 + -0.219392865057E+01 -0.219367111200E+01 -0.219341350333E+01 -0.219315582504E+01 + -0.219289807763E+01 -0.219264026156E+01 -0.219238237733E+01 -0.219212442541E+01 + -0.219186640629E+01 -0.219160832043E+01 -0.219135016833E+01 -0.219109195046E+01 + -0.219083366729E+01 -0.219057531930E+01 -0.219031690697E+01 -0.219005843078E+01 + -0.218979989119E+01 -0.218954128868E+01 -0.218928262373E+01 -0.218902389681E+01 + -0.218876510839E+01 -0.218850625893E+01 -0.218824734892E+01 -0.218798837882E+01 + -0.218772934909E+01 -0.218747026022E+01 -0.218721111266E+01 -0.218695190688E+01 + -0.218669264336E+01 -0.218643332254E+01 -0.218617394491E+01 -0.218591451093E+01 + -0.218565502105E+01 -0.218539547574E+01 -0.218513587547E+01 -0.218487622069E+01 + -0.218461651187E+01 -0.218435674947E+01 -0.218409693395E+01 -0.218383706576E+01 + -0.218357714537E+01 -0.218331717324E+01 -0.218305714981E+01 -0.218279707555E+01 + -0.218253695092E+01 -0.218227677636E+01 -0.218201655234E+01 -0.218175627931E+01 + -0.218149595772E+01 -0.218123558802E+01 -0.218097517067E+01 -0.218071470611E+01 + -0.218045419481E+01 -0.218019363721E+01 -0.217993303375E+01 -0.217967238489E+01 + -0.217941169108E+01 -0.217915095276E+01 -0.217889017039E+01 -0.217862934440E+01 + -0.217836847525E+01 -0.217810756337E+01 -0.217784660922E+01 -0.217758561324E+01 + -0.217732457587E+01 -0.217706349756E+01 -0.217680237874E+01 -0.217654121986E+01 + -0.217628002135E+01 -0.217601878367E+01 -0.217575750725E+01 -0.217549619253E+01 + -0.217523483994E+01 -0.217497344993E+01 -0.217471202293E+01 -0.217445055938E+01 + -0.217418905972E+01 -0.217392752437E+01 -0.217366595379E+01 -0.217340434839E+01 + -0.217314270862E+01 -0.217288103490E+01 -0.217261932767E+01 -0.217235758737E+01 + -0.217209581442E+01 -0.217183400925E+01 -0.217157217230E+01 -0.217131030399E+01 + -0.217104840475E+01 -0.217078647502E+01 -0.217052451521E+01 -0.217026252576E+01 + -0.217000050709E+01 -0.216973845963E+01 -0.216947638381E+01 -0.216921428005E+01 + -0.216895214876E+01 -0.216868999039E+01 -0.216842780535E+01 -0.216816559406E+01 + -0.216790335694E+01 -0.216764109442E+01 -0.216737880692E+01 -0.216711649486E+01 + -0.216685415866E+01 -0.216659179873E+01 -0.216632941550E+01 -0.216606700938E+01 + -0.216580458079E+01 -0.216554213015E+01 -0.216527965787E+01 -0.216501716437E+01 + -0.216475465007E+01 -0.216449211538E+01 -0.216422956071E+01 -0.216396698648E+01 + -0.216370439310E+01 -0.216344178098E+01 -0.216317915054E+01 -0.216291650218E+01 + -0.216265383632E+01 -0.216239115337E+01 -0.216212845373E+01 -0.216186573782E+01 + -0.216160300604E+01 -0.216134025880E+01 -0.216107749651E+01 -0.216081471958E+01 + -0.216055192841E+01 -0.216028912342E+01 -0.216002630499E+01 -0.215976347354E+01 + -0.215950062948E+01 -0.215923777320E+01 -0.215897490511E+01 -0.215871202561E+01 + -0.215844913511E+01 -0.215818623400E+01 -0.215792332269E+01 -0.215766040157E+01 + -0.215739747105E+01 -0.215713453153E+01 -0.215687158340E+01 -0.215660862707E+01 + -0.215634566292E+01 -0.215608269137E+01 -0.215581971280E+01 -0.215555672760E+01 + -0.215529373619E+01 -0.215503073895E+01 -0.215476773627E+01 -0.215450472855E+01 + -0.215424171619E+01 -0.215397869958E+01 -0.215371567910E+01 -0.215345265515E+01 + -0.215318962813E+01 -0.215292659842E+01 -0.215266356642E+01 -0.215240053251E+01 + -0.215213749708E+01 -0.215187446052E+01 -0.215161142323E+01 -0.215134838558E+01 + -0.215108534797E+01 -0.215082231079E+01 -0.215055927441E+01 -0.215029623923E+01 + -0.215003320562E+01 -0.214977017399E+01 -0.214950714470E+01 -0.214924411814E+01 + -0.214898109470E+01 -0.214871807476E+01 -0.214845505871E+01 -0.214819204691E+01 + -0.214792903976E+01 -0.214766603764E+01 -0.214740304092E+01 -0.214714004999E+01 + -0.214687706522E+01 -0.214661408699E+01 -0.214635111569E+01 -0.214608815169E+01 + -0.214582519536E+01 -0.214556224709E+01 -0.214529930725E+01 -0.214503637622E+01 + -0.214477345436E+01 -0.214451054207E+01 -0.214424763970E+01 -0.214398474764E+01 + -0.214372186626E+01 -0.214345899593E+01 -0.214319613702E+01 -0.214293328991E+01 + -0.214267045497E+01 -0.214240763256E+01 -0.214214482306E+01 -0.214188202684E+01 + -0.214161924427E+01 -0.214135647572E+01 -0.214109372155E+01 -0.214083098214E+01 + -0.214056825785E+01 -0.214030554905E+01 -0.214004285611E+01 -0.213978017938E+01 + -0.213951751925E+01 -0.213925487607E+01 -0.213899225020E+01 -0.213872964202E+01 + -0.213846705189E+01 -0.213820448016E+01 -0.213794192721E+01 -0.213767939339E+01 + -0.213741687908E+01 -0.213715438462E+01 -0.213689191038E+01 -0.213662945672E+01 + -0.213636702400E+01 -0.213610461258E+01 -0.213584222282E+01 -0.213557985509E+01 + -0.213531750972E+01 -0.213505518710E+01 -0.213479288756E+01 -0.213453061148E+01 + -0.213426835920E+01 -0.213400613109E+01 -0.213374392749E+01 -0.213348174876E+01 + -0.213321959527E+01 -0.213295746735E+01 -0.213269536537E+01 -0.213243328968E+01 + -0.213217124064E+01 -0.213190921858E+01 -0.213164722388E+01 -0.213138525687E+01 + -0.213112331791E+01 -0.213086140735E+01 -0.213059952554E+01 -0.213033767283E+01 + -0.213007584958E+01 -0.212981405612E+01 -0.212955229280E+01 -0.212929055999E+01 + -0.212902885801E+01 -0.212876718723E+01 -0.212850554798E+01 -0.212824394061E+01 + -0.212798236548E+01 -0.212772082291E+01 -0.212745931327E+01 -0.212719783689E+01 + -0.212693639412E+01 -0.212667498530E+01 -0.212641361078E+01 -0.212615227089E+01 + -0.212589096598E+01 -0.212562969640E+01 -0.212536846248E+01 -0.212510726456E+01 + -0.212484610299E+01 -0.212458497811E+01 -0.212432389025E+01 -0.212406283975E+01 + -0.212380182696E+01 -0.212354085222E+01 -0.212327991585E+01 -0.212301901820E+01 + -0.212275815961E+01 -0.212249734041E+01 -0.212223656094E+01 -0.212197582154E+01 + -0.212171512253E+01 -0.212145446427E+01 -0.212119384707E+01 -0.212093327128E+01 + -0.212067273723E+01 -0.212041224525E+01 -0.212015179568E+01 -0.211989138884E+01 + -0.211963102508E+01 -0.211937070472E+01 -0.211911042810E+01 -0.211885019554E+01 + -0.211859000737E+01 -0.211832986394E+01 -0.211806976556E+01 -0.211780971256E+01 + -0.211754970528E+01 -0.211728974405E+01 -0.211702982919E+01 -0.211676996102E+01 + -0.211651013989E+01 -0.211625036610E+01 -0.211599064000E+01 -0.211573096191E+01 + -0.211547133215E+01 -0.211521175104E+01 -0.211495221892E+01 -0.211469273611E+01 + -0.211443330293E+01 -0.211417391971E+01 -0.211391458676E+01 -0.211365530442E+01 + -0.211339607301E+01 -0.211313689284E+01 -0.211287776424E+01 -0.211261868753E+01 + -0.211235966303E+01 -0.211210069107E+01 -0.211184177195E+01 -0.211158290602E+01 + -0.211132409357E+01 -0.211106533493E+01 -0.211080663043E+01 -0.211054798037E+01 + -0.211028938508E+01 -0.211003084487E+01 -0.210977236007E+01 -0.210951393098E+01 + -0.210925555793E+01 -0.210899724122E+01 -0.210873898119E+01 -0.210848077813E+01 + -0.210822263237E+01 -0.210796454422E+01 -0.210770651400E+01 -0.210744854201E+01 + -0.210719062858E+01 -0.210693277401E+01 -0.210667497862E+01 -0.210641724272E+01 + -0.210615956662E+01 -0.210590195063E+01 -0.210564439507E+01 -0.210538690024E+01 + -0.210512946646E+01 -0.210487209403E+01 -0.210461478327E+01 -0.210435753448E+01 + -0.210410034797E+01 -0.210384322406E+01 -0.210358616304E+01 -0.210332916524E+01 + -0.210307223094E+01 -0.210281536047E+01 -0.210255855413E+01 -0.210230181222E+01 + -0.210204513505E+01 -0.210178852293E+01 -0.210153197616E+01 -0.210127549504E+01 + -0.210101907989E+01 -0.210076273100E+01 -0.210050644867E+01 -0.210025023322E+01 + -0.209999408495E+01 -0.209973800415E+01 -0.209948199113E+01 -0.209922604619E+01 + -0.209897016964E+01 -0.209871436177E+01 -0.209845862288E+01 -0.209820295328E+01 + -0.209794735326E+01 -0.209769182313E+01 -0.209743636319E+01 -0.209718097373E+01 + -0.209692565505E+01 -0.209667040745E+01 -0.209641523123E+01 -0.209616012669E+01 + -0.209590509412E+01 -0.209565013382E+01 -0.209539524609E+01 -0.209514043122E+01 + -0.209488568951E+01 -0.209463102126E+01 -0.209437642676E+01 -0.209412190630E+01 + -0.209386746018E+01 -0.209361308869E+01 -0.209335879213E+01 -0.209310457080E+01 + -0.209285042497E+01 -0.209259635496E+01 -0.209234236104E+01 -0.209208844351E+01 + -0.209183460267E+01 -0.209158083880E+01 -0.209132715219E+01 -0.209107354314E+01 + -0.209082001194E+01 -0.209056655887E+01 -0.209031318423E+01 -0.209005988831E+01 + -0.208980667139E+01 -0.208955353376E+01 -0.208930047571E+01 -0.208904749753E+01 + -0.208879459951E+01 -0.208854178194E+01 -0.208828904509E+01 -0.208803638926E+01 + -0.208778381474E+01 -0.208753132181E+01 -0.208727891075E+01 -0.208702658185E+01 + -0.208677433540E+01 -0.208652217168E+01 -0.208627009098E+01 -0.208601809357E+01 + -0.208576617975E+01 -0.208551434979E+01 -0.208526260399E+01 -0.208501094261E+01 + -0.208475936595E+01 -0.208450787428E+01 -0.208425646789E+01 -0.208400514706E+01 + -0.208375391207E+01 -0.208350276320E+01 -0.208325170074E+01 -0.208300072495E+01 + -0.208274983612E+01 -0.208249903454E+01 -0.208224832047E+01 -0.208199769420E+01 + -0.208174715601E+01 -0.208149670618E+01 -0.208124634497E+01 -0.208099607268E+01 + -0.208074588957E+01 -0.208049579593E+01 -0.208024579203E+01 -0.207999587814E+01 + -0.207974605455E+01 -0.207949632152E+01 -0.207924667934E+01 -0.207899712828E+01 + -0.207874766861E+01 -0.207849830061E+01 -0.207824902455E+01 -0.207799984070E+01 + -0.207775074934E+01 -0.207750175075E+01 -0.207725284518E+01 -0.207700403293E+01 + -0.207675531425E+01 -0.207650668943E+01 -0.207625815872E+01 -0.207600972241E+01 + -0.207576138077E+01 -0.207551313405E+01 -0.207526498255E+01 -0.207501692651E+01 + -0.207476896623E+01 -0.207452110195E+01 -0.207427333396E+01 -0.207402566253E+01 + -0.207377808791E+01 -0.207353061038E+01 -0.207328323020E+01 -0.207303594765E+01 + -0.207278876299E+01 -0.207254167649E+01 -0.207229468841E+01 -0.207204779902E+01 + -0.207180100859E+01 -0.207155431738E+01 -0.207130772566E+01 -0.207106123369E+01 + -0.207081484174E+01 -0.207056855007E+01 -0.207032235895E+01 -0.207007626864E+01 + -0.206983027940E+01 -0.206958439149E+01 -0.206933860519E+01 -0.206909292075E+01 + -0.206884733844E+01 -0.206860185851E+01 -0.206835648123E+01 -0.206811120687E+01 + -0.206786603567E+01 -0.206762096791E+01 -0.206737600384E+01 -0.206713114372E+01 + -0.206688638782E+01 -0.206664173639E+01 -0.206639718970E+01 -0.206615274799E+01 + -0.206590841154E+01 -0.206566418060E+01 -0.206542005543E+01 -0.206517603628E+01 + -0.206493212342E+01 -0.206468831709E+01 -0.206444461757E+01 -0.206420102510E+01 + -0.206395753994E+01 -0.206371416236E+01 -0.206347089259E+01 -0.206322773091E+01 + -0.206298467756E+01 -0.206274173280E+01 -0.206249889689E+01 -0.206225617008E+01 + -0.206201355262E+01 -0.206177104477E+01 -0.206152864678E+01 -0.206128635891E+01 + -0.206104418141E+01 -0.206080211453E+01 -0.206056015852E+01 -0.206031831364E+01 + -0.206007658014E+01 -0.205983495827E+01 -0.205959344828E+01 -0.205935205042E+01 + -0.205911076495E+01 -0.205886959212E+01 -0.205862853217E+01 -0.205838758535E+01 + -0.205814675192E+01 -0.205790603212E+01 -0.205766542621E+01 -0.205742493444E+01 + -0.205718455704E+01 -0.205694429427E+01 -0.205670414639E+01 -0.205646411362E+01 + -0.205622419624E+01 -0.205598439447E+01 -0.205574470858E+01 -0.205550513879E+01 + -0.205526568538E+01 -0.205502634856E+01 -0.205478712861E+01 -0.205454802575E+01 + -0.205430904024E+01 -0.205407017232E+01 -0.205383142223E+01 -0.205359279023E+01 + -0.205335427655E+01 -0.205311588144E+01 -0.205287760514E+01 -0.205263944790E+01 + -0.205240140995E+01 -0.205216349155E+01 -0.205192569294E+01 -0.205168801435E+01 + -0.205145045604E+01 -0.205121301823E+01 -0.205097570118E+01 -0.205073850513E+01 + -0.205050143031E+01 -0.205026447697E+01 -0.205002764535E+01 -0.204979093569E+01 + -0.204955434823E+01 -0.204931788320E+01 -0.204908154086E+01 -0.204884532143E+01 + -0.204860922516E+01 -0.204837325229E+01 -0.204813740305E+01 -0.204790167768E+01 + -0.204766607642E+01 -0.204743059952E+01 -0.204719524720E+01 -0.204696001970E+01 + -0.204672491727E+01 -0.204648994013E+01 -0.204625508853E+01 -0.204602036269E+01 + -0.204578576287E+01 -0.204555128928E+01 -0.204531694218E+01 -0.204508272178E+01 + -0.204484862834E+01 -0.204461466208E+01 -0.204438082323E+01 -0.204414711204E+01 + -0.204391352873E+01 -0.204368007355E+01 -0.204344674671E+01 -0.204321354847E+01 + -0.204298047904E+01 -0.204274753866E+01 -0.204251472757E+01 -0.204228204600E+01 + -0.204204949417E+01 -0.204181707232E+01 -0.204158478069E+01 -0.204135261950E+01 + -0.204112058899E+01 -0.204088868938E+01 -0.204065692090E+01 -0.204042528380E+01 + -0.204019377828E+01 -0.203996240460E+01 -0.203973116297E+01 -0.203950005362E+01 + -0.203926907679E+01 -0.203903823270E+01 -0.203880752158E+01 -0.203857694366E+01 + -0.203834649917E+01 -0.203811618833E+01 -0.203788601138E+01 -0.203765596854E+01 + -0.203742606003E+01 -0.203719628609E+01 -0.203696664694E+01 -0.203673714281E+01 + -0.203650777392E+01 -0.203627854050E+01 -0.203604944277E+01 -0.203582048097E+01 + -0.203559165531E+01 -0.203536296602E+01 -0.203513441333E+01 -0.203490599745E+01 + -0.203467771863E+01 -0.203444957706E+01 -0.203422157299E+01 -0.203399370664E+01 + -0.203376597822E+01 -0.203353838797E+01 -0.203331093610E+01 -0.203308362284E+01 + -0.203285644840E+01 -0.203262941302E+01 -0.203240251691E+01 -0.203217576030E+01 + -0.203194914340E+01 -0.203172266644E+01 -0.203149632964E+01 -0.203127013322E+01 + -0.203104407740E+01 -0.203081816239E+01 -0.203059238843E+01 -0.203036675573E+01 + -0.203014126451E+01 -0.202991591498E+01 -0.202969070738E+01 -0.202946564191E+01 + -0.202924071879E+01 -0.202901593825E+01 -0.202879130050E+01 -0.202856680577E+01 + -0.202834245425E+01 -0.202811824619E+01 -0.202789418178E+01 -0.202767026126E+01 + -0.202744648483E+01 -0.202722285272E+01 -0.202699936513E+01 -0.202677602229E+01 + -0.202655282441E+01 -0.202632977171E+01 -0.202610686440E+01 -0.202588410270E+01 + -0.202566148682E+01 -0.202543901697E+01 -0.202521669338E+01 -0.202499451626E+01 + -0.202477248582E+01 -0.202455060227E+01 -0.202432886583E+01 -0.202410727671E+01 + -0.202388583512E+01 -0.202366454129E+01 -0.202344339541E+01 -0.202322239771E+01 + -0.202300154839E+01 -0.202278084767E+01 -0.202256029576E+01 -0.202233989287E+01 + -0.202211963921E+01 -0.202189953500E+01 -0.202167958044E+01 -0.202145977575E+01 + -0.202124012114E+01 -0.202102061681E+01 -0.202080126298E+01 -0.202058205986E+01 + -0.202036300765E+01 -0.202014410657E+01 -0.201992535683E+01 -0.201970675863E+01 + -0.201948831218E+01 -0.201927001769E+01 -0.201905187538E+01 -0.201883388545E+01 + -0.201861604810E+01 -0.201839836355E+01 -0.201818083200E+01 -0.201796345365E+01 + -0.201774622873E+01 -0.201752915743E+01 -0.201731223996E+01 -0.201709547653E+01 + -0.201687886734E+01 -0.201666241260E+01 -0.201644611252E+01 -0.201622996730E+01 + -0.201601397714E+01 -0.201579814226E+01 -0.201558246285E+01 -0.201536693912E+01 + -0.201515157129E+01 -0.201493635954E+01 -0.201472130409E+01 -0.201450640513E+01 + -0.201429166288E+01 -0.201407707754E+01 -0.201386264931E+01 -0.201364837838E+01 + -0.201343426498E+01 -0.201322030930E+01 -0.201300651153E+01 -0.201279287189E+01 + -0.201257939058E+01 -0.201236606779E+01 -0.201215290374E+01 -0.201193989861E+01 + -0.201172705262E+01 -0.201151436596E+01 -0.201130183884E+01 -0.201108947145E+01 + -0.201087726399E+01 -0.201066521668E+01 -0.201045332970E+01 -0.201024160325E+01 + -0.201003003755E+01 -0.200981863277E+01 -0.200960738914E+01 -0.200939630683E+01 + -0.200918538606E+01 -0.200897462703E+01 -0.200876402992E+01 -0.200855359494E+01 + -0.200834332228E+01 -0.200813321215E+01 -0.200792326475E+01 -0.200771348026E+01 + -0.200750385889E+01 -0.200729440083E+01 -0.200708510629E+01 -0.200687597545E+01 + -0.200666700852E+01 -0.200645820568E+01 -0.200624956715E+01 -0.200604109310E+01 + -0.200583278375E+01 -0.200562463928E+01 -0.200541665989E+01 -0.200520884577E+01 + -0.200500119712E+01 -0.200479371414E+01 -0.200458639701E+01 -0.200437924594E+01 + -0.200417226112E+01 -0.200396544273E+01 -0.200375879099E+01 -0.200355230607E+01 + -0.200334598817E+01 -0.200313983749E+01 -0.200293385421E+01 -0.200272803854E+01 + -0.200252239066E+01 -0.200231691077E+01 -0.200211159905E+01 -0.200190645571E+01 + -0.200170148093E+01 -0.200149667490E+01 -0.200129203782E+01 -0.200108756987E+01 + -0.200088327126E+01 -0.200067914216E+01 -0.200047518277E+01 -0.200027139328E+01 + -0.200006777388E+01 -0.199986432477E+01 -0.199966104612E+01 -0.199945793813E+01 + -0.199925500100E+01 -0.199905223490E+01 -0.199884964003E+01 -0.199864721658E+01 + -0.199844496474E+01 -0.199824288469E+01 -0.199804097662E+01 -0.199783924073E+01 + -0.199763767719E+01 -0.199743628621E+01 -0.199723506796E+01 -0.199703402263E+01 + -0.199683315042E+01 -0.199663245150E+01 -0.199643192607E+01 -0.199623157431E+01 + -0.199603139640E+01 -0.199583139254E+01 -0.199563156292E+01 -0.199543190771E+01 + -0.199523242710E+01 -0.199503312128E+01 -0.199483399044E+01 -0.199463503475E+01 + -0.199443625441E+01 -0.199423764960E+01 -0.199403922050E+01 -0.199384096731E+01 + -0.199364289019E+01 -0.199344498935E+01 -0.199324726496E+01 -0.199304971720E+01 + -0.199285234626E+01 -0.199265515233E+01 -0.199245813558E+01 -0.199226129620E+01 + -0.199206463437E+01 -0.199186815028E+01 -0.199167184411E+01 -0.199147571604E+01 + -0.199127976625E+01 -0.199108399493E+01 -0.199088840225E+01 -0.199069298840E+01 + -0.199049775356E+01 -0.199030269792E+01 -0.199010782165E+01 -0.198991312493E+01 + -0.198971860794E+01 -0.198952427088E+01 -0.198933011390E+01 -0.198913613721E+01 + -0.198894234097E+01 -0.198874872537E+01 -0.198855529059E+01 -0.198836203680E+01 + -0.198816896418E+01 -0.198797607293E+01 -0.198778336320E+01 -0.198759083519E+01 + -0.198739848907E+01 -0.198720632503E+01 -0.198701434323E+01 -0.198682254385E+01 + -0.198663092709E+01 -0.198643949311E+01 -0.198624824208E+01 -0.198605717420E+01 + -0.198586628963E+01 -0.198567558856E+01 -0.198548507116E+01 -0.198529473760E+01 + -0.198510458807E+01 -0.198491462274E+01 -0.198472484179E+01 -0.198453524538E+01 + -0.198434583371E+01 -0.198415660695E+01 -0.198396756526E+01 -0.198377870883E+01 + -0.198359003784E+01 -0.198340155245E+01 -0.198321325284E+01 -0.198302513919E+01 + -0.198283721167E+01 -0.198264947046E+01 -0.198246191573E+01 -0.198227454765E+01 + -0.198208736640E+01 -0.198190037216E+01 -0.198171356509E+01 -0.198152694537E+01 + -0.198134051317E+01 -0.198115426868E+01 -0.198096821205E+01 -0.198078234346E+01 + -0.198059666309E+01 -0.198041117111E+01 -0.198022586769E+01 -0.198004075299E+01 + -0.197985582721E+01 -0.197967109050E+01 -0.197948654304E+01 -0.197930218500E+01 + -0.197911801655E+01 -0.197893403786E+01 -0.197875024911E+01 -0.197856665046E+01 + -0.197838324208E+01 -0.197820002415E+01 -0.197801699684E+01 -0.197783416032E+01 + -0.197765151475E+01 -0.197746906031E+01 -0.197728679716E+01 -0.197710472548E+01 + -0.197692284543E+01 -0.197674115719E+01 -0.197655966093E+01 -0.197637835681E+01 + -0.197619724499E+01 -0.197601632566E+01 -0.197583559898E+01 -0.197565506512E+01 + -0.197547472424E+01 -0.197529457651E+01 -0.197511462211E+01 -0.197493486119E+01 + -0.197475529394E+01 -0.197457592050E+01 -0.197439674106E+01 -0.197421775578E+01 + -0.197403896482E+01 -0.197386036835E+01 -0.197368196654E+01 -0.197350375956E+01 + -0.197332574757E+01 -0.197314793073E+01 -0.197297030922E+01 -0.197279288320E+01 + -0.197261565284E+01 -0.197243861830E+01 -0.197226177974E+01 -0.197208513733E+01 + -0.197190869124E+01 -0.197173244163E+01 -0.197155638867E+01 -0.197138053252E+01 + -0.197120487334E+01 -0.197102941130E+01 -0.197085414657E+01 -0.197067907930E+01 + -0.197050420966E+01 -0.197032953782E+01 -0.197015506394E+01 -0.196998078818E+01 + -0.196980671071E+01 -0.196963283168E+01 -0.196945915127E+01 -0.196928566963E+01 + -0.196911238692E+01 -0.196893930332E+01 -0.196876641897E+01 -0.196859373405E+01 + -0.196842124872E+01 -0.196824896313E+01 -0.196807687745E+01 -0.196790499184E+01 + -0.196773330647E+01 -0.196756182148E+01 -0.196739053706E+01 -0.196721945334E+01 + -0.196704857051E+01 -0.196687788871E+01 -0.196670740810E+01 -0.196653712886E+01 + -0.196636705113E+01 -0.196619717509E+01 -0.196602750088E+01 -0.196585802866E+01 + -0.196568875861E+01 -0.196551969087E+01 -0.196535082561E+01 -0.196518216298E+01 + -0.196501370315E+01 -0.196484544627E+01 -0.196467739250E+01 -0.196450954201E+01 + -0.196434189494E+01 -0.196417445146E+01 -0.196400721173E+01 -0.196384017590E+01 + -0.196367334413E+01 -0.196350671658E+01 -0.196334029341E+01 -0.196317407477E+01 + -0.196300806083E+01 -0.196284225173E+01 -0.196267664764E+01 -0.196251124871E+01 + -0.196234605510E+01 -0.196218106696E+01 -0.196201628446E+01 -0.196185170775E+01 + -0.196168733698E+01 -0.196152317231E+01 -0.196135921390E+01 -0.196119546190E+01 + -0.196103191647E+01 -0.196086857777E+01 -0.196070544594E+01 -0.196054252114E+01 + -0.196037980354E+01 -0.196021729328E+01 -0.196005499051E+01 -0.195989289540E+01 + -0.195973100810E+01 -0.195956932876E+01 -0.195940785753E+01 -0.195924659457E+01 + -0.195908554004E+01 -0.195892469409E+01 -0.195876405686E+01 -0.195860362852E+01 + -0.195844340922E+01 -0.195828339911E+01 -0.195812359835E+01 -0.195796400708E+01 + -0.195780462546E+01 -0.195764545364E+01 -0.195748649178E+01 -0.195732774003E+01 + -0.195716919853E+01 -0.195701086745E+01 -0.195685274693E+01 -0.195669483712E+01 + -0.195653713819E+01 -0.195637965027E+01 -0.195622237352E+01 -0.195606530809E+01 + -0.195590845413E+01 -0.195575181180E+01 -0.195559538124E+01 -0.195543916261E+01 + -0.195528315605E+01 -0.195512736172E+01 -0.195497177976E+01 -0.195481641033E+01 + -0.195466125358E+01 -0.195450630965E+01 -0.195435157870E+01 -0.195419706087E+01 + -0.195404275632E+01 -0.195388866519E+01 -0.195373478764E+01 -0.195358112381E+01 + -0.195342767385E+01 -0.195327443791E+01 -0.195312141614E+01 -0.195296860869E+01 + -0.195281601570E+01 -0.195266363733E+01 -0.195251147373E+01 -0.195235952503E+01 + -0.195220779139E+01 -0.195205627295E+01 -0.195190496987E+01 -0.195175388230E+01 + -0.195160301037E+01 -0.195145235423E+01 -0.195130191404E+01 -0.195115168994E+01 + -0.195100168208E+01 -0.195085189060E+01 -0.195070231565E+01 -0.195055295737E+01 + -0.195040381592E+01 -0.195025489144E+01 -0.195010618407E+01 -0.194995769397E+01 + -0.194980942127E+01 -0.194966136612E+01 -0.194951352867E+01 -0.194936590907E+01 + -0.194921850745E+01 -0.194907132397E+01 -0.194892435876E+01 -0.194877761198E+01 + -0.194863108377E+01 -0.194848477427E+01 -0.194833868363E+01 -0.194819281199E+01 + -0.194804715950E+01 -0.194790172629E+01 -0.194775651252E+01 -0.194761151833E+01 + -0.194746674386E+01 -0.194732218926E+01 -0.194717785466E+01 -0.194703374022E+01 + -0.194688984607E+01 -0.194674617236E+01 -0.194660271924E+01 -0.194645948684E+01 + -0.194631647530E+01 -0.194617368477E+01 -0.194603111540E+01 -0.194588876732E+01 + -0.194574664068E+01 -0.194560473561E+01 -0.194546305227E+01 -0.194532159079E+01 + -0.194518035131E+01 -0.194503933398E+01 -0.194489853894E+01 -0.194475796633E+01 + -0.194461761628E+01 -0.194447748895E+01 -0.194433758447E+01 -0.194419790298E+01 + -0.194405844462E+01 -0.194391920954E+01 -0.194378019788E+01 -0.194364140977E+01 + -0.194350284535E+01 -0.194336450477E+01 -0.194322638816E+01 -0.194308849567E+01 + -0.194295082744E+01 -0.194281338360E+01 -0.194267616429E+01 -0.194253916966E+01 + -0.194240239984E+01 -0.194226585497E+01 -0.194212953519E+01 -0.194199344064E+01 + -0.194185757146E+01 -0.194172192779E+01 -0.194158650976E+01 -0.194145131752E+01 + -0.194131635119E+01 -0.194118161093E+01 -0.194104709687E+01 -0.194091280914E+01 + -0.194077874789E+01 -0.194064491325E+01 -0.194051130536E+01 -0.194037792435E+01 + -0.194024477037E+01 -0.194011184355E+01 -0.193997914403E+01 -0.193984667195E+01 + -0.193971442743E+01 -0.193958241063E+01 -0.193945062167E+01 -0.193931906070E+01 + -0.193918772784E+01 -0.193905662323E+01 -0.193892574702E+01 -0.193879509933E+01 + -0.193866468031E+01 -0.193853449009E+01 -0.193840452879E+01 -0.193827479657E+01 + -0.193814529356E+01 -0.193801601988E+01 -0.193788697568E+01 -0.193775816109E+01 + -0.193762957625E+01 -0.193750122128E+01 -0.193737309634E+01 -0.193724520154E+01 + -0.193711753702E+01 -0.193699010293E+01 -0.193686289938E+01 -0.193673592653E+01 + -0.193660918449E+01 -0.193648267342E+01 -0.193635639342E+01 -0.193623034466E+01 + -0.193610452724E+01 -0.193597894132E+01 -0.193585358702E+01 -0.193572846448E+01 + -0.193560357382E+01 -0.193547891519E+01 -0.193535448871E+01 -0.193523029453E+01 + -0.193510633276E+01 -0.193498260354E+01 -0.193485910701E+01 -0.193473584330E+01 + -0.193461281254E+01 -0.193449001486E+01 -0.193436745039E+01 -0.193424511927E+01 + -0.193412302163E+01 -0.193400115759E+01 -0.193387952730E+01 -0.193375813088E+01 + -0.193363696846E+01 -0.193351604018E+01 -0.193339534616E+01 -0.193327488654E+01 + -0.193315466145E+01 -0.193303467102E+01 -0.193291491537E+01 -0.193279539465E+01 + -0.193267610897E+01 -0.193255705848E+01 -0.193243824329E+01 -0.193231966355E+01 + -0.193220131938E+01 -0.193208321090E+01 -0.193196533826E+01 -0.193184770158E+01 + -0.193173030098E+01 -0.193161313661E+01 -0.193149620858E+01 -0.193137951703E+01 + -0.193126306208E+01 -0.193114684387E+01 -0.193103086253E+01 -0.193091511817E+01 + -0.193079961094E+01 -0.193068434096E+01 -0.193056930836E+01 -0.193045451326E+01 + -0.193033995580E+01 -0.193022563610E+01 -0.193011155429E+01 -0.192999771050E+01 + -0.192988410486E+01 -0.192977073749E+01 -0.192965760853E+01 -0.192954471809E+01 + -0.192943206631E+01 -0.192931965332E+01 -0.192920747923E+01 -0.192909554418E+01 + -0.192898384830E+01 -0.192887239171E+01 -0.192876117454E+01 -0.192865019691E+01 + -0.192853945896E+01 -0.192842896080E+01 -0.192831870257E+01 -0.192820868439E+01 + -0.192809890638E+01 -0.192798936868E+01 -0.192788007141E+01 -0.192777101468E+01 + -0.192766219864E+01 -0.192755362341E+01 -0.192744528910E+01 -0.192733719585E+01 + -0.192722934379E+01 -0.192712173303E+01 -0.192701436370E+01 -0.192690723592E+01 + -0.192680034983E+01 -0.192669370554E+01 -0.192658730319E+01 -0.192648114289E+01 + -0.192637522476E+01 -0.192626954894E+01 -0.192616411555E+01 -0.192605892471E+01 + -0.192595397655E+01 -0.192584927119E+01 -0.192574480875E+01 -0.192564058935E+01 + -0.192553661313E+01 -0.192543288020E+01 -0.192532939069E+01 -0.192522614472E+01 + -0.192512314241E+01 -0.192502038389E+01 -0.192491786928E+01 -0.192481559871E+01 + -0.192471357228E+01 -0.192461179014E+01 -0.192451025240E+01 -0.192440895918E+01 + -0.192430791060E+01 -0.192420710680E+01 -0.192410654788E+01 -0.192400623397E+01 + -0.192390616520E+01 -0.192380634168E+01 -0.192370676354E+01 -0.192360743090E+01 + -0.192350834388E+01 -0.192340950260E+01 -0.192331090719E+01 -0.192321255776E+01 + -0.192311445443E+01 -0.192301659733E+01 -0.192291898658E+01 -0.192282162229E+01 + -0.192272450460E+01 -0.192262763361E+01 -0.192253100946E+01 -0.192243463225E+01 + -0.192233850212E+01 -0.192224261918E+01 -0.192214698354E+01 -0.192205159534E+01 + -0.192195645469E+01 -0.192186156172E+01 -0.192176691653E+01 -0.192167251925E+01 + -0.192157837000E+01 -0.192148446890E+01 -0.192139081607E+01 -0.192129741163E+01 + -0.192120425570E+01 -0.192111134839E+01 -0.192101868982E+01 -0.192092628012E+01 + -0.192083411940E+01 -0.192074220779E+01 -0.192065054539E+01 -0.192055913233E+01 + -0.192046796873E+01 -0.192037705470E+01 -0.192028639037E+01 -0.192019597584E+01 + -0.192010581125E+01 -0.192001589670E+01 -0.191992623232E+01 -0.191983681822E+01 + -0.191974765452E+01 -0.191965874134E+01 -0.191957007879E+01 -0.191948166699E+01 + -0.191939350607E+01 -0.191930559613E+01 -0.191921793729E+01 -0.191913052967E+01 + -0.191904337339E+01 -0.191895646857E+01 -0.191886981532E+01 -0.191878341375E+01 + -0.191869726399E+01 -0.191861136614E+01 -0.191852572033E+01 -0.191844032668E+01 + -0.191835518529E+01 -0.191827029629E+01 -0.191818565979E+01 -0.191810127590E+01 + -0.191801714475E+01 -0.191793326644E+01 -0.191784964110E+01 -0.191776626883E+01 + -0.191768314976E+01 -0.191760028400E+01 -0.191751767166E+01 -0.191743531285E+01 + -0.191735320771E+01 -0.191727135633E+01 -0.191718975883E+01 -0.191710841534E+01 + -0.191702732595E+01 -0.191694649080E+01 -0.191686590998E+01 -0.191678558362E+01 + -0.191670551183E+01 -0.191662569473E+01 -0.191654613242E+01 -0.191646682502E+01 + -0.191638777265E+01 -0.191630897542E+01 -0.191623043345E+01 -0.191615214684E+01 + -0.191607411571E+01 -0.191599634017E+01 -0.191591882034E+01 -0.191584155634E+01 + -0.191576454826E+01 -0.191568779623E+01 -0.191561130036E+01 -0.191553506076E+01 + -0.191545907755E+01 -0.191538335083E+01 -0.191530788073E+01 -0.191523266734E+01 + -0.191515771080E+01 -0.191508301119E+01 -0.191500856865E+01 -0.191493438328E+01 + -0.191486045519E+01 -0.191478678450E+01 -0.191471337131E+01 -0.191464021575E+01 + -0.191456731791E+01 -0.191449467792E+01 -0.191442229588E+01 -0.191435017190E+01 + -0.191427830610E+01 -0.191420669859E+01 -0.191413534948E+01 -0.191406425887E+01 + -0.191399342689E+01 -0.191392285364E+01 -0.191385253923E+01 -0.191378248377E+01 + -0.191371268738E+01 -0.191364315016E+01 -0.191357387222E+01 -0.191350485368E+01 + -0.191343609464E+01 -0.191336759522E+01 -0.191329935553E+01 -0.191323137567E+01 + -0.191316365575E+01 -0.191309619589E+01 -0.191302899620E+01 -0.191296205677E+01 + -0.191289537774E+01 -0.191282895919E+01 -0.191276280125E+01 -0.191269690402E+01 + -0.191263126761E+01 -0.191256589213E+01 -0.191250077768E+01 -0.191243592439E+01 + -0.191237133235E+01 -0.191230700168E+01 -0.191224293249E+01 -0.191217912487E+01 + -0.191211557895E+01 -0.191205229483E+01 -0.191198927261E+01 -0.191192651242E+01 + -0.191186401434E+01 -0.191180177850E+01 -0.191173980500E+01 -0.191167809395E+01 + -0.191161664545E+01 -0.191155545962E+01 -0.191149453656E+01 -0.191143387638E+01 + -0.191137347919E+01 -0.191131334509E+01 -0.191125347419E+01 -0.191119386660E+01 + -0.191113452242E+01 -0.191107544177E+01 -0.191101662475E+01 -0.191095807146E+01 + -0.191089978202E+01 -0.191084175653E+01 -0.191078399510E+01 -0.191072649782E+01 + -0.191066926482E+01 -0.191061229620E+01 -0.191055559206E+01 -0.191049915250E+01 + -0.191044297764E+01 -0.191038706758E+01 -0.191033142243E+01 -0.191027604229E+01 + -0.191022092727E+01 -0.191016607748E+01 -0.191011149301E+01 -0.191005717398E+01 + -0.191000312049E+01 -0.190994933265E+01 -0.190989581056E+01 -0.190984255432E+01 + -0.190978956405E+01 -0.190973683984E+01 -0.190968438181E+01 -0.190963219005E+01 + -0.190958026468E+01 -0.190952860579E+01 -0.190947721349E+01 -0.190942608789E+01 + -0.190937522909E+01 -0.190932463719E+01 -0.190927431230E+01 -0.190922425453E+01 + -0.190917446397E+01 -0.190912494074E+01 -0.190907568492E+01 -0.190902669664E+01 + -0.190897797599E+01 -0.190892952308E+01 -0.190888133801E+01 -0.190883342088E+01 + -0.190878577181E+01 -0.190873839088E+01 -0.190869127820E+01 -0.190864443389E+01 + -0.190859785803E+01 -0.190855155074E+01 -0.190850551212E+01 -0.190845974226E+01 + -0.190841424128E+01 -0.190836900928E+01 -0.190832404635E+01 -0.190827935260E+01 + -0.190823492814E+01 -0.190819077307E+01 -0.190814688748E+01 -0.190810327148E+01 + -0.190805992518E+01 -0.190801684867E+01 -0.190797404206E+01 -0.190793150544E+01 + -0.190788923893E+01 -0.190784724262E+01 -0.190780551662E+01 -0.190776406102E+01 + -0.190772287594E+01 -0.190768196146E+01 -0.190764131769E+01 -0.190760094473E+01 + -0.190756084269E+01 -0.190752101166E+01 -0.190748145175E+01 -0.190744216306E+01 + -0.190740314568E+01 -0.190736439973E+01 -0.190732592529E+01 -0.190728772248E+01 + -0.190724979138E+01 -0.190721213211E+01 -0.190717474476E+01 -0.190713762943E+01 + -0.190710078623E+01 -0.190706421525E+01 -0.190702791659E+01 -0.190699189036E+01 + -0.190695613665E+01 -0.190692065557E+01 -0.190688544720E+01 -0.190685051167E+01 + -0.190681584905E+01 -0.190678145946E+01 -0.190674734300E+01 -0.190671349975E+01 + -0.190667992983E+01 -0.190664663332E+01 -0.190661361034E+01 -0.190658086098E+01 + -0.190654838533E+01 -0.190651618351E+01 -0.190648425560E+01 -0.190645260170E+01 + -0.190642122192E+01 -0.190639011636E+01 -0.190635928510E+01 -0.190632872826E+01 + -0.190629844592E+01 -0.190626843820E+01 -0.190623870518E+01 -0.190620924696E+01 + -0.190618006365E+01 -0.190615115533E+01 -0.190612252212E+01 -0.190609416410E+01 + -0.190606608138E+01 -0.190603827405E+01 -0.190601074221E+01 -0.190598348596E+01 + -0.190595650539E+01 -0.190592980061E+01 -0.190590337171E+01 -0.190587721879E+01 + -0.190585134194E+01 -0.190582574127E+01 -0.190580041686E+01 -0.190577536883E+01 + -0.190575059725E+01 -0.190572610224E+01 -0.190570188389E+01 -0.190567794229E+01 + -0.190565427755E+01 -0.190563088975E+01 -0.190560777900E+01 -0.190558494539E+01 + -0.190556238902E+01 -0.190554010998E+01 -0.190551810837E+01 -0.190549638429E+01 + -0.190547493784E+01 -0.190545376910E+01 -0.190543287818E+01 -0.190541226517E+01 + -0.190539193017E+01 -0.190537187327E+01 -0.190535209457E+01 -0.190533259416E+01 + -0.190531337215E+01 -0.190529442862E+01 -0.190527576367E+01 -0.190525737740E+01 + -0.190523926990E+01 -0.190522144126E+01 -0.190520389159E+01 -0.190518662098E+01 + -0.190516962952E+01 -0.190515291731E+01 -0.190513648443E+01 -0.190512033100E+01 + -0.190510445710E+01 -0.190508886282E+01 -0.190507354827E+01 -0.190505851353E+01 + -0.190504375870E+01 -0.190502928388E+01 -0.190501508915E+01 -0.190500117462E+01 + -0.190498754037E+01 -0.190497418651E+01 -0.190496111312E+01 -0.190494832030E+01 + -0.190493580814E+01 -0.190492357675E+01 -0.190491162620E+01 -0.190489995659E+01 + -0.190488856803E+01 -0.190487746060E+01 -0.190486663439E+01 -0.190485608950E+01 + -0.190484582602E+01 -0.190483584405E+01 -0.190482614367E+01 -0.190481672499E+01 + -0.190480758809E+01 -0.190479873307E+01 -0.190479016002E+01 -0.190478186904E+01 + -0.190477386021E+01 -0.190476613362E+01 -0.190475868938E+01 -0.190475152758E+01 + -0.190474464830E+01 -0.190473805164E+01 -0.190473173769E+01 -0.190472570654E+01 + -0.190471995829E+01 -0.190471449303E+01 -0.190470931085E+01 -0.190470441184E+01 + -0.190469979610E+01 -0.190469546371E+01 -0.190469141477E+01 -0.190468764937E+01 + -0.190468416760E+01 -0.190468096956E+01 -0.190467805532E+01 -0.190467542500E+01 + -0.190467307867E+01 -0.190467101643E+01 -0.190466923837E+01 -0.190466774458E+01 + -0.190466653516E+01 -0.190466561019E+01 -0.190466496976E+01 -0.190466461397E+01 + -0.190466454290E+01 -0.190466475665E+01 -0.190466525531E+01 -0.190466603897E+01 + -0.190466710772E+01 -0.190466846165E+01 -0.190467010084E+01 -0.190467202540E+01 + -0.190467423541E+01 -0.190467673096E+01 -0.190467951215E+01 -0.190468257905E+01 + -0.190468593177E+01 -0.190468957038E+01 -0.190469349499E+01 -0.190469770568E+01 + -0.190470220255E+01 -0.190470698567E+01 -0.190471205515E+01 -0.190471741106E+01 + -0.190472305351E+01 -0.190472898257E+01 -0.190473519834E+01 -0.190474170092E+01 + -0.190474849038E+01 -0.190475556681E+01 -0.190476293031E+01 -0.190477058097E+01 + -0.190477851887E+01 -0.190478674411E+01 -0.190479525677E+01 -0.190480405693E+01 + -0.190481314470E+01 -0.190482252016E+01 -0.190483218339E+01 -0.190484213449E+01 + -0.190485237354E+01 -0.190486290063E+01 -0.190487371586E+01 -0.190488481930E+01 + -0.190489621106E+01 -0.190490789120E+01 -0.190491985984E+01 -0.190493211704E+01 + -0.190494466290E+01 -0.190495749751E+01 -0.190497062096E+01 -0.190498403333E+01 + -0.190499773471E+01 -0.190501172519E+01 -0.190502600486E+01 -0.190504057380E+01 + -0.190505543210E+01 -0.190507057986E+01 -0.190508601714E+01 -0.190510174405E+01 + -0.190511776068E+01 -0.190513406710E+01 -0.190515066340E+01 -0.190516754968E+01 + -0.190518472602E+01 -0.190520219250E+01 -0.190521994922E+01 -0.190523799625E+01 + -0.190525633369E+01 -0.190527496163E+01 -0.190529388014E+01 -0.190531308932E+01 + -0.190533258926E+01 -0.190535238003E+01 -0.190537246173E+01 -0.190539283444E+01 + -0.190541349825E+01 -0.190543445324E+01 -0.190545569950E+01 -0.190547723712E+01 + -0.190549906618E+01 -0.190552118677E+01 -0.190554359898E+01 -0.190556630288E+01 + -0.190558929857E+01 -0.190561258613E+01 -0.190563616565E+01 -0.190566003721E+01 + -0.190568420090E+01 -0.190570865680E+01 -0.190573340500E+01 -0.190575844559E+01 + -0.190578377864E+01 -0.190580940425E+01 -0.190583532250E+01 -0.190586153347E+01 + -0.190588803725E+01 -0.190591483393E+01 -0.190594192358E+01 -0.190596930631E+01 + -0.190599698218E+01 -0.190602495128E+01 -0.190605321370E+01 -0.190608176953E+01 + -0.190611061884E+01 -0.190613976172E+01 -0.190616919826E+01 -0.190619892854E+01 + -0.190622895265E+01 -0.190625927067E+01 -0.190628988267E+01 -0.190632078876E+01 + -0.190635198901E+01 -0.190638348350E+01 -0.190641527232E+01 -0.190644735556E+01 + -0.190647973329E+01 -0.190651240560E+01 -0.190654537258E+01 -0.190657863430E+01 + -0.190661219086E+01 -0.190664604233E+01 -0.190668018880E+01 -0.190671463035E+01 + -0.190674936707E+01 -0.190678439903E+01 -0.190681972633E+01 -0.190685534904E+01 + -0.190689126724E+01 -0.190692748103E+01 -0.190696399049E+01 -0.190700079569E+01 + -0.190703789672E+01 -0.190707529366E+01 -0.190711298659E+01 -0.190715097561E+01 + -0.190718926078E+01 -0.190722784220E+01 -0.190726671994E+01 -0.190730589409E+01 + -0.190734536473E+01 -0.190738513194E+01 -0.190742519581E+01 -0.190746555641E+01 + -0.190750621383E+01 -0.190754716815E+01 -0.190758841946E+01 -0.190762996783E+01 + -0.190767181335E+01 -0.190771395610E+01 -0.190775639616E+01 -0.190779913361E+01 + -0.190784216853E+01 -0.190788550101E+01 -0.190792913113E+01 -0.190797305896E+01 + -0.190801728460E+01 -0.190806180811E+01 -0.190810662959E+01 -0.190815174912E+01 + -0.190819716676E+01 -0.190824288262E+01 -0.190828889676E+01 -0.190833520927E+01 + -0.190838182024E+01 -0.190842872973E+01 -0.190847593783E+01 -0.190852344463E+01 + -0.190857125019E+01 -0.190861935462E+01 -0.190866775797E+01 -0.190871646034E+01 + -0.190876546181E+01 -0.190881476245E+01 -0.190886436235E+01 -0.190891426158E+01 + -0.190896446024E+01 -0.190901495839E+01 -0.190906575611E+01 -0.190911685350E+01 + -0.190916825062E+01 -0.190921994756E+01 -0.190927194440E+01 -0.190932424121E+01 + -0.190937683808E+01 -0.190942973509E+01 -0.190948293232E+01 -0.190953642984E+01 + -0.190959022774E+01 -0.190964432610E+01 -0.190969872499E+01 -0.190975342449E+01 + -0.190980842469E+01 -0.190986372567E+01 -0.190991932749E+01 -0.190997523025E+01 + -0.191003143402E+01 -0.191008793888E+01 -0.191014474491E+01 -0.191020185219E+01 + -0.191025926079E+01 -0.191031697081E+01 -0.191037498230E+01 -0.191043329537E+01 + -0.191049191007E+01 -0.191055082650E+01 -0.191061004472E+01 -0.191066956483E+01 + -0.191072938689E+01 -0.191078951099E+01 -0.191084993720E+01 -0.191091066561E+01 + -0.191097169628E+01 -0.191103302931E+01 -0.191109466476E+01 -0.191115660272E+01 + -0.191121884326E+01 -0.191128138646E+01 -0.191134423241E+01 -0.191140738117E+01 + -0.191147083282E+01 -0.191153458745E+01 -0.191159864513E+01 -0.191166300594E+01 + -0.191172766996E+01 -0.191179263726E+01 -0.191185790792E+01 -0.191192348202E+01 + -0.191198935963E+01 -0.191205554084E+01 -0.191212202573E+01 -0.191218881436E+01 + -0.191225590681E+01 -0.191232330317E+01 -0.191239100351E+01 -0.191245900791E+01 + -0.191252731644E+01 -0.191259592918E+01 -0.191266484621E+01 -0.191273406760E+01 + -0.191280359344E+01 -0.191287342380E+01 -0.191294355875E+01 -0.191301399837E+01 + -0.191308474274E+01 -0.191315579194E+01 -0.191322714603E+01 -0.191329880511E+01 + -0.191337076924E+01 -0.191344303850E+01 -0.191351561297E+01 -0.191358849272E+01 + -0.191366167783E+01 -0.191373516837E+01 -0.191380896443E+01 -0.191388306607E+01 + -0.191395747338E+01 -0.191403218643E+01 -0.191410720529E+01 -0.191418253004E+01 + -0.191425816076E+01 -0.191433409753E+01 -0.191441034041E+01 -0.191448688949E+01 + -0.191456374483E+01 -0.191464090652E+01 -0.191471837463E+01 -0.191479614924E+01 + -0.191487423041E+01 -0.191495261824E+01 -0.191503131278E+01 -0.191511031412E+01 + -0.191518962234E+01 -0.191526923750E+01 -0.191534915968E+01 -0.191542938896E+01 + -0.191550992542E+01 -0.191559076912E+01 -0.191567192014E+01 -0.191575337855E+01 + -0.191583514444E+01 -0.191591721788E+01 -0.191599959893E+01 -0.191608228769E+01 + -0.191616528421E+01 -0.191624858857E+01 -0.191633220085E+01 -0.191641612113E+01 + -0.191650034947E+01 -0.191658488596E+01 -0.191666973066E+01 -0.191675488365E+01 + -0.191684034501E+01 -0.191692611480E+01 -0.191701219310E+01 -0.191709858000E+01 + -0.191718527555E+01 -0.191727227983E+01 -0.191735959293E+01 -0.191744721490E+01 + -0.191753514583E+01 -0.191762338579E+01 -0.191771193485E+01 -0.191780079309E+01 + -0.191788996058E+01 -0.191797943739E+01 -0.191806922360E+01 -0.191815931927E+01 + -0.191824972449E+01 -0.191834043933E+01 -0.191843146386E+01 -0.191852279815E+01 + -0.191861444227E+01 -0.191870639631E+01 -0.191879866033E+01 -0.191889123440E+01 + -0.191898411860E+01 -0.191907731300E+01 -0.191917081768E+01 -0.191926463270E+01 + -0.191935875814E+01 -0.191945319407E+01 -0.191954794057E+01 -0.191964299771E+01 + -0.191973836555E+01 -0.191983404418E+01 -0.191993003366E+01 -0.192002633407E+01 + -0.192012294548E+01 -0.192021986796E+01 -0.192031710158E+01 -0.192041464642E+01 + -0.192051250255E+01 -0.192061067003E+01 -0.192070914896E+01 -0.192080793938E+01 + -0.192090704138E+01 -0.192100645503E+01 -0.192110618040E+01 -0.192120621756E+01 + -0.192130656659E+01 -0.192140722755E+01 -0.192150820052E+01 -0.192160948557E+01 + -0.192171108276E+01 -0.192181299218E+01 -0.192191521389E+01 -0.192201774797E+01 + -0.192212059448E+01 -0.192222375350E+01 -0.192232722510E+01 -0.192243100935E+01 + -0.192253510632E+01 -0.192263951608E+01 -0.192274423871E+01 -0.192284927427E+01 + -0.192295462283E+01 -0.192306028448E+01 -0.192316625926E+01 -0.192327254727E+01 + -0.192337914857E+01 -0.192348606322E+01 -0.192359329131E+01 -0.192370083289E+01 + -0.192380868805E+01 -0.192391685685E+01 -0.192402533936E+01 -0.192413413566E+01 + -0.192424324581E+01 -0.192435266988E+01 -0.192446240795E+01 -0.192457246008E+01 + -0.192468282635E+01 -0.192479350682E+01 -0.192490450157E+01 -0.192501581067E+01 + -0.192512743417E+01 -0.192523937217E+01 -0.192535162472E+01 -0.192546419189E+01 + -0.192557707376E+01 -0.192569027040E+01 -0.192580378186E+01 -0.192591760824E+01 + -0.192603174959E+01 -0.192614620598E+01 -0.192626097748E+01 -0.192637606417E+01 + -0.192649146611E+01 -0.192660718337E+01 -0.192672321602E+01 -0.192683956414E+01 + -0.192695622778E+01 -0.192707320703E+01 -0.192719050194E+01 -0.192730811259E+01 + -0.192742603904E+01 -0.192754428137E+01 -0.192766283965E+01 -0.192778171394E+01 + -0.192790090431E+01 -0.192802041084E+01 -0.192814023359E+01 -0.192826037262E+01 + -0.192838082801E+01 -0.192850159983E+01 -0.192862268815E+01 -0.192874409303E+01 + -0.192886581454E+01 -0.192898785276E+01 -0.192911020774E+01 -0.192923287956E+01 + -0.192935586829E+01 -0.192947917400E+01 -0.192960279674E+01 -0.192972673660E+01 + -0.192985099364E+01 -0.192997556793E+01 -0.193010045953E+01 -0.193022566852E+01 + -0.193035119496E+01 -0.193047703892E+01 -0.193060320047E+01 -0.193072967967E+01 + -0.193085647660E+01 -0.193098359132E+01 -0.193111102390E+01 -0.193123877441E+01 + -0.193136684292E+01 -0.193149522948E+01 -0.193162393418E+01 -0.193175295707E+01 + -0.193188229823E+01 -0.193201195772E+01 -0.193214193562E+01 -0.193227223198E+01 + -0.193240284687E+01 -0.193253378037E+01 -0.193266503254E+01 -0.193279660344E+01 + -0.193292849315E+01 -0.193306070173E+01 -0.193319322925E+01 -0.193332607577E+01 + -0.193345924137E+01 -0.193359272610E+01 -0.193372653005E+01 -0.193386065326E+01 + -0.193399509581E+01 -0.193412985777E+01 -0.193426493921E+01 -0.193440034018E+01 + -0.193453606076E+01 -0.193467210101E+01 -0.193480846100E+01 -0.193494514080E+01 + -0.193508214047E+01 -0.193521946008E+01 -0.193535709970E+01 -0.193549505939E+01 + -0.193563333921E+01 -0.193577193924E+01 -0.193591085954E+01 -0.193605010018E+01 + -0.193618966122E+01 -0.193632954273E+01 -0.193646974477E+01 -0.193661026742E+01 + -0.193675111073E+01 -0.193689227477E+01 -0.193703375962E+01 -0.193717556533E+01 + -0.193731769196E+01 -0.193746013960E+01 -0.193760290829E+01 -0.193774599812E+01 + -0.193788940913E+01 -0.193803314141E+01 -0.193817719501E+01 -0.193832156999E+01 + -0.193846626644E+01 -0.193861128440E+01 -0.193875662395E+01 -0.193890228515E+01 + -0.193904826807E+01 -0.193919457277E+01 -0.193934119931E+01 -0.193948814777E+01 + -0.193963541820E+01 -0.193978301068E+01 -0.193993092526E+01 -0.194007916202E+01 + -0.194022772101E+01 -0.194037660230E+01 -0.194052580596E+01 -0.194067533205E+01 + -0.194082518064E+01 -0.194097535179E+01 -0.194112584557E+01 -0.194127666203E+01 + -0.194142780125E+01 -0.194157926329E+01 -0.194173104821E+01 -0.194188315609E+01 + -0.194203558697E+01 -0.194218834093E+01 -0.194234141804E+01 -0.194249481835E+01 + -0.194264854193E+01 -0.194280258884E+01 -0.194295695916E+01 -0.194311165293E+01 + -0.194326667024E+01 -0.194342201113E+01 -0.194357767568E+01 -0.194373366395E+01 + -0.194388997600E+01 -0.194404661190E+01 -0.194420357171E+01 -0.194436085549E+01 + -0.194451846331E+01 -0.194467639523E+01 -0.194483465132E+01 -0.194499323164E+01 + -0.194515213625E+01 -0.194531136522E+01 -0.194547091861E+01 -0.194563079648E+01 + -0.194579099890E+01 -0.194595152593E+01 -0.194611237763E+01 -0.194627355407E+01 + -0.194643505531E+01 -0.194659688142E+01 -0.194675903245E+01 -0.194692150847E+01 + -0.194708430954E+01 -0.194724743573E+01 -0.194741088710E+01 -0.194757466371E+01 + -0.194773876563E+01 -0.194790319292E+01 -0.194806794563E+01 -0.194823302385E+01 + -0.194839842761E+01 -0.194856415700E+01 -0.194873021207E+01 -0.194889659288E+01 + -0.194906329951E+01 -0.194923033200E+01 -0.194939769042E+01 -0.194956537484E+01 + -0.194973338532E+01 -0.194990172192E+01 -0.195007038470E+01 -0.195023937373E+01 + -0.195040868906E+01 -0.195057833076E+01 -0.195074829890E+01 -0.195091859353E+01 + -0.195108921471E+01 -0.195126016252E+01 -0.195143143700E+01 -0.195160303823E+01 + -0.195177496626E+01 -0.195194722116E+01 -0.195211980298E+01 -0.195229271180E+01 + -0.195246594767E+01 -0.195263951065E+01 -0.195281340081E+01 -0.195298761821E+01 + -0.195316216290E+01 -0.195333703496E+01 -0.195351223444E+01 -0.195368776141E+01 + -0.195386361591E+01 -0.195403979803E+01 -0.195421630782E+01 -0.195439314533E+01 + -0.195457031064E+01 -0.195474780380E+01 -0.195492562487E+01 -0.195510377392E+01 + -0.195528225101E+01 -0.195546105620E+01 -0.195564018954E+01 -0.195581965110E+01 + -0.195599944095E+01 -0.195617955914E+01 -0.195636000573E+01 -0.195654078078E+01 + -0.195672188436E+01 -0.195690331653E+01 -0.195708507734E+01 -0.195726716686E+01 + -0.195744958515E+01 -0.195763233227E+01 -0.195781540828E+01 -0.195799881324E+01 + -0.195818254721E+01 -0.195836661025E+01 -0.195855100243E+01 -0.195873572380E+01 + -0.195892077442E+01 -0.195910615436E+01 -0.195929186367E+01 -0.195947790241E+01 + -0.195966427065E+01 -0.195985096845E+01 -0.196003799586E+01 -0.196022535294E+01 + -0.196041303976E+01 -0.196060105638E+01 -0.196078940286E+01 -0.196097807925E+01 + -0.196116708561E+01 -0.196135642201E+01 -0.196154608851E+01 -0.196173608517E+01 + -0.196192641204E+01 -0.196211706918E+01 -0.196230805667E+01 -0.196249937454E+01 + -0.196269102287E+01 -0.196288300172E+01 -0.196307531114E+01 -0.196326795120E+01 + -0.196346092195E+01 -0.196365422345E+01 -0.196384785576E+01 -0.196404181895E+01 + -0.196423611307E+01 -0.196443073817E+01 -0.196462569433E+01 -0.196482098160E+01 + -0.196501660004E+01 -0.196521254970E+01 -0.196540883065E+01 -0.196560544295E+01 + -0.196580238666E+01 -0.196599966183E+01 -0.196619726852E+01 -0.196639520679E+01 + -0.196659347671E+01 -0.196679207833E+01 -0.196699101170E+01 -0.196719027690E+01 + -0.196738987397E+01 -0.196758980298E+01 -0.196779006398E+01 -0.196799065704E+01 + -0.196819158221E+01 -0.196839283955E+01 -0.196859442912E+01 -0.196879635098E+01 + -0.196899860518E+01 -0.196920119179E+01 -0.196940411086E+01 -0.196960736246E+01 + -0.196981094663E+01 -0.197001486345E+01 -0.197021911296E+01 -0.197042369523E+01 + -0.197062861031E+01 -0.197083385826E+01 -0.197103943914E+01 -0.197124535301E+01 + -0.197145159993E+01 -0.197165817995E+01 -0.197186509314E+01 -0.197207233954E+01 + -0.197227991923E+01 -0.197248783225E+01 -0.197269607866E+01 -0.197290465853E+01 + -0.197311357191E+01 -0.197332281885E+01 -0.197353239942E+01 -0.197374231367E+01 + -0.197395256167E+01 -0.197416314346E+01 -0.197437405911E+01 -0.197458530867E+01 + -0.197479689221E+01 -0.197500880977E+01 -0.197522106142E+01 -0.197543364722E+01 + -0.197564656721E+01 -0.197585982147E+01 -0.197607341003E+01 -0.197628733298E+01 + -0.197650159035E+01 -0.197671618221E+01 -0.197693110862E+01 -0.197714636963E+01 + -0.197736196529E+01 -0.197757789568E+01 -0.197779416083E+01 -0.197801076082E+01 + -0.197822769570E+01 -0.197844496551E+01 -0.197866257033E+01 -0.197888051021E+01 + -0.197909878521E+01 -0.197931739537E+01 -0.197953634076E+01 -0.197975562144E+01 + -0.197997523746E+01 -0.198019518888E+01 -0.198041547576E+01 -0.198063609814E+01 + -0.198085705610E+01 -0.198107834968E+01 -0.198129997894E+01 -0.198152194394E+01 + -0.198174424473E+01 -0.198196688138E+01 -0.198218985393E+01 -0.198241316245E+01 + -0.198263680698E+01 -0.198286078759E+01 -0.198308510434E+01 -0.198330975727E+01 + -0.198353474644E+01 -0.198376007192E+01 -0.198398573375E+01 -0.198421173200E+01 + -0.198443806672E+01 -0.198466473796E+01 -0.198489174578E+01 -0.198511909024E+01 + -0.198534677139E+01 -0.198557478928E+01 -0.198580314399E+01 -0.198603183555E+01 + -0.198626086403E+01 -0.198649022948E+01 -0.198671993196E+01 -0.198694997152E+01 + -0.198718034822E+01 -0.198741106211E+01 -0.198764211326E+01 -0.198787350170E+01 + -0.198810522751E+01 -0.198833729074E+01 -0.198856969143E+01 -0.198880242966E+01 + -0.198903550546E+01 -0.198926891890E+01 -0.198950267004E+01 -0.198973675892E+01 + -0.198997118561E+01 -0.199020595015E+01 -0.199044105261E+01 -0.199067649304E+01 + -0.199091227149E+01 -0.199114838802E+01 -0.199138484268E+01 -0.199162163553E+01 + -0.199185876663E+01 -0.199209623602E+01 -0.199233404377E+01 -0.199257218993E+01 + -0.199281067455E+01 -0.199304949768E+01 -0.199328865939E+01 -0.199352815973E+01 + -0.199376799875E+01 -0.199400817651E+01 -0.199424869305E+01 -0.199448954845E+01 + -0.199473074274E+01 -0.199497227599E+01 -0.199521414825E+01 -0.199545635957E+01 + -0.199569891001E+01 -0.199594179963E+01 -0.199618502847E+01 -0.199642859659E+01 + -0.199667250405E+01 -0.199691675089E+01 -0.199716133718E+01 -0.199740626297E+01 + -0.199765152832E+01 -0.199789713327E+01 -0.199814307788E+01 -0.199838936220E+01 + -0.199863598629E+01 -0.199888295021E+01 -0.199913025400E+01 -0.199937789773E+01 + -0.199962588144E+01 -0.199987420518E+01 -0.200012286902E+01 -0.200037187301E+01 + -0.200062121719E+01 -0.200087090163E+01 -0.200112092638E+01 -0.200137129149E+01 + -0.200162199701E+01 -0.200187304300E+01 -0.200212442951E+01 -0.200237615660E+01 + -0.200262822431E+01 -0.200288063271E+01 -0.200313338185E+01 -0.200338647177E+01 + -0.200363990254E+01 -0.200389367420E+01 -0.200414778681E+01 -0.200440224043E+01 + -0.200465703510E+01 -0.200491217087E+01 -0.200516764782E+01 -0.200542346597E+01 + -0.200567962540E+01 -0.200593612615E+01 -0.200619296827E+01 -0.200645015182E+01 + -0.200670767685E+01 -0.200696554341E+01 -0.200722375157E+01 -0.200748230136E+01 + -0.200774119284E+01 -0.200800042607E+01 -0.200826000110E+01 -0.200851991797E+01 + -0.200878017676E+01 -0.200904077749E+01 -0.200930172024E+01 -0.200956300505E+01 + -0.200982463197E+01 -0.201008660106E+01 -0.201034891237E+01 -0.201061156596E+01 + -0.201087456186E+01 -0.201113790015E+01 -0.201140158086E+01 -0.201166560406E+01 + -0.201192996979E+01 -0.201219467810E+01 -0.201245972906E+01 -0.201272512271E+01 + -0.201299085910E+01 -0.201325693829E+01 -0.201352336032E+01 -0.201379012525E+01 + -0.201405723314E+01 -0.201432468403E+01 -0.201459247798E+01 -0.201486061504E+01 + -0.201512909525E+01 -0.201539791868E+01 -0.201566708538E+01 -0.201593659539E+01 + -0.201620644877E+01 -0.201647664557E+01 -0.201674718584E+01 -0.201701806963E+01 + -0.201728929700E+01 -0.201756086800E+01 -0.201783278268E+01 -0.201810504108E+01 + -0.201837764327E+01 -0.201865058930E+01 -0.201892387921E+01 -0.201919751305E+01 + -0.201947149089E+01 -0.201974581276E+01 -0.202002047873E+01 -0.202029548884E+01 + -0.202057084314E+01 -0.202084654169E+01 -0.202112258454E+01 -0.202139897173E+01 + -0.202167570332E+01 -0.202195277937E+01 -0.202223019992E+01 -0.202250796502E+01 + -0.202278607472E+01 -0.202306452909E+01 -0.202334332815E+01 -0.202362247198E+01 + -0.202390196061E+01 -0.202418179411E+01 -0.202446197251E+01 -0.202474249588E+01 + -0.202502336426E+01 -0.202530457770E+01 -0.202558613626E+01 -0.202586803999E+01 + -0.202615028893E+01 -0.202643288313E+01 -0.202671582266E+01 -0.202699910755E+01 + -0.202728273786E+01 -0.202756671364E+01 -0.202785103494E+01 -0.202813570182E+01 + -0.202842071431E+01 -0.202870607248E+01 -0.202899177637E+01 -0.202927782603E+01 + -0.202956422151E+01 -0.202985096287E+01 -0.203013805016E+01 -0.203042548341E+01 + -0.203071326270E+01 -0.203100138806E+01 -0.203128985954E+01 -0.203157867720E+01 + -0.203186784109E+01 -0.203215735125E+01 -0.203244720774E+01 -0.203273741060E+01 + -0.203302795989E+01 -0.203331885566E+01 -0.203361009796E+01 -0.203390168683E+01 + -0.203419362233E+01 -0.203448590450E+01 -0.203477853341E+01 -0.203507150908E+01 + -0.203536483159E+01 -0.203565850097E+01 -0.203595251728E+01 -0.203624688056E+01 + -0.203654159087E+01 -0.203683664825E+01 -0.203713205276E+01 -0.203742780445E+01 + -0.203772390335E+01 -0.203802034953E+01 -0.203831714304E+01 -0.203861428392E+01 + -0.203891177222E+01 -0.203920960799E+01 -0.203950779128E+01 -0.203980632215E+01 + -0.204010520063E+01 -0.204040442679E+01 -0.204070400066E+01 -0.204100392231E+01 + -0.204130419177E+01 -0.204160480909E+01 -0.204190577434E+01 -0.204220708754E+01 + -0.204250874877E+01 -0.204281075805E+01 -0.204311311545E+01 -0.204341582102E+01 + -0.204371887479E+01 -0.204402227682E+01 -0.204432602716E+01 -0.204463012586E+01 + -0.204493457297E+01 -0.204523936853E+01 -0.204554451260E+01 -0.204585000522E+01 + -0.204615584644E+01 -0.204646203632E+01 -0.204676857489E+01 -0.204707546222E+01 + -0.204738269834E+01 -0.204769028331E+01 -0.204799821717E+01 -0.204830649998E+01 + -0.204861513178E+01 -0.204892411261E+01 -0.204923344254E+01 -0.204954312161E+01 + -0.204985314986E+01 -0.205016352735E+01 -0.205047425412E+01 -0.205078533023E+01 + -0.205109675571E+01 -0.205140853062E+01 -0.205172065501E+01 -0.205203312892E+01 + -0.205234595241E+01 -0.205265912552E+01 -0.205297264830E+01 -0.205328652080E+01 + -0.205360074306E+01 -0.205391531514E+01 -0.205423023708E+01 -0.205454550893E+01 + -0.205486113074E+01 -0.205517710256E+01 -0.205549342443E+01 -0.205581009641E+01 + -0.205612711853E+01 -0.205644449085E+01 -0.205676221342E+01 -0.205708028629E+01 + -0.205739870950E+01 -0.205771748309E+01 -0.205803660713E+01 -0.205835608165E+01 + -0.205867590670E+01 -0.205899608234E+01 -0.205931660860E+01 -0.205963748554E+01 + -0.205995871321E+01 -0.206028029164E+01 -0.206060222090E+01 -0.206092450102E+01 + -0.206124713206E+01 -0.206157011406E+01 -0.206189344706E+01 -0.206221713113E+01 + -0.206254116629E+01 -0.206286555261E+01 -0.206319029013E+01 -0.206351537890E+01 + -0.206384081895E+01 -0.206416661035E+01 -0.206449275314E+01 -0.206481924736E+01 + -0.206514609307E+01 -0.206547329030E+01 -0.206580083911E+01 -0.206612873954E+01 + -0.206645699165E+01 -0.206678559547E+01 -0.206711455106E+01 -0.206744385846E+01 + -0.206777351772E+01 -0.206810352889E+01 -0.206843389200E+01 -0.206876460712E+01 + -0.206909567429E+01 -0.206942709354E+01 -0.206975886494E+01 -0.207009098853E+01 + -0.207042346435E+01 -0.207075629245E+01 -0.207108947287E+01 -0.207142300568E+01 + -0.207175689090E+01 -0.207209112859E+01 -0.207242571879E+01 -0.207276066155E+01 + -0.207309595693E+01 -0.207343160495E+01 -0.207376760568E+01 -0.207410395915E+01 + -0.207444066541E+01 -0.207477772452E+01 -0.207511513651E+01 -0.207545290143E+01 + -0.207579101933E+01 -0.207612949025E+01 -0.207646831425E+01 -0.207680749137E+01 + -0.207714702164E+01 -0.207748690513E+01 -0.207782714188E+01 -0.207816773192E+01 + -0.207850867532E+01 -0.207884997211E+01 -0.207919162234E+01 -0.207953362606E+01 + -0.207987598331E+01 -0.208021869414E+01 -0.208056175859E+01 -0.208090517671E+01 + -0.208124894856E+01 -0.208159307416E+01 -0.208193755357E+01 -0.208228238684E+01 + -0.208262757401E+01 -0.208297311512E+01 -0.208331901022E+01 -0.208366525936E+01 + -0.208401186259E+01 -0.208435881994E+01 -0.208470613147E+01 -0.208505379722E+01 + -0.208540181724E+01 -0.208575019156E+01 -0.208609892025E+01 -0.208644800333E+01 + -0.208679744087E+01 -0.208714723290E+01 -0.208749737946E+01 -0.208784788061E+01 + -0.208819873640E+01 -0.208854994685E+01 -0.208890151203E+01 -0.208925343197E+01 + -0.208960570673E+01 -0.208995833634E+01 -0.209031132086E+01 -0.209066466032E+01 + -0.209101835477E+01 -0.209137240426E+01 -0.209172680884E+01 -0.209208156854E+01 + -0.209243668341E+01 -0.209279215351E+01 -0.209314797886E+01 -0.209350415953E+01 + -0.209386069555E+01 -0.209421758696E+01 -0.209457483382E+01 -0.209493243617E+01 + -0.209529039405E+01 -0.209564870751E+01 -0.209600737659E+01 -0.209636640134E+01 + -0.209672578181E+01 -0.209708551803E+01 -0.209744561005E+01 -0.209780605792E+01 + -0.209816686168E+01 -0.209852802137E+01 -0.209888953705E+01 -0.209925140876E+01 + -0.209961363653E+01 -0.209997622042E+01 -0.210033916047E+01 -0.210070245672E+01 + -0.210106610922E+01 -0.210143011801E+01 -0.210179448314E+01 -0.210215920465E+01 + -0.210252428259E+01 -0.210288971700E+01 -0.210325550793E+01 -0.210362165541E+01 + -0.210398815950E+01 -0.210435502023E+01 -0.210472223766E+01 -0.210508981183E+01 + -0.210545774277E+01 -0.210582603054E+01 -0.210619467518E+01 -0.210656367673E+01 + -0.210693303524E+01 -0.210730275076E+01 -0.210767282331E+01 -0.210804325296E+01 + -0.210841403974E+01 -0.210878518370E+01 -0.210915668488E+01 -0.210952854333E+01 + -0.210990075908E+01 -0.211027333219E+01 -0.211064626270E+01 -0.211101955065E+01 + -0.211139319608E+01 -0.211176719904E+01 -0.211214155958E+01 -0.211251627773E+01 + -0.211289135354E+01 -0.211326678706E+01 -0.211364257832E+01 -0.211401872738E+01 + -0.211439523427E+01 -0.211477209903E+01 -0.211514932173E+01 -0.211552690238E+01 + -0.211590484105E+01 -0.211628313777E+01 -0.211666179258E+01 -0.211704080553E+01 + -0.211742017667E+01 -0.211779990604E+01 -0.211817999367E+01 -0.211856043962E+01 + -0.211894124392E+01 -0.211932240663E+01 -0.211970392778E+01 -0.212008580741E+01 + -0.212046804558E+01 -0.212085064232E+01 -0.212123359767E+01 -0.212161691169E+01 + -0.212200058440E+01 -0.212238461587E+01 -0.212276900612E+01 -0.212315375521E+01 + -0.212353886317E+01 -0.212392433005E+01 -0.212431015589E+01 -0.212469634073E+01 + -0.212508288462E+01 -0.212546978760E+01 -0.212585704972E+01 -0.212624467101E+01 + -0.212663265152E+01 -0.212702099130E+01 -0.212740969037E+01 -0.212779874880E+01 + -0.212818816661E+01 -0.212857794386E+01 -0.212896808059E+01 -0.212935857683E+01 + -0.212974943263E+01 -0.213014064804E+01 -0.213053222310E+01 -0.213092415784E+01 + -0.213131645232E+01 -0.213170910657E+01 -0.213210212064E+01 -0.213249549456E+01 + -0.213288922839E+01 -0.213328332217E+01 -0.213367777593E+01 -0.213407258972E+01 + -0.213446776358E+01 -0.213486329756E+01 -0.213525919169E+01 -0.213565544602E+01 + -0.213605206060E+01 -0.213644903545E+01 -0.213684637064E+01 -0.213724406619E+01 + -0.213764212215E+01 -0.213804053857E+01 -0.213843931548E+01 -0.213883845292E+01 + -0.213923795095E+01 -0.213963780960E+01 -0.214003802891E+01 -0.214043860892E+01 + -0.214083954969E+01 -0.214124085124E+01 -0.214164251362E+01 -0.214204453688E+01 + -0.214244692106E+01 -0.214284966619E+01 -0.214325277232E+01 -0.214365623949E+01 + -0.214406006775E+01 -0.214446425713E+01 -0.214486880767E+01 -0.214527371943E+01 + -0.214567899244E+01 -0.214608462673E+01 -0.214649062237E+01 -0.214689697937E+01 + -0.214730369780E+01 -0.214771077768E+01 -0.214811821907E+01 -0.214852602200E+01 + -0.214893418651E+01 -0.214934271264E+01 -0.214975160045E+01 -0.215016084996E+01 + -0.215057046122E+01 -0.215098043428E+01 -0.215139076916E+01 -0.215180146593E+01 + -0.215221252460E+01 -0.215262394524E+01 -0.215303572787E+01 -0.215344787255E+01 + -0.215386037930E+01 -0.215427324818E+01 -0.215468647922E+01 -0.215510007247E+01 + -0.215551402796E+01 -0.215592834574E+01 -0.215634302585E+01 -0.215675806833E+01 + -0.215717347322E+01 -0.215758924057E+01 -0.215800537040E+01 -0.215842186277E+01 + -0.215883871772E+01 -0.215925593529E+01 -0.215967351551E+01 -0.216009145843E+01 + -0.216050976409E+01 -0.216092843253E+01 -0.216134746379E+01 -0.216176685792E+01 + -0.216218661495E+01 -0.216260673492E+01 -0.216302721788E+01 -0.216344806386E+01 + -0.216386927292E+01 -0.216429084507E+01 -0.216471278038E+01 -0.216513507888E+01 + -0.216555774060E+01 -0.216598076560E+01 -0.216640415391E+01 -0.216682790557E+01 + -0.216725202062E+01 -0.216767649910E+01 -0.216810134106E+01 -0.216852654654E+01 + -0.216895211556E+01 -0.216937804819E+01 -0.216980434445E+01 -0.217023100438E+01 + -0.217065802803E+01 -0.217108541544E+01 -0.217151316665E+01 -0.217194128169E+01 + -0.217236976062E+01 -0.217279860346E+01 -0.217322781026E+01 -0.217365738106E+01 + -0.217408731590E+01 -0.217451761482E+01 -0.217494827786E+01 -0.217537930506E+01 + -0.217581069646E+01 -0.217624245210E+01 -0.217667457202E+01 -0.217710705627E+01 + -0.217753990487E+01 -0.217797311788E+01 -0.217840669532E+01 -0.217884063725E+01 + -0.217927494370E+01 -0.217970961471E+01 -0.218014465033E+01 -0.218058005058E+01 + -0.218101581552E+01 -0.218145194517E+01 -0.218188843959E+01 -0.218232529881E+01 + -0.218276252287E+01 -0.218320011181E+01 -0.218363806567E+01 -0.218407638449E+01 + -0.218451506831E+01 -0.218495411718E+01 -0.218539353112E+01 -0.218583331018E+01 + -0.218627345440E+01 -0.218671396381E+01 -0.218715483847E+01 -0.218759607840E+01 + -0.218803768366E+01 -0.218847965427E+01 -0.218892199027E+01 -0.218936469171E+01 + -0.218980775863E+01 -0.219025119106E+01 -0.219069498905E+01 -0.219113915263E+01 + -0.219158368185E+01 -0.219202857674E+01 -0.219247383734E+01 -0.219291946369E+01 + -0.219336545584E+01 -0.219381181381E+01 -0.219425853766E+01 -0.219470562741E+01 + -0.219515308311E+01 -0.219560090481E+01 -0.219604909252E+01 -0.219649764631E+01 + -0.219694656619E+01 -0.219739585223E+01 -0.219784550445E+01 -0.219829552289E+01 + -0.219874590759E+01 -0.219919665859E+01 -0.219964777593E+01 -0.220009925966E+01 + -0.220055110980E+01 -0.220100332639E+01 -0.220145590949E+01 -0.220190885911E+01 + -0.220236217532E+01 -0.220281585813E+01 -0.220326990760E+01 -0.220372432376E+01 + -0.220417910665E+01 -0.220463425630E+01 -0.220508977277E+01 -0.220554565608E+01 + -0.220600190627E+01 -0.220645852339E+01 -0.220691550747E+01 -0.220737285855E+01 + -0.220783057667E+01 -0.220828866188E+01 -0.220874711419E+01 -0.220920593367E+01 + -0.220966512033E+01 -0.221012467423E+01 -0.221058459541E+01 -0.221104488389E+01 + -0.221150553972E+01 -0.221196656294E+01 -0.221242795358E+01 -0.221288971169E+01 + -0.221335183730E+01 -0.221381433045E+01 -0.221427719119E+01 -0.221474041953E+01 + -0.221520401554E+01 -0.221566797924E+01 -0.221613231067E+01 -0.221659700988E+01 + -0.221706207689E+01 -0.221752751176E+01 -0.221799331450E+01 -0.221845948518E+01 + -0.221892602381E+01 -0.221939293045E+01 -0.221986020512E+01 -0.222032784787E+01 + -0.222079585874E+01 -0.222126423776E+01 -0.222173298498E+01 -0.222220210042E+01 + -0.222267158413E+01 -0.222314143614E+01 -0.222361165650E+01 -0.222408224524E+01 + -0.222455320240E+01 -0.222502452802E+01 -0.222549622213E+01 -0.222596828478E+01 + -0.222644071600E+01 -0.222691351583E+01 -0.222738668430E+01 -0.222786022146E+01 + -0.222833412734E+01 -0.222880840199E+01 -0.222928304543E+01 -0.222975805771E+01 + -0.223023343886E+01 -0.223070918892E+01 -0.223118530793E+01 -0.223166179593E+01 + -0.223213865296E+01 -0.223261587905E+01 -0.223309347423E+01 -0.223357143856E+01 + -0.223404977206E+01 -0.223452847477E+01 -0.223500754673E+01 -0.223548698798E+01 + -0.223596679856E+01 -0.223644697849E+01 -0.223692752783E+01 -0.223740844661E+01 + -0.223788973486E+01 -0.223837139263E+01 -0.223885341994E+01 -0.223933581684E+01 + -0.223981858337E+01 -0.224030171956E+01 -0.224078522544E+01 -0.224126910107E+01 + -0.224175334647E+01 -0.224223796167E+01 -0.224272294673E+01 -0.224320830168E+01 + -0.224369402654E+01 -0.224418012137E+01 -0.224466658619E+01 -0.224515342105E+01 + -0.224564062598E+01 -0.224612820102E+01 -0.224661614620E+01 -0.224710446157E+01 + -0.224759314715E+01 -0.224808220300E+01 -0.224857162913E+01 -0.224906142560E+01 + -0.224955159244E+01 -0.225004212968E+01 -0.225053303736E+01 -0.225102431552E+01 + -0.225151596419E+01 -0.225200798342E+01 -0.225250037324E+01 -0.225299313368E+01 + -0.225348626479E+01 -0.225397976660E+01 -0.225447363914E+01 -0.225496788245E+01 + -0.225546249658E+01 -0.225595748155E+01 -0.225645283741E+01 -0.225694856418E+01 + -0.225744466192E+01 -0.225794113064E+01 -0.225843797040E+01 -0.225893518122E+01 + -0.225943276315E+01 -0.225993071621E+01 -0.226042904046E+01 -0.226092773591E+01 + -0.226142680262E+01 -0.226192624061E+01 -0.226242604992E+01 -0.226292623059E+01 + -0.226342678266E+01 -0.226392770616E+01 -0.226442900113E+01 -0.226493066760E+01 + -0.226543270561E+01 -0.226593511520E+01 -0.226643789641E+01 -0.226694104926E+01 + -0.226744457380E+01 -0.226794847006E+01 -0.226845273808E+01 -0.226895737790E+01 + -0.226946238955E+01 -0.226996777306E+01 -0.227047352848E+01 -0.227097965584E+01 + -0.227148615517E+01 -0.227199302652E+01 -0.227250026991E+01 -0.227300788539E+01 + -0.227351587299E+01 -0.227402423275E+01 -0.227453296470E+01 -0.227504206887E+01 + -0.227555154531E+01 -0.227606139405E+01 -0.227657161513E+01 -0.227708220858E+01 + -0.227759317444E+01 -0.227810451274E+01 -0.227861622353E+01 -0.227912830683E+01 + -0.227964076268E+01 -0.228015359111E+01 -0.228066679218E+01 -0.228118036590E+01 + -0.228169431231E+01 -0.228220863146E+01 -0.228272332337E+01 -0.228323838809E+01 + -0.228375382564E+01 -0.228426963607E+01 -0.228478581941E+01 -0.228530237569E+01 + -0.228581930495E+01 -0.228633660723E+01 -0.228685428256E+01 -0.228737233098E+01 + -0.228789075252E+01 -0.228840954722E+01 -0.228892871512E+01 -0.228944825624E+01 + -0.228996817063E+01 -0.229048845832E+01 -0.229100911934E+01 -0.229153015374E+01 + -0.229205156154E+01 -0.229257334279E+01 -0.229309549751E+01 -0.229361802575E+01 + -0.229414092753E+01 -0.229466420290E+01 -0.229518785189E+01 -0.229571187453E+01 + -0.229623627087E+01 -0.229676104092E+01 -0.229728618474E+01 -0.229781170235E+01 + -0.229833759380E+01 -0.229886385910E+01 -0.229939049831E+01 -0.229991751146E+01 + -0.230044489858E+01 -0.230097265970E+01 -0.230150079487E+01 -0.230202930411E+01 + -0.230255818746E+01 -0.230308744496E+01 -0.230361707664E+01 -0.230414708254E+01 + -0.230467746269E+01 -0.230520821713E+01 -0.230573934588E+01 -0.230627084900E+01 + -0.230680272650E+01 -0.230733497844E+01 -0.230786760483E+01 -0.230840060572E+01 + -0.230893398114E+01 -0.230946773113E+01 -0.231000185572E+01 -0.231053635494E+01 + -0.231107122883E+01 -0.231160647743E+01 -0.231214210077E+01 -0.231267809888E+01 + -0.231321447180E+01 -0.231375121957E+01 -0.231428834221E+01 -0.231482583977E+01 + -0.231536371227E+01 -0.231590195976E+01 -0.231644058227E+01 -0.231697957982E+01 + -0.231751895247E+01 -0.231805870023E+01 -0.231859882315E+01 -0.231913932126E+01 + -0.231968019459E+01 -0.232022144319E+01 -0.232076306707E+01 -0.232130506629E+01 + 0.744976280169E+01 0.744064414492E+01 0.743153316624E+01 0.742242986234E+01 + 0.741333422992E+01 0.740424626569E+01 0.739516596636E+01 0.738609332861E+01 + 0.737702834916E+01 0.736797102471E+01 0.735892135195E+01 0.734987932760E+01 + 0.734084494835E+01 0.733181821090E+01 0.732279911196E+01 0.731378764824E+01 + 0.730478381642E+01 0.729578761322E+01 0.728679903533E+01 0.727781807947E+01 + 0.726884474232E+01 0.725987902060E+01 0.725092091100E+01 0.724197041023E+01 + 0.723302751499E+01 0.722409222198E+01 0.721516452790E+01 0.720624442946E+01 + 0.719733192336E+01 0.718842700630E+01 0.717952967498E+01 0.717063992610E+01 + 0.716175775638E+01 0.715288316250E+01 0.714401614117E+01 0.713515668910E+01 + 0.712630480298E+01 0.711746047952E+01 0.710862371542E+01 0.709979450738E+01 + 0.709097285210E+01 0.708215874630E+01 0.707335218666E+01 0.706455316989E+01 + 0.705576169269E+01 0.704697775177E+01 0.703820134383E+01 0.702943246556E+01 + 0.702067111368E+01 0.701191728488E+01 0.700317097587E+01 0.699443218335E+01 + 0.698570090401E+01 0.697697713457E+01 0.696826087173E+01 0.695955211218E+01 + 0.695085085263E+01 0.694215708978E+01 0.693347082033E+01 0.692479204099E+01 + 0.691612074846E+01 0.690745693944E+01 0.689880061063E+01 0.689015175873E+01 + 0.688151038045E+01 0.687287647249E+01 0.686425003155E+01 0.685563105434E+01 + 0.684701953755E+01 0.683841547788E+01 0.682981887205E+01 0.682122971674E+01 + 0.681264800868E+01 0.680407374454E+01 0.679550692105E+01 0.678694753490E+01 + 0.677839558278E+01 0.676985106142E+01 0.676131396750E+01 0.675278429773E+01 + 0.674426204881E+01 0.673574721745E+01 0.672723980034E+01 0.671873979418E+01 + 0.671024719569E+01 0.670176200156E+01 0.669328420850E+01 0.668481381320E+01 + 0.667635081237E+01 0.666789520271E+01 0.665944698093E+01 0.665100614372E+01 + 0.664257268778E+01 0.663414660983E+01 0.662572790656E+01 0.661731657467E+01 + 0.660891261087E+01 0.660051601186E+01 0.659212677434E+01 0.658374489501E+01 + 0.657537037057E+01 0.656700319774E+01 0.655864337320E+01 0.655029089366E+01 + 0.654194575583E+01 0.653360795640E+01 0.652527749208E+01 0.651695435957E+01 + 0.650863855558E+01 0.650033007680E+01 0.649202891993E+01 0.648373508168E+01 + 0.647544855876E+01 0.646716934786E+01 0.645889744568E+01 0.645063284893E+01 + 0.644237555431E+01 0.643412555852E+01 0.642588285827E+01 0.641764745025E+01 + 0.640941933117E+01 0.640119849773E+01 0.639298494664E+01 0.638477867459E+01 + 0.637657967829E+01 0.636838795443E+01 0.636020349973E+01 0.635202631088E+01 + 0.634385638459E+01 0.633569371755E+01 0.632753830648E+01 0.631939014807E+01 + 0.631124923902E+01 0.630311557604E+01 0.629498915583E+01 0.628686997509E+01 + 0.627875803052E+01 0.627065331883E+01 0.626255583671E+01 0.625446558088E+01 + 0.624638254803E+01 0.623830673486E+01 0.623023813808E+01 0.622217675438E+01 + 0.621412258048E+01 0.620607561307E+01 0.619803584886E+01 0.619000328454E+01 + 0.618197791682E+01 0.617395974240E+01 0.616594875799E+01 0.615794496028E+01 + 0.614994834599E+01 0.614195891180E+01 0.613397665442E+01 0.612600157056E+01 + 0.611803365692E+01 0.611007291019E+01 0.610211932709E+01 0.609417290431E+01 + 0.608623363855E+01 0.607830152653E+01 0.607037656493E+01 0.606245875046E+01 + 0.605454807983E+01 0.604664454974E+01 0.603874815688E+01 0.603085889797E+01 + 0.602297676969E+01 0.601510176877E+01 0.600723389189E+01 0.599937313576E+01 + 0.599151949708E+01 0.598367297255E+01 0.597583355889E+01 0.596800125278E+01 + 0.596017605093E+01 0.595235795004E+01 0.594454694682E+01 0.593674303796E+01 + 0.592894622017E+01 0.592115649016E+01 0.591337384462E+01 0.590559828025E+01 + 0.589782979376E+01 0.589006838185E+01 0.588231404123E+01 0.587456676859E+01 + 0.586682656063E+01 0.585909341406E+01 0.585136732559E+01 0.584364829191E+01 + 0.583593630972E+01 0.582823137573E+01 0.582053348664E+01 0.581284263915E+01 + 0.580515882997E+01 0.579748205579E+01 0.578981231332E+01 0.578214959926E+01 + 0.577449391031E+01 0.576684524318E+01 0.575920359456E+01 0.575156896117E+01 + 0.574394133969E+01 0.573632072684E+01 0.572870711932E+01 0.572110051382E+01 + 0.571350090705E+01 0.570590829572E+01 0.569832267652E+01 0.569074404615E+01 + 0.568317240133E+01 0.567560773874E+01 0.566805005510E+01 0.566049934710E+01 + 0.565295561146E+01 0.564541884486E+01 0.563788904401E+01 0.563036620562E+01 + 0.562285032638E+01 0.561534140300E+01 0.560783943219E+01 0.560034441063E+01 + 0.559285633504E+01 0.558537520212E+01 0.557790100856E+01 0.557043375108E+01 + 0.556297342637E+01 0.555552003114E+01 0.554807356209E+01 0.554063401591E+01 + 0.553320138932E+01 0.552577567901E+01 0.551835688169E+01 0.551094499406E+01 + 0.550354001282E+01 0.549614193467E+01 0.548875075632E+01 0.548136647446E+01 + 0.547398908581E+01 0.546661858705E+01 0.545925497491E+01 0.545189824606E+01 + 0.544454839723E+01 0.543720542511E+01 0.542986932639E+01 0.542254009780E+01 + 0.541521773602E+01 0.540790223776E+01 0.540059359972E+01 0.539329181861E+01 + 0.538599689112E+01 0.537870881396E+01 0.537142758383E+01 0.536415319743E+01 + 0.535688565147E+01 0.534962494264E+01 0.534237106766E+01 0.533512402321E+01 + 0.532788380601E+01 0.532065041275E+01 0.531342384014E+01 0.530620408488E+01 + 0.529899114368E+01 0.529178501322E+01 0.528458569023E+01 0.527739317139E+01 + 0.527020745341E+01 0.526302853299E+01 0.525585640684E+01 0.524869107166E+01 + 0.524153252415E+01 0.523438076101E+01 0.522723577894E+01 0.522009757465E+01 + 0.521296614483E+01 0.520584148620E+01 0.519872359545E+01 0.519161246928E+01 + 0.518450810441E+01 0.517741049752E+01 0.517031964532E+01 0.516323554451E+01 + 0.515615819180E+01 0.514908758389E+01 0.514202371748E+01 0.513496658927E+01 + 0.512791619596E+01 0.512087253426E+01 0.511383560087E+01 0.510680539249E+01 + 0.509978190582E+01 0.509276513757E+01 0.508575508444E+01 0.507875174312E+01 + 0.507175511033E+01 0.506476518276E+01 0.505778195712E+01 0.505080543010E+01 + 0.504383559842E+01 0.503687245877E+01 0.502991600785E+01 0.502296624237E+01 + 0.501602315903E+01 0.500908675453E+01 0.500215702557E+01 0.499523396886E+01 + 0.498831758110E+01 0.498140785898E+01 0.497450479922E+01 0.496760839852E+01 + 0.496071865357E+01 0.495383556108E+01 0.494695911775E+01 0.494008932028E+01 + 0.493322616538E+01 0.492636964974E+01 0.491951977008E+01 0.491267652308E+01 + 0.490583990547E+01 0.489900991392E+01 0.489218654516E+01 0.488536979587E+01 + 0.487855966277E+01 0.487175614256E+01 0.486495923193E+01 0.485816892759E+01 + 0.485138522624E+01 0.484460812458E+01 0.483783761932E+01 0.483107370716E+01 + 0.482431638480E+01 0.481756564894E+01 0.481082149628E+01 0.480408392353E+01 + 0.479735292740E+01 0.479062850457E+01 0.478391065175E+01 0.477719936565E+01 + 0.477049464297E+01 0.476379648041E+01 0.475710487466E+01 0.475041982245E+01 + 0.474374132046E+01 0.473706936539E+01 0.473040395396E+01 0.472374508286E+01 + 0.471709274880E+01 0.471044694847E+01 0.470380767858E+01 0.469717493584E+01 + 0.469054871694E+01 0.468392901858E+01 0.467731583747E+01 0.467070917031E+01 + 0.466410901381E+01 0.465751536465E+01 0.465092821956E+01 0.464434757522E+01 + 0.463777342835E+01 0.463120577564E+01 0.462464461379E+01 0.461808993951E+01 + 0.461154174950E+01 0.460500004046E+01 0.459846480910E+01 0.459193605211E+01 + 0.458541376621E+01 0.457889794808E+01 0.457238859443E+01 0.456588570197E+01 + 0.455938926740E+01 0.455289928742E+01 0.454641575873E+01 0.453993867803E+01 + 0.453346804203E+01 0.452700384742E+01 0.452054609092E+01 0.451409476922E+01 + 0.450764987902E+01 0.450121141703E+01 0.449477937995E+01 0.448835376448E+01 + 0.448193456733E+01 0.447552178519E+01 0.446911541476E+01 0.446271545276E+01 + 0.445632189588E+01 0.444993474082E+01 0.444355398429E+01 0.443717962299E+01 + 0.443081165362E+01 0.442445007288E+01 0.441809487747E+01 0.441174606411E+01 + 0.440540362948E+01 0.439906757030E+01 0.439273788326E+01 0.438641456506E+01 + 0.438009761241E+01 0.437378702202E+01 0.436748279057E+01 0.436118491478E+01 + 0.435489339135E+01 0.434860821698E+01 0.434232938837E+01 0.433605690222E+01 + 0.432979075523E+01 0.432353094412E+01 0.431727746557E+01 0.431103031630E+01 + 0.430478949300E+01 0.429855499238E+01 0.429232681113E+01 0.428610494597E+01 + 0.427988939359E+01 0.427368015069E+01 0.426747721399E+01 0.426128058017E+01 + 0.425509024594E+01 0.424890620801E+01 0.424272846307E+01 0.423655700783E+01 + 0.423039183900E+01 0.422423295326E+01 0.421808034733E+01 0.421193401791E+01 + 0.420579396169E+01 0.419966017539E+01 0.419353265570E+01 0.418741139933E+01 + 0.418129640297E+01 0.417518766333E+01 0.416908517712E+01 0.416298894103E+01 + 0.415689895177E+01 0.415081520603E+01 0.414473770053E+01 0.413866643196E+01 + 0.413260139703E+01 0.412654259243E+01 0.412049001487E+01 0.411444366105E+01 + 0.410840352768E+01 0.410236961146E+01 0.409634190908E+01 0.409032041725E+01 + 0.408430513268E+01 0.407829605206E+01 0.407229317209E+01 0.406629648949E+01 + 0.406030600095E+01 0.405432170317E+01 0.404834359286E+01 0.404237166671E+01 + 0.403640592144E+01 0.403044635374E+01 0.402449296031E+01 0.401854573786E+01 + 0.401260468309E+01 0.400666979269E+01 0.400074106339E+01 0.399481849186E+01 + 0.398890207483E+01 0.398299180898E+01 0.397708769103E+01 0.397118971767E+01 + 0.396529788561E+01 0.395941219154E+01 0.395353263218E+01 0.394765920421E+01 + 0.394179190436E+01 0.393593072931E+01 0.393007567577E+01 0.392422674044E+01 + 0.391838392002E+01 0.391254721122E+01 0.390671661074E+01 0.390089211528E+01 + 0.389507372154E+01 0.388926142623E+01 0.388345522604E+01 0.387765511768E+01 + 0.387186109785E+01 0.386607316326E+01 0.386029131060E+01 0.385451553658E+01 + 0.384874583790E+01 0.384298221126E+01 0.383722465336E+01 0.383147316091E+01 + 0.382572773061E+01 0.381998835916E+01 0.381425504327E+01 0.380852777962E+01 + 0.380280656494E+01 0.379709139591E+01 0.379138226925E+01 0.378567918165E+01 + 0.377998212982E+01 0.377429111045E+01 0.376860612025E+01 0.376292715593E+01 + 0.375725421418E+01 0.375158729171E+01 0.374592638522E+01 0.374027149141E+01 + 0.373462260698E+01 0.372897972863E+01 0.372334285308E+01 0.371771197701E+01 + 0.371208709714E+01 0.370646821016E+01 0.370085531278E+01 0.369524840169E+01 + 0.368964747361E+01 0.368405252523E+01 0.367846355325E+01 0.367288055439E+01 + 0.366730352533E+01 0.366173246278E+01 0.365616736345E+01 0.365060822403E+01 + 0.364505504123E+01 0.363950781175E+01 0.363396653230E+01 0.362843119956E+01 + 0.362290181026E+01 0.361737836108E+01 0.361186084874E+01 0.360634926993E+01 + 0.360084362135E+01 0.359534389972E+01 0.358985010172E+01 0.358436222406E+01 + 0.357888026345E+01 0.357340421659E+01 0.356793408017E+01 0.356246985091E+01 + 0.355701152549E+01 0.355155910064E+01 0.354611257304E+01 0.354067193940E+01 + 0.353523719642E+01 0.352980834081E+01 0.352438536926E+01 0.351896827848E+01 + 0.351355706517E+01 0.350815172603E+01 0.350275225777E+01 0.349735865708E+01 + 0.349197092068E+01 0.348658904525E+01 0.348121302751E+01 0.347584286416E+01 + 0.347047855189E+01 0.346512008741E+01 0.345976746743E+01 0.345442068863E+01 + 0.344907974774E+01 0.344374464144E+01 0.343841536645E+01 0.343309191946E+01 + 0.342777429717E+01 0.342246249629E+01 0.341715651352E+01 0.341185634557E+01 + 0.340656198912E+01 0.340127344089E+01 0.339599069759E+01 0.339071375590E+01 + 0.338544261253E+01 0.338017726419E+01 0.337491770758E+01 0.336966393939E+01 + 0.336441595634E+01 0.335917375512E+01 0.335393733243E+01 0.334870668499E+01 + 0.334348180948E+01 0.333826270262E+01 0.333304936110E+01 0.332784178163E+01 + 0.332263996090E+01 0.331744389563E+01 0.331225358251E+01 0.330706901825E+01 + 0.330189019954E+01 0.329671712309E+01 0.329154978561E+01 0.328638818379E+01 + 0.328123231433E+01 0.327608217395E+01 0.327093775933E+01 0.326579906719E+01 + 0.326066609422E+01 0.325553883713E+01 0.325041729262E+01 0.324530145739E+01 + 0.324019132814E+01 0.323508690158E+01 0.322998817441E+01 0.322489514333E+01 + 0.321980780504E+01 0.321472615624E+01 0.320965019364E+01 0.320457991394E+01 + 0.319951531385E+01 0.319445639005E+01 0.318940313926E+01 0.318435555818E+01 + 0.317931364351E+01 0.317427739195E+01 0.316924680020E+01 0.316422186497E+01 + 0.315920258296E+01 0.315418895087E+01 0.314918096540E+01 0.314417862326E+01 + 0.313918192114E+01 0.313419085575E+01 0.312920542380E+01 0.312422562198E+01 + 0.311925144699E+01 0.311428289555E+01 0.310931996434E+01 0.310436265008E+01 + 0.309941094946E+01 0.309446485918E+01 0.308952437596E+01 0.308458949649E+01 + 0.307966021747E+01 0.307473653560E+01 0.306981844760E+01 0.306490595015E+01 + 0.305999903997E+01 0.305509771375E+01 0.305020196819E+01 0.304531180001E+01 + 0.304042720590E+01 0.303554818255E+01 0.303067472669E+01 0.302580683500E+01 + 0.302094450419E+01 0.301608773096E+01 0.301123651202E+01 0.300639084406E+01 + 0.300155072379E+01 0.299671614791E+01 0.299188711313E+01 0.298706361613E+01 + 0.298224565364E+01 0.297743322234E+01 0.297262631895E+01 0.296782494016E+01 + 0.296302908267E+01 0.295823874319E+01 0.295345391843E+01 0.294867460507E+01 + 0.294390079983E+01 0.293913249940E+01 0.293436970050E+01 0.292961239981E+01 + 0.292486059405E+01 0.292011427991E+01 0.291537345410E+01 0.291063811332E+01 + 0.290590825427E+01 0.290118387366E+01 0.289646496818E+01 0.289175153454E+01 + 0.288704356944E+01 0.288234106958E+01 0.287764403167E+01 0.287295245241E+01 + 0.286826632849E+01 0.286358565663E+01 0.285891043351E+01 0.285424065586E+01 + 0.284957632036E+01 0.284491742372E+01 0.284026396265E+01 0.283561593384E+01 + 0.283097333399E+01 0.282633615982E+01 0.282170440801E+01 0.281707807528E+01 + 0.281245715832E+01 0.280784165384E+01 0.280323155854E+01 0.279862686913E+01 + 0.279402758229E+01 0.278943369475E+01 0.278484520319E+01 0.278026210432E+01 + 0.277568439484E+01 0.277111207146E+01 0.276654513088E+01 0.276198356979E+01 + 0.275742738491E+01 0.275287657293E+01 0.274833113056E+01 0.274379105449E+01 + 0.273925634144E+01 0.273472698809E+01 0.273020299116E+01 0.272568434735E+01 + 0.272117105336E+01 0.271666310588E+01 0.271216050164E+01 0.270766323731E+01 + 0.270317130962E+01 0.269868471525E+01 0.269420345091E+01 0.268972751331E+01 + 0.268525689915E+01 0.268079160512E+01 0.267633162794E+01 0.267187696430E+01 + 0.266742761090E+01 0.266298356445E+01 0.265854482165E+01 0.265411137920E+01 + 0.264968323380E+01 0.264526038216E+01 0.264084282098E+01 0.263643054696E+01 + 0.263202355680E+01 0.262762184720E+01 0.262322541488E+01 0.261883425652E+01 + 0.261444836883E+01 0.261006774851E+01 0.260569239227E+01 0.260132229681E+01 + 0.259695745883E+01 0.259259787503E+01 0.258824354211E+01 0.258389445679E+01 + 0.257955061574E+01 0.257521201569E+01 0.257087865334E+01 0.256655052537E+01 + 0.256222762851E+01 0.255790995944E+01 0.255359751488E+01 0.254929029152E+01 + 0.254498828607E+01 0.254069149522E+01 0.253639991568E+01 0.253211354416E+01 + 0.252783237735E+01 0.252355641196E+01 0.251928564469E+01 0.251502007223E+01 + 0.251075969131E+01 0.250650449860E+01 0.250225449083E+01 0.249800966468E+01 + 0.249377001687E+01 0.248953554409E+01 0.248530624305E+01 0.248108211044E+01 + 0.247686314298E+01 0.247264933736E+01 0.246844069029E+01 0.246423719846E+01 + 0.246003885858E+01 0.245584566735E+01 0.245165762148E+01 0.244747471766E+01 + 0.244329695261E+01 0.243912432301E+01 0.243495682557E+01 0.243079445700E+01 + 0.242663721400E+01 0.242248509326E+01 0.241833809150E+01 0.241419620541E+01 + 0.241005943169E+01 0.240592776706E+01 0.240180120820E+01 0.239767975183E+01 + 0.239356339464E+01 0.238945213333E+01 0.238534596462E+01 0.238124488519E+01 + 0.237714889176E+01 0.237305798103E+01 0.236897214969E+01 0.236489139445E+01 + 0.236081571201E+01 0.235674509908E+01 0.235267955235E+01 0.234861906853E+01 + 0.234456364432E+01 0.234051327643E+01 0.233646796155E+01 0.233242769638E+01 + 0.232839247764E+01 0.232436230201E+01 0.232033716621E+01 0.231631706694E+01 + 0.231230200089E+01 0.230829196478E+01 0.230428695529E+01 0.230028696914E+01 + 0.229629200303E+01 0.229230205365E+01 0.228831711772E+01 0.228433719193E+01 + 0.228036227299E+01 0.227639235759E+01 0.227242744244E+01 0.226846752424E+01 + 0.226451259970E+01 0.226056266552E+01 0.225661771839E+01 0.225267775502E+01 + 0.224874277212E+01 0.224481276638E+01 0.224088773451E+01 0.223696767320E+01 + 0.223305257917E+01 0.222914244911E+01 0.222523727973E+01 0.222133706773E+01 + 0.221744180980E+01 0.221355150266E+01 0.220966614301E+01 0.220578572753E+01 + 0.220191025295E+01 0.219803971596E+01 0.219417411327E+01 0.219031344156E+01 + 0.218645769756E+01 0.218260687795E+01 0.217876097945E+01 0.217491999875E+01 + 0.217108393256E+01 0.216725277758E+01 0.216342653050E+01 0.215960518804E+01 + 0.215578874690E+01 0.215197720377E+01 0.214817055536E+01 0.214436879837E+01 + 0.214057192951E+01 0.213677994547E+01 0.213299284296E+01 0.212921061868E+01 + 0.212543326933E+01 0.212166079162E+01 0.211789318224E+01 0.211413043791E+01 + 0.211037255531E+01 0.210661953116E+01 0.210287136215E+01 0.209912804499E+01 + 0.209538957638E+01 0.209165595302E+01 0.208792717162E+01 0.208420322887E+01 + 0.208048412148E+01 0.207676984615E+01 0.207306039959E+01 0.206935577849E+01 + 0.206565597956E+01 0.206196099949E+01 0.205827083500E+01 0.205458548278E+01 + 0.205090493954E+01 0.204722920198E+01 0.204355826679E+01 0.203989213069E+01 + 0.203623079038E+01 0.203257424255E+01 0.202892248391E+01 0.202527551116E+01 + 0.202163332100E+01 0.201799591014E+01 0.201436327528E+01 0.201073541311E+01 + 0.200711232035E+01 0.200349399370E+01 0.199988042985E+01 0.199627162550E+01 + 0.199266757737E+01 0.198906828216E+01 0.198547373655E+01 0.198188393727E+01 + 0.197829888100E+01 0.197471856446E+01 0.197114298434E+01 0.196757213734E+01 + 0.196400602018E+01 0.196044462954E+01 0.195688796214E+01 0.195333601467E+01 + 0.194978878384E+01 0.194624626635E+01 0.194270845890E+01 0.193917535819E+01 + 0.193564696093E+01 0.193212326381E+01 0.192860426355E+01 0.192508995684E+01 + 0.192158034038E+01 0.191807541088E+01 0.191457516504E+01 0.191107959955E+01 + 0.190758871114E+01 0.190410249648E+01 0.190062095230E+01 0.189714407528E+01 + 0.189367186214E+01 0.189020430957E+01 0.188674141427E+01 0.188328317295E+01 + 0.187982958232E+01 0.187638063907E+01 0.187293633990E+01 0.186949668152E+01 + 0.186606166062E+01 0.186263127392E+01 0.185920551812E+01 0.185578438991E+01 + 0.185236788599E+01 0.184895600308E+01 0.184554873787E+01 0.184214608706E+01 + 0.183874804736E+01 0.183535461547E+01 0.183196578809E+01 0.182858156192E+01 + 0.182520193367E+01 0.182182690003E+01 0.181845645772E+01 0.181509060343E+01 + 0.181172933386E+01 0.180837264572E+01 0.180502053570E+01 0.180167300052E+01 + 0.179833003687E+01 0.179499164145E+01 0.179165781097E+01 0.178832854213E+01 + 0.178500383163E+01 0.178168367618E+01 0.177836807247E+01 0.177505701721E+01 + 0.177175050710E+01 0.176844853884E+01 0.176515110913E+01 0.176185821469E+01 + 0.175856985220E+01 0.175528601837E+01 0.175200670991E+01 0.174873192351E+01 + 0.174546165588E+01 0.174219590372E+01 0.173893466373E+01 0.173567793261E+01 + 0.173242570707E+01 0.172917798381E+01 0.172593475953E+01 0.172269603093E+01 + 0.171946179472E+01 0.171623204760E+01 0.171300678626E+01 0.170978600742E+01 + 0.170656970777E+01 0.170335788401E+01 0.170015053285E+01 0.169694765100E+01 + 0.169374923514E+01 0.169055528200E+01 0.168736578825E+01 0.168418075062E+01 + 0.168100016580E+01 0.167782403049E+01 0.167465234139E+01 0.167148509522E+01 + 0.166832228866E+01 0.166516391843E+01 0.166200998122E+01 0.165886047373E+01 + 0.165571539268E+01 0.165257473475E+01 0.164943849666E+01 0.164630667511E+01 + 0.164317926679E+01 0.164005626841E+01 0.163693767667E+01 0.163382348828E+01 + 0.163071369993E+01 0.162760830833E+01 0.162450731018E+01 0.162141070218E+01 + 0.161831848104E+01 0.161523064345E+01 0.161214718612E+01 0.160906810576E+01 + 0.160599339906E+01 0.160292306272E+01 0.159985709345E+01 0.159679548795E+01 + 0.159373824292E+01 0.159068535507E+01 0.158763682110E+01 0.158459263770E+01 + 0.158155280158E+01 0.157851730945E+01 0.157548615800E+01 0.157245934394E+01 + 0.156943686397E+01 0.156641871479E+01 0.156340489310E+01 0.156039539561E+01 + 0.155739021902E+01 0.155438936003E+01 0.155139281534E+01 0.154840058165E+01 + 0.154541265567E+01 0.154242903411E+01 0.153944971365E+01 0.153647469101E+01 + 0.153350396288E+01 0.153053752597E+01 0.152757537698E+01 0.152461751261E+01 + 0.152166392957E+01 0.151871462455E+01 0.151576959426E+01 0.151282883540E+01 + 0.150989234468E+01 0.150696011879E+01 0.150403215444E+01 0.150110844833E+01 + 0.149818899716E+01 0.149527379763E+01 0.149236284645E+01 0.148945614032E+01 + 0.148655367594E+01 0.148365545001E+01 0.148076145924E+01 0.147787170032E+01 + 0.147498616996E+01 0.147210486486E+01 0.146922778173E+01 0.146635491727E+01 + 0.146348626817E+01 0.146062183114E+01 0.145776160288E+01 0.145490558010E+01 + 0.145205375949E+01 0.144920613777E+01 0.144636271162E+01 0.144352347776E+01 + 0.144068843288E+01 0.143785757369E+01 0.143503089689E+01 0.143220839918E+01 + 0.142939007727E+01 0.142657592785E+01 0.142376594763E+01 0.142096013331E+01 + 0.141815848159E+01 0.141536098918E+01 0.141256765278E+01 0.140977846908E+01 + 0.140699343480E+01 0.140421254663E+01 0.140143580127E+01 0.139866319544E+01 + 0.139589472582E+01 0.139313038913E+01 0.139037018206E+01 0.138761410132E+01 + 0.138486214360E+01 0.138211430562E+01 0.137937058407E+01 0.137663097566E+01 + 0.137389547708E+01 0.137116408504E+01 0.136843679625E+01 0.136571360740E+01 + 0.136299451519E+01 0.136027951634E+01 0.135756860753E+01 0.135486178548E+01 + 0.135215904688E+01 0.134946038844E+01 0.134676580686E+01 0.134407529884E+01 + 0.134138886109E+01 0.133870649030E+01 0.133602818318E+01 0.133335393642E+01 + 0.133068374675E+01 0.132801761084E+01 0.132535552541E+01 0.132269748716E+01 + 0.132004349280E+01 0.131739353901E+01 0.131474762251E+01 0.131210574000E+01 + 0.130946788818E+01 0.130683406375E+01 0.130420426342E+01 0.130157848388E+01 + 0.129895672184E+01 0.129633897400E+01 0.129372523706E+01 0.129111550773E+01 + 0.128850978271E+01 0.128590805870E+01 0.128331033239E+01 0.128071660050E+01 + 0.127812685973E+01 0.127554110677E+01 0.127295933834E+01 0.127038155113E+01 + 0.126780774184E+01 0.126523790718E+01 0.126267204385E+01 0.126011014855E+01 + 0.125755221798E+01 0.125499824885E+01 0.125244823786E+01 0.124990218170E+01 + 0.124736007709E+01 0.124482192072E+01 0.124228770930E+01 0.123975743953E+01 + 0.123723110811E+01 0.123470871174E+01 0.123219024713E+01 0.122967571097E+01 + 0.122716509998E+01 0.122465841084E+01 0.122215564027E+01 0.121965678497E+01 + 0.121716184163E+01 0.121467080696E+01 0.121218367767E+01 0.120970045045E+01 + 0.120722112201E+01 0.120474568905E+01 0.120227414827E+01 0.119980649637E+01 + 0.119734273006E+01 0.119488284603E+01 0.119242684100E+01 0.118997471165E+01 + 0.118752645471E+01 0.118508206686E+01 0.118264154480E+01 0.118020488525E+01 + 0.117777208490E+01 0.117534314046E+01 0.117291804862E+01 0.117049680610E+01 + 0.116807940958E+01 0.116566585578E+01 0.116325614140E+01 0.116085026313E+01 + 0.115844821769E+01 0.115605000176E+01 0.115365561207E+01 0.115126504530E+01 + 0.114887829815E+01 0.114649536734E+01 0.114411624957E+01 0.114174094153E+01 + 0.113936943992E+01 0.113700174146E+01 0.113463784284E+01 0.113227774076E+01 + 0.112992143193E+01 0.112756891305E+01 0.112522018082E+01 0.112287523194E+01 + 0.112053406312E+01 0.111819667106E+01 0.111586305246E+01 0.111353320401E+01 + 0.111120712243E+01 0.110888480442E+01 0.110656624668E+01 0.110425144591E+01 + 0.110194039881E+01 0.109963310208E+01 0.109732955243E+01 0.109502974656E+01 + 0.109273368118E+01 0.109044135297E+01 0.108815275865E+01 0.108586789492E+01 + 0.108358675848E+01 0.108130934604E+01 0.107903565428E+01 0.107676567993E+01 + 0.107449941967E+01 0.107223687021E+01 0.106997802826E+01 0.106772289051E+01 + 0.106547145367E+01 0.106322371444E+01 0.106097966952E+01 0.105873931562E+01 + 0.105650264943E+01 0.105426966766E+01 0.105204036701E+01 0.104981474419E+01 + 0.104759279589E+01 0.104537451881E+01 0.104315990967E+01 0.104094896515E+01 + 0.103874168198E+01 0.103653805683E+01 0.103433808643E+01 0.103214176746E+01 + 0.102994909664E+01 0.102776007066E+01 0.102557468623E+01 0.102339294005E+01 + 0.102121482882E+01 0.101904034924E+01 0.101686949802E+01 0.101470227185E+01 + 0.101253866745E+01 0.101037868151E+01 0.100822231073E+01 0.100606955182E+01 + 0.100392040147E+01 0.100177485640E+01 0.999632913302E+00 0.997494568878E+00 + 0.995359819830E+00 0.993228662863E+00 0.991101094676E+00 0.988977111974E+00 + 0.986856711458E+00 0.984739889829E+00 0.982626643792E+00 0.980516970046E+00 + 0.978410865296E+00 0.976308326242E+00 0.974209349587E+00 0.972113932034E+00 + 0.970022070284E+00 0.967933761039E+00 0.965849001002E+00 0.963767786876E+00 + 0.961690115361E+00 0.959615983161E+00 0.957545386977E+00 0.955478323512E+00 + 0.953414789467E+00 0.951354781546E+00 0.949298296449E+00 0.947245330881E+00 + 0.945195881541E+00 0.943149945134E+00 0.941107518360E+00 0.939068597922E+00 + 0.937033180523E+00 0.935001262864E+00 0.932972841648E+00 0.930947913576E+00 + 0.928926475351E+00 0.926908523676E+00 0.924894055252E+00 0.922883066781E+00 + 0.920875554966E+00 0.918871516509E+00 0.916870948112E+00 0.914873846477E+00 + 0.912880208306E+00 0.910890030302E+00 0.908903309167E+00 0.906920041602E+00 + 0.904940224311E+00 0.902963853995E+00 0.900990927357E+00 0.899021441098E+00 + 0.897055391921E+00 0.895092776527E+00 0.893133591620E+00 0.891177833902E+00 + 0.889225500073E+00 0.887276586838E+00 0.885331090897E+00 0.883389008954E+00 + 0.881450337709E+00 0.879515073866E+00 0.877583214127E+00 0.875654755193E+00 + 0.873729693768E+00 0.871808026552E+00 0.869889750249E+00 0.867974861560E+00 + 0.866063357188E+00 0.864155233834E+00 0.862250488202E+00 0.860349116993E+00 + 0.858451116909E+00 0.856556484652E+00 0.854665216926E+00 0.852777310431E+00 + 0.850892761870E+00 0.849011567946E+00 0.847133725360E+00 0.845259230814E+00 + 0.843388081011E+00 0.841520272654E+00 0.839655802443E+00 0.837794667082E+00 + 0.835936863272E+00 0.834082387715E+00 0.832231237115E+00 0.830383408173E+00 + 0.828538897591E+00 0.826697702071E+00 0.824859818316E+00 0.823025243027E+00 + 0.821193972907E+00 0.819366004659E+00 0.817541334983E+00 0.815719960584E+00 + 0.813901878161E+00 0.812087084419E+00 0.810275576058E+00 0.808467349782E+00 + 0.806662402292E+00 0.804860730290E+00 0.803062330479E+00 0.801267199561E+00 + 0.799475334238E+00 0.797686731213E+00 0.795901387186E+00 0.794119298861E+00 + 0.792340462940E+00 0.790564876125E+00 0.788792535118E+00 0.787023436621E+00 + 0.785257577337E+00 0.783494953967E+00 0.781735563214E+00 0.779979401780E+00 + 0.778226466367E+00 0.776476753678E+00 0.774730260414E+00 0.772986983278E+00 + 0.771246918971E+00 0.769510064197E+00 0.767776415657E+00 0.766045970053E+00 + 0.764318724088E+00 0.762594674464E+00 0.760873817882E+00 0.759156151046E+00 + 0.757441670657E+00 0.755730373417E+00 0.754022256029E+00 0.752317315195E+00 + 0.750615547617E+00 0.748916949997E+00 0.747221519038E+00 0.745529251441E+00 + 0.743840143908E+00 0.742154193143E+00 0.740471395847E+00 0.738791748721E+00 + 0.737115248470E+00 0.735441891794E+00 0.733771675395E+00 0.732104595977E+00 + 0.730440650241E+00 0.728779834889E+00 0.727122146623E+00 0.725467582146E+00 + 0.723816138161E+00 0.722167811368E+00 0.720522598470E+00 0.718880496169E+00 + 0.717241501169E+00 0.715605610170E+00 0.713972819874E+00 0.712343126985E+00 + 0.710716528204E+00 0.709093020234E+00 0.707472599776E+00 0.705855263533E+00 + 0.704241008207E+00 0.702629830500E+00 0.701021727115E+00 0.699416694753E+00 + 0.697814730116E+00 0.696215829908E+00 0.694619990829E+00 0.693027209583E+00 + 0.691437482871E+00 0.689850807396E+00 0.688267179859E+00 0.686686596964E+00 + 0.685109055411E+00 0.683534551904E+00 0.681963083144E+00 0.680394645834E+00 + 0.678829236676E+00 0.677266852371E+00 0.675707489623E+00 0.674151145133E+00 + 0.672597815604E+00 0.671047497737E+00 0.669500188236E+00 0.667955883801E+00 + 0.666414581135E+00 0.664876276941E+00 0.663340967921E+00 0.661808650776E+00 + 0.660279322209E+00 0.658752978923E+00 0.657229617618E+00 0.655709234998E+00 + 0.654191827765E+00 0.652677392621E+00 0.651165926267E+00 0.649657425407E+00 + 0.648151886742E+00 0.646649306975E+00 0.645149682807E+00 0.643653010942E+00 + 0.642159288080E+00 0.640668510925E+00 0.639180676178E+00 0.637695780541E+00 + 0.636213820718E+00 0.634734793409E+00 0.633258695318E+00 0.631785523146E+00 + 0.630315273595E+00 0.628847943368E+00 0.627383529167E+00 0.625922027694E+00 + 0.624463435651E+00 0.623007749740E+00 0.621554966664E+00 0.620105083125E+00 + 0.618658095825E+00 0.617214001465E+00 0.615772796749E+00 0.614334478379E+00 + 0.612899043056E+00 0.611466487483E+00 0.610036808361E+00 0.608610002394E+00 + 0.607186066284E+00 0.605764996732E+00 0.604346790440E+00 0.602931444112E+00 + 0.601518954448E+00 0.600109318152E+00 0.598702531925E+00 0.597298592469E+00 + 0.595897496488E+00 0.594499240682E+00 0.593103821754E+00 0.591711236407E+00 + 0.590321481342E+00 0.588934553262E+00 0.587550448869E+00 0.586169164864E+00 + 0.584790697951E+00 0.583415044831E+00 0.582042202207E+00 0.580672166780E+00 + 0.579304935253E+00 0.577940504329E+00 0.576578870708E+00 0.575220031094E+00 + 0.573863982189E+00 0.572510720694E+00 0.571160243312E+00 0.569812546746E+00 + 0.568467627697E+00 0.567125482867E+00 0.565786108959E+00 0.564449502674E+00 + 0.563115660716E+00 0.561784579786E+00 0.560456256586E+00 0.559130687819E+00 + 0.557807870186E+00 0.556487800391E+00 0.555170475134E+00 0.553855891119E+00 + 0.552544045047E+00 0.551234933621E+00 0.549928553542E+00 0.548624901514E+00 + 0.547323974238E+00 0.546025768416E+00 0.544730280750E+00 0.543437507943E+00 + 0.542147446697E+00 0.540860093714E+00 0.539575445696E+00 0.538293499346E+00 + 0.537014251365E+00 0.535737698456E+00 0.534463837321E+00 0.533192664662E+00 + 0.531924177181E+00 0.530658371581E+00 0.529395244563E+00 0.528134792830E+00 + 0.526877013084E+00 0.525621902028E+00 0.524369456362E+00 0.523119672790E+00 + 0.521872548014E+00 0.520628078736E+00 0.519386261658E+00 0.518147093482E+00 + 0.516910570910E+00 0.515676690645E+00 0.514445449388E+00 0.513216843843E+00 + 0.511990870711E+00 0.510767526694E+00 0.509546808494E+00 0.508328712814E+00 + 0.507113236356E+00 0.505900375822E+00 0.504690127915E+00 0.503482489335E+00 + 0.502277456786E+00 0.501075026970E+00 0.499875196588E+00 0.498677962344E+00 + 0.497483320939E+00 0.496291269075E+00 0.495101803455E+00 0.493914920781E+00 + 0.492730617755E+00 0.491548891079E+00 0.490369737455E+00 0.489193153585E+00 + 0.488019136173E+00 0.486847681919E+00 0.485678787526E+00 0.484512449696E+00 + 0.483348665132E+00 0.482187430535E+00 0.481028742608E+00 0.479872598053E+00 + 0.478718993572E+00 0.477567925867E+00 0.476419391641E+00 0.475273387595E+00 + 0.474129910432E+00 0.472988956854E+00 0.471850523563E+00 0.470714607262E+00 + 0.469581204652E+00 0.468450312436E+00 0.467321927315E+00 0.466196045993E+00 + 0.465072665171E+00 0.463951781551E+00 0.462833391836E+00 0.461717492727E+00 + 0.460604080928E+00 0.459493153139E+00 0.458384706064E+00 0.457278736404E+00 + 0.456175240862E+00 0.455074216140E+00 0.453975658940E+00 0.452879565963E+00 + 0.451785933914E+00 0.450694759492E+00 0.449606039402E+00 0.448519770344E+00 + 0.447435949022E+00 0.446354572136E+00 0.445275636390E+00 0.444199138486E+00 + 0.443125075125E+00 0.442053443010E+00 0.440984238844E+00 0.439917459328E+00 + 0.438853101164E+00 0.437791161055E+00 0.436731635702E+00 0.435674521809E+00 + 0.434619816077E+00 0.433567515208E+00 0.432517615905E+00 0.431470114869E+00 + 0.430425008804E+00 0.429382294410E+00 0.428341968391E+00 0.427304027448E+00 + 0.426268468284E+00 0.425235287600E+00 0.424204482100E+00 0.423176048484E+00 + 0.422149983456E+00 0.421126283718E+00 0.420104945971E+00 0.419085966918E+00 + 0.418069343261E+00 0.417055071702E+00 0.416043148943E+00 0.415033571688E+00 + 0.414026336636E+00 0.413021440492E+00 0.412018879957E+00 0.411018651733E+00 + 0.410020752523E+00 0.409025179028E+00 0.408031927951E+00 0.407040995994E+00 + 0.406052379859E+00 0.405066076248E+00 0.404082081864E+00 0.403100393409E+00 + 0.402121007584E+00 0.401143921093E+00 0.400169130637E+00 0.399196632918E+00 + 0.398226424638E+00 0.397258502501E+00 0.396292863207E+00 0.395329503460E+00 + 0.394368419961E+00 0.393409609412E+00 0.392453068516E+00 0.391498793975E+00 + 0.390546782490E+00 0.389597030765E+00 0.388649535501E+00 0.387704293401E+00 + 0.386761301167E+00 0.385820555500E+00 0.384882053103E+00 0.383945790679E+00 + 0.383011764929E+00 0.382079972556E+00 0.381150410261E+00 0.380223074748E+00 + 0.379297962717E+00 0.378375070872E+00 0.377454395914E+00 0.376535934546E+00 + 0.375619683470E+00 0.374705639388E+00 0.373793799002E+00 0.372884159014E+00 + 0.371976716127E+00 0.371071467043E+00 0.370168408463E+00 0.369267537091E+00 + 0.368368849627E+00 0.367472342776E+00 0.366578013238E+00 0.365685857715E+00 + 0.364795872911E+00 0.363908055527E+00 0.363022402265E+00 0.362138909827E+00 + 0.361257574917E+00 0.360378394235E+00 0.359501364484E+00 0.358626482366E+00 + 0.357753744584E+00 0.356883147840E+00 0.356014688835E+00 0.355148364272E+00 + 0.354284170853E+00 0.353422105280E+00 0.352562164256E+00 0.351704344482E+00 + 0.350848642661E+00 0.349995055496E+00 0.349143579687E+00 0.348294211938E+00 + 0.347446948950E+00 0.346601787426E+00 0.345758724068E+00 0.344917755578E+00 + 0.344078878658E+00 0.343242090010E+00 0.342407386337E+00 0.341574764341E+00 + 0.340744220724E+00 0.339915752188E+00 0.339089355435E+00 0.338265027167E+00 + 0.337442764088E+00 0.336622562898E+00 0.335804420300E+00 0.334988332996E+00 + 0.334174297689E+00 0.333362311080E+00 0.332552369872E+00 0.331744470767E+00 + 0.330938610466E+00 0.330134785673E+00 0.329332993090E+00 0.328533229418E+00 + 0.327735491360E+00 0.326939775618E+00 0.326146078894E+00 0.325354397890E+00 + 0.324564729309E+00 0.323777069852E+00 0.322991416222E+00 0.322207765122E+00 + 0.321426113252E+00 0.320646457316E+00 0.319868794015E+00 0.319093120052E+00 + 0.318319432130E+00 0.317547726949E+00 0.316778001212E+00 0.316010251622E+00 + 0.315244474880E+00 0.314480667689E+00 0.313718826752E+00 0.312958948769E+00 + 0.312201030444E+00 0.311445068478E+00 0.310691059574E+00 0.309939000433E+00 + 0.309188887759E+00 0.308440718253E+00 0.307694488617E+00 0.306950195554E+00 + 0.306207835766E+00 0.305467405955E+00 0.304728902822E+00 0.303992323071E+00 + 0.303257663404E+00 0.302524920522E+00 0.301794091128E+00 0.301065171924E+00 + 0.300338159612E+00 0.299613050894E+00 0.298889842473E+00 0.298168531051E+00 + 0.297449113329E+00 0.296731586011E+00 0.296015945797E+00 0.295302189392E+00 + 0.294590313495E+00 0.293880314811E+00 0.293172190040E+00 0.292465935886E+00 + 0.291761549050E+00 0.291059026234E+00 0.290358364141E+00 0.289659559473E+00 + 0.288962608932E+00 0.288267509220E+00 0.287574257039E+00 0.286882849092E+00 + 0.286193282081E+00 0.285505552707E+00 0.284819657674E+00 0.284135593683E+00 + 0.283453357436E+00 0.282772945636E+00 0.282094354985E+00 0.281417582184E+00 + 0.280742623937E+00 0.280069476945E+00 0.279398137911E+00 0.278728603536E+00 + 0.278060870523E+00 0.277394935574E+00 0.276730795392E+00 0.276068446677E+00 + 0.275407886134E+00 0.274749110463E+00 0.274092116367E+00 0.273436900548E+00 + 0.272783459708E+00 0.272131790550E+00 0.271481889775E+00 0.270833754086E+00 + 0.270187380185E+00 0.269542764775E+00 0.268899904556E+00 0.268258796232E+00 + 0.267619436505E+00 0.266981822077E+00 0.266345949649E+00 0.265711815925E+00 + 0.265079417607E+00 0.264448751396E+00 0.263819813994E+00 0.263192602105E+00 + 0.262567112430E+00 0.261943341671E+00 0.261321286530E+00 0.260700943710E+00 + 0.260082309913E+00 0.259465381841E+00 0.258850156196E+00 0.258236629680E+00 + 0.257624798996E+00 0.257014660846E+00 0.256406211932E+00 0.255799448955E+00 + 0.255194368619E+00 0.254590967625E+00 0.253989242676E+00 0.253389190474E+00 + 0.252790807720E+00 0.252194091118E+00 0.251599037369E+00 0.251005643175E+00 + 0.250413905240E+00 0.249823820264E+00 0.249235384950E+00 0.248648596000E+00 + 0.248063450116E+00 0.247479944001E+00 0.246898074357E+00 0.246317837886E+00 + 0.245739231290E+00 0.245162251271E+00 0.244586894531E+00 0.244013157773E+00 + 0.243441037699E+00 0.242870531011E+00 0.242301634411E+00 0.241734344601E+00 + 0.241168658284E+00 0.240604572162E+00 0.240042082936E+00 0.239481187309E+00 + 0.238921881984E+00 0.238364163662E+00 0.237808029045E+00 0.237253474837E+00 + 0.236700497738E+00 0.236149094451E+00 0.235599261679E+00 0.235050996123E+00 + 0.234504294485E+00 0.233959153469E+00 0.233415569775E+00 0.232873540107E+00 + 0.232333061166E+00 0.231794129654E+00 0.231256742274E+00 0.230720895728E+00 + 0.230186586718E+00 0.229653811947E+00 0.229122568115E+00 0.228592851927E+00 + 0.228064660083E+00 0.227537989286E+00 0.227012836238E+00 0.226489197641E+00 + 0.225967070198E+00 0.225446450610E+00 0.224927335581E+00 0.224409721811E+00 + 0.223893606003E+00 0.223378984860E+00 0.222865855084E+00 0.222354213376E+00 + 0.221844056439E+00 0.221335380975E+00 0.220828183686E+00 0.220322461275E+00 + 0.219818210443E+00 0.219315427893E+00 0.218814110327E+00 0.218314254447E+00 + 0.217815856956E+00 0.217318914555E+00 0.216823423946E+00 0.216329381833E+00 + 0.215836784916E+00 0.215345629899E+00 0.214855913483E+00 0.214367632371E+00 + 0.213880783264E+00 0.213395362865E+00 0.212911367877E+00 0.212428795000E+00 + 0.211947640938E+00 0.211467902393E+00 0.210989576066E+00 0.210512658661E+00 + 0.210037146878E+00 0.209563037421E+00 0.209090326992E+00 0.208619012292E+00 + 0.208149090024E+00 0.207680556890E+00 0.207213409592E+00 0.206747644833E+00 + 0.206283259314E+00 0.205820249738E+00 0.205358612806E+00 0.204898345222E+00 + 0.204439443688E+00 0.203981904904E+00 0.203525725575E+00 0.203070902401E+00 + 0.202617432085E+00 0.202165311329E+00 0.201714536836E+00 0.201265105307E+00 + 0.200817013445E+00 0.200370257951E+00 0.199924835529E+00 0.199480742880E+00 + 0.199037976707E+00 0.198596533711E+00 0.198156410594E+00 0.197717604060E+00 + 0.197280110810E+00 0.196843927546E+00 0.196409050971E+00 0.195975477786E+00 + 0.195543204694E+00 0.195112228397E+00 0.194682545597E+00 0.194254152997E+00 + 0.193827047298E+00 0.193401225203E+00 0.192976683414E+00 0.192553418633E+00 + 0.192131427562E+00 0.191710706903E+00 0.191291253360E+00 0.190873063632E+00 + 0.190456134424E+00 0.190040462437E+00 0.189626044374E+00 0.189212876936E+00 + 0.188800956825E+00 0.188390280744E+00 0.187980845396E+00 0.187572647481E+00 + 0.187165683703E+00 0.186759950764E+00 0.186355445365E+00 0.185952164209E+00 + 0.185550103999E+00 0.185149261435E+00 0.184749633221E+00 0.184351216059E+00 + 0.183954006650E+00 0.183558001697E+00 0.183163197903E+00 0.182769591969E+00 + 0.182377180597E+00 0.181985960490E+00 0.181595928350E+00 0.181207080879E+00 + 0.180819414779E+00 0.180432926753E+00 0.180047613502E+00 0.179663471729E+00 + 0.179280498136E+00 0.178898689425E+00 0.178518042298E+00 0.178138553458E+00 + 0.177760219606E+00 0.177383037445E+00 0.177007003678E+00 0.176632115005E+00 + 0.176258368130E+00 0.175885759754E+00 0.175514286580E+00 0.175143945310E+00 + 0.174774732645E+00 0.174406645290E+00 0.174039679944E+00 0.173673833311E+00 + 0.173309102093E+00 0.172945482992E+00 0.172582972710E+00 0.172221567949E+00 + 0.171861265412E+00 0.171502061800E+00 0.171143953817E+00 0.170786938163E+00 + 0.170431011541E+00 0.170076170654E+00 0.169722412203E+00 0.169369732891E+00 + 0.169018129420E+00 0.168667598493E+00 0.168318136810E+00 0.167969741075E+00 + 0.167622407989E+00 0.167276134255E+00 0.166930916575E+00 0.166586751652E+00 + 0.166243636186E+00 0.165901566881E+00 0.165560540439E+00 0.165220553562E+00 + 0.164881602951E+00 0.164543685310E+00 0.164206797340E+00 0.163870935744E+00 + 0.163536097224E+00 0.163202278481E+00 0.162869476219E+00 0.162537687139E+00 + 0.162206907943E+00 0.161877135334E+00 0.161548366014E+00 0.161220596684E+00 + 0.160893824048E+00 0.160568044807E+00 0.160243255664E+00 0.159919453320E+00 + 0.159596634479E+00 0.159274795841E+00 0.158953934110E+00 0.158634045987E+00 + 0.158315128174E+00 0.157997177375E+00 0.157680190290E+00 0.157364163622E+00 + 0.157049094074E+00 0.156734978347E+00 0.156421813144E+00 0.156109595166E+00 + 0.155798321117E+00 0.155487987698E+00 0.155178591611E+00 0.154870129558E+00 + 0.154562598243E+00 0.154255994366E+00 0.153950314630E+00 0.153645555738E+00 + 0.153341714391E+00 0.153038787292E+00 0.152736771142E+00 0.152435662644E+00 + 0.152135458501E+00 0.151836155414E+00 0.151537750085E+00 0.151240239217E+00 + 0.150943619512E+00 0.150647887671E+00 0.150353040398E+00 0.150059074395E+00 + 0.149765986363E+00 0.149473773004E+00 0.149182431022E+00 0.148891957118E+00 + 0.148602347993E+00 0.148313600352E+00 0.148025710895E+00 0.147738676325E+00 + 0.147452493343E+00 0.147167158653E+00 0.146882668956E+00 0.146599020955E+00 + 0.146316211351E+00 0.146034236848E+00 0.145753094146E+00 0.145472779948E+00 + 0.145193290957E+00 0.144914623875E+00 0.144636775403E+00 0.144359742244E+00 + 0.144083521100E+00 0.143808108674E+00 0.143533501667E+00 0.143259696782E+00 + 0.142986690720E+00 0.142714480184E+00 0.142443061877E+00 0.142172432500E+00 + 0.141902588755E+00 0.141633527346E+00 0.141365244973E+00 0.141097738339E+00 + 0.140831004146E+00 0.140565039097E+00 0.140299839893E+00 0.140035403237E+00 + 0.139771725831E+00 0.139508804377E+00 0.139246635578E+00 0.138985216135E+00 + 0.138724542750E+00 0.138464612127E+00 0.138205420966E+00 0.137946965971E+00 + 0.137689243843E+00 0.137432251284E+00 0.137175984997E+00 0.136920441685E+00 + 0.136665618048E+00 0.136411510789E+00 0.136158116611E+00 0.135905432216E+00 + 0.135653454305E+00 0.135402179581E+00 0.135151604746E+00 0.134901726503E+00 + 0.134652541553E+00 0.134404046599E+00 0.134156238343E+00 0.133909113486E+00 + 0.133662668732E+00 0.133416900783E+00 0.133171806339E+00 0.132927382105E+00 + 0.132683624782E+00 0.132440531071E+00 0.132198097676E+00 0.131956321298E+00 + 0.131715198640E+00 0.131474726404E+00 0.131234901292E+00 0.130995720006E+00 + 0.130757179248E+00 0.130519275721E+00 0.130282006126E+00 0.130045367166E+00 + 0.129809355544E+00 0.129573967960E+00 0.129339201118E+00 0.129105051719E+00 + 0.128871516467E+00 0.128638592062E+00 0.128406275207E+00 0.128174562605E+00 + 0.127943450957E+00 0.127712936966E+00 0.127483017333E+00 0.127253688762E+00 + 0.127024947953E+00 0.126796791610E+00 0.126569216435E+00 0.126342219129E+00 + 0.126115796395E+00 0.125889944936E+00 0.125664661452E+00 0.125439942647E+00 + 0.125215785222E+00 0.124992185881E+00 0.124769141324E+00 0.124546648254E+00 + 0.124324703374E+00 0.124103303385E+00 0.123882444989E+00 0.123662124890E+00 + 0.123442339789E+00 0.123223086387E+00 0.123004361389E+00 0.122786161494E+00 + 0.122568483407E+00 0.122351323828E+00 0.122134679461E+00 0.121918547006E+00 + 0.121702923167E+00 0.121487804646E+00 0.121273188145E+00 0.121059070365E+00 + 0.120845448010E+00 0.120632317781E+00 0.120419676380E+00 0.120207520510E+00 + 0.119995846873E+00 0.119784652171E+00 0.119573933106E+00 0.119363686381E+00 + 0.119153908697E+00 0.118944596757E+00 0.118735747263E+00 0.118527356917E+00 + 0.118319422421E+00 0.118111940478E+00 0.117904907789E+00 0.117698321057E+00 + 0.117492176984E+00 0.117286472272E+00 0.117081203624E+00 0.116876367741E+00 + 0.116671961326E+00 0.116467981080E+00 0.116264423707E+00 0.116061285908E+00 + 0.115858564385E+00 0.115656255841E+00 0.115454356978E+00 0.115252864498E+00 + 0.115051775102E+00 0.114851085494E+00 0.114650792376E+00 0.114450892449E+00 + 0.114251382416E+00 0.114052258979E+00 0.113853518840E+00 0.113655158702E+00 + 0.113457175266E+00 0.113259565235E+00 0.113062325310E+00 0.112865452195E+00 + 0.112668942591E+00 0.112472793200E+00 0.112277000725E+00 0.112081561868E+00 + 0.111886473331E+00 0.111691731816E+00 0.111497334025E+00 0.111303276660E+00 + 0.111109556425E+00 0.110916170020E+00 0.110723114148E+00 0.110530385511E+00 + 0.110337980812E+00 0.110145896752E+00 0.109954130034E+00 0.109762677360E+00 + 0.109571535432E+00 0.109380700953E+00 0.109190170623E+00 0.108999941147E+00 + 0.108810009225E+00 0.108620371560E+00 0.108431024854E+00 0.108241965810E+00 + 0.108053191129E+00 0.107864697514E+00 0.107676481666E+00 0.107488540289E+00 + 0.107300870084E+00 0.107113467753E+00 0.106926329999E+00 0.106739453524E+00 + 0.106552835029E+00 0.106366471218E+00 0.106180358792E+00 0.105994494453E+00 + 0.105808874904E+00 0.105623496847E+00 0.105438356984E+00 0.105253452017E+00 + 0.105068778648E+00 0.104884333580E+00 0.104700113515E+00 0.104516115154E+00 + 0.104332335200E+00 0.104148770680E+00 0.103965420667E+00 0.103782285036E+00 + 0.103599363663E+00 0.103416656424E+00 0.103234163194E+00 0.103051883849E+00 + 0.102869818265E+00 0.102687966318E+00 0.102506327883E+00 0.102324902838E+00 + 0.102143691056E+00 0.101962692415E+00 0.101781906790E+00 0.101601334057E+00 + 0.101420974091E+00 0.101240826770E+00 0.101060891967E+00 0.100881169560E+00 + 0.100701659424E+00 0.100522361435E+00 0.100343275469E+00 0.100164401401E+00 + 0.999857391075E-01 0.998072884645E-01 0.996290493475E-01 0.994510216326E-01 + 0.992732051954E-01 0.990955999119E-01 0.989182056578E-01 0.987410223091E-01 + 0.985640497414E-01 0.983872878308E-01 0.982107364530E-01 0.980343954838E-01 + 0.978582647991E-01 0.976823442747E-01 0.975066337865E-01 0.973311332102E-01 + 0.971558424219E-01 0.969807612971E-01 0.968058897119E-01 0.966312275421E-01 + 0.964567746634E-01 0.962825309518E-01 0.961084962830E-01 0.959346705329E-01 + 0.957610535773E-01 0.955876452921E-01 0.954144455531E-01 0.952414542362E-01 + 0.950686712171E-01 0.948960963717E-01 0.947237295759E-01 0.945515707055E-01 + 0.943796196363E-01 0.942078762442E-01 0.940363404050E-01 0.938650119945E-01 + 0.936938908886E-01 0.935229769631E-01 0.933522700939E-01 0.931817701568E-01 + 0.930114770275E-01 0.928413905821E-01 0.926715106962E-01 0.925018372458E-01 + 0.923323701066E-01 0.921631091546E-01 0.919940542655E-01 0.918252053151E-01 + 0.916565621794E-01 0.914881247342E-01 0.913198928553E-01 0.911518664184E-01 + 0.909840452996E-01 0.908164293746E-01 0.906490185192E-01 0.904818126093E-01 + 0.903148115207E-01 0.901480151292E-01 0.899814233108E-01 0.898150359411E-01 + 0.896488528962E-01 0.894828740517E-01 0.893170992836E-01 0.891515284677E-01 + 0.889861614797E-01 0.888209981956E-01 0.886560384913E-01 0.884912822424E-01 + 0.883267293249E-01 0.881623796146E-01 0.879982329873E-01 0.878342893189E-01 + 0.876705484852E-01 0.875070103621E-01 0.873436748253E-01 0.871805417508E-01 + 0.870176110143E-01 0.868548824917E-01 0.866923560589E-01 0.865300315916E-01 + 0.863679089657E-01 0.862059880571E-01 0.860442687415E-01 0.858827508949E-01 + 0.857214343930E-01 0.855603191117E-01 0.853994049269E-01 0.852386917143E-01 + 0.850781793498E-01 0.849178677092E-01 0.847577566684E-01 0.845978461033E-01 + 0.844381358896E-01 0.842786259031E-01 0.841193160198E-01 0.839602061155E-01 + 0.838012960660E-01 0.836425857471E-01 0.834840750346E-01 0.833257638045E-01 + 0.831676519325E-01 0.830097392945E-01 0.828520257664E-01 0.826945112239E-01 + 0.825371955428E-01 0.823800785992E-01 0.822231602686E-01 0.820664404271E-01 + 0.819099189505E-01 0.817535957145E-01 0.815974705950E-01 0.814415434679E-01 + 0.812858142090E-01 0.811302826941E-01 0.809749487991E-01 0.808198123997E-01 + 0.806648733720E-01 0.805101315916E-01 0.803555869344E-01 0.802012392762E-01 + 0.800470884930E-01 0.798931344604E-01 0.797393770545E-01 0.795858161509E-01 + 0.794324516256E-01 0.792792833543E-01 0.791263112130E-01 0.789735350774E-01 + 0.788209548234E-01 0.786685703268E-01 0.785163814634E-01 0.783643881092E-01 + 0.782125901399E-01 0.780609874313E-01 0.779095798594E-01 0.777583672999E-01 + 0.776073496287E-01 0.774565267216E-01 0.773058984545E-01 0.771554647031E-01 + 0.770052253434E-01 0.768551802512E-01 0.767053293022E-01 0.765556723724E-01 + 0.764062093376E-01 0.762569400736E-01 0.761078644562E-01 0.759589823613E-01 + 0.758102936648E-01 0.756617982424E-01 0.755134959700E-01 0.753653867235E-01 + 0.752174703786E-01 0.750697468112E-01 0.749222158972E-01 0.747748775124E-01 + 0.746277315325E-01 0.744807778336E-01 0.743340162913E-01 0.741874467816E-01 + 0.740410691802E-01 0.738948833631E-01 0.737488892060E-01 0.736030865848E-01 + 0.734574753752E-01 0.733120554533E-01 0.731668266947E-01 0.730217889754E-01 + 0.728769421711E-01 0.727322861578E-01 0.725878208111E-01 0.724435460071E-01 + 0.722994616215E-01 0.721555675301E-01 0.720118636088E-01 0.718683497334E-01 + 0.717250257798E-01 0.715818916238E-01 0.714389471413E-01 0.712961922080E-01 + 0.711536266998E-01 0.710112504926E-01 0.708690634621E-01 0.707270654843E-01 + 0.705852564349E-01 0.704436361898E-01 0.703022046249E-01 0.701609616159E-01 + 0.700199070388E-01 0.698790407692E-01 0.697383626832E-01 0.695978726565E-01 + 0.694575705649E-01 0.693174562844E-01 0.691775296906E-01 0.690377906595E-01 + 0.688982390670E-01 0.687588747887E-01 0.686196977007E-01 0.684807076786E-01 + 0.683419045984E-01 0.682032883359E-01 0.680648587670E-01 0.679266157674E-01 + 0.677885592130E-01 0.676506889796E-01 0.675130049431E-01 0.673755069793E-01 + 0.672381949640E-01 0.671010687732E-01 0.669641282826E-01 0.668273733680E-01 + 0.666908039053E-01 0.665544197704E-01 0.664182208390E-01 0.662822069870E-01 + 0.661463780903E-01 0.660107340246E-01 0.658752746659E-01 0.657399998900E-01 + 0.656049095726E-01 0.654700035896E-01 0.653352818169E-01 0.652007441304E-01 + 0.650663904057E-01 0.649322205189E-01 0.647982343456E-01 0.646644317618E-01 + 0.645308126433E-01 0.643973768660E-01 0.642641243056E-01 0.641310548379E-01 + 0.639981683390E-01 0.638654646845E-01 0.637329437503E-01 0.636006054122E-01 + 0.634684495462E-01 0.633364760279E-01 0.632046847334E-01 0.630730755383E-01 + 0.629416483185E-01 0.628104029500E-01 0.626793393084E-01 0.625484572697E-01 + 0.624177567096E-01 0.622872375041E-01 0.621568995289E-01 0.620267426600E-01 + 0.618967667730E-01 0.617669717440E-01 0.616373574486E-01 0.615079237627E-01 + 0.613786705623E-01 0.612495977231E-01 0.611207051209E-01 0.609919926316E-01 + 0.608634601310E-01 0.607351074950E-01 0.606069345994E-01 0.604789413200E-01 + 0.603511275327E-01 0.602234931133E-01 0.600960379377E-01 0.599687618816E-01 + 0.598416648210E-01 0.597147466316E-01 0.595880071894E-01 0.594614463700E-01 + 0.593350640495E-01 0.592088601035E-01 0.590828344080E-01 0.589569868388E-01 + 0.588313172716E-01 0.587058255825E-01 0.585805116471E-01 0.584553753414E-01 + 0.583304165411E-01 0.582056351222E-01 0.580810309603E-01 0.579566039315E-01 + 0.578323539115E-01 0.577082807761E-01 0.575843844012E-01 0.574606646626E-01 + 0.573371214362E-01 0.572137545978E-01 0.570905640233E-01 0.569675495884E-01 + 0.568447111690E-01 0.567220486410E-01 0.565995618802E-01 0.564772507623E-01 + 0.563551151634E-01 0.562331549591E-01 0.561113700254E-01 0.559897602380E-01 + 0.558683254729E-01 0.557470656058E-01 0.556259805126E-01 0.555050700691E-01 + 0.553843341511E-01 0.552637726346E-01 0.551433853953E-01 0.550231723090E-01 + 0.549031332517E-01 0.547832680991E-01 0.546635767270E-01 0.545440590114E-01 + 0.544247148281E-01 0.543055440528E-01 0.541865465614E-01 0.540677222299E-01 + 0.539490709339E-01 0.538305925493E-01 0.537122869521E-01 0.535941540179E-01 + 0.534761936227E-01 0.533584056423E-01 0.532407899525E-01 0.531233464292E-01 + 0.530060749481E-01 0.528889753852E-01 0.527720476163E-01 0.526552915172E-01 + 0.525387069637E-01 0.524222938317E-01 0.523060519970E-01 0.521899813355E-01 + 0.520740817230E-01 0.519583530353E-01 0.518427951482E-01 0.517274079377E-01 + 0.516121912795E-01 0.514971450495E-01 0.513822691235E-01 0.512675633774E-01 + 0.511530276869E-01 0.510386619280E-01 0.509244659765E-01 0.508104397081E-01 + 0.506965829988E-01 0.505828957243E-01 0.504693777606E-01 0.503560289834E-01 + 0.502428492686E-01 0.501298384921E-01 0.500169965296E-01 0.499043232569E-01 + 0.497918185501E-01 0.496794822848E-01 0.495673143369E-01 0.494553145822E-01 + 0.493434828966E-01 0.492318191560E-01 0.491203232361E-01 0.490089950128E-01 + 0.488978343619E-01 0.487868411593E-01 0.486760152808E-01 0.485653566023E-01 + 0.484548649995E-01 0.483445403483E-01 0.482343825246E-01 0.481243914042E-01 + 0.480145668629E-01 0.479049087766E-01 0.477954170211E-01 0.476860914722E-01 + 0.475769320058E-01 0.474679384977E-01 0.473591108237E-01 0.472504488598E-01 + 0.471419524816E-01 0.470336215651E-01 0.469254559862E-01 0.468174556205E-01 + 0.467096203440E-01 0.466019500326E-01 0.464944445620E-01 0.463871038080E-01 + 0.462799276466E-01 0.461729159535E-01 0.460660686047E-01 0.459593854758E-01 + 0.458528664429E-01 0.457465113816E-01 0.456403201679E-01 0.455342926775E-01 + 0.454284287864E-01 0.453227283704E-01 0.452171913052E-01 0.451118174667E-01 + 0.450066067308E-01 0.449015589733E-01 0.447966740701E-01 0.446919518969E-01 + 0.445873923297E-01 0.444829952441E-01 0.443787605162E-01 0.442746880217E-01 + 0.441707776365E-01 0.440670292363E-01 0.439634426971E-01 0.438600178947E-01 + 0.437567547049E-01 0.436536530035E-01 0.435507126664E-01 0.434479335694E-01 + 0.433453155884E-01 0.432428585992E-01 0.431405624776E-01 0.430384270995E-01 + 0.429364523406E-01 0.428346380770E-01 0.427329841843E-01 0.426314905384E-01 + 0.425301570152E-01 0.424289834904E-01 0.423279698400E-01 0.422271159398E-01 + 0.421264216655E-01 0.420258868931E-01 0.419255114984E-01 0.418252953572E-01 + 0.417252383453E-01 0.416253403386E-01 0.415256012130E-01 0.414260208442E-01 + 0.413265991081E-01 0.412273358805E-01 0.411282310373E-01 0.410292844543E-01 + 0.409304960074E-01 0.408318655724E-01 0.407333930250E-01 0.406350782413E-01 + 0.405369210969E-01 0.404389214677E-01 0.403410792297E-01 0.402433942585E-01 + 0.401458664301E-01 0.400484956202E-01 0.399512817048E-01 0.398542245596E-01 + 0.397573240605E-01 0.396605800833E-01 0.395639925039E-01 0.394675611981E-01 + 0.393712860418E-01 0.392751669107E-01 0.391792036807E-01 0.390833962277E-01 + 0.389877444275E-01 0.388922481559E-01 0.387969072888E-01 0.387017217019E-01 + 0.386066912712E-01 0.385118158725E-01 0.384170953815E-01 0.383225296743E-01 + 0.382281186265E-01 0.381338621140E-01 0.380397600127E-01 0.379458121983E-01 + 0.378520185469E-01 0.377583789340E-01 0.376648932357E-01 0.375715613277E-01 + 0.374783830859E-01 0.373853583862E-01 0.372924871042E-01 0.371997691160E-01 + 0.371072042973E-01 0.370147925240E-01 0.369225336718E-01 0.368304276167E-01 + 0.367384742345E-01 0.366466734010E-01 0.365550249920E-01 0.364635288835E-01 + 0.363721849511E-01 0.362809930708E-01 0.361899531185E-01 0.360990649698E-01 + 0.360083285007E-01 0.359177435871E-01 0.358273101046E-01 0.357370279293E-01 + 0.356468969369E-01 0.355569170032E-01 0.354670880042E-01 0.353774098155E-01 + 0.352878823132E-01 0.351985053729E-01 0.351092788706E-01 0.350202026821E-01 + 0.349312766831E-01 0.348425007497E-01 0.347538747575E-01 0.346653985825E-01 + 0.345770721004E-01 0.344888951871E-01 0.344008677185E-01 0.343129895703E-01 + 0.342252606185E-01 0.341376807388E-01 0.340502498071E-01 0.339629676992E-01 + 0.338758342910E-01 0.337888494583E-01 0.337020130769E-01 0.336153250227E-01 + 0.335287851715E-01 0.334423933991E-01 0.333561495814E-01 0.332700535943E-01 + 0.331841053135E-01 0.330983046149E-01 0.330126513743E-01 0.329271454676E-01 + 0.328417867706E-01 0.327565751592E-01 0.326715105091E-01 0.325865926963E-01 + 0.325018215965E-01 0.324171970856E-01 0.323327190394E-01 0.322483873338E-01 + 0.321642018446E-01 0.320801624476E-01 0.319962690187E-01 0.319125214338E-01 + 0.318289195685E-01 0.317454632989E-01 0.316621525007E-01 0.315789870497E-01 + 0.314959668219E-01 0.314130916930E-01 0.313303615388E-01 0.312477762353E-01 + 0.311653356582E-01 0.310830396834E-01 0.310008881867E-01 0.309188810440E-01 + 0.308370181311E-01 0.307552993238E-01 0.306737244980E-01 0.305922935295E-01 + 0.305110062941E-01 0.304298626677E-01 0.303488625261E-01 0.302680057452E-01 + 0.301872922008E-01 0.301067217687E-01 0.300262943248E-01 0.299460097448E-01 + 0.298658679047E-01 0.297858686803E-01 0.297060119474E-01 0.296262975819E-01 + 0.295467254595E-01 0.294672954562E-01 0.293880074477E-01 0.293088613100E-01 + 0.292298569187E-01 0.291509941499E-01 0.290722728792E-01 0.289936929826E-01 + 0.289152543359E-01 0.288369568149E-01 0.287588002954E-01 0.286807846534E-01 + 0.286029097646E-01 0.285251755048E-01 0.284475817500E-01 0.283701283759E-01 + 0.282928152584E-01 0.282156422733E-01 0.281386092965E-01 0.280617162037E-01 + 0.279849628709E-01 0.279083491739E-01 0.278318749884E-01 0.277555401904E-01 + 0.276793446557E-01 0.276032882601E-01 0.275273708794E-01 0.274515923895E-01 + 0.273759526663E-01 0.273004515855E-01 0.272250890230E-01 0.271498648546E-01 + 0.270747789563E-01 0.269998312037E-01 0.269250214728E-01 0.268503496393E-01 + 0.267758155792E-01 0.267014191683E-01 0.266271602823E-01 0.265530387972E-01 + 0.264790545887E-01 0.264052075328E-01 0.263314975052E-01 0.262579243818E-01 + 0.261844880384E-01 0.261111883508E-01 0.260380251950E-01 0.259649984466E-01 + 0.258921079817E-01 0.258193536759E-01 0.257467354052E-01 0.256742530453E-01 + 0.256019064722E-01 0.255296955616E-01 0.254576201895E-01 0.253856802315E-01 + 0.253138755636E-01 0.252422060616E-01 0.251706716013E-01 0.250992720587E-01 + 0.250280073094E-01 0.249568772294E-01 0.248858816944E-01 0.248150205804E-01 + 0.247442937631E-01 0.246737011185E-01 0.246032425222E-01 0.245329178503E-01 + 0.244627269784E-01 0.243926697825E-01 0.243227461384E-01 0.242529559219E-01 + 0.241832990088E-01 0.241137752750E-01 0.240443845964E-01 0.239751268487E-01 + 0.239060019079E-01 0.238370096497E-01 0.237681499499E-01 0.236994226845E-01 + 0.236308277292E-01 0.235623649599E-01 0.234940342525E-01 0.234258354827E-01 + 0.233577685264E-01 0.232898332594E-01 0.232220295576E-01 0.231543572968E-01 + 0.230868163529E-01 0.230194066016E-01 0.229521279189E-01 0.228849801806E-01 + 0.228179632624E-01 0.227510770403E-01 0.226843213900E-01 0.226176961874E-01 + 0.225512013084E-01 0.224848366288E-01 0.224186020244E-01 0.223524973710E-01 + 0.222865225446E-01 0.222206774208E-01 0.221549618757E-01 0.220893757849E-01 + 0.220239190244E-01 0.219585914700E-01 0.218933929974E-01 0.218283234826E-01 + 0.217633828015E-01 0.216985708297E-01 0.216338874432E-01 0.215693325178E-01 + 0.215049059293E-01 0.214406075537E-01 0.213764372666E-01 0.213123949440E-01 + 0.212484804616E-01 0.211846936954E-01 0.211210345211E-01 0.210575028147E-01 + 0.209940984519E-01 0.209308213085E-01 0.208676712605E-01 0.208046481836E-01 + 0.207417519536E-01 0.206789824465E-01 0.206163395381E-01 0.205538231041E-01 + 0.204914330205E-01 0.204291691630E-01 0.203670314076E-01 0.203050196300E-01 + 0.202431337060E-01 0.201813735116E-01 0.201197389226E-01 0.200582298147E-01 + 0.199968460638E-01 0.199355875458E-01 0.198744541366E-01 0.198134457118E-01 + 0.197525621474E-01 0.196918033193E-01 0.196311691032E-01 0.195706593749E-01 + 0.195102740104E-01 0.194500128855E-01 0.193898758759E-01 0.193298628576E-01 + 0.192699737064E-01 0.192102082980E-01 0.191505665084E-01 0.190910482134E-01 + 0.190316532888E-01 0.189723816105E-01 0.189132330543E-01 0.188542074959E-01 + 0.187953048114E-01 0.187365248765E-01 0.186778675670E-01 0.186193327587E-01 + 0.185609203276E-01 0.185026301495E-01 0.184444621001E-01 0.183864160554E-01 + 0.183284918911E-01 0.182706894832E-01 0.182130087073E-01 0.181554494395E-01 + 0.180980115554E-01 0.180406949310E-01 0.179834994421E-01 0.179264249645E-01 + 0.178694713731E-01 0.178126385402E-01 0.177559263376E-01 0.176993346372E-01 + 0.176428633107E-01 0.175865122301E-01 0.175302812672E-01 0.174741702938E-01 + 0.174181791818E-01 0.173623078030E-01 0.173065560293E-01 0.172509237324E-01 + 0.171954107843E-01 0.171400170568E-01 0.170847424217E-01 0.170295867509E-01 + 0.169745499161E-01 0.169196317893E-01 0.168648322424E-01 0.168101511470E-01 + 0.167555883751E-01 0.167011437986E-01 0.166468172892E-01 0.165926087188E-01 + 0.165385179592E-01 0.164845448824E-01 0.164306893600E-01 0.163769512641E-01 + 0.163233304664E-01 0.162698268387E-01 0.162164402529E-01 0.161631705808E-01 + 0.161100176944E-01 0.160569814654E-01 0.160040617656E-01 0.159512584669E-01 + 0.158985714412E-01 0.158460005603E-01 0.157935456961E-01 0.157412067203E-01 + 0.156889835048E-01 0.156368759215E-01 0.155848838422E-01 0.155330071387E-01 + 0.154812456830E-01 0.154295993468E-01 0.153780680019E-01 0.153266515203E-01 + 0.152753497737E-01 0.152241626340E-01 0.151730899731E-01 0.151221316627E-01 + 0.150712875748E-01 0.150205575812E-01 0.149699415536E-01 0.149194393641E-01 + 0.148690508843E-01 0.148187759861E-01 0.147686145415E-01 0.147185664221E-01 + 0.146686315000E-01 0.146188096468E-01 0.145691007345E-01 0.145195046349E-01 + 0.144700212198E-01 0.144206503611E-01 0.143713919306E-01 0.143222458002E-01 + 0.142732118417E-01 0.142242899269E-01 0.141754799277E-01 0.141267817159E-01 + 0.140781951635E-01 0.140297201421E-01 0.139813565237E-01 0.139331041801E-01 + 0.138849629831E-01 0.138369328046E-01 0.137890135164E-01 0.137412049905E-01 + 0.136935070985E-01 0.136459197123E-01 0.135984427039E-01 0.135510759450E-01 + 0.135038193075E-01 0.134566726632E-01 0.134096358840E-01 0.133627088417E-01 + 0.133158914081E-01 0.132691834551E-01 0.132225848545E-01 0.131760954783E-01 + 0.131297151981E-01 0.130834438859E-01 0.130372814135E-01 0.129912276527E-01 + 0.129452824755E-01 0.128994457535E-01 0.128537173588E-01 0.128080971630E-01 + 0.127625850381E-01 0.127171808559E-01 0.126718844882E-01 0.126266958070E-01 + 0.125816146839E-01 0.125366409909E-01 0.124917745998E-01 0.124470153825E-01 + 0.124023632108E-01 0.123578179565E-01 0.123133794914E-01 0.122690476875E-01 + 0.122248224166E-01 0.121807035504E-01 0.121366909610E-01 0.120927845199E-01 + 0.120489840993E-01 0.120052895708E-01 0.119617008063E-01 0.119182176777E-01 + 0.118748400567E-01 0.118315678153E-01 0.117884008253E-01 0.117453389586E-01 + 0.117023820868E-01 0.116595300821E-01 0.116167828160E-01 0.115741401606E-01 + 0.115316019875E-01 0.114891681688E-01 0.114468385762E-01 0.114046130816E-01 + 0.113624915567E-01 0.113204738735E-01 0.112785599038E-01 0.112367495195E-01 + 0.111950425923E-01 0.111534389941E-01 0.111119385968E-01 0.110705412722E-01 + 0.110292468921E-01 0.109880553284E-01 0.109469664530E-01 0.109059801376E-01 + 0.108650962541E-01 0.108243146744E-01 0.107836352703E-01 0.107430579136E-01 + 0.107025824762E-01 0.106622088300E-01 0.106219368467E-01 0.105817663982E-01 + 0.105416973563E-01 0.105017295930E-01 0.104618629800E-01 0.104220973891E-01 + 0.103824326923E-01 0.103428687614E-01 0.103034054681E-01 0.102640426844E-01 + 0.102247802821E-01 0.101856181330E-01 0.101465561090E-01 0.101075940819E-01 + 0.100687319236E-01 0.100299695059E-01 0.999130670056E-02 0.995274337955E-02 + 0.991427941467E-02 0.987591467776E-02 0.983764904066E-02 0.979948237521E-02 + 0.976141455325E-02 0.972344544664E-02 0.968557492720E-02 0.964780286679E-02 + 0.961012913724E-02 0.957255361040E-02 0.953507615810E-02 0.949769665220E-02 + 0.946041496453E-02 0.942323096694E-02 0.938614453127E-02 0.934915552935E-02 + 0.931226383304E-02 0.927546931417E-02 0.923877184459E-02 0.920217129613E-02 + 0.916566754065E-02 0.912926044999E-02 0.909294989597E-02 0.905673575046E-02 + 0.902061788528E-02 0.898459617229E-02 0.894867048332E-02 0.891284069022E-02 + 0.887710666483E-02 0.884146827899E-02 0.880592540454E-02 0.877047791333E-02 + 0.873512567720E-02 0.869986856799E-02 0.866470645754E-02 0.862963921769E-02 + 0.859466672029E-02 0.855978883718E-02 0.852500544020E-02 0.849031640120E-02 + 0.845572159201E-02 0.842122088448E-02 0.838681415044E-02 0.835250126176E-02 + 0.831828209025E-02 0.828415650777E-02 0.825012438617E-02 0.821618559727E-02 + 0.818234001293E-02 0.814858750498E-02 0.811492794527E-02 0.808136120564E-02 + 0.804788715793E-02 0.801450567399E-02 0.798121662566E-02 0.794801988477E-02 + 0.791491532317E-02 0.788190281271E-02 0.784898222523E-02 0.781615343256E-02 + 0.778341630655E-02 0.775077071905E-02 0.771821654189E-02 0.768575364692E-02 + 0.765338190598E-02 0.762110119090E-02 0.758891137355E-02 0.755681232574E-02 + 0.752480391934E-02 0.749288602618E-02 0.746105851810E-02 0.742932126694E-02 + 0.739767414455E-02 0.736611702277E-02 0.733464977344E-02 0.730327226841E-02 + 0.727198437951E-02 0.724078597859E-02 0.720967693749E-02 0.717865712805E-02 + 0.714772642212E-02 0.711688469153E-02 0.708613180813E-02 0.705546764377E-02 + 0.702489207028E-02 0.699440495950E-02 0.696400618329E-02 0.693369561347E-02 + 0.690347312190E-02 0.687333858041E-02 0.684329186085E-02 0.681333283505E-02 + 0.678346137487E-02 0.675367735215E-02 0.672398063872E-02 0.669437110642E-02 + 0.666484862711E-02 0.663541307262E-02 0.660606431480E-02 0.657680222548E-02 + 0.654762667651E-02 0.651853753974E-02 0.648953468699E-02 0.646061799013E-02 + 0.643178732098E-02 0.640304255139E-02 0.637438355321E-02 0.634581019827E-02 + 0.631732235842E-02 0.628891990549E-02 0.626060271134E-02 0.623237064780E-02 + 0.620422358672E-02 0.617616139994E-02 0.614818395930E-02 0.612029113664E-02 + 0.609248280380E-02 0.606475883264E-02 0.603711909498E-02 0.600956346267E-02 + 0.598209180756E-02 0.595470400149E-02 0.592739991629E-02 0.590017942381E-02 + 0.587304239590E-02 0.584598870439E-02 0.581901822113E-02 0.579213081796E-02 + 0.576532636672E-02 0.573860473925E-02 0.571196580740E-02 0.568540944301E-02 + 0.565893551792E-02 0.563254390397E-02 0.560623447301E-02 0.558000709687E-02 + 0.555386164741E-02 0.552779799646E-02 0.550181601586E-02 0.547591557745E-02 + 0.545009655309E-02 0.542435881460E-02 0.539870223384E-02 0.537312668265E-02 + 0.534763203286E-02 0.532221815632E-02 0.529688492487E-02 0.527163221036E-02 + 0.524645988462E-02 0.522136781950E-02 0.519635588685E-02 0.517142395849E-02 + 0.514657190628E-02 0.512179960206E-02 0.509710691767E-02 0.507249372495E-02 + 0.504795989574E-02 0.502350530190E-02 0.499912981524E-02 0.497483330763E-02 + 0.495061565091E-02 0.492647671691E-02 0.490241637747E-02 0.487843450445E-02 + 0.485453096968E-02 0.483070564500E-02 0.480695840226E-02 0.478328911329E-02 + 0.475969764995E-02 0.473618388407E-02 0.471274768750E-02 0.468938893207E-02 + 0.466610748963E-02 0.464290323203E-02 0.461977603110E-02 0.459672575869E-02 + 0.457375228663E-02 0.455085548678E-02 0.452803523097E-02 0.450529139104E-02 + 0.448262383884E-02 0.446003244621E-02 0.443751708500E-02 0.441507762704E-02 + 0.439271394417E-02 0.437042590825E-02 0.434821339110E-02 0.432607626458E-02 + 0.430401440052E-02 0.428202767077E-02 0.426011594717E-02 0.423827910157E-02 + 0.421651700579E-02 0.419482953170E-02 0.417321655112E-02 0.415167793590E-02 + 0.413021355789E-02 0.410882328892E-02 0.408750700084E-02 0.406626456549E-02 + 0.404509585471E-02 0.402400074035E-02 0.400297909424E-02 0.398203078824E-02 + 0.396115569417E-02 0.394035368389E-02 0.391962462923E-02 0.389896840204E-02 + 0.387838487416E-02 0.385787391743E-02 0.383743540369E-02 0.381706920480E-02 + 0.379677519258E-02 0.377655323888E-02 0.375640321555E-02 0.373632499442E-02 + 0.371631844734E-02 0.369638344615E-02 0.367651986269E-02 0.365672756881E-02 + 0.363700643634E-02 0.361735633713E-02 0.359777714303E-02 0.357826872586E-02 + 0.355883095749E-02 0.353946370974E-02 0.352016685446E-02 0.350094026349E-02 + 0.348178380868E-02 0.346269736186E-02 0.344368079488E-02 0.342473397959E-02 + 0.340585678781E-02 0.338704909141E-02 0.336831076221E-02 0.334964167206E-02 + 0.333104169280E-02 0.331251069628E-02 0.329404855434E-02 0.327565513881E-02 + 0.325733032154E-02 0.323907397438E-02 0.322088596917E-02 0.320276617774E-02 + 0.318471447194E-02 0.316673072362E-02 0.314881480461E-02 0.313096658675E-02 + 0.311318594190E-02 0.309547274189E-02 0.307782685856E-02 0.306024816375E-02 + 0.304273652932E-02 0.302529182709E-02 0.300791392892E-02 0.299060270664E-02 + 0.297335803210E-02 0.295617977713E-02 0.293906781359E-02 0.292202201332E-02 + 0.290504224814E-02 0.288812838992E-02 0.287128031049E-02 0.285449788169E-02 + 0.283778097536E-02 0.282112946335E-02 0.280454321750E-02 0.278802210965E-02 + 0.277156601165E-02 0.275517479533E-02 0.273884833254E-02 0.272258649512E-02 + 0.270638915491E-02 0.269025618375E-02 0.267418745350E-02 0.265818283598E-02 + 0.264224220304E-02 0.262636542653E-02 0.261055237829E-02 0.259480293015E-02 + 0.257911695396E-02 0.256349432157E-02 0.254793490481E-02 0.253243857552E-02 + 0.251700520556E-02 0.250163466676E-02 0.248632683096E-02 0.247108157000E-02 + 0.245589875574E-02 0.244077826001E-02 0.242571995464E-02 0.241072371150E-02 + 0.239578940241E-02 0.238091689922E-02 0.236610607377E-02 0.235135679790E-02 + 0.233666894347E-02 0.232204238230E-02 0.230747698623E-02 0.229297262713E-02 + 0.227852917681E-02 0.226414650714E-02 0.224982448994E-02 0.223556299707E-02 + 0.222136190036E-02 0.220722107165E-02 0.219314038280E-02 0.217911970563E-02 + 0.216515891200E-02 0.215125787374E-02 0.213741646270E-02 0.212363455072E-02 + 0.210991200964E-02 0.209624871130E-02 0.208264452755E-02 0.206909933023E-02 + 0.205561299118E-02 0.204218538224E-02 0.202881637526E-02 0.201550584207E-02 + 0.200225365453E-02 0.198905968446E-02 0.197592380372E-02 0.196284588415E-02 + 0.194982579758E-02 0.193686341586E-02 0.192395861084E-02 0.191111125435E-02 + 0.189832121824E-02 0.188558837435E-02 0.187291259452E-02 0.186029375060E-02 + 0.184773171442E-02 0.183522635783E-02 0.182277755267E-02 0.181038517078E-02 + 0.179804908401E-02 0.178576916419E-02 0.177354528318E-02 0.176137731280E-02 + 0.174926512492E-02 0.173720859135E-02 0.172520758396E-02 0.171326197457E-02 + 0.170137163504E-02 0.168953643721E-02 0.167775625291E-02 0.166603095399E-02 + 0.165436041229E-02 0.164274449966E-02 0.163118308793E-02 0.161967604895E-02 + 0.160822325457E-02 0.159682457661E-02 0.158547988693E-02 0.157418905737E-02 + 0.156295195977E-02 0.155176846597E-02 0.154063844781E-02 0.152956177714E-02 + 0.151853832580E-02 0.150756796563E-02 0.149665056847E-02 0.148578600617E-02 + 0.147497415057E-02 0.146421487350E-02 0.145350804682E-02 0.144285354236E-02 + 0.143225123197E-02 0.142170098748E-02 0.141120268075E-02 0.140075618361E-02 + 0.139036136791E-02 0.138001810548E-02 0.136972626817E-02 0.135948572783E-02 + 0.134929635629E-02 0.133915802539E-02 0.132907060699E-02 0.131903397291E-02 + 0.130904799501E-02 0.129911254512E-02 0.128922749509E-02 0.127939271676E-02 + 0.126960808198E-02 0.125987346257E-02 0.125018873040E-02 0.124055375729E-02 + 0.123096841509E-02 0.122143257565E-02 0.121194611080E-02 0.120250889239E-02 + 0.119312079226E-02 0.118378168225E-02 0.117449143420E-02 0.116524991997E-02 + 0.115605701138E-02 0.114691258028E-02 0.113781649851E-02 0.112876863792E-02 + 0.111976887035E-02 0.111081706764E-02 0.110191310163E-02 0.109305684416E-02 + 0.108424816709E-02 0.107548694224E-02 0.106677304146E-02 0.105810633659E-02 + 0.104948669948E-02 0.104091400197E-02 0.103238811590E-02 0.102390891310E-02 + 0.101547626544E-02 0.100709004474E-02 0.998750122849E-03 0.990456371609E-03 + 0.982208662863E-03 0.974006868452E-03 0.965850860219E-03 0.957740510006E-03 + 0.949675689656E-03 0.941656271009E-03 0.933682125910E-03 0.925753126199E-03 + 0.917869143719E-03 0.910030050313E-03 0.902235717823E-03 0.894486018090E-03 + 0.886780822957E-03 0.879120004267E-03 0.871503433861E-03 0.863930983581E-03 + 0.856402525271E-03 0.848917930772E-03 0.841477071926E-03 0.834079820576E-03 + 0.826726048564E-03 0.819415627732E-03 0.812148429922E-03 0.804924326977E-03 + 0.797743190738E-03 0.790604893049E-03 0.783509305750E-03 0.776456300685E-03 + 0.769445749696E-03 0.762477524625E-03 0.755551497314E-03 0.748667539605E-03 + 0.741825523341E-03 0.735025320364E-03 0.728266802515E-03 0.721549841638E-03 + 0.714874309575E-03 0.708240078167E-03 0.701647019257E-03 0.695095004688E-03 + 0.688583906300E-03 0.682113595938E-03 0.675683945442E-03 0.669294826655E-03 + 0.662946111420E-03 0.656637671578E-03 0.650369378972E-03 0.644141105444E-03 + 0.637952722837E-03 0.631804102991E-03 0.625695117751E-03 0.619625638957E-03 + 0.613595538453E-03 0.607604688079E-03 0.601652959680E-03 0.595740225096E-03 + 0.589866356170E-03 0.584031224745E-03 0.578234702662E-03 0.572476661764E-03 + 0.566756973893E-03 0.561075510891E-03 0.555432144600E-03 0.549826746863E-03 + 0.544259189522E-03 0.538729344419E-03 0.533237083396E-03 0.527782278296E-03 + 0.522364800961E-03 0.516984523233E-03 0.511641316954E-03 0.506335053966E-03 + 0.501065606112E-03 0.495832845234E-03 0.490636643174E-03 0.485476871775E-03 + 0.480353402878E-03 0.475266108326E-03 0.470214859961E-03 0.465199529625E-03 + 0.460219989161E-03 0.455276110411E-03 0.450367765216E-03 0.445494825420E-03 + 0.440657162864E-03 0.435854649391E-03 0.431087156843E-03 0.426354557061E-03 + 0.421656721890E-03 0.416993523169E-03 0.412364832743E-03 0.407770522452E-03 + 0.403210464140E-03 0.398684529648E-03 0.394192590819E-03 0.389734519495E-03 + 0.385310187518E-03 0.380919466730E-03 0.376562228974E-03 0.372238346092E-03 + 0.367947689926E-03 0.363690132318E-03 0.359465545111E-03 0.355273800146E-03 + 0.351114769267E-03 0.346988324314E-03 0.342894337131E-03 0.338832679560E-03 + 0.334803223443E-03 0.330805840621E-03 0.326840402938E-03 0.322906782236E-03 + 0.319004850356E-03 0.315134479142E-03 0.311295540435E-03 0.307487906077E-03 + 0.303711447911E-03 0.299966037778E-03 0.296251547522E-03 0.292567848985E-03 + 0.288914814008E-03 0.285292314433E-03 0.281700222104E-03 0.278138408862E-03 + 0.274606746550E-03 0.271105107010E-03 0.267633362083E-03 0.264191383613E-03 + 0.260779043441E-03 0.257396213409E-03 0.254042765361E-03 0.250718571138E-03 + 0.247423502582E-03 0.244157431536E-03 0.240920229841E-03 0.237711769340E-03 + 0.234531921876E-03 0.231380559290E-03 0.228257553425E-03 0.225162776123E-03 + 0.222096099226E-03 0.219057394577E-03 0.216046534017E-03 0.213063389389E-03 + 0.210107832535E-03 0.207179735297E-03 0.204278969518E-03 0.201405407039E-03 + 0.198558919704E-03 0.195739379354E-03 0.192946657831E-03 0.190180626978E-03 + 0.187441158636E-03 0.184728124649E-03 0.182041396859E-03 0.179380847106E-03 + 0.176746347235E-03 0.174137769087E-03 0.171554984504E-03 0.168997865328E-03 + 0.166466283402E-03 0.163960110568E-03 0.161479218669E-03 0.159023479545E-03 + 0.156592765040E-03 0.154186946997E-03 0.151805897256E-03 0.149449487660E-03 + 0.147117590052E-03 0.144810076274E-03 0.142526818168E-03 0.140267687576E-03 + 0.138032556340E-03 0.135821296304E-03 0.133633779308E-03 0.131469877195E-03 + 0.129329461807E-03 0.127212404988E-03 0.125118578578E-03 0.123047854419E-03 + 0.121000104356E-03 0.118975200228E-03 0.116973013880E-03 0.114993417152E-03 + 0.113036281888E-03 0.111101479929E-03 0.109188883118E-03 0.107298363296E-03 + 0.105429792307E-03 0.103583041992E-03 0.101757984193E-03 0.999544907532E-04 + 0.981724335144E-04 0.964116843188E-04 0.946721150087E-04 0.929535974262E-04 + 0.912560034137E-04 0.895792048133E-04 0.879230734673E-04 0.862874812178E-04 + 0.846722999072E-04 0.830774013776E-04 0.815026574713E-04 0.799479400305E-04 + 0.784131208974E-04 0.768980719143E-04 0.754026649234E-04 0.739267717669E-04 + 0.724702642870E-04 0.710330143259E-04 0.696148937260E-04 0.682157743294E-04 + 0.668355279784E-04 0.654740265151E-04 0.641311417818E-04 0.628067456207E-04 + 0.615007098741E-04 0.602129063842E-04 0.589432069932E-04 0.576914835434E-04 + 0.564576078769E-04 0.552414518360E-04 0.540428872630E-04 0.528617860000E-04 + 0.516980198892E-04 0.505514607730E-04 0.494219804935E-04 0.483094508930E-04 + 0.472137438136E-04 0.461347310977E-04 0.450722845874E-04 0.440262761250E-04 + 0.429965775527E-04 0.419830607127E-04 0.409855974473E-04 0.400040595987E-04 + 0.390383190090E-04 0.380882475206E-04 0.371537169757E-04 0.362345992165E-04 + 0.353307660851E-04 0.344420894240E-04 0.335684410752E-04 0.327096928810E-04 + 0.318657166836E-04 0.310363843253E-04 0.302215676483E-04 0.294211384947E-04 + 0.286349687070E-04 0.278629301272E-04 0.271048945975E-04 0.263607339604E-04 + 0.256303200578E-04 0.249135247322E-04 0.242102198256E-04 0.235202771804E-04 + 0.228435686387E-04 0.221799660428E-04 0.215293412350E-04 0.208915660573E-04 + 0.202665123522E-04 0.196540519617E-04 0.190540567282E-04 0.184663984938E-04 + 0.178909491008E-04 0.173275803915E-04 0.167761642079E-04 0.162365723924E-04 + 0.157086767872E-04 0.151923492346E-04 0.146874615766E-04 0.141938856557E-04 + 0.137114933139E-04 0.132401563936E-04 0.127797467369E-04 0.123301361861E-04 + 0.118911965834E-04 0.114627997711E-04 0.110448175913E-04 0.106371218863E-04 + 0.102395844984E-04 0.985207726966E-05 0.947447204242E-05 0.910664065889E-05 + 0.874845496129E-05 0.839978679184E-05 0.806050799279E-05 0.773049040635E-05 + 0.740960587474E-05 0.709772624021E-05 0.679472334497E-05 0.650046903126E-05 + 0.621483514130E-05 0.593769351732E-05 0.566891600154E-05 0.540837443620E-05 + 0.515594066352E-05 0.491148652573E-05 0.467488386506E-05 0.444600452373E-05 + 0.422472034397E-05 0.401090316802E-05 0.380442483808E-05 0.360515719641E-05 + 0.341297208521E-05 0.322774134673E-05 0.304933682318E-05 0.287763035679E-05 + 0.271249378980E-05 0.255379896443E-05 0.240141772290E-05 0.225522190745E-05 + 0.211508336030E-05 0.198087392369E-05 0.185246543982E-05 0.172972975095E-05 + 0.161253869928E-05 0.150076412706E-05 0.139427787650E-05 0.129295178984E-05 + 0.119665770930E-05 0.110526747711E-05 0.101865293550E-05 0.936685926697E-06 + 0.859238292923E-06 0.786181876410E-06 0.717388519384E-06 0.652730064074E-06 + 0.592078352706E-06 0.535305227509E-06 0.482282530710E-06 0.432882104536E-06 + 0.386975791215E-06 0.344435432975E-06 0.305132872043E-06 0.268939950646E-06 + 0.235728511013E-06 0.205370395370E-06 0.177737445946E-06 0.152701504967E-06 + 0.130134414661E-06 0.109908017257E-06 0.918941549802E-07 0.759646700597E-07 + 0.619914047227E-07 0.498462011967E-07 0.394009017091E-07 0.305273484876E-07 + 0.230973837597E-07 0.169828497529E-07 0.120555886948E-07 0.818744281291E-08 + 0.525025433473E-08 0.311586548782E-08 0.165611849973E-08 0.742855597978E-09 + 0.247919010117E-09 0.431509636804E-10 0.393686205880E-12 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 74 183.84999999999999 3.1652000100000000 bcc + 0.000000000000E+00 -0.379554120012E+00 -0.532635781715E+00 -0.648457138173E+00 + -0.744991141384E+00 -0.829199462989E+00 -0.904652472039E+00 -0.973471131520E+00 + -0.103703736615E+01 -0.109631106412E+01 -0.115199111417E+01 -0.120460512085E+01 + -0.125456298043E+01 -0.130219066186E+01 -0.134775245955E+01 -0.139146618996E+01 + -0.143351388821E+01 -0.147404953342E+01 -0.151320475330E+01 -0.155109311883E+01 + -0.158781343278E+01 -0.162345228612E+01 -0.165808607214E+01 -0.169178259253E+01 + -0.172460235224E+01 -0.175659961366E+01 -0.178782326280E+01 -0.181831752676E+01 + -0.184812257256E+01 -0.187727501060E+01 -0.190580832050E+01 -0.193375321360E+01 + -0.196113794318E+01 -0.198798857136E+01 -0.201432919993E+01 -0.204018217072E+01 + -0.206556824047E+01 -0.209050673391E+01 -0.211501567839E+01 -0.213911192265E+01 + -0.216281124193E+01 -0.218612843138E+01 -0.220907738922E+01 -0.223167119110E+01 + -0.225392215666E+01 -0.227584190936E+01 -0.229744143034E+01 -0.231873110704E+01 + -0.233972077717E+01 -0.236041976864E+01 -0.238083693577E+01 -0.240098069228E+01 + -0.242085904140E+01 -0.244047960336E+01 -0.245984964059E+01 -0.247897608079E+01 + -0.249786553813E+01 -0.251652433279E+01 -0.253495850892E+01 -0.255317385123E+01 + -0.257117590031E+01 -0.258896996683E+01 -0.260656114467E+01 -0.262395432311E+01 + -0.264115419817E+01 -0.265816528311E+01 -0.267499191825E+01 -0.269163828011E+01 + -0.270810838995E+01 -0.272440612169E+01 -0.274053520941E+01 -0.275649925427E+01 + -0.277230173108E+01 -0.278794599439E+01 -0.280343528427E+01 -0.281877273166E+01 + -0.283396136349E+01 -0.284900410746E+01 -0.286390379647E+01 -0.287866317293E+01 + -0.289328489275E+01 -0.290777152906E+01 -0.292212557584E+01 -0.293634945124E+01 + -0.295044550080E+01 -0.296441600045E+01 -0.297826315938E+01 -0.299198912274E+01 + -0.300559597420E+01 -0.301908573840E+01 -0.303246038329E+01 -0.304572182227E+01 + -0.305887191634E+01 -0.307191247604E+01 -0.308484526340E+01 -0.309767199367E+01 + -0.311039433710E+01 -0.312301392057E+01 -0.313553232911E+01 -0.314795110743E+01 + -0.316027176131E+01 -0.317249575901E+01 -0.318462453250E+01 -0.319665947877E+01 + -0.320860196096E+01 -0.322045330953E+01 -0.323221482333E+01 -0.324388777065E+01 + -0.325547339023E+01 -0.326697289216E+01 -0.327838745889E+01 -0.328971824602E+01 + -0.330096638318E+01 -0.331213297488E+01 -0.332321910119E+01 -0.333422581859E+01 + -0.334515416063E+01 -0.335600513861E+01 -0.336677974230E+01 -0.337747894052E+01 + -0.338810368179E+01 -0.339865489492E+01 -0.340913348954E+01 -0.341954035669E+01 + -0.342987636936E+01 -0.344014238293E+01 -0.345033923575E+01 -0.346046774953E+01 + -0.347052872986E+01 -0.348052296663E+01 -0.349045123443E+01 -0.350031429300E+01 + -0.351011288759E+01 -0.351984774939E+01 -0.352951959584E+01 -0.353912913105E+01 + -0.354867704609E+01 -0.355816401936E+01 -0.356759071690E+01 -0.357695779270E+01 + -0.358626588903E+01 -0.359551563669E+01 -0.360470765533E+01 -0.361384255368E+01 + -0.362292092989E+01 -0.363194337170E+01 -0.364091045678E+01 -0.364982275287E+01 + -0.365868081813E+01 -0.366748520125E+01 -0.367623644178E+01 -0.368493507025E+01 + -0.369358160845E+01 -0.370217656960E+01 -0.371072045852E+01 -0.371921377188E+01 + -0.372765699833E+01 -0.373605061872E+01 -0.374439510624E+01 -0.375269092661E+01 + -0.376093853825E+01 -0.376913839240E+01 -0.377729093333E+01 -0.378539659846E+01 + -0.379345581850E+01 -0.380146901761E+01 -0.380943661354E+01 -0.381735901774E+01 + -0.382523663554E+01 -0.383306986622E+01 -0.384085910316E+01 -0.384860473399E+01 + -0.385630714066E+01 -0.386396669958E+01 -0.387158378173E+01 -0.387915875278E+01 + -0.388669197315E+01 -0.389418379818E+01 -0.390163457818E+01 -0.390904465856E+01 + -0.391641437991E+01 -0.392374407809E+01 -0.393103408432E+01 -0.393828472529E+01 + -0.394549632323E+01 -0.395266919600E+01 -0.395980365716E+01 -0.396690001608E+01 + -0.397395857798E+01 -0.398097964403E+01 -0.398796351142E+01 -0.399491047346E+01 + -0.400182081960E+01 -0.400869483552E+01 -0.401553280323E+01 -0.402233500109E+01 + -0.402910170390E+01 -0.403583318297E+01 -0.404252970616E+01 -0.404919153796E+01 + -0.405581893952E+01 -0.406241216876E+01 -0.406897148039E+01 -0.407549712595E+01 + -0.408198935390E+01 -0.408844840967E+01 -0.409487453567E+01 -0.410126797142E+01 + -0.410762895350E+01 -0.411395771567E+01 -0.412025448891E+01 -0.412651950144E+01 + -0.413275297878E+01 -0.413895514380E+01 -0.414512621674E+01 -0.415126641529E+01 + -0.415737595461E+01 -0.416345504735E+01 -0.416950390374E+01 -0.417552273160E+01 + -0.418151173636E+01 -0.418747112113E+01 -0.419340108672E+01 -0.419930183170E+01 + -0.420517355240E+01 -0.421101644295E+01 -0.421683069535E+01 -0.422261649947E+01 + -0.422837404308E+01 -0.423410351191E+01 -0.423980508964E+01 -0.424547895800E+01 + -0.425112529670E+01 -0.425674428356E+01 -0.426233609447E+01 -0.426790090345E+01 + -0.427343888267E+01 -0.427895020249E+01 -0.428443503145E+01 -0.428989353633E+01 + -0.429532588219E+01 -0.430073223235E+01 -0.430611274843E+01 -0.431146759040E+01 + -0.431679691659E+01 -0.432210088369E+01 -0.432737964681E+01 -0.433263335946E+01 + -0.433786217363E+01 -0.434306623977E+01 -0.434824570680E+01 -0.435340072218E+01 + -0.435853143188E+01 -0.436363798045E+01 -0.436872051098E+01 -0.437377916518E+01 + -0.437881408336E+01 -0.438382540446E+01 -0.438881326608E+01 -0.439377780447E+01 + -0.439871915459E+01 -0.440363745008E+01 -0.440853282332E+01 -0.441340540542E+01 + -0.441825532623E+01 -0.442308271440E+01 -0.442788769735E+01 -0.443267040131E+01 + -0.443743095132E+01 -0.444216947127E+01 -0.444688608388E+01 -0.445158091075E+01 + -0.445625407236E+01 -0.446090568807E+01 -0.446553587616E+01 -0.447014475382E+01 + -0.447473243720E+01 -0.447929904138E+01 -0.448384468039E+01 -0.448836946726E+01 + -0.449287351400E+01 -0.449735693161E+01 -0.450181983013E+01 -0.450626231859E+01 + -0.451068450508E+01 -0.451508649674E+01 -0.451946839976E+01 -0.452383031942E+01 + -0.452817236006E+01 -0.453249462513E+01 -0.453679721718E+01 -0.454108023788E+01 + -0.454534378804E+01 -0.454958796758E+01 -0.455381287559E+01 -0.455801861031E+01 + -0.456220526915E+01 -0.456637294869E+01 -0.457052174471E+01 -0.457465175219E+01 + -0.457876306529E+01 -0.458285577742E+01 -0.458692998119E+01 -0.459098576846E+01 + -0.459502323032E+01 -0.459904245713E+01 -0.460304353848E+01 -0.460702656325E+01 + -0.461099161961E+01 -0.461493879497E+01 -0.461886817608E+01 -0.462277984898E+01 + -0.462667389898E+01 -0.463055041077E+01 -0.463440946832E+01 -0.463825115493E+01 + -0.464207555328E+01 -0.464588274535E+01 -0.464967281250E+01 -0.465344583545E+01 + -0.465720189427E+01 -0.466094106843E+01 -0.466466343676E+01 -0.466836907749E+01 + -0.467205806825E+01 -0.467573048606E+01 -0.467938640735E+01 -0.468302590796E+01 + -0.468664906317E+01 -0.469025594766E+01 -0.469384663557E+01 -0.469742120045E+01 + -0.470097971533E+01 -0.470452225265E+01 -0.470804888434E+01 -0.471155968178E+01 + -0.471505471581E+01 -0.471853405675E+01 -0.472199777440E+01 -0.472544593805E+01 + -0.472887861647E+01 -0.473229587793E+01 -0.473569779018E+01 -0.473908442051E+01 + -0.474245583569E+01 -0.474581210203E+01 -0.474915328534E+01 -0.475247945096E+01 + -0.475579066377E+01 -0.475908698816E+01 -0.476236848809E+01 -0.476563522703E+01 + -0.476888726804E+01 -0.477212467370E+01 -0.477534750614E+01 -0.477855582709E+01 + -0.478174969782E+01 -0.478492917916E+01 -0.478809433153E+01 -0.479124521494E+01 + -0.479438188895E+01 -0.479750441274E+01 -0.480061284506E+01 -0.480370724425E+01 + -0.480678766828E+01 -0.480985417468E+01 -0.481290682061E+01 -0.481594566285E+01 + -0.481897075777E+01 -0.482198216137E+01 -0.482497992926E+01 -0.482796411669E+01 + -0.483093477854E+01 -0.483389196929E+01 -0.483683574310E+01 -0.483976615373E+01 + -0.484268325460E+01 -0.484558709878E+01 -0.484847773897E+01 -0.485135522754E+01 + -0.485421961650E+01 -0.485707095754E+01 -0.485990930197E+01 -0.486273470082E+01 + -0.486554720474E+01 -0.486834686407E+01 -0.487113372882E+01 -0.487390784869E+01 + -0.487666927304E+01 -0.487941805091E+01 -0.488215423104E+01 -0.488487786186E+01 + -0.488758899147E+01 -0.489028766769E+01 -0.489297393801E+01 -0.489564784963E+01 + -0.489830944946E+01 -0.490095878410E+01 -0.490359589987E+01 -0.490622084279E+01 + -0.490883365859E+01 -0.491143439272E+01 -0.491402309034E+01 -0.491659979635E+01 + -0.491916455534E+01 -0.492171741165E+01 -0.492425840933E+01 -0.492678759217E+01 + -0.492930500369E+01 -0.493181068713E+01 -0.493430468549E+01 -0.493678704149E+01 + -0.493925779759E+01 -0.494171699599E+01 -0.494416467866E+01 -0.494660088729E+01 + -0.494902566333E+01 -0.495143904797E+01 -0.495384108217E+01 -0.495623180663E+01 + -0.495861126183E+01 -0.496097948797E+01 -0.496333652505E+01 -0.496568241282E+01 + -0.496801719079E+01 -0.497034089823E+01 -0.497265357420E+01 -0.497495525753E+01 + -0.497724598679E+01 -0.497952580037E+01 -0.498179473640E+01 -0.498405283281E+01 + -0.498630012730E+01 -0.498853665735E+01 -0.499076246024E+01 -0.499297757302E+01 + -0.499518203253E+01 -0.499737587540E+01 -0.499955913805E+01 -0.500173185669E+01 + -0.500389406734E+01 -0.500604580579E+01 -0.500818710765E+01 -0.501031800830E+01 + -0.501243854296E+01 -0.501454874661E+01 -0.501664865407E+01 -0.501873829995E+01 + -0.502081771865E+01 -0.502288694441E+01 -0.502494601126E+01 -0.502699495303E+01 + -0.502903380340E+01 -0.503106259582E+01 -0.503308136359E+01 -0.503509013980E+01 + -0.503708895739E+01 -0.503907784908E+01 -0.504105684744E+01 -0.504302598486E+01 + -0.504498529355E+01 -0.504693480553E+01 -0.504887455266E+01 -0.505080456664E+01 + -0.505272487897E+01 -0.505463552101E+01 -0.505653652393E+01 -0.505842791875E+01 + -0.506030973630E+01 -0.506218200727E+01 -0.506404476217E+01 -0.506589803136E+01 + -0.506774184504E+01 -0.506957623322E+01 -0.507140122580E+01 -0.507321685249E+01 + -0.507502314284E+01 -0.507682012627E+01 -0.507860783202E+01 -0.508038628920E+01 + -0.508215552675E+01 -0.508391557347E+01 -0.508566645800E+01 -0.508740820885E+01 + -0.508914085436E+01 -0.509086442274E+01 -0.509257894204E+01 -0.509428444019E+01 + -0.509598094495E+01 -0.509766848396E+01 -0.509934708470E+01 -0.510101677452E+01 + -0.510267758063E+01 -0.510432953009E+01 -0.510597264986E+01 -0.510760696671E+01 + -0.510923250731E+01 -0.511084929820E+01 -0.511245736576E+01 -0.511405673626E+01 + -0.511564743582E+01 -0.511722949045E+01 -0.511880292602E+01 -0.512036776827E+01 + -0.512192404281E+01 -0.512347177513E+01 -0.512501099059E+01 -0.512654171442E+01 + -0.512806397173E+01 -0.512957778752E+01 -0.513108318665E+01 -0.513258019385E+01 + -0.513406883376E+01 -0.513554913087E+01 -0.513702110957E+01 -0.513848479411E+01 + -0.513994020865E+01 -0.514138737722E+01 -0.514282632372E+01 -0.514425707196E+01 + -0.514567964561E+01 -0.514709406826E+01 -0.514850036334E+01 -0.514989855422E+01 + -0.515128866411E+01 -0.515267071614E+01 -0.515404473333E+01 -0.515541073857E+01 + -0.515676875466E+01 -0.515811880428E+01 -0.515946091002E+01 -0.516079509434E+01 + -0.516212137961E+01 -0.516343978810E+01 -0.516475034196E+01 -0.516605306323E+01 + -0.516734797388E+01 -0.516863509576E+01 -0.516991445060E+01 -0.517118606005E+01 + -0.517244994566E+01 -0.517370612887E+01 -0.517495463103E+01 -0.517619547339E+01 + -0.517742867709E+01 -0.517865426320E+01 -0.517987225266E+01 -0.518108266633E+01 + -0.518228552499E+01 -0.518348084930E+01 -0.518466865983E+01 -0.518584897708E+01 + -0.518702182143E+01 -0.518818721317E+01 -0.518934517252E+01 -0.519049571959E+01 + -0.519163887440E+01 -0.519277465689E+01 -0.519390308690E+01 -0.519502418419E+01 + -0.519613796842E+01 -0.519724445918E+01 -0.519834367596E+01 -0.519943563816E+01 + -0.520052036510E+01 -0.520159787603E+01 -0.520266819007E+01 -0.520373132631E+01 + -0.520478730373E+01 -0.520583614121E+01 -0.520687785757E+01 -0.520791247155E+01 + -0.520894000180E+01 -0.520996046687E+01 -0.521097388527E+01 -0.521198027539E+01 + -0.521297965557E+01 -0.521397204404E+01 -0.521495745899E+01 -0.521593591849E+01 + -0.521690744056E+01 -0.521787204313E+01 -0.521882974407E+01 -0.521978056114E+01 + -0.522072451206E+01 -0.522166161445E+01 -0.522259188587E+01 -0.522351534379E+01 + -0.522443200562E+01 -0.522534188868E+01 -0.522624501024E+01 -0.522714138747E+01 + -0.522803103748E+01 -0.522891397732E+01 -0.522979022395E+01 -0.523065979427E+01 + -0.523152270509E+01 -0.523237897318E+01 -0.523322861521E+01 -0.523407164781E+01 + -0.523490808750E+01 -0.523573795078E+01 -0.523656125404E+01 -0.523737801363E+01 + -0.523818824581E+01 -0.523899196679E+01 -0.523978919271E+01 -0.524057993964E+01 + -0.524136422358E+01 -0.524214206046E+01 -0.524291346617E+01 -0.524367845651E+01 + -0.524443704722E+01 -0.524518925399E+01 -0.524593509242E+01 -0.524667457807E+01 + -0.524740772642E+01 -0.524813455291E+01 -0.524885507290E+01 -0.524956930168E+01 + -0.525027725450E+01 -0.525097894653E+01 -0.525167439289E+01 -0.525236360864E+01 + -0.525304660877E+01 -0.525372340821E+01 -0.525439402185E+01 -0.525505846449E+01 + -0.525571675091E+01 -0.525636889578E+01 -0.525701491376E+01 -0.525765481943E+01 + -0.525828862731E+01 -0.525891635186E+01 -0.525953800751E+01 -0.526015360859E+01 + -0.526076316941E+01 -0.526136670421E+01 -0.526196422717E+01 -0.526255575243E+01 + -0.526314129404E+01 -0.526372086604E+01 -0.526429448239E+01 -0.526486215699E+01 + -0.526542390371E+01 -0.526597973634E+01 -0.526652966863E+01 -0.526707371428E+01 + -0.526761188693E+01 -0.526814420017E+01 -0.526867066754E+01 -0.526919130252E+01 + -0.526970611854E+01 -0.527021512900E+01 -0.527071834721E+01 -0.527121578646E+01 + -0.527170745998E+01 -0.527219338095E+01 -0.527267356249E+01 -0.527314801768E+01 + -0.527361675956E+01 -0.527407980111E+01 -0.527453715524E+01 -0.527498883486E+01 + -0.527543485278E+01 -0.527587522180E+01 -0.527630995465E+01 -0.527673906402E+01 + -0.527716256255E+01 -0.527758046284E+01 -0.527799277744E+01 -0.527839951884E+01 + -0.527880069950E+01 -0.527919633183E+01 -0.527958642819E+01 -0.527997100090E+01 + -0.528035006222E+01 -0.528072362438E+01 -0.528109169955E+01 -0.528145429989E+01 + -0.528181143747E+01 -0.528216312434E+01 -0.528250937250E+01 -0.528285019391E+01 + -0.528318560049E+01 -0.528351560410E+01 -0.528384021657E+01 -0.528415944968E+01 + -0.528447331519E+01 -0.528478182477E+01 -0.528508499010E+01 -0.528538282278E+01 + -0.528567533439E+01 -0.528596253645E+01 -0.528624444046E+01 -0.528652105786E+01 + -0.528679240005E+01 -0.528705847841E+01 -0.528731930425E+01 -0.528757488887E+01 + -0.528782524349E+01 -0.528807037934E+01 -0.528831030756E+01 -0.528854503928E+01 + -0.528877458560E+01 -0.528899895754E+01 -0.528921816612E+01 -0.528943222230E+01 + -0.528964113701E+01 -0.528984492115E+01 -0.529004358555E+01 -0.529023714104E+01 + -0.529042559838E+01 -0.529060896832E+01 -0.529078726156E+01 -0.529096048874E+01 + -0.529112866051E+01 -0.529129178744E+01 -0.529144988009E+01 -0.529160294898E+01 + -0.529175100457E+01 -0.529189405730E+01 -0.529203211759E+01 -0.529216519581E+01 + -0.529229330227E+01 -0.529241644729E+01 -0.529253464112E+01 -0.529264789399E+01 + -0.529275621609E+01 -0.529285961758E+01 -0.529295810857E+01 -0.529305169916E+01 + -0.529314039940E+01 -0.529322421930E+01 -0.529330316884E+01 -0.529337725798E+01 + -0.529344649664E+01 -0.529351089469E+01 -0.529357046199E+01 -0.529362520834E+01 + -0.529367514354E+01 -0.529372027733E+01 -0.529376061942E+01 -0.529379617950E+01 + -0.529382696723E+01 -0.529385299221E+01 -0.529387426404E+01 -0.529389079227E+01 + -0.529390258642E+01 -0.529390965598E+01 -0.529391201041E+01 -0.529390965915E+01 + -0.529390261157E+01 -0.529389087705E+01 -0.529387446493E+01 -0.529385338449E+01 + -0.529382764503E+01 -0.529379725577E+01 -0.529376222593E+01 -0.529372256468E+01 + -0.529367828119E+01 -0.529362938456E+01 -0.529357588389E+01 -0.529351778823E+01 + -0.529345510663E+01 -0.529338784807E+01 -0.529331602153E+01 -0.529323963596E+01 + -0.529315870026E+01 -0.529307322332E+01 -0.529298321399E+01 -0.529288868111E+01 + -0.529278963346E+01 -0.529268607983E+01 -0.529257802894E+01 -0.529246548952E+01 + -0.529234847024E+01 -0.529222697976E+01 -0.529210102672E+01 -0.529197061972E+01 + -0.529183576732E+01 -0.529169647807E+01 -0.529155276050E+01 -0.529140462309E+01 + -0.529125207430E+01 -0.529109512259E+01 -0.529093377635E+01 -0.529076804397E+01 + -0.529059793380E+01 -0.529042345419E+01 -0.529024461342E+01 -0.529006141979E+01 + -0.528987388154E+01 -0.528968200690E+01 -0.528948580406E+01 -0.528928528121E+01 + -0.528908044649E+01 -0.528887130802E+01 -0.528865787390E+01 -0.528844015220E+01 + -0.528821815098E+01 -0.528799187824E+01 -0.528776134199E+01 -0.528752655021E+01 + -0.528728751082E+01 -0.528704423177E+01 -0.528679672094E+01 -0.528654498621E+01 + -0.528628903543E+01 -0.528602887642E+01 -0.528576451698E+01 -0.528549596489E+01 + -0.528522322791E+01 -0.528494631375E+01 -0.528466523012E+01 -0.528437998471E+01 + -0.528409058517E+01 -0.528379703914E+01 -0.528349935422E+01 -0.528319753801E+01 + -0.528289159806E+01 -0.528258154193E+01 -0.528226737712E+01 -0.528194911113E+01 + -0.528162675144E+01 -0.528130030550E+01 -0.528096978072E+01 -0.528063518453E+01 + -0.528029652429E+01 -0.527995380737E+01 -0.527960704111E+01 -0.527925623282E+01 + -0.527890138980E+01 -0.527854251933E+01 -0.527817962864E+01 -0.527781272496E+01 + -0.527744181552E+01 -0.527706690748E+01 -0.527668800802E+01 -0.527630512427E+01 + -0.527591826336E+01 -0.527552743239E+01 -0.527513263843E+01 -0.527473388855E+01 + -0.527433118978E+01 -0.527392454914E+01 -0.527351397361E+01 -0.527309947019E+01 + -0.527268104582E+01 -0.527225870743E+01 -0.527183246194E+01 -0.527140231624E+01 + -0.527096827721E+01 -0.527053035169E+01 -0.527008854652E+01 -0.526964286851E+01 + -0.526919332445E+01 -0.526873992112E+01 -0.526828266527E+01 -0.526782156363E+01 + -0.526735662291E+01 -0.526688784982E+01 -0.526641525102E+01 -0.526593883317E+01 + -0.526545860290E+01 -0.526497456684E+01 -0.526448673158E+01 -0.526399510369E+01 + -0.526349968975E+01 -0.526300049629E+01 -0.526249752982E+01 -0.526199079687E+01 + -0.526148030390E+01 -0.526096605739E+01 -0.526044806378E+01 -0.525992632950E+01 + -0.525940086097E+01 -0.525887166457E+01 -0.525833874668E+01 -0.525780211366E+01 + -0.525726177184E+01 -0.525671772755E+01 -0.525616998708E+01 -0.525561855672E+01 + -0.525506344274E+01 -0.525450465138E+01 -0.525394218889E+01 -0.525337606146E+01 + -0.525280627529E+01 -0.525223283657E+01 -0.525165575146E+01 -0.525107502610E+01 + -0.525049066661E+01 -0.524990267911E+01 -0.524931106969E+01 -0.524871584442E+01 + -0.524811700936E+01 -0.524751457056E+01 -0.524690853403E+01 -0.524629890579E+01 + -0.524568569183E+01 -0.524506889812E+01 -0.524444853062E+01 -0.524382459527E+01 + -0.524319709799E+01 -0.524256604470E+01 -0.524193144129E+01 -0.524129329363E+01 + -0.524065160759E+01 -0.524000638900E+01 -0.523935764369E+01 -0.523870537748E+01 + -0.523804959617E+01 -0.523739030552E+01 -0.523672751131E+01 -0.523606121929E+01 + -0.523539143518E+01 -0.523471816470E+01 -0.523404141356E+01 -0.523336118744E+01 + -0.523267749201E+01 -0.523199033293E+01 -0.523129971583E+01 -0.523060564635E+01 + -0.522990813008E+01 -0.522920717262E+01 -0.522850277956E+01 -0.522779495645E+01 + -0.522708370885E+01 -0.522636904228E+01 -0.522565096227E+01 -0.522492947432E+01 + -0.522420458392E+01 -0.522347629655E+01 -0.522274461766E+01 -0.522200955270E+01 + -0.522127110710E+01 -0.522052928628E+01 -0.521978409564E+01 -0.521903554056E+01 + -0.521828362642E+01 -0.521752835858E+01 -0.521676974239E+01 -0.521600778316E+01 + -0.521524248623E+01 -0.521447385689E+01 -0.521370190042E+01 -0.521292662211E+01 + -0.521214802722E+01 -0.521136612098E+01 -0.521058090864E+01 -0.520979239541E+01 + -0.520900058649E+01 -0.520820548709E+01 -0.520740710237E+01 -0.520660543750E+01 + -0.520580049763E+01 -0.520499228790E+01 -0.520418081343E+01 -0.520336607933E+01 + -0.520254809071E+01 -0.520172685263E+01 -0.520090237018E+01 -0.520007464842E+01 + -0.519924369237E+01 -0.519840950709E+01 -0.519757209758E+01 -0.519673146885E+01 + -0.519588762590E+01 -0.519504057370E+01 -0.519419031722E+01 -0.519333686141E+01 + -0.519248021121E+01 -0.519162037156E+01 -0.519075734736E+01 -0.518989114353E+01 + -0.518902176494E+01 -0.518814921649E+01 -0.518727350303E+01 -0.518639462942E+01 + -0.518551260050E+01 -0.518462742110E+01 -0.518373909603E+01 -0.518284763010E+01 + -0.518195302809E+01 -0.518105529479E+01 -0.518015443497E+01 -0.517925045338E+01 + -0.517834335476E+01 -0.517743314385E+01 -0.517651982536E+01 -0.517560340400E+01 + -0.517468388447E+01 -0.517376127145E+01 -0.517283556960E+01 -0.517190678361E+01 + -0.517097491810E+01 -0.517003997771E+01 -0.516910196708E+01 -0.516816089082E+01 + -0.516721675352E+01 -0.516626955978E+01 -0.516531931418E+01 -0.516436602128E+01 + -0.516340968564E+01 -0.516245031180E+01 -0.516148790431E+01 -0.516052246767E+01 + -0.515955400641E+01 -0.515858252501E+01 -0.515760802798E+01 -0.515663051978E+01 + -0.515565000489E+01 -0.515466648776E+01 -0.515367997284E+01 -0.515269046455E+01 + -0.515169796732E+01 -0.515070248556E+01 -0.514970402368E+01 -0.514870258606E+01 + -0.514769817708E+01 -0.514669080111E+01 -0.514568046251E+01 -0.514466716563E+01 + -0.514365091479E+01 -0.514263171434E+01 -0.514160956858E+01 -0.514058448182E+01 + -0.513955645836E+01 -0.513852550247E+01 -0.513749161843E+01 -0.513645481051E+01 + -0.513541508295E+01 -0.513437244001E+01 -0.513332688590E+01 -0.513227842486E+01 + -0.513122706110E+01 -0.513017279882E+01 -0.512911564220E+01 -0.512805559544E+01 + -0.512699266270E+01 -0.512592684814E+01 -0.512485815592E+01 -0.512378659018E+01 + -0.512271215504E+01 -0.512163485464E+01 -0.512055469308E+01 -0.511947167446E+01 + -0.511838580288E+01 -0.511729708242E+01 -0.511620551715E+01 -0.511511111113E+01 + -0.511401386843E+01 -0.511291379307E+01 -0.511181088910E+01 -0.511070516055E+01 + -0.510959661141E+01 -0.510848524571E+01 -0.510737106744E+01 -0.510625408058E+01 + -0.510513428912E+01 -0.510401169701E+01 -0.510288630822E+01 -0.510175812669E+01 + -0.510062715638E+01 -0.509949340120E+01 -0.509835686508E+01 -0.509721755193E+01 + -0.509607546565E+01 -0.509493061014E+01 -0.509378298929E+01 -0.509263260696E+01 + -0.509147946703E+01 -0.509032357336E+01 -0.508916492978E+01 -0.508800354015E+01 + -0.508683940829E+01 -0.508567253802E+01 -0.508450293316E+01 -0.508333059751E+01 + -0.508215553487E+01 -0.508097774902E+01 -0.507979724374E+01 -0.507861402281E+01 + -0.507742808997E+01 -0.507623944899E+01 -0.507504810360E+01 -0.507385405754E+01 + -0.507265731454E+01 -0.507145787832E+01 -0.507025575257E+01 -0.506905094101E+01 + -0.506784344732E+01 -0.506663327519E+01 -0.506542042830E+01 -0.506420491030E+01 + -0.506298672486E+01 -0.506176587563E+01 -0.506054236625E+01 -0.505931620035E+01 + -0.505808738156E+01 -0.505685591349E+01 -0.505562179976E+01 -0.505438504395E+01 + -0.505314564968E+01 -0.505190362051E+01 -0.505065896003E+01 -0.504941167180E+01 + -0.504816175938E+01 -0.504690922633E+01 -0.504565407619E+01 -0.504439631249E+01 + -0.504313593877E+01 -0.504187295853E+01 -0.504060737530E+01 -0.503933919258E+01 + -0.503806841387E+01 -0.503679504265E+01 -0.503551908240E+01 -0.503424053660E+01 + -0.503295940870E+01 -0.503167570218E+01 -0.503038942048E+01 -0.502910056704E+01 + -0.502780914529E+01 -0.502651515867E+01 -0.502521861059E+01 -0.502391950446E+01 + -0.502261784368E+01 -0.502131363166E+01 -0.502000687178E+01 -0.501869756742E+01 + -0.501738572196E+01 -0.501607133877E+01 -0.501475442119E+01 -0.501343497259E+01 + -0.501211299631E+01 -0.501078849568E+01 -0.500946147404E+01 -0.500813193470E+01 + -0.500679988099E+01 -0.500546531621E+01 -0.500412824365E+01 -0.500278866662E+01 + -0.500144658840E+01 -0.500010201226E+01 -0.499875494149E+01 -0.499740537933E+01 + -0.499605332907E+01 -0.499469879393E+01 -0.499334177716E+01 -0.499198228201E+01 + -0.499062031170E+01 -0.498925586945E+01 -0.498788895848E+01 -0.498651958200E+01 + -0.498514774320E+01 -0.498377344528E+01 -0.498239669144E+01 -0.498101748484E+01 + -0.497963582866E+01 -0.497825172608E+01 -0.497686518025E+01 -0.497547619432E+01 + -0.497408477144E+01 -0.497269091474E+01 -0.497129462738E+01 -0.496989591246E+01 + -0.496849477311E+01 -0.496709121244E+01 -0.496568523356E+01 -0.496427683956E+01 + -0.496286603355E+01 -0.496145281860E+01 -0.496003719780E+01 -0.495861917422E+01 + -0.495719875093E+01 -0.495577593098E+01 -0.495435071744E+01 -0.495292311334E+01 + -0.495149312173E+01 -0.495006074564E+01 -0.494862598810E+01 -0.494718885214E+01 + -0.494574934076E+01 -0.494430745698E+01 -0.494286320380E+01 -0.494141658421E+01 + -0.493996760120E+01 -0.493851625777E+01 -0.493706255688E+01 -0.493560650150E+01 + -0.493414809461E+01 -0.493268733915E+01 -0.493122423809E+01 -0.492975879436E+01 + -0.492829101091E+01 -0.492682089068E+01 -0.492534843658E+01 -0.492387365154E+01 + -0.492239653848E+01 -0.492091710031E+01 -0.491943533992E+01 -0.491795126022E+01 + -0.491646486410E+01 -0.491497615444E+01 -0.491348513412E+01 -0.491199180602E+01 + -0.491049617300E+01 -0.490899823793E+01 -0.490749800366E+01 -0.490599547303E+01 + -0.490449064890E+01 -0.490298353410E+01 -0.490147413147E+01 -0.489996244382E+01 + -0.489844847399E+01 -0.489693222478E+01 -0.489541369900E+01 -0.489389289946E+01 + -0.489236982895E+01 -0.489084449027E+01 -0.488931688620E+01 -0.488778701953E+01 + -0.488625489302E+01 -0.488472050944E+01 -0.488318387156E+01 -0.488164498214E+01 + -0.488010384393E+01 -0.487856045967E+01 -0.487701483210E+01 -0.487546696397E+01 + -0.487391685799E+01 -0.487236451690E+01 -0.487080994341E+01 -0.486925314024E+01 + -0.486769411008E+01 -0.486613285566E+01 -0.486456937965E+01 -0.486300368476E+01 + -0.486143577367E+01 -0.485986564905E+01 -0.485829331359E+01 -0.485671876996E+01 + -0.485514202081E+01 -0.485356306881E+01 -0.485198191660E+01 -0.485039856685E+01 + -0.484881302219E+01 -0.484722528525E+01 -0.484563535868E+01 -0.484404324510E+01 + -0.484244894712E+01 -0.484085246737E+01 -0.483925380846E+01 -0.483765297299E+01 + -0.483604996357E+01 -0.483444478279E+01 -0.483283743324E+01 -0.483122791750E+01 + -0.482961623817E+01 -0.482800239780E+01 -0.482638639898E+01 -0.482476824426E+01 + -0.482314793621E+01 -0.482152547739E+01 -0.481990087033E+01 -0.481827411760E+01 + -0.481664522172E+01 -0.481501418523E+01 -0.481338101066E+01 -0.481174570053E+01 + -0.481010825738E+01 -0.480846868370E+01 -0.480682698201E+01 -0.480518315482E+01 + -0.480353720463E+01 -0.480188913392E+01 -0.480023894520E+01 -0.479858664094E+01 + -0.479693222364E+01 -0.479527569575E+01 -0.479361705976E+01 -0.479195631812E+01 + -0.479029347331E+01 -0.478862852778E+01 -0.478696148397E+01 -0.478529234435E+01 + -0.478362111134E+01 -0.478194778738E+01 -0.478027237492E+01 -0.477859487637E+01 + -0.477691529416E+01 -0.477523363072E+01 -0.477354988844E+01 -0.477186406975E+01 + -0.477017617704E+01 -0.476848621272E+01 -0.476679417918E+01 -0.476510007882E+01 + -0.476340391401E+01 -0.476170568715E+01 -0.476000540060E+01 -0.475830305675E+01 + -0.475659865795E+01 -0.475489220657E+01 -0.475318370497E+01 -0.475147315551E+01 + -0.474976056053E+01 -0.474804592238E+01 -0.474632924341E+01 -0.474461052594E+01 + -0.474288977230E+01 -0.474116698484E+01 -0.473944216586E+01 -0.473771531770E+01 + -0.473598644265E+01 -0.473425554304E+01 -0.473252262116E+01 -0.473078767933E+01 + -0.472905071982E+01 -0.472731174495E+01 -0.472557075699E+01 -0.472382775823E+01 + -0.472208275096E+01 -0.472033573743E+01 -0.471858671993E+01 -0.471683570072E+01 + -0.471508268206E+01 -0.471332766622E+01 -0.471157065544E+01 -0.470981165198E+01 + -0.470805065807E+01 -0.470628767597E+01 -0.470452270790E+01 -0.470275575611E+01 + -0.470098682281E+01 -0.469921591024E+01 -0.469744302061E+01 -0.469566815614E+01 + -0.469389131905E+01 -0.469211251153E+01 -0.469033173579E+01 -0.468854899404E+01 + -0.468676428846E+01 -0.468497762126E+01 -0.468318899461E+01 -0.468139841070E+01 + -0.467960587171E+01 -0.467781137981E+01 -0.467601493718E+01 -0.467421654598E+01 + -0.467241620838E+01 -0.467061392653E+01 -0.466880970259E+01 -0.466700353871E+01 + -0.466519543704E+01 -0.466338539972E+01 -0.466157342889E+01 -0.465975952668E+01 + -0.465794369524E+01 -0.465612593667E+01 -0.465430625312E+01 -0.465248464669E+01 + -0.465066111950E+01 -0.464883567367E+01 -0.464700831130E+01 -0.464517903450E+01 + -0.464334784537E+01 -0.464151474600E+01 -0.463967973849E+01 -0.463784282492E+01 + -0.463600400739E+01 -0.463416328796E+01 -0.463232066873E+01 -0.463047615176E+01 + -0.462862973912E+01 -0.462678143288E+01 -0.462493123510E+01 -0.462307914784E+01 + -0.462122517315E+01 -0.461936931309E+01 -0.461751156971E+01 -0.461565194504E+01 + -0.461379044113E+01 -0.461192706001E+01 -0.461006180372E+01 -0.460819467429E+01 + -0.460632567373E+01 -0.460445480408E+01 -0.460258206735E+01 -0.460070746555E+01 + -0.459883100070E+01 -0.459695267480E+01 -0.459507248986E+01 -0.459319044788E+01 + -0.459130655084E+01 -0.458942080076E+01 -0.458753319961E+01 -0.458564374938E+01 + -0.458375245206E+01 -0.458185930962E+01 -0.457996432403E+01 -0.457806749727E+01 + -0.457616883131E+01 -0.457426832812E+01 -0.457236598964E+01 -0.457046181785E+01 + -0.456855581469E+01 -0.456664798211E+01 -0.456473832207E+01 -0.456282683651E+01 + -0.456091352736E+01 -0.455899839656E+01 -0.455708144605E+01 -0.455516267776E+01 + -0.455324209361E+01 -0.455131969553E+01 -0.454939548544E+01 -0.454746946525E+01 + -0.454554163687E+01 -0.454361200222E+01 -0.454168056321E+01 -0.453974732172E+01 + -0.453781227968E+01 -0.453587543896E+01 -0.453393680147E+01 -0.453199636909E+01 + -0.453005414372E+01 -0.452811012722E+01 -0.452616432149E+01 -0.452421672840E+01 + -0.452226734983E+01 -0.452031618763E+01 -0.451836324369E+01 -0.451640851986E+01 + -0.451445201800E+01 -0.451249373997E+01 -0.451053368763E+01 -0.450857186281E+01 + -0.450660826739E+01 -0.450464290318E+01 -0.450267577205E+01 -0.450070687582E+01 + -0.449873621632E+01 -0.449676379540E+01 -0.449478961487E+01 -0.449281367657E+01 + -0.449083598232E+01 -0.448885653392E+01 -0.448687533321E+01 -0.448489238199E+01 + -0.448290768207E+01 -0.448092123525E+01 -0.447893304335E+01 -0.447694310816E+01 + -0.447495143147E+01 -0.447295801509E+01 -0.447096286080E+01 -0.446896597038E+01 + -0.446696734564E+01 -0.446496698833E+01 -0.446296490025E+01 -0.446096108317E+01 + -0.445895553887E+01 -0.445694826910E+01 -0.445493927564E+01 -0.445292856026E+01 + -0.445091612470E+01 -0.444890197073E+01 -0.444688610011E+01 -0.444486851458E+01 + -0.444284921590E+01 -0.444082820580E+01 -0.443880548603E+01 -0.443678105834E+01 + -0.443475492445E+01 -0.443272708610E+01 -0.443069754503E+01 -0.442866630295E+01 + -0.442663336160E+01 -0.442459872269E+01 -0.442256238795E+01 -0.442052435909E+01 + -0.441848463782E+01 -0.441644322586E+01 -0.441440012492E+01 -0.441235533668E+01 + -0.441030886287E+01 -0.440826070518E+01 -0.440621086529E+01 -0.440415934492E+01 + -0.440210614574E+01 -0.440005126945E+01 -0.439799471773E+01 -0.439593649225E+01 + -0.439387659471E+01 -0.439181502678E+01 -0.438975179012E+01 -0.438768688642E+01 + -0.438562031733E+01 -0.438355208453E+01 -0.438148218968E+01 -0.437941063443E+01 + -0.437733742044E+01 -0.437526254937E+01 -0.437318602286E+01 -0.437110784258E+01 + -0.436902801015E+01 -0.436694652723E+01 -0.436486339546E+01 -0.436277861647E+01 + -0.436069219190E+01 -0.435860412337E+01 -0.435651441253E+01 -0.435442306100E+01 + -0.435233007039E+01 -0.435023544234E+01 -0.434813917846E+01 -0.434604128037E+01 + -0.434394174968E+01 -0.434184058800E+01 -0.433973779694E+01 -0.433763337811E+01 + -0.433552733311E+01 -0.433341966353E+01 -0.433131037098E+01 -0.432919945706E+01 + -0.432708692334E+01 -0.432497277144E+01 -0.432285700292E+01 -0.432073961938E+01 + -0.431862062239E+01 -0.431650001355E+01 -0.431437779442E+01 -0.431225396657E+01 + -0.431012853159E+01 -0.430800149104E+01 -0.430587284648E+01 -0.430374259949E+01 + -0.430161075161E+01 -0.429947730442E+01 -0.429734225947E+01 -0.429520561830E+01 + -0.429306738248E+01 -0.429092755355E+01 -0.428878613307E+01 -0.428664312256E+01 + -0.428449852358E+01 -0.428235233765E+01 -0.428020456633E+01 -0.427805521115E+01 + -0.427590427362E+01 -0.427375175530E+01 -0.427159765769E+01 -0.426944198232E+01 + -0.426728473073E+01 -0.426512590442E+01 -0.426296550491E+01 -0.426080353372E+01 + -0.425863999235E+01 -0.425647488233E+01 -0.425430820515E+01 -0.425213996232E+01 + -0.424997015535E+01 -0.424779878573E+01 -0.424562585495E+01 -0.424345136452E+01 + -0.424127531593E+01 -0.423909771067E+01 -0.423691855023E+01 -0.423473783608E+01 + -0.423255556972E+01 -0.423037175263E+01 -0.422818638628E+01 -0.422599947216E+01 + -0.422381101172E+01 -0.422162100645E+01 -0.421942945782E+01 -0.421723636729E+01 + -0.421504173633E+01 -0.421284556639E+01 -0.421064785895E+01 -0.420844861545E+01 + -0.420624783735E+01 -0.420404552610E+01 -0.420184168316E+01 -0.419963630998E+01 + -0.419742940799E+01 -0.419522097865E+01 -0.419301102339E+01 -0.419079954366E+01 + -0.418858654089E+01 -0.418637201652E+01 -0.418415597197E+01 -0.418193840868E+01 + -0.417971932808E+01 -0.417749873160E+01 -0.417527662065E+01 -0.417305299666E+01 + -0.417082786104E+01 -0.416860121522E+01 -0.416637306061E+01 -0.416414339862E+01 + -0.416191223066E+01 -0.415967955814E+01 -0.415744538247E+01 -0.415520970504E+01 + -0.415297252727E+01 -0.415073385055E+01 -0.414849367627E+01 -0.414625200584E+01 + -0.414400884064E+01 -0.414176418207E+01 -0.413951803151E+01 -0.413727039035E+01 + -0.413502125998E+01 -0.413277064178E+01 -0.413051853712E+01 -0.412826494739E+01 + -0.412600987396E+01 -0.412375331820E+01 -0.412149528149E+01 -0.411923576520E+01 + -0.411697477068E+01 -0.411471229932E+01 -0.411244835246E+01 -0.411018293148E+01 + -0.410791603773E+01 -0.410564767256E+01 -0.410337783734E+01 -0.410110653341E+01 + -0.409883376212E+01 -0.409655952483E+01 -0.409428382288E+01 -0.409200665761E+01 + -0.408972803037E+01 -0.408744794250E+01 -0.408516639533E+01 -0.408288339020E+01 + -0.408059892845E+01 -0.407831301141E+01 -0.407602564040E+01 -0.407373681675E+01 + -0.407144654180E+01 -0.406915481687E+01 -0.406686164327E+01 -0.406456702233E+01 + -0.406227095536E+01 -0.405997344368E+01 -0.405767448861E+01 -0.405537409146E+01 + -0.405307225353E+01 -0.405076897614E+01 -0.404846426059E+01 -0.404615810819E+01 + -0.404385052023E+01 -0.404154149802E+01 -0.403923104286E+01 -0.403691915604E+01 + -0.403460583885E+01 -0.403229109259E+01 -0.402997491855E+01 -0.402765731802E+01 + -0.402533829228E+01 -0.402301784262E+01 -0.402069597032E+01 -0.401837267666E+01 + -0.401604796292E+01 -0.401372183038E+01 -0.401139428031E+01 -0.400906531399E+01 + -0.400673493268E+01 -0.400440313766E+01 -0.400206993019E+01 -0.399973531154E+01 + -0.399739928297E+01 -0.399506184574E+01 -0.399272300112E+01 -0.399038275036E+01 + -0.398804109471E+01 -0.398569803544E+01 -0.398335357379E+01 -0.398100771102E+01 + -0.397866044836E+01 -0.397631178708E+01 -0.397396172841E+01 -0.397161027360E+01 + -0.396925742389E+01 -0.396690318051E+01 -0.396454754471E+01 -0.396219051773E+01 + -0.395983210078E+01 -0.395747229512E+01 -0.395511110196E+01 -0.395274852254E+01 + -0.395038455807E+01 -0.394801920980E+01 -0.394565247894E+01 -0.394328436671E+01 + -0.394091487432E+01 -0.393854400301E+01 -0.393617175398E+01 -0.393379812845E+01 + -0.393142312763E+01 -0.392904675273E+01 -0.392666900496E+01 -0.392428988553E+01 + -0.392190939564E+01 -0.391952753649E+01 -0.391714430929E+01 -0.391475971523E+01 + -0.391237375553E+01 -0.390998643136E+01 -0.390759774392E+01 -0.390520769442E+01 + -0.390281628404E+01 -0.390042351396E+01 -0.389802938538E+01 -0.389563389949E+01 + -0.389323705746E+01 -0.389083886048E+01 -0.388843930973E+01 -0.388603840639E+01 + -0.388363615163E+01 -0.388123254664E+01 -0.387882759259E+01 -0.387642129064E+01 + -0.387401364197E+01 -0.387160464775E+01 -0.386919430915E+01 -0.386678262732E+01 + -0.386436960344E+01 -0.386195523867E+01 -0.385953953416E+01 -0.385712249108E+01 + -0.385470411058E+01 -0.385228439382E+01 -0.384986334195E+01 -0.384744095613E+01 + -0.384501723750E+01 -0.384259218721E+01 -0.384016580642E+01 -0.383773809626E+01 + -0.383530905788E+01 -0.383287869242E+01 -0.383044700102E+01 -0.382801398483E+01 + -0.382557964498E+01 -0.382314398260E+01 -0.382070699882E+01 -0.381826869479E+01 + -0.381582907164E+01 -0.381338813048E+01 -0.381094587245E+01 -0.380850229868E+01 + -0.380605741029E+01 -0.380361120840E+01 -0.380116369413E+01 -0.379871486860E+01 + -0.379626473294E+01 -0.379381328825E+01 -0.379136053566E+01 -0.378890647627E+01 + -0.378645111120E+01 -0.378399444156E+01 -0.378153646845E+01 -0.377907719298E+01 + -0.377661661627E+01 -0.377415473940E+01 -0.377169156349E+01 -0.376922708964E+01 + -0.376676131894E+01 -0.376429425249E+01 -0.376182589139E+01 -0.375935623673E+01 + -0.375688528961E+01 -0.375441305111E+01 -0.375193952233E+01 -0.374946470436E+01 + -0.374698859828E+01 -0.374451120518E+01 -0.374203252613E+01 -0.373955256223E+01 + -0.373707131456E+01 -0.373458878419E+01 -0.373210497220E+01 -0.372961987967E+01 + -0.372713350767E+01 -0.372464585728E+01 -0.372215692956E+01 -0.371966672559E+01 + -0.371717524644E+01 -0.371468249317E+01 -0.371218846685E+01 -0.370969316855E+01 + -0.370719659932E+01 -0.370469876023E+01 -0.370219965233E+01 -0.369969927669E+01 + -0.369719763437E+01 -0.369469472641E+01 -0.369219055388E+01 -0.368968511781E+01 + -0.368717841928E+01 -0.368467045932E+01 -0.368216123898E+01 -0.367965075932E+01 + -0.367713902137E+01 -0.367462602618E+01 -0.367211177479E+01 -0.366959626824E+01 + -0.366707950757E+01 -0.366456149383E+01 -0.366204222804E+01 -0.365952171124E+01 + -0.365699994447E+01 -0.365447692875E+01 -0.365195266513E+01 -0.364942715462E+01 + -0.364690039826E+01 -0.364437239707E+01 -0.364184315208E+01 -0.363931266431E+01 + -0.363678093478E+01 -0.363424796453E+01 -0.363171375455E+01 -0.362917830588E+01 + -0.362664161953E+01 -0.362410369652E+01 -0.362156453785E+01 -0.361902414455E+01 + -0.361648251762E+01 -0.361393965807E+01 -0.361139556692E+01 -0.360885024517E+01 + -0.360630369382E+01 -0.360375591388E+01 -0.360120690635E+01 -0.359865667224E+01 + -0.359610521255E+01 -0.359355252826E+01 -0.359099862039E+01 -0.358844348992E+01 + -0.358588713786E+01 -0.358332956520E+01 -0.358077077292E+01 -0.357821076202E+01 + -0.357564953349E+01 -0.357308708832E+01 -0.357052342749E+01 -0.356795855199E+01 + -0.356539246280E+01 -0.356282516092E+01 -0.356025664730E+01 -0.355768692295E+01 + -0.355511598883E+01 -0.355254384593E+01 -0.354997049522E+01 -0.354739593768E+01 + -0.354482017427E+01 -0.354224320598E+01 -0.353966503377E+01 -0.353708565861E+01 + -0.353450508147E+01 -0.353192330333E+01 -0.352934032513E+01 -0.352675614786E+01 + -0.352417077246E+01 -0.352158419991E+01 -0.351899643117E+01 -0.351640746719E+01 + -0.351381730893E+01 -0.351122595734E+01 -0.350863341340E+01 -0.350603967804E+01 + -0.350344475222E+01 -0.350084863690E+01 -0.349825133302E+01 -0.349565284154E+01 + -0.349305316339E+01 -0.349045229953E+01 -0.348785025091E+01 -0.348524701846E+01 + -0.348264260313E+01 -0.348003700587E+01 -0.347743022760E+01 -0.347482226928E+01 + -0.347221313184E+01 -0.346960281621E+01 -0.346699132334E+01 -0.346437865415E+01 + -0.346176480958E+01 -0.345914979055E+01 -0.345653359801E+01 -0.345391623288E+01 + -0.345129769609E+01 -0.344867798856E+01 -0.344605711123E+01 -0.344343506501E+01 + -0.344081185082E+01 -0.343818746960E+01 -0.343556192226E+01 -0.343293520971E+01 + -0.343030733289E+01 -0.342767829270E+01 -0.342504809006E+01 -0.342241672589E+01 + -0.341978420110E+01 -0.341715051661E+01 -0.341451567331E+01 -0.341187967213E+01 + -0.340924251397E+01 -0.340660419974E+01 -0.340396473035E+01 -0.340132410669E+01 + -0.339868232969E+01 -0.339603940023E+01 -0.339339531922E+01 -0.339075008756E+01 + -0.338810370615E+01 -0.338545617588E+01 -0.338280749766E+01 -0.338015767238E+01 + -0.337750670094E+01 -0.337485458423E+01 -0.337220132313E+01 -0.336954691855E+01 + -0.336689137137E+01 -0.336423468248E+01 -0.336157685276E+01 -0.335891788312E+01 + -0.335625777442E+01 -0.335359652755E+01 -0.335093414341E+01 -0.334827062286E+01 + -0.334560596680E+01 -0.334294017609E+01 -0.334027325162E+01 -0.333760519427E+01 + -0.333493600491E+01 -0.333226568442E+01 -0.332959423367E+01 -0.332692165354E+01 + -0.332424794489E+01 -0.332157310859E+01 -0.331889714553E+01 -0.331622005655E+01 + -0.331354184254E+01 -0.331086250436E+01 -0.330818204287E+01 -0.330550045894E+01 + -0.330281775343E+01 -0.330013392720E+01 -0.329744898111E+01 -0.329476291603E+01 + -0.329207573280E+01 -0.328938743229E+01 -0.328669801536E+01 -0.328400748286E+01 + -0.328131583564E+01 -0.327862307455E+01 -0.327592920046E+01 -0.327323421420E+01 + -0.327053811664E+01 -0.326784090861E+01 -0.326514259096E+01 -0.326244316455E+01 + -0.325974263021E+01 -0.325704098880E+01 -0.325433824115E+01 -0.325163438810E+01 + -0.324892943051E+01 -0.324622336920E+01 -0.324351620502E+01 -0.324080793880E+01 + -0.323809857139E+01 -0.323538810361E+01 -0.323267653631E+01 -0.322996387031E+01 + -0.322725010645E+01 -0.322453524557E+01 -0.322181928848E+01 -0.321910223602E+01 + -0.321638408902E+01 -0.321366484831E+01 -0.321094451471E+01 -0.320822308905E+01 + -0.320550057216E+01 -0.320277696484E+01 -0.320005226794E+01 -0.319732648226E+01 + -0.319459960864E+01 -0.319187164788E+01 -0.318914260081E+01 -0.318641246824E+01 + -0.318368125099E+01 -0.318094894988E+01 -0.317821556571E+01 -0.317548109931E+01 + -0.317274555148E+01 -0.317000892303E+01 -0.316727121478E+01 -0.316453242754E+01 + -0.316179256210E+01 -0.315905161929E+01 -0.315630959989E+01 -0.315356650473E+01 + -0.315082233460E+01 -0.314807709031E+01 -0.314533077265E+01 -0.314258338243E+01 + -0.313983492046E+01 -0.313708538751E+01 -0.313433478441E+01 -0.313158311194E+01 + -0.312883037089E+01 -0.312607656207E+01 -0.312332168627E+01 -0.312056574428E+01 + -0.311780873689E+01 -0.311505066490E+01 -0.311229152908E+01 -0.310953133024E+01 + -0.310677006917E+01 -0.310400774664E+01 -0.310124436344E+01 -0.309847992036E+01 + -0.309571441819E+01 -0.309294785770E+01 -0.309018023969E+01 -0.308741156492E+01 + -0.308464183418E+01 -0.308187104826E+01 -0.307909920792E+01 -0.307632631395E+01 + -0.307355236712E+01 -0.307077736821E+01 -0.306800131799E+01 -0.306522421724E+01 + -0.306244606673E+01 -0.305966686723E+01 -0.305688661951E+01 -0.305410532435E+01 + -0.305132298250E+01 -0.304853959475E+01 -0.304575516185E+01 -0.304296968457E+01 + -0.304018316368E+01 -0.303739559994E+01 -0.303460699411E+01 -0.303181734697E+01 + -0.302902665926E+01 -0.302623493175E+01 -0.302344216520E+01 -0.302064836037E+01 + -0.301785351801E+01 -0.301505763889E+01 -0.301226072375E+01 -0.300946277336E+01 + -0.300666378846E+01 -0.300386376982E+01 -0.300106271817E+01 -0.299826063429E+01 + -0.299545751890E+01 -0.299265337277E+01 -0.298984819665E+01 -0.298704199127E+01 + -0.298423475739E+01 -0.298142649576E+01 -0.297861720711E+01 -0.297580689219E+01 + -0.297299555176E+01 -0.297018318653E+01 -0.296736979727E+01 -0.296455538471E+01 + -0.296173994959E+01 -0.295892349265E+01 -0.295610601462E+01 -0.295328751624E+01 + -0.295046799826E+01 -0.294764746140E+01 -0.294482590640E+01 -0.294200333399E+01 + -0.293917974490E+01 -0.293635513988E+01 -0.293352951964E+01 -0.293070288491E+01 + -0.292787523643E+01 -0.292504657493E+01 -0.292221690113E+01 -0.291938621576E+01 + -0.291655451954E+01 -0.291372181320E+01 -0.291088809746E+01 -0.290805337305E+01 + -0.290521764068E+01 -0.290238090109E+01 -0.289954315498E+01 -0.289670440308E+01 + -0.289386464611E+01 -0.289102388479E+01 -0.288818211982E+01 -0.288533935194E+01 + -0.288249558184E+01 -0.287965081026E+01 -0.287680503790E+01 -0.287395826547E+01 + -0.287111049369E+01 -0.286826172326E+01 -0.286541195490E+01 -0.286256118932E+01 + -0.285970942723E+01 -0.285685666932E+01 -0.285400291632E+01 -0.285114816892E+01 + -0.284829242783E+01 -0.284543569376E+01 -0.284257796741E+01 -0.283971924948E+01 + -0.283685954067E+01 -0.283399884168E+01 -0.283113715322E+01 -0.282827447598E+01 + -0.282541081067E+01 -0.282254615797E+01 -0.281968051860E+01 -0.281681389323E+01 + -0.281394628258E+01 -0.281107768732E+01 -0.280820810816E+01 -0.280533754579E+01 + -0.280246600091E+01 -0.279959347419E+01 -0.279671996634E+01 -0.279384547804E+01 + -0.279097000998E+01 -0.278809356285E+01 -0.278521613733E+01 -0.278233773412E+01 + -0.277945835389E+01 -0.277657799734E+01 -0.277369666514E+01 -0.277081435799E+01 + -0.276793107656E+01 -0.276504682152E+01 -0.276216159358E+01 -0.275927539340E+01 + -0.275638822166E+01 -0.275350007904E+01 -0.275061096623E+01 -0.274772088389E+01 + -0.274482983270E+01 -0.274193781334E+01 -0.273904482648E+01 -0.273615087280E+01 + -0.273325595296E+01 -0.273036006765E+01 -0.272746321753E+01 -0.272456540327E+01 + -0.272166662554E+01 -0.271876688502E+01 -0.271586618236E+01 -0.271296451824E+01 + -0.271006189333E+01 -0.270715830828E+01 -0.270425376377E+01 -0.270134826046E+01 + -0.269844179901E+01 -0.269553438008E+01 -0.269262600435E+01 -0.268971667246E+01 + -0.268680638508E+01 -0.268389514288E+01 -0.268098294650E+01 -0.267806979660E+01 + -0.267515569385E+01 -0.267224063890E+01 -0.266932463241E+01 -0.266640767503E+01 + -0.266348976742E+01 -0.266057091023E+01 -0.265765110411E+01 -0.265473034972E+01 + -0.265180864770E+01 -0.264888599871E+01 -0.264596240340E+01 -0.264303786242E+01 + -0.264011237641E+01 -0.263718594603E+01 -0.263425857191E+01 -0.263133025472E+01 + -0.262840099508E+01 -0.262547079366E+01 -0.262253965108E+01 -0.261960756800E+01 + -0.261667454506E+01 -0.261374058290E+01 -0.261080568215E+01 -0.260786984347E+01 + -0.260493306749E+01 -0.260199535485E+01 -0.259905670619E+01 -0.259611712214E+01 + -0.259317660334E+01 -0.259023515044E+01 -0.258729276405E+01 -0.258434944483E+01 + -0.258140519340E+01 -0.257846001039E+01 -0.257551389644E+01 -0.257256685218E+01 + -0.256961887825E+01 -0.256666997526E+01 -0.256372014386E+01 -0.256076938466E+01 + -0.255781769831E+01 -0.255486508541E+01 -0.255191154662E+01 -0.254895708254E+01 + -0.254600169380E+01 -0.254304538103E+01 -0.254008814486E+01 -0.253712998590E+01 + -0.253417090478E+01 -0.253121090212E+01 -0.252824997855E+01 -0.252528813467E+01 + -0.252232537112E+01 -0.251936168851E+01 -0.251639708746E+01 -0.251343156858E+01 + -0.251046513250E+01 -0.250749777983E+01 -0.250452951119E+01 -0.250156032718E+01 + -0.249859022844E+01 -0.249561921556E+01 -0.249264728916E+01 -0.248967444986E+01 + -0.248670069826E+01 -0.248372603498E+01 -0.248075046063E+01 -0.247777397581E+01 + -0.247479658114E+01 -0.247181827722E+01 -0.246883906466E+01 -0.246585894407E+01 + -0.246287791605E+01 -0.245989598122E+01 -0.245691314016E+01 -0.245392939349E+01 + -0.245094474182E+01 -0.244795918573E+01 -0.244497272585E+01 -0.244198536276E+01 + -0.243899709706E+01 -0.243600792937E+01 -0.243301786027E+01 -0.243002689037E+01 + -0.242703502027E+01 -0.242404225055E+01 -0.242104858183E+01 -0.241805401469E+01 + -0.241505854972E+01 -0.241206218754E+01 -0.240906492872E+01 -0.240606677387E+01 + -0.240306772357E+01 -0.240006777841E+01 -0.239706693900E+01 -0.239406520591E+01 + -0.239106257975E+01 -0.238805906109E+01 -0.238505465054E+01 -0.238204934867E+01 + -0.237904315607E+01 -0.237603607334E+01 -0.237302810105E+01 -0.237001923980E+01 + -0.236700949016E+01 -0.236399885273E+01 -0.236098732808E+01 -0.235797491681E+01 + -0.235496161948E+01 -0.235194743669E+01 -0.234893236901E+01 -0.234591641703E+01 + -0.234289958133E+01 -0.233988186248E+01 -0.233686326106E+01 -0.233384377766E+01 + -0.233082341284E+01 -0.232780216719E+01 -0.232478004128E+01 -0.232175703569E+01 + -0.231873315099E+01 -0.231570838776E+01 -0.231268274657E+01 -0.230965622799E+01 + -0.230662883260E+01 -0.230360056096E+01 -0.230057141365E+01 -0.229754139125E+01 + -0.229451049431E+01 -0.229147872341E+01 -0.228844607911E+01 -0.228541256199E+01 + -0.228237817262E+01 -0.227934291155E+01 -0.227630677936E+01 -0.227326977661E+01 + -0.227023190387E+01 -0.226719316169E+01 -0.226415355065E+01 -0.226111307131E+01 + -0.225807172423E+01 -0.225502950997E+01 -0.225198642909E+01 -0.224894248216E+01 + -0.224589766973E+01 -0.224285199237E+01 -0.223980545062E+01 -0.223675804506E+01 + -0.223370977624E+01 -0.223066064471E+01 -0.222761065104E+01 -0.222455979577E+01 + -0.222150807947E+01 -0.221845550269E+01 -0.221540206597E+01 -0.221234776989E+01 + -0.220929261498E+01 -0.220623660180E+01 -0.220317973091E+01 -0.220012200285E+01 + -0.219706341818E+01 -0.219400397744E+01 -0.219094368118E+01 -0.218788252996E+01 + -0.218482052432E+01 -0.218175766481E+01 -0.217869395197E+01 -0.217562938636E+01 + -0.217256396851E+01 -0.216949769898E+01 -0.216643057831E+01 -0.216336260704E+01 + -0.216029378571E+01 -0.215722411488E+01 -0.215415359507E+01 -0.215108222684E+01 + -0.214801001072E+01 -0.214493694726E+01 -0.214186303700E+01 -0.213878828047E+01 + -0.213571267821E+01 -0.213263623076E+01 -0.212955893867E+01 -0.212648080246E+01 + -0.212340182268E+01 -0.212032199986E+01 -0.211724133453E+01 -0.211415982723E+01 + -0.211107747850E+01 -0.210799428887E+01 -0.210491025887E+01 -0.210182538903E+01 + -0.209873967989E+01 -0.209565313198E+01 -0.209256574583E+01 -0.208947752197E+01 + -0.208638846093E+01 -0.208329856324E+01 -0.208020782943E+01 -0.207711626002E+01 + -0.207402385555E+01 -0.207093061654E+01 -0.206783654352E+01 -0.206474163701E+01 + -0.206164589754E+01 -0.205854932564E+01 -0.205545192182E+01 -0.205235368662E+01 + -0.204925462055E+01 -0.204615472414E+01 -0.204305399792E+01 -0.203995244239E+01 + -0.203685005809E+01 -0.203374684553E+01 -0.203064280523E+01 -0.202753793772E+01 + -0.202443224351E+01 -0.202132572312E+01 -0.201821837707E+01 -0.201511020588E+01 + -0.201200121006E+01 -0.200889139013E+01 -0.200578074660E+01 -0.200266927999E+01 + -0.199955699081E+01 -0.199644387958E+01 -0.199332994682E+01 -0.199021519303E+01 + -0.198709961872E+01 -0.198398322442E+01 -0.198086601062E+01 -0.197774797785E+01 + -0.197462912661E+01 -0.197150945741E+01 -0.196838897076E+01 -0.196526766716E+01 + -0.196214554714E+01 -0.195902261119E+01 -0.195589885983E+01 -0.195277429355E+01 + -0.194964891287E+01 -0.194652271828E+01 -0.194339571031E+01 -0.194026788944E+01 + -0.193713925619E+01 -0.193400981106E+01 -0.193087955454E+01 -0.192774848715E+01 + -0.192461660939E+01 -0.192148392175E+01 -0.191835042474E+01 -0.191521611886E+01 + -0.191208100460E+01 -0.190894508247E+01 -0.190580835297E+01 -0.190267081659E+01 + -0.189953247383E+01 -0.189639332520E+01 -0.189325337118E+01 -0.189011261227E+01 + -0.188697104897E+01 -0.188382868177E+01 -0.188068551117E+01 -0.187754153766E+01 + -0.187439676174E+01 -0.187125118390E+01 -0.186810480463E+01 -0.186495762443E+01 + -0.186180964378E+01 -0.185866086318E+01 -0.185551128312E+01 -0.185236090408E+01 + -0.184920972656E+01 -0.184605775105E+01 -0.184290497804E+01 -0.183975140801E+01 + -0.183659704145E+01 -0.183344187885E+01 -0.183028592070E+01 -0.182712916748E+01 + -0.182397161967E+01 -0.182081327777E+01 -0.181765414226E+01 -0.181449421362E+01 + -0.181133349233E+01 -0.180817197889E+01 -0.180500967376E+01 -0.180184657744E+01 + -0.179868269041E+01 -0.179551801314E+01 -0.179235254612E+01 -0.178918628983E+01 + -0.178601924475E+01 -0.178285141135E+01 -0.177968279012E+01 -0.177651338154E+01 + -0.177334318608E+01 -0.177017220422E+01 -0.176700043643E+01 -0.176382788320E+01 + -0.176065454500E+01 -0.175748042231E+01 -0.175430551559E+01 -0.175112982533E+01 + -0.174795335200E+01 -0.174477609607E+01 -0.174159805801E+01 -0.173841923831E+01 + -0.173523963742E+01 -0.173205925583E+01 -0.172887809399E+01 -0.172569615240E+01 + -0.172251343150E+01 -0.171932993178E+01 -0.171614565371E+01 -0.171296059774E+01 + -0.170977476436E+01 -0.170658815402E+01 -0.170340076720E+01 -0.170021260436E+01 + -0.169702366597E+01 -0.169383395250E+01 -0.169064346440E+01 -0.168745220216E+01 + -0.168426016622E+01 -0.168106735706E+01 -0.167787377513E+01 -0.167467942091E+01 + -0.167148429485E+01 -0.166828839742E+01 -0.166509172908E+01 -0.166189429029E+01 + -0.165869608151E+01 -0.165549710319E+01 -0.165229735582E+01 -0.164909683983E+01 + -0.164589555569E+01 -0.164269350386E+01 -0.163949068480E+01 -0.163628709896E+01 + -0.163308274680E+01 -0.162987762878E+01 -0.162667174536E+01 -0.162346509699E+01 + -0.162025768412E+01 -0.161704950722E+01 -0.161384056673E+01 -0.161063086311E+01 + -0.160742039682E+01 -0.160420916830E+01 -0.160099717801E+01 -0.159778442640E+01 + -0.159457091393E+01 -0.159135664104E+01 -0.158814160819E+01 -0.158492581583E+01 + -0.158170926440E+01 -0.157849195436E+01 -0.157527388616E+01 -0.157205506024E+01 + -0.156883547705E+01 -0.156561513704E+01 -0.156239404067E+01 -0.155917218836E+01 + -0.155594958058E+01 -0.155272621777E+01 -0.154950210036E+01 -0.154627722882E+01 + -0.154305160358E+01 -0.153982522509E+01 -0.153659809379E+01 -0.153337021013E+01 + -0.153014157454E+01 -0.152691218748E+01 -0.152368204937E+01 -0.152045116067E+01 + -0.151721952182E+01 -0.151398713326E+01 -0.151075399542E+01 -0.150752010875E+01 + -0.150428547369E+01 -0.150105009067E+01 -0.149781396014E+01 -0.149457708253E+01 + -0.149133945828E+01 -0.148810108783E+01 -0.148486197161E+01 -0.148162211007E+01 + -0.147838150364E+01 -0.147514015275E+01 -0.147189805783E+01 -0.146865521934E+01 + -0.146541163769E+01 -0.146216731332E+01 -0.145892224667E+01 -0.145567643817E+01 + -0.145242988825E+01 -0.144918259735E+01 -0.144593456589E+01 -0.144268579432E+01 + -0.143943628305E+01 -0.143618603252E+01 -0.143293504316E+01 -0.142968331540E+01 + -0.142643084967E+01 -0.142317764639E+01 -0.141992370601E+01 -0.141666902894E+01 + -0.141341361561E+01 -0.141015746645E+01 -0.140690058189E+01 -0.140364296236E+01 + -0.140038460827E+01 -0.139712552006E+01 -0.139386569815E+01 -0.139060514297E+01 + -0.138734385493E+01 -0.138408183447E+01 -0.138081908201E+01 -0.137755559797E+01 + -0.137429138277E+01 -0.137102643684E+01 -0.136776076060E+01 -0.136449435447E+01 + -0.136122721887E+01 -0.135795935422E+01 -0.135469076094E+01 -0.135142143946E+01 + -0.134815139018E+01 -0.134488061354E+01 -0.134160910995E+01 -0.133833687983E+01 + -0.133506392360E+01 -0.133179024166E+01 -0.132851583445E+01 -0.132524070238E+01 + -0.132196484586E+01 -0.131868826532E+01 -0.131541096115E+01 -0.131213293379E+01 + -0.130885418365E+01 -0.130557471113E+01 -0.130229451666E+01 -0.129901360065E+01 + -0.129573196351E+01 -0.129244960565E+01 -0.128916652749E+01 -0.128588272944E+01 + -0.128259821191E+01 -0.127931297531E+01 -0.127602702005E+01 -0.127274034654E+01 + -0.126945295520E+01 -0.126616484643E+01 -0.126287602064E+01 -0.125958647824E+01 + -0.125629621964E+01 -0.125300524525E+01 -0.124971355547E+01 -0.124642115072E+01 + -0.124312803139E+01 -0.123983419790E+01 -0.123653965066E+01 -0.123324439006E+01 + -0.122994841651E+01 -0.122665173042E+01 -0.122335433220E+01 -0.122005622224E+01 + -0.121675740096E+01 -0.121345786875E+01 -0.121015762601E+01 -0.120685667316E+01 + -0.120355501059E+01 -0.120025263871E+01 -0.119694955791E+01 -0.119364576860E+01 + -0.119034127118E+01 -0.118703606604E+01 -0.118373015360E+01 -0.118042353425E+01 + -0.117711620838E+01 -0.117380817640E+01 -0.117049943871E+01 -0.116718999570E+01 + -0.116387984778E+01 -0.116056899533E+01 -0.115725743876E+01 -0.115394517846E+01 + -0.115063221484E+01 -0.114731854827E+01 -0.114400417917E+01 -0.114068910793E+01 + -0.113737333494E+01 -0.113405686059E+01 -0.113073968528E+01 -0.112742180941E+01 + -0.112410323337E+01 -0.112078395754E+01 -0.111746398233E+01 -0.111414330812E+01 + -0.111082193531E+01 -0.110749986429E+01 -0.110417709544E+01 -0.110085362917E+01 + -0.109752946586E+01 -0.109420460590E+01 -0.109087904968E+01 -0.108755279760E+01 + -0.108422585003E+01 -0.108089820737E+01 -0.107756987000E+01 -0.107424083832E+01 + -0.107091111271E+01 -0.106758069356E+01 -0.106424958126E+01 -0.106091777618E+01 + -0.105758527873E+01 -0.105425208928E+01 -0.105091820822E+01 -0.104758363593E+01 + -0.104424837281E+01 -0.104091241922E+01 -0.103757577557E+01 -0.103423844222E+01 + -0.103090041957E+01 -0.102756170800E+01 -0.102422230789E+01 -0.102088221962E+01 + -0.101754144357E+01 -0.101419998013E+01 -0.101085782968E+01 -0.100751499259E+01 + -0.100417146925E+01 -0.100082726004E+01 -0.997482365336E+00 -0.994136785519E+00 + -0.990790520969E+00 -0.987443572063E+00 -0.984095939181E+00 -0.980747622699E+00 + -0.977398622997E+00 -0.974048940450E+00 -0.970698575436E+00 -0.967347528332E+00 + -0.963995799514E+00 -0.960643389358E+00 -0.957290298239E+00 -0.953936526532E+00 + -0.950582074613E+00 -0.947226942856E+00 -0.943871131635E+00 -0.940514641325E+00 + -0.937157472297E+00 -0.933799624926E+00 -0.930441099585E+00 -0.927081896646E+00 + -0.923722016481E+00 -0.920361459462E+00 -0.917000225960E+00 -0.913638316346E+00 + -0.910275730992E+00 -0.906912470268E+00 -0.903548534543E+00 -0.900183924188E+00 + -0.896818639571E+00 -0.893452681063E+00 -0.890086049032E+00 -0.886718743846E+00 + -0.883350765873E+00 -0.879982115481E+00 -0.876612793038E+00 -0.873242798910E+00 + -0.869872133465E+00 -0.866500797068E+00 -0.863128790086E+00 -0.859756112884E+00 + -0.856382765828E+00 -0.853008749284E+00 -0.849634063615E+00 -0.846258709186E+00 + -0.842882686361E+00 -0.839505995504E+00 -0.836128636979E+00 -0.832750611148E+00 + -0.829371918374E+00 -0.825992559020E+00 -0.822612533448E+00 -0.819231842020E+00 + -0.815850485096E+00 -0.812468463039E+00 -0.809085776208E+00 -0.805702424965E+00 + -0.802318409670E+00 -0.798933730682E+00 -0.795548388361E+00 -0.792162383066E+00 + -0.788775715156E+00 -0.785388384989E+00 -0.782000392924E+00 -0.778611739318E+00 + -0.775222424530E+00 -0.771832448915E+00 -0.768441812832E+00 -0.765050516637E+00 + -0.761658560686E+00 -0.758265945335E+00 -0.754872670940E+00 -0.751478737856E+00 + -0.748084146437E+00 -0.744688897040E+00 -0.741292990017E+00 -0.737896425723E+00 + -0.734499204512E+00 -0.731101326738E+00 -0.727702792752E+00 -0.724303602909E+00 + -0.720903757560E+00 -0.717503257058E+00 -0.714102101754E+00 -0.710700292000E+00 + -0.707297828147E+00 -0.703894710546E+00 -0.700490939548E+00 -0.697086515503E+00 + -0.693681438760E+00 -0.690275709670E+00 -0.686869328582E+00 -0.683462295844E+00 + -0.680054611806E+00 -0.676646276815E+00 -0.673237291221E+00 -0.669827655370E+00 + -0.666417369610E+00 -0.663006434288E+00 -0.659594849752E+00 -0.656182616347E+00 + -0.652769734420E+00 -0.649356204316E+00 -0.645942026382E+00 -0.642527200963E+00 + -0.639111728403E+00 -0.635695609047E+00 -0.632278843240E+00 -0.628861431326E+00 + -0.625443373649E+00 -0.622024670551E+00 -0.618605322376E+00 -0.615185329468E+00 + -0.611764692168E+00 -0.608343410818E+00 -0.604921485762E+00 -0.601498917339E+00 + -0.598075705893E+00 -0.594651851763E+00 -0.591227355291E+00 -0.587802216816E+00 + -0.584376436680E+00 -0.580950015221E+00 -0.577522952780E+00 -0.574095249695E+00 + -0.570666906306E+00 -0.567237922951E+00 -0.563808299969E+00 -0.560378037697E+00 + -0.556947136474E+00 -0.553515596636E+00 -0.550083418521E+00 -0.546650602466E+00 + -0.543217148808E+00 -0.539783057882E+00 -0.536348330024E+00 -0.532912965571E+00 + -0.529476964857E+00 -0.526040328218E+00 -0.522603055988E+00 -0.519165148502E+00 + -0.515726606095E+00 -0.512287429099E+00 -0.508847617849E+00 -0.505407172679E+00 + -0.501966093920E+00 -0.498524381905E+00 -0.495082036969E+00 -0.491639059441E+00 + -0.488195449654E+00 -0.484751207941E+00 -0.481306334631E+00 -0.477860830057E+00 + -0.474414694548E+00 -0.470967928436E+00 -0.467520532050E+00 -0.464072505719E+00 + -0.460623849775E+00 -0.457174564546E+00 -0.453724650361E+00 -0.450274107548E+00 + -0.446822936436E+00 -0.443371137354E+00 -0.439918710629E+00 -0.436465656588E+00 + -0.433011975559E+00 -0.429557667869E+00 -0.426102733844E+00 -0.422647173812E+00 + -0.419190988097E+00 -0.415734177026E+00 -0.412276740925E+00 -0.408818680119E+00 + -0.405359994932E+00 -0.401900685690E+00 -0.398440752717E+00 -0.394980196337E+00 + -0.391519016874E+00 -0.388057214651E+00 -0.384594789993E+00 -0.381131743221E+00 + -0.377668074659E+00 -0.374203784629E+00 -0.370738873453E+00 -0.367273341453E+00 + -0.363807188952E+00 -0.360340416270E+00 -0.356873023728E+00 -0.353405011647E+00 + -0.349936380348E+00 -0.346467130151E+00 -0.342997261376E+00 -0.339526774342E+00 + -0.336055669370E+00 -0.332583946778E+00 -0.329111606885E+00 -0.325638650009E+00 + -0.322165076470E+00 -0.318690886585E+00 -0.315216080672E+00 -0.311740659048E+00 + -0.308264622031E+00 -0.304787969937E+00 -0.301310703084E+00 -0.297832821787E+00 + -0.294354326363E+00 -0.290875217129E+00 -0.287395494398E+00 -0.283915158487E+00 + -0.280434209711E+00 -0.276952648385E+00 -0.273470474823E+00 -0.269987689339E+00 + -0.266504292247E+00 -0.263020283862E+00 -0.259535664496E+00 -0.256050434463E+00 + -0.252564594076E+00 -0.249078143647E+00 -0.245591083488E+00 -0.242103413913E+00 + -0.238615135232E+00 -0.235126247758E+00 -0.231636751801E+00 -0.228146647673E+00 + -0.224655935684E+00 -0.221164616145E+00 -0.217672689367E+00 -0.214180155659E+00 + -0.210687015330E+00 -0.207193268692E+00 -0.203698916052E+00 -0.200203957719E+00 + -0.196708394003E+00 -0.193212225212E+00 -0.189715451653E+00 -0.186218073636E+00 + -0.182720091466E+00 -0.179221505453E+00 -0.175722315903E+00 -0.172222523122E+00 + -0.168722127418E+00 -0.165221129096E+00 -0.161719528463E+00 -0.158217325825E+00 + -0.154714521487E+00 -0.151211115755E+00 -0.147707108933E+00 -0.144202501326E+00 + -0.140697293239E+00 -0.137191484977E+00 -0.133685076842E+00 -0.130178069139E+00 + -0.126670462172E+00 -0.123162256244E+00 -0.119653451657E+00 -0.116144048714E+00 + -0.112634047718E+00 -0.109123448971E+00 -0.105612252776E+00 -0.102100459433E+00 + -0.985880692442E-01 -0.950750825110E-01 -0.915614995341E-01 -0.880473206143E-01 + -0.845325460521E-01 -0.810171761476E-01 -0.775012112007E-01 -0.739846515113E-01 + -0.704674973786E-01 -0.669497491020E-01 -0.634314069803E-01 -0.599124713123E-01 + -0.563929423963E-01 -0.528728205306E-01 -0.493521060131E-01 -0.458307991415E-01 + -0.423089002133E-01 -0.387864095255E-01 -0.352633273753E-01 -0.317396540592E-01 + -0.282153898737E-01 -0.246905351151E-01 -0.211650900792E-01 -0.176390550618E-01 + -0.141124303584E-01 -0.105852162640E-01 -0.705741307383E-02 -0.352902108246E-02 + -0.405843998408E-07 0.352952812613E-02 0.705968475514E-02 0.105904290089E-01 + 0.141217605939E-01 0.176536792169E-01 0.211861845849E-01 0.247192764051E-01 + 0.282529543850E-01 0.317872182324E-01 0.353220676552E-01 0.388575023615E-01 + 0.423935220600E-01 0.459301264592E-01 0.494673152680E-01 0.530050881958E-01 + 0.565434449518E-01 0.600823852458E-01 0.636219087876E-01 0.671620152874E-01 + 0.707027044555E-01 0.742439760027E-01 0.777858296396E-01 0.813282650776E-01 + 0.848712820277E-01 0.884148802018E-01 0.919590593114E-01 0.955038190688E-01 + 0.990491591862E-01 0.102595079376E+00 0.106141579351E+00 0.109688658825E+00 + 0.113236317510E+00 0.116784555120E+00 0.120333371369E+00 0.123882765970E+00 + 0.127432738639E+00 0.130983289088E+00 0.134534417034E+00 0.138086122190E+00 + 0.141638404272E+00 0.145191262995E+00 0.148744698076E+00 0.152298709229E+00 + 0.155853296171E+00 0.159408458618E+00 0.162964196286E+00 0.166520508893E+00 + 0.170077396155E+00 0.173634857789E+00 0.177192893514E+00 0.180751503046E+00 + 0.184310686104E+00 0.187870442405E+00 0.191430771669E+00 0.194991673613E+00 + 0.198553147957E+00 0.202115194420E+00 0.205677812720E+00 0.209241002578E+00 + 0.212804763713E+00 0.216369095845E+00 0.219933998695E+00 0.223499471982E+00 + 0.227065515428E+00 0.230632128754E+00 0.234199311680E+00 0.237767063927E+00 + 0.241335385219E+00 0.244904275275E+00 0.248473733819E+00 0.252043760572E+00 + 0.255614355258E+00 0.259185517598E+00 0.262757247316E+00 0.266329544135E+00 + 0.269902407778E+00 0.273475837969E+00 0.277049834432E+00 0.280624396890E+00 + 0.284199525068E+00 0.287775218691E+00 0.291351477484E+00 0.294928301170E+00 + 0.298505689476E+00 0.302083642127E+00 0.305662158848E+00 0.309241239366E+00 + 0.312820883406E+00 0.316401090694E+00 0.319981860958E+00 0.323563193924E+00 + 0.327145089318E+00 0.330727546869E+00 0.334310566303E+00 0.337894147348E+00 + 0.341478289732E+00 0.345062993183E+00 0.348648257429E+00 0.352234082198E+00 + 0.355820467221E+00 0.359407412224E+00 0.362994916938E+00 0.366582981092E+00 + 0.370171604415E+00 0.373760786638E+00 0.377350527490E+00 0.380940826701E+00 + 0.384531684003E+00 0.388123099125E+00 0.391715071798E+00 0.395307601755E+00 + 0.398900688725E+00 0.402494332441E+00 0.406088532634E+00 0.409683289036E+00 + 0.413278601380E+00 0.416874469397E+00 0.420470892821E+00 0.424067871384E+00 + 0.427665404819E+00 0.431263492860E+00 0.434862135240E+00 0.438461331693E+00 + 0.442061081952E+00 0.445661385753E+00 0.449262242828E+00 0.452863652912E+00 + 0.456465615741E+00 0.460068131049E+00 0.463671198572E+00 0.467274818044E+00 + 0.470878989202E+00 0.474483711781E+00 0.478088985518E+00 0.481694810148E+00 + 0.485301185407E+00 0.488908111033E+00 0.492515586763E+00 0.496123612333E+00 + 0.499732187481E+00 0.503341311944E+00 0.506950985460E+00 0.510561207767E+00 + 0.514171978602E+00 0.517783297705E+00 0.521395164814E+00 0.525007579667E+00 + 0.528620542004E+00 0.532234051563E+00 0.535848108084E+00 0.539462711307E+00 + 0.543077860971E+00 0.546693556816E+00 0.550309798583E+00 0.553926586011E+00 + 0.557543918842E+00 0.561161796817E+00 0.564780219675E+00 0.568399187159E+00 + 0.572018699009E+00 0.575638754968E+00 0.579259354778E+00 0.582880498179E+00 + 0.586502184916E+00 0.590124414729E+00 0.593747187362E+00 0.597370502557E+00 + 0.600994360058E+00 0.604618759607E+00 0.608243700949E+00 0.611869183826E+00 + 0.615495207984E+00 0.619121773165E+00 0.622748879114E+00 0.626376525575E+00 + 0.630004712294E+00 0.633633439015E+00 0.637262705482E+00 0.640892511442E+00 + 0.644522856640E+00 0.648153740821E+00 0.651785163732E+00 0.655417125118E+00 + 0.659049624725E+00 0.662682662301E+00 0.666316237591E+00 0.669950350343E+00 + 0.673585000304E+00 0.677220187220E+00 0.680855910840E+00 0.684492170911E+00 + 0.688128967181E+00 0.691766299398E+00 0.695404167310E+00 0.699042570665E+00 + 0.702681509213E+00 0.706320982702E+00 0.709960990881E+00 0.713601533499E+00 + 0.717242610306E+00 0.720884221052E+00 0.724526365485E+00 0.728169043357E+00 + 0.731812254417E+00 0.735455998416E+00 0.739100275105E+00 0.742745084233E+00 + 0.746390425553E+00 0.750036298815E+00 0.753682703771E+00 0.757329640172E+00 + 0.760977107770E+00 0.764625106317E+00 0.768273635566E+00 0.771922695267E+00 + 0.775572285175E+00 0.779222405042E+00 0.782873054620E+00 0.786524233662E+00 + 0.790175941923E+00 0.793828179156E+00 0.797480945113E+00 0.801134239550E+00 + 0.804788062220E+00 0.808442412877E+00 0.812097291276E+00 0.815752697172E+00 + 0.819408630319E+00 0.823065090472E+00 0.826722077386E+00 0.830379590818E+00 + 0.834037630522E+00 0.837696196254E+00 0.841355287771E+00 0.845014904828E+00 + 0.848675047181E+00 0.852335714588E+00 0.855996906805E+00 0.859658623588E+00 + 0.863320864696E+00 0.866983629885E+00 0.870646918912E+00 0.874310731536E+00 + 0.877975067514E+00 0.881639926604E+00 0.885305308564E+00 0.888971213154E+00 + 0.892637640130E+00 0.896304589253E+00 0.899972060281E+00 0.903640052973E+00 + 0.907308567089E+00 0.910977602387E+00 0.914647158629E+00 0.918317235573E+00 + 0.921987832980E+00 0.925658950610E+00 0.929330588223E+00 0.933002745580E+00 + 0.936675422442E+00 0.940348618570E+00 0.944022333725E+00 0.947696567668E+00 + 0.951371320160E+00 0.955046590965E+00 0.958722379843E+00 0.962398686556E+00 + 0.966075510867E+00 0.969752852538E+00 0.973430711332E+00 0.977109087012E+00 + 0.980787979341E+00 0.984467388081E+00 0.988147312996E+00 0.991827753850E+00 + 0.995508710407E+00 0.999190182430E+00 0.100287216968E+01 0.100655467193E+01 + 0.101023768894E+01 0.101392122047E+01 0.101760526629E+01 0.102128982616E+01 + 0.102497489985E+01 0.102866048712E+01 0.103234658775E+01 0.103603320149E+01 + 0.103972032811E+01 0.104340796737E+01 0.104709611905E+01 0.105078478291E+01 + 0.105447395872E+01 0.105816364624E+01 0.106185384524E+01 0.106554455548E+01 + 0.106923577674E+01 0.107292750878E+01 0.107661975137E+01 0.108031250428E+01 + 0.108400576728E+01 0.108769954012E+01 0.109139382259E+01 0.109508861445E+01 + 0.109878391546E+01 0.110247972541E+01 0.110617604405E+01 0.110987287116E+01 + 0.111357020650E+01 0.111726804985E+01 0.112096640097E+01 0.112466525963E+01 + 0.112836462561E+01 0.113206449868E+01 0.113576487860E+01 0.113946576515E+01 + 0.114316715809E+01 0.114686905720E+01 0.115057146225E+01 0.115427437301E+01 + 0.115797778925E+01 0.116168171074E+01 0.116538613726E+01 0.116909106858E+01 + 0.117279650446E+01 0.117650244469E+01 0.118020888903E+01 0.118391583726E+01 + 0.118762328914E+01 0.119133124446E+01 0.119503970298E+01 0.119874866449E+01 + 0.120245812874E+01 0.120616809552E+01 0.120987856460E+01 0.121358953576E+01 + 0.121730100876E+01 0.122101298339E+01 0.122472545941E+01 0.122843843660E+01 + 0.123215191475E+01 0.123586589361E+01 0.123958037297E+01 0.124329535260E+01 + 0.124701083228E+01 0.125072681178E+01 0.125444329089E+01 0.125816026936E+01 + 0.126187774699E+01 0.126559572355E+01 0.126931419882E+01 0.127303317256E+01 + 0.127675264456E+01 0.128047261460E+01 0.128419308245E+01 0.128791404789E+01 + 0.129163551070E+01 0.129535747065E+01 0.129907992752E+01 0.130280288110E+01 + 0.130652633115E+01 0.131025027747E+01 0.131397471982E+01 0.131769965798E+01 + 0.132142509174E+01 0.132515102087E+01 0.132887744515E+01 0.133260436437E+01 + 0.133633177829E+01 0.134005968671E+01 0.134378808939E+01 0.134751698613E+01 + 0.135124637669E+01 0.135497626087E+01 0.135870663844E+01 0.136243750918E+01 + 0.136616887288E+01 0.136990072930E+01 0.137363307825E+01 0.137736591949E+01 + 0.138109925280E+01 0.138483307798E+01 0.138856739480E+01 0.139230220304E+01 + 0.139603750249E+01 0.139977329292E+01 0.140350957412E+01 0.140724634588E+01 + 0.141098360797E+01 0.141472136018E+01 0.141845960230E+01 0.142219833409E+01 + 0.142593755536E+01 0.142967726588E+01 0.143341746543E+01 0.143715815380E+01 + 0.144089933078E+01 0.144464099614E+01 0.144838314967E+01 0.145212579116E+01 + 0.145586892039E+01 0.145961253715E+01 0.146335664122E+01 0.146710123239E+01 + 0.147084631043E+01 0.147459187515E+01 0.147833792631E+01 0.148208446372E+01 + 0.148583148714E+01 0.148957899638E+01 0.149332699122E+01 0.149707547143E+01 + 0.150082443682E+01 0.150457388717E+01 0.150832382225E+01 0.151207424187E+01 + 0.151582514580E+01 0.151957653384E+01 0.152332840577E+01 0.152708076139E+01 + 0.153083360046E+01 0.153458692280E+01 0.153834072818E+01 0.154209501639E+01 + 0.154584978722E+01 0.154960504046E+01 0.155336077590E+01 0.155711699332E+01 + 0.156087369252E+01 0.156463087329E+01 0.156838853541E+01 0.157214667867E+01 + 0.157590530287E+01 0.157966440779E+01 0.158342399322E+01 0.158718405896E+01 + 0.159094460479E+01 0.159470563050E+01 0.159846713589E+01 0.160222912074E+01 + 0.160599158486E+01 0.160975452801E+01 0.161351795001E+01 0.161728185064E+01 + 0.162104622969E+01 0.162481108695E+01 0.162857642221E+01 0.163234223528E+01 + 0.163610852593E+01 0.163987529396E+01 0.164364253917E+01 0.164741026134E+01 + 0.165117846027E+01 0.165494713575E+01 0.165871628758E+01 0.166248591554E+01 + 0.166625601944E+01 0.167002659906E+01 0.167379765420E+01 0.167756918465E+01 + 0.168134119020E+01 0.168511367066E+01 0.168888662581E+01 0.169266005545E+01 + 0.169643395937E+01 0.170020833737E+01 0.170398318924E+01 0.170775851477E+01 + 0.171153431377E+01 0.171531058603E+01 0.171908733134E+01 0.172286454950E+01 + 0.172664224030E+01 0.173042040355E+01 0.173419903902E+01 0.173797814653E+01 + 0.174175772587E+01 0.174553777683E+01 0.174931829922E+01 0.175309929282E+01 + 0.175688075744E+01 0.176066269287E+01 0.176444509890E+01 0.176822797535E+01 + 0.177201132199E+01 0.177579513864E+01 0.177957942509E+01 0.178336418113E+01 + 0.178714940657E+01 0.179093510120E+01 0.179472126482E+01 0.179850789723E+01 + 0.180229499823E+01 0.180608256762E+01 0.180987060519E+01 0.181365911075E+01 + 0.181744808409E+01 0.182123752502E+01 0.182502743332E+01 0.182881780881E+01 + 0.183260865128E+01 0.183639996054E+01 0.184019173637E+01 0.184398397859E+01 + 0.184777668699E+01 0.185156986137E+01 0.185536350154E+01 0.185915760729E+01 + 0.186295217843E+01 0.186674721475E+01 0.187054271606E+01 0.187433868216E+01 + 0.187813511284E+01 0.188193200792E+01 0.188572936719E+01 0.188952719046E+01 + 0.189332547753E+01 0.189712422819E+01 0.190092344226E+01 0.190472311953E+01 + 0.190852325980E+01 0.191232386289E+01 0.191612492859E+01 0.191992645670E+01 + 0.192372844703E+01 0.192753089939E+01 0.193133381356E+01 0.193513718937E+01 + 0.193894102661E+01 0.194274532508E+01 0.194655008460E+01 0.195035530496E+01 + 0.195416098596E+01 0.195796712742E+01 0.196177372914E+01 0.196558079092E+01 + 0.196938831257E+01 0.197319629388E+01 0.197700473468E+01 0.198081363476E+01 + 0.198462299392E+01 0.198843281197E+01 0.199224308873E+01 0.199605382399E+01 + 0.199986501756E+01 0.200367666924E+01 0.200748877885E+01 0.201130134618E+01 + 0.201511437106E+01 0.201892785327E+01 0.202274179263E+01 0.202655618894E+01 + 0.203037104202E+01 0.203418635167E+01 0.203800211769E+01 0.204181833990E+01 + 0.204563501810E+01 0.204945215210E+01 0.205326974170E+01 0.205708778672E+01 + 0.206090628696E+01 0.206472524224E+01 0.206854465235E+01 0.207236451711E+01 + 0.207618483633E+01 0.208000560981E+01 0.208382683737E+01 0.208764851881E+01 + 0.209147065394E+01 0.209529324258E+01 0.209911628452E+01 0.210293977959E+01 + 0.210676372759E+01 0.211058812832E+01 0.211441298161E+01 0.211823828726E+01 + 0.212206404507E+01 0.212589025487E+01 0.212971691646E+01 0.213354402965E+01 + 0.213737159425E+01 0.214119961008E+01 0.214502807694E+01 0.214885699464E+01 + 0.215268636301E+01 0.215651618184E+01 0.216034645095E+01 0.216417717015E+01 + 0.216800833925E+01 0.217183995807E+01 0.217567202642E+01 0.217950454411E+01 + 0.218333751095E+01 0.218717092675E+01 0.219100479133E+01 0.219483910450E+01 + 0.219867386607E+01 0.220250907585E+01 0.220634473367E+01 0.221018083932E+01 + 0.221401739263E+01 0.221785439341E+01 0.222169184147E+01 0.222552973663E+01 + 0.222936807869E+01 0.223320686748E+01 0.223704610281E+01 0.224088578449E+01 + 0.224472591234E+01 0.224856648617E+01 0.225240750579E+01 0.225624897102E+01 + 0.226009088168E+01 0.226393323758E+01 0.226777603853E+01 0.227161928436E+01 + 0.227546297487E+01 0.227930710988E+01 0.228315168921E+01 0.228699671267E+01 + 0.229084218009E+01 0.229468809126E+01 0.229853444602E+01 0.230238124418E+01 + 0.230622848555E+01 0.231007616995E+01 0.231392429720E+01 0.231777286712E+01 + 0.232162187951E+01 0.232547133420E+01 0.232932123101E+01 0.233317156975E+01 + 0.233702235024E+01 0.234087357230E+01 0.234472523575E+01 0.234857734039E+01 + 0.235242988606E+01 0.235628287257E+01 0.236013629973E+01 0.236399016738E+01 + 0.236784447531E+01 0.237169922336E+01 0.237555441134E+01 0.237941003907E+01 + 0.238326610637E+01 0.238712261306E+01 0.239097955895E+01 0.239483694387E+01 + 0.239869476764E+01 0.240255303008E+01 0.240641173100E+01 0.241027087022E+01 + 0.241413044757E+01 0.241799046287E+01 0.242185091593E+01 0.242571180658E+01 + 0.242957313463E+01 0.243343489991E+01 0.243729710224E+01 0.244115974144E+01 + 0.244502281732E+01 0.244888632972E+01 0.245275027845E+01 0.245661466333E+01 + 0.246047948418E+01 0.246434474083E+01 0.246821043310E+01 0.247207656080E+01 + 0.247594312377E+01 0.247981012182E+01 0.248367755478E+01 0.248754542246E+01 + 0.249141372469E+01 0.249528246130E+01 0.249915163210E+01 0.250302123691E+01 + 0.250689127557E+01 0.251076174789E+01 0.251463265370E+01 0.251850399282E+01 + 0.252237576507E+01 0.252624797028E+01 0.253012060827E+01 0.253399367886E+01 + 0.253786718188E+01 0.254174111715E+01 0.254561548449E+01 0.254949028374E+01 + 0.255336551471E+01 0.255724117723E+01 0.256111727112E+01 0.256499379621E+01 + 0.256887075233E+01 0.257274813929E+01 0.257662595692E+01 0.258050420505E+01 + 0.258438288350E+01 0.258826199211E+01 0.259214153068E+01 0.259602149906E+01 + 0.259990189706E+01 0.260378272451E+01 0.260766398123E+01 0.261154566706E+01 + 0.261542778182E+01 0.261931032534E+01 0.262319329744E+01 0.262707669794E+01 + 0.263096052668E+01 0.263484478348E+01 0.263872946817E+01 0.264261458058E+01 + 0.264650012053E+01 0.265038608785E+01 0.265427248237E+01 0.265815930391E+01 + 0.266204655230E+01 0.266593422738E+01 0.266982232896E+01 0.267371085688E+01 + 0.267759981096E+01 0.268148919104E+01 0.268537899694E+01 0.268926922848E+01 + 0.269315988550E+01 0.269705096783E+01 0.270094247529E+01 0.270483440772E+01 + 0.270872676494E+01 0.271261954678E+01 0.271651275307E+01 0.272040638365E+01 + 0.272430043833E+01 0.272819491695E+01 0.273208981934E+01 0.273598514533E+01 + 0.273988089475E+01 0.274377706742E+01 0.274767366319E+01 0.275157068187E+01 + 0.275546812331E+01 0.275936598732E+01 0.276326427374E+01 0.276716298241E+01 + 0.277106211314E+01 0.277496166578E+01 0.277886164015E+01 0.278276203609E+01 + 0.278666285343E+01 0.279056409199E+01 0.279446575161E+01 0.279836783212E+01 + 0.280227033335E+01 0.280617325514E+01 0.281007659731E+01 0.281398035970E+01 + 0.281788454214E+01 0.282178914447E+01 0.282569416651E+01 0.282959960809E+01 + 0.283350546906E+01 0.283741174924E+01 0.284131844846E+01 0.284522556656E+01 + 0.284913310338E+01 0.285304105874E+01 0.285694943247E+01 0.286085822442E+01 + 0.286476743441E+01 0.286867706228E+01 0.287258710786E+01 0.287649757099E+01 + 0.288040845150E+01 0.288431974922E+01 0.288823146399E+01 0.289214359564E+01 + 0.289605614401E+01 0.289996910893E+01 0.290388249023E+01 0.290779628775E+01 + 0.291171050133E+01 0.291562513080E+01 0.291954017600E+01 0.292345563675E+01 + 0.292737151290E+01 0.293128780428E+01 0.293520451073E+01 0.293912163208E+01 + 0.294303916816E+01 0.294695711882E+01 0.295087548389E+01 0.295479426320E+01 + 0.295871345659E+01 0.296263306390E+01 0.296655308497E+01 0.297047351962E+01 + 0.297439436770E+01 0.297831562905E+01 0.298223730349E+01 0.298615939087E+01 + 0.299008189103E+01 0.299400480380E+01 0.299792812901E+01 0.300185186651E+01 + 0.300577601613E+01 0.300970057772E+01 0.301362555110E+01 0.301755093611E+01 + 0.302147673260E+01 0.302540294040E+01 0.302932955935E+01 0.303325658929E+01 + 0.303718403005E+01 0.304111188148E+01 0.304504014341E+01 0.304896881568E+01 + 0.305289789813E+01 0.305682739060E+01 0.306075729293E+01 0.306468760496E+01 + 0.306861832652E+01 0.307254945745E+01 0.307648099760E+01 0.308041294680E+01 + 0.308434530489E+01 0.308827807172E+01 0.309221124712E+01 0.309614483093E+01 + 0.310007882300E+01 0.310401322315E+01 0.310794803124E+01 0.311188324710E+01 + 0.311581887057E+01 0.311975490150E+01 0.312369133972E+01 0.312762818508E+01 + 0.313156543741E+01 0.313550309655E+01 0.313944116236E+01 0.314337963466E+01 + 0.314731851330E+01 0.315125779812E+01 0.315519748897E+01 0.315913758567E+01 + 0.316307808809E+01 0.316701899605E+01 0.317096030940E+01 0.317490202797E+01 + 0.317884415163E+01 0.318278668019E+01 0.318672961351E+01 0.319067295144E+01 + 0.319461669380E+01 0.319856084045E+01 0.320250539122E+01 0.320645034597E+01 + 0.321039570452E+01 0.321434146674E+01 0.321828763244E+01 0.322223420150E+01 + 0.322618117373E+01 0.323012854900E+01 0.323407632713E+01 0.323802450798E+01 + 0.324197309139E+01 0.324592207720E+01 0.324987146526E+01 0.325382125540E+01 + 0.325777144748E+01 0.326172204134E+01 0.326567303683E+01 0.326962443377E+01 + 0.327357623203E+01 0.327752843145E+01 0.328148103187E+01 0.328543403313E+01 + 0.328938743508E+01 0.329334123756E+01 0.329729544043E+01 0.330125004352E+01 + 0.330520504668E+01 0.330916044976E+01 0.331311625260E+01 0.331707245505E+01 + 0.332102905694E+01 0.332498605814E+01 0.332894345848E+01 0.333290125781E+01 + 0.333685945598E+01 0.334081805282E+01 0.334477704820E+01 0.334873644195E+01 + 0.335269623392E+01 0.335665642396E+01 0.336061701192E+01 0.336457799763E+01 + 0.336853938095E+01 0.337250116173E+01 0.337646333981E+01 0.338042591504E+01 + 0.338438888726E+01 0.338835225633E+01 0.339231602209E+01 0.339628018438E+01 + 0.340024474307E+01 0.340420969798E+01 0.340817504898E+01 0.341214079591E+01 + 0.341610693861E+01 0.342007347694E+01 0.342404041075E+01 0.342800773987E+01 + 0.343197546417E+01 0.343594358348E+01 0.343991209767E+01 0.344388100657E+01 + 0.344785031003E+01 0.345182000791E+01 0.345579010005E+01 0.345976058630E+01 + 0.346373146651E+01 0.346770274053E+01 0.347167440822E+01 0.347564646941E+01 + 0.347961892396E+01 0.348359177172E+01 0.348756501253E+01 0.349153864626E+01 + 0.349551267274E+01 0.349948709183E+01 0.350346190338E+01 0.350743710723E+01 + 0.351141270325E+01 0.351538869127E+01 0.351936507115E+01 0.352334184274E+01 + 0.352731900590E+01 0.353129656046E+01 0.353527450629E+01 0.353925284323E+01 + 0.354323157113E+01 0.354721068985E+01 0.355119019924E+01 0.355517009914E+01 + 0.355915038942E+01 0.356313106991E+01 0.356711214048E+01 0.357109360097E+01 + 0.357507545124E+01 0.357905769114E+01 0.358304032051E+01 0.358702333922E+01 + 0.359100674712E+01 0.359499054405E+01 0.359897472987E+01 0.360295930443E+01 + 0.360694426758E+01 0.361092961919E+01 0.361491535909E+01 0.361890148714E+01 + 0.362288800320E+01 0.362687490712E+01 0.363086219875E+01 0.363484987795E+01 + 0.363883794456E+01 0.364282639845E+01 0.364681523946E+01 0.365080446745E+01 + 0.365479408227E+01 0.365878408377E+01 0.366277447182E+01 0.366676524626E+01 + 0.367075640695E+01 0.367474795374E+01 0.367873988649E+01 0.368273220505E+01 + 0.368672490927E+01 0.369071799902E+01 0.369471147414E+01 0.369870533448E+01 + 0.370269957991E+01 0.370669421028E+01 0.371068922544E+01 0.371468462526E+01 + 0.371868040957E+01 0.372267657824E+01 0.372667313113E+01 0.373067006809E+01 + 0.373466738898E+01 0.373866509364E+01 0.374266318194E+01 0.374666165373E+01 + 0.375066050888E+01 0.375465974722E+01 0.375865936863E+01 0.376265937295E+01 + 0.376665976005E+01 0.377066052977E+01 0.377466168198E+01 0.377866321653E+01 + 0.378266513328E+01 0.378666743209E+01 0.379067011281E+01 0.379467317529E+01 + 0.379867661940E+01 0.380268044500E+01 0.380668465193E+01 0.381068924007E+01 + 0.381469420925E+01 0.381869955935E+01 0.382270529022E+01 0.382671140171E+01 + 0.383071789369E+01 0.383472476601E+01 0.383873201854E+01 0.384273965112E+01 + 0.384674766361E+01 0.385075605588E+01 0.385476482779E+01 0.385877397918E+01 + 0.386278350992E+01 0.386679341987E+01 0.387080370889E+01 0.387481437683E+01 + 0.387882542356E+01 0.388283684892E+01 0.388684865279E+01 0.389086083502E+01 + 0.389487339547E+01 0.389888633399E+01 0.390289965046E+01 0.390691334472E+01 + 0.391092741664E+01 0.391494186607E+01 0.391895669288E+01 0.392297189692E+01 + 0.392698747806E+01 0.393100343616E+01 0.393501977107E+01 0.393903648265E+01 + 0.394305357077E+01 0.394707103528E+01 0.395108887605E+01 0.395510709294E+01 + 0.395912568580E+01 0.396314465450E+01 0.396716399889E+01 0.397118371885E+01 + 0.397520381422E+01 0.397922428487E+01 0.398324513067E+01 0.398726635146E+01 + 0.399128794712E+01 0.399530991751E+01 0.399933226248E+01 0.400335498189E+01 + 0.400737807562E+01 0.401140154351E+01 0.401542538544E+01 0.401944960126E+01 + 0.402347419084E+01 0.402749915403E+01 0.403152449070E+01 0.403555020072E+01 + 0.403957628393E+01 0.404360274022E+01 0.404762956943E+01 0.405165677143E+01 + 0.405568434609E+01 0.405971229326E+01 0.406374061281E+01 0.406776930460E+01 + 0.407179836850E+01 0.407582780436E+01 0.407985761205E+01 0.408388779144E+01 + 0.408791834238E+01 0.409194926474E+01 0.409598055839E+01 0.410001222318E+01 + 0.410404425898E+01 0.410807666565E+01 0.411210944306E+01 0.411614259108E+01 + 0.412017610955E+01 0.412420999836E+01 0.412824425736E+01 0.413227888642E+01 + 0.413631388539E+01 0.414034925416E+01 0.414438499257E+01 0.414842110050E+01 + 0.415245757780E+01 0.415649442435E+01 0.416053164001E+01 0.416456922464E+01 + 0.416860717810E+01 0.417264550027E+01 0.417668419101E+01 0.418072325018E+01 + 0.418476267765E+01 0.418880247328E+01 0.419284263694E+01 0.419688316849E+01 + 0.420092406781E+01 0.420496533474E+01 0.420900696917E+01 0.421304897096E+01 + 0.421709133996E+01 0.422113407606E+01 0.422517717911E+01 0.422922064898E+01 + 0.423326448554E+01 0.423730868865E+01 0.424135325817E+01 0.424539819399E+01 + 0.424944349595E+01 0.425348916394E+01 0.425753519781E+01 0.426158159743E+01 + 0.426562836267E+01 0.426967549340E+01 0.427372298947E+01 0.427777085077E+01 + 0.428181907716E+01 0.428586766850E+01 0.428991662465E+01 0.429396594550E+01 + 0.429801563091E+01 0.430206568074E+01 0.430611609486E+01 0.431016687314E+01 + 0.431421801544E+01 0.431826952164E+01 0.432232139160E+01 0.432637362520E+01 + 0.433042622229E+01 0.433447918275E+01 0.433853250644E+01 0.434258619324E+01 + 0.434664024301E+01 0.435069465562E+01 0.435474943093E+01 0.435880456883E+01 + 0.436286006917E+01 0.436691593183E+01 0.437097215667E+01 0.437502874357E+01 + 0.437908569238E+01 0.438314300299E+01 0.438720067526E+01 0.439125870906E+01 + 0.439531710425E+01 0.439937586072E+01 0.440343497832E+01 0.440749445693E+01 + 0.441155429642E+01 0.441561449666E+01 0.441967505751E+01 0.442373597885E+01 + 0.442779726054E+01 0.443185890247E+01 0.443592090448E+01 0.443998326647E+01 + 0.444404598830E+01 0.444810906983E+01 0.445217251094E+01 0.445623631150E+01 + 0.446030047138E+01 0.446436499045E+01 0.446842986858E+01 0.447249510564E+01 + 0.447656070151E+01 0.448062665604E+01 0.448469296913E+01 0.448875964063E+01 + 0.449282667042E+01 0.449689405836E+01 0.450096180434E+01 0.450502990821E+01 + 0.450909836986E+01 0.451316718916E+01 0.451723636597E+01 0.452130590017E+01 + 0.452537579163E+01 0.452944604022E+01 0.453351664581E+01 0.453758760828E+01 + 0.454165892750E+01 0.454573060334E+01 0.454980263567E+01 0.455387502437E+01 + 0.455794776930E+01 0.456202087035E+01 0.456609432738E+01 0.457016814026E+01 + 0.457424230887E+01 0.457831683308E+01 0.458239171276E+01 0.458646694780E+01 + 0.459054253805E+01 0.459461848339E+01 0.459869478370E+01 0.460277143885E+01 + 0.460684844872E+01 0.461092581317E+01 0.461500353208E+01 0.461908160532E+01 + 0.462316003277E+01 0.462723881430E+01 0.463131794979E+01 0.463539743910E+01 + 0.463947728212E+01 0.464355747871E+01 0.464763802876E+01 0.465171893213E+01 + 0.465580018870E+01 0.465988179834E+01 0.466396376093E+01 0.466804607634E+01 + 0.467212874445E+01 0.467621176513E+01 0.468029513826E+01 0.468437886371E+01 + 0.468846294136E+01 0.469254737107E+01 0.469663215273E+01 0.470071728622E+01 + 0.470480277140E+01 0.470888860815E+01 0.471297479634E+01 0.471706133586E+01 + 0.472114822658E+01 0.472523546837E+01 0.472932306111E+01 0.473341100468E+01 + 0.473749929894E+01 0.474158794378E+01 0.474567693907E+01 0.474976628469E+01 + 0.475385598051E+01 0.475794602642E+01 0.476203642228E+01 0.476612716797E+01 + 0.477021826337E+01 0.477430970836E+01 0.477840150280E+01 0.478249364659E+01 + 0.478658613959E+01 0.479067898168E+01 0.479477217275E+01 0.479886571265E+01 + 0.480295960128E+01 0.480705383851E+01 0.481114842421E+01 0.481524335827E+01 + 0.481933864055E+01 0.482343427095E+01 0.482753024933E+01 0.483162657557E+01 + 0.483572324955E+01 0.483982027115E+01 0.484391764025E+01 0.484801535672E+01 + 0.485211342043E+01 0.485621183128E+01 0.486031058913E+01 0.486440969387E+01 + 0.486850914537E+01 0.487260894351E+01 0.487670908817E+01 0.488080957923E+01 + 0.488491041656E+01 0.488901160005E+01 0.489311312957E+01 0.489721500500E+01 + 0.490131722622E+01 0.490541979311E+01 0.490952270554E+01 0.491362596340E+01 + 0.491772956657E+01 0.492183351492E+01 0.492593780833E+01 0.493004244668E+01 + 0.493414742986E+01 0.493825275773E+01 0.494235843019E+01 0.494646444711E+01 + 0.495057080836E+01 0.495467751383E+01 0.495878456340E+01 0.496289195695E+01 + 0.496699969435E+01 0.497110777550E+01 0.497521620026E+01 0.497932496851E+01 + 0.498343408015E+01 0.498754353504E+01 0.499165333306E+01 0.499576347411E+01 + 0.499987395805E+01 0.500398478478E+01 0.500809595416E+01 0.501220746608E+01 + 0.501631932042E+01 0.502043151706E+01 0.502454405588E+01 0.502865693677E+01 + 0.503277015959E+01 0.503688372424E+01 0.504099763060E+01 0.504511187854E+01 + 0.504922646795E+01 0.505334139871E+01 0.505745667070E+01 0.506157228380E+01 + 0.506568823789E+01 0.506980453286E+01 0.507392116858E+01 0.507803814494E+01 + 0.508215546182E+01 0.508627311909E+01 0.509039111666E+01 0.509450945438E+01 + 0.509862813215E+01 0.510274714985E+01 0.510686650736E+01 0.511098620457E+01 + 0.511510624135E+01 0.511922661758E+01 0.512334733316E+01 0.512746838796E+01 + 0.513158978186E+01 0.513571151475E+01 0.513983358651E+01 0.514395599702E+01 + 0.514807874617E+01 0.515220183384E+01 0.515632525991E+01 0.516044902426E+01 + 0.516457312678E+01 0.516869756735E+01 0.517282234585E+01 0.517694746217E+01 + 0.518107291619E+01 0.518519870780E+01 0.518932483687E+01 0.519345130329E+01 + 0.519757810695E+01 0.520170524772E+01 0.520583272549E+01 0.520996054016E+01 + 0.521408869159E+01 0.521821717967E+01 0.522234600429E+01 0.522647516533E+01 + 0.523060466268E+01 0.523473449622E+01 0.523886466583E+01 0.524299517140E+01 + 0.524712601281E+01 0.525125718995E+01 0.525538870270E+01 0.525952055095E+01 + 0.526365273457E+01 0.526778525347E+01 0.527191810751E+01 0.527605129659E+01 + 0.528018482059E+01 0.528431867939E+01 0.528845287289E+01 0.529258740096E+01 + 0.529672226349E+01 0.530085746036E+01 0.530499299147E+01 0.530912885669E+01 + 0.531326505592E+01 0.531740158903E+01 0.532153845592E+01 0.532567565646E+01 + 0.532981319055E+01 0.533395105807E+01 0.533808925891E+01 0.534222779294E+01 + 0.534636666007E+01 0.535050586017E+01 0.535464539313E+01 0.535878525883E+01 + 0.536292545717E+01 0.536706598803E+01 0.537120685129E+01 0.537534804684E+01 + 0.537948957458E+01 0.538363143437E+01 0.538777362612E+01 0.539191614970E+01 + 0.539605900501E+01 0.540020219194E+01 0.540434571036E+01 0.540848956016E+01 + 0.541263374124E+01 0.541677825348E+01 0.542092309676E+01 0.542506827098E+01 + 0.542921377602E+01 0.543335961176E+01 0.543750577810E+01 0.544165227493E+01 + 0.544579910213E+01 0.544994625958E+01 0.545409374718E+01 0.545824156482E+01 + 0.546238971237E+01 0.546653818974E+01 0.547068699680E+01 0.547483613344E+01 + 0.547898559956E+01 0.548313539505E+01 0.548728551978E+01 0.549143597365E+01 + 0.549558675654E+01 0.549973786835E+01 0.550388930896E+01 0.550804107826E+01 + 0.551219317614E+01 0.551634560249E+01 0.552049835720E+01 0.552465144015E+01 + 0.552880485124E+01 0.553295859035E+01 0.553711265738E+01 0.554126705220E+01 + 0.554542177471E+01 0.554957682481E+01 0.555373220237E+01 0.555788790729E+01 + 0.556204393946E+01 0.556620029876E+01 0.557035698509E+01 0.557451399833E+01 + 0.557867133838E+01 0.558282900512E+01 0.558698699845E+01 0.559114531825E+01 + 0.559530396442E+01 0.559946293683E+01 0.560362223540E+01 0.560778185999E+01 + 0.561194181051E+01 0.561610208684E+01 0.562026268887E+01 0.562442361650E+01 + 0.562858486961E+01 0.563274644810E+01 0.563690835185E+01 0.564107058076E+01 + 0.564523313471E+01 0.564939601360E+01 0.565355921732E+01 0.565772274575E+01 + 0.566188659879E+01 0.566605077634E+01 0.567021527827E+01 0.567438010448E+01 + 0.567854525487E+01 0.568271072931E+01 0.568687652772E+01 0.569104264997E+01 + 0.569520909595E+01 0.569937586556E+01 0.570354295870E+01 0.570771037524E+01 + 0.571187811509E+01 0.571604617813E+01 0.572021456426E+01 0.572438327336E+01 + 0.572855230533E+01 0.573272166007E+01 0.573689133745E+01 0.574106133739E+01 + 0.574523165975E+01 0.574940230445E+01 0.575357327137E+01 0.575774456040E+01 + 0.576191617144E+01 0.576608810437E+01 0.577026035909E+01 0.577443293550E+01 + 0.577860583348E+01 0.578277905293E+01 0.578695259374E+01 0.579112645580E+01 + 0.579530063900E+01 0.579947514325E+01 0.580364996842E+01 0.580782511442E+01 + 0.581200058114E+01 0.581617636846E+01 0.582035247629E+01 0.582452890451E+01 + 0.582870565302E+01 0.583288272172E+01 0.583706011049E+01 0.584123781923E+01 + 0.584541584783E+01 0.584959419619E+01 0.585377286420E+01 0.585795185175E+01 + 0.586213115873E+01 0.586631078505E+01 0.587049073059E+01 0.587467099525E+01 + 0.587885157892E+01 0.588303248150E+01 0.588721370288E+01 0.589139524295E+01 + 0.589557710161E+01 0.589975927875E+01 0.590394177426E+01 0.590812458805E+01 + 0.591230772001E+01 0.591649117002E+01 0.592067493799E+01 0.592485902380E+01 + 0.592904342736E+01 0.593322814856E+01 0.593741318729E+01 0.594159854344E+01 + 0.594578421692E+01 0.594997020762E+01 0.595415651542E+01 0.595834314024E+01 + 0.596253008195E+01 0.596671734047E+01 0.597090491567E+01 0.597509280747E+01 + 0.597928101574E+01 0.598346954040E+01 0.598765838133E+01 0.599184753842E+01 + 0.599603701159E+01 0.600022680071E+01 0.600441690568E+01 0.600860732641E+01 + 0.601279806279E+01 0.601698911471E+01 0.602118048207E+01 0.602537216476E+01 + 0.602956416269E+01 0.603375647574E+01 0.603794910381E+01 0.604214204680E+01 + 0.604633530461E+01 0.605052887713E+01 0.605472276426E+01 0.605891696589E+01 + 0.606311148192E+01 0.606730631225E+01 0.607150145678E+01 0.607569691539E+01 + 0.607989268799E+01 0.608408877448E+01 0.608828517474E+01 0.609248188868E+01 + 0.609667891620E+01 0.610087625719E+01 0.610507391155E+01 0.610927187917E+01 + 0.611347015995E+01 0.611766875379E+01 0.612186766059E+01 0.612606688025E+01 + 0.613026641265E+01 0.613446625771E+01 0.613866641531E+01 0.614286688535E+01 + 0.614706766774E+01 0.615126876236E+01 0.615547016913E+01 0.615967188792E+01 + 0.616387391865E+01 0.616807626121E+01 0.617227891549E+01 0.617648188141E+01 + 0.618068515884E+01 0.618488874770E+01 0.618909264788E+01 0.619329685927E+01 + 0.619750138178E+01 0.620170621531E+01 0.620591135975E+01 0.621011681500E+01 + 0.621432258096E+01 0.621852865753E+01 0.622273504461E+01 0.622694174209E+01 + 0.623114874988E+01 0.623535606787E+01 0.623956369596E+01 0.624377163405E+01 + 0.624797988205E+01 0.625218843984E+01 0.625639730732E+01 0.626060648441E+01 + 0.626481597099E+01 0.626902576696E+01 0.627323587223E+01 0.627744628670E+01 + 0.628165701025E+01 0.628586804280E+01 0.629007938424E+01 0.629429103447E+01 + 0.629850299339E+01 0.630271526090E+01 0.630692783690E+01 0.631114072129E+01 + 0.631535391397E+01 0.631956741484E+01 0.632378122380E+01 0.632799534075E+01 + 0.633220976558E+01 0.633642449821E+01 0.634063953852E+01 0.634485488643E+01 + 0.634907054182E+01 0.635328650460E+01 0.635750277467E+01 0.636171935194E+01 + 0.636593623629E+01 0.637015342764E+01 0.637437092587E+01 0.637858873090E+01 + 0.638280684263E+01 0.638702526094E+01 0.639124398575E+01 0.639546301696E+01 + 0.639968235446E+01 0.640390199816E+01 0.640812194796E+01 0.641234220375E+01 + 0.641656276545E+01 0.642078363295E+01 0.642500480615E+01 0.642922628495E+01 + 0.643344806926E+01 0.643767015897E+01 0.644189255399E+01 0.644611525422E+01 + 0.645033825957E+01 0.645456156992E+01 0.645878518519E+01 0.646300910527E+01 + 0.646723333007E+01 0.647145785948E+01 0.647568269342E+01 0.647990783178E+01 + 0.648413327447E+01 0.648835902138E+01 0.649258507242E+01 0.649681142749E+01 + 0.650103808649E+01 0.650526504933E+01 0.650949231590E+01 0.651371988611E+01 + 0.651794775986E+01 0.652217593706E+01 0.652640441761E+01 0.653063320140E+01 + 0.653486228834E+01 0.653909167834E+01 0.654332137129E+01 0.654755136711E+01 + 0.655178166568E+01 0.655601226692E+01 0.656024317073E+01 0.656447437701E+01 + 0.656870588566E+01 0.657293769659E+01 0.657716980970E+01 0.658140222489E+01 + 0.658563494206E+01 0.658986796113E+01 0.659410128199E+01 0.659833490454E+01 + 0.660256882869E+01 0.660680305435E+01 0.661103758141E+01 0.661527240978E+01 + 0.661950753936E+01 0.662374297006E+01 0.662797870178E+01 0.663221473442E+01 + 0.663645106789E+01 0.664068770210E+01 0.664492463693E+01 0.664916187231E+01 + 0.665339940813E+01 0.665763724430E+01 0.666187538072E+01 0.666611381730E+01 + 0.667035255393E+01 0.667459159053E+01 0.667883092700E+01 0.668307056324E+01 + 0.668731049916E+01 0.669155073466E+01 0.669579126965E+01 0.670003210402E+01 + 0.670427323770E+01 0.670851467057E+01 0.671275640254E+01 0.671699843353E+01 + 0.672124076343E+01 0.672548339215E+01 0.672972631959E+01 0.673396954566E+01 + 0.673821307027E+01 0.674245689331E+01 0.674670101470E+01 0.675094543434E+01 + 0.675519015213E+01 0.675943516798E+01 0.676368048180E+01 0.676792609348E+01 + 0.677217200295E+01 0.677641821009E+01 0.678066471482E+01 0.678491151704E+01 + 0.678915861666E+01 0.679340601358E+01 0.679765370771E+01 0.680190169896E+01 + 0.680614998723E+01 0.681039857242E+01 0.681464745445E+01 0.681889663322E+01 + 0.682314610862E+01 0.682739588058E+01 0.683164594900E+01 0.683589631378E+01 + 0.684014697483E+01 0.684439793205E+01 0.684864918536E+01 0.685290073465E+01 + 0.685715257983E+01 0.686140472082E+01 0.686565715752E+01 0.686990988982E+01 + 0.687416291765E+01 0.687841624091E+01 0.688266985949E+01 0.688692377332E+01 + 0.689117798230E+01 0.689543248633E+01 0.689968728532E+01 0.690394237918E+01 + 0.690819776781E+01 0.691245345113E+01 0.691670942903E+01 0.692096570143E+01 + 0.692522226823E+01 0.692947912935E+01 0.693373628468E+01 0.693799373414E+01 + 0.694225147763E+01 0.694650951505E+01 0.695076784633E+01 0.695502647136E+01 + 0.695928539005E+01 0.696354460232E+01 0.696780410806E+01 0.697206390719E+01 + 0.697632399961E+01 0.698058438523E+01 0.698484506396E+01 0.698910603570E+01 + 0.699336730037E+01 0.699762885788E+01 0.700189070812E+01 0.700615285101E+01 + 0.701041528647E+01 0.701467801438E+01 0.701894103467E+01 0.702320434724E+01 + 0.702746795200E+01 0.703173184886E+01 0.703599603773E+01 0.704026051851E+01 + 0.704452529112E+01 0.704879035545E+01 0.705305571143E+01 0.705732135896E+01 + 0.706158729795E+01 0.706585352831E+01 0.707012004994E+01 0.707438686276E+01 + 0.707865396667E+01 0.708292136158E+01 0.708718904741E+01 0.709145702405E+01 + 0.709572529143E+01 0.709999384944E+01 0.710426269801E+01 0.710853183703E+01 + 0.711280126642E+01 0.711707098608E+01 0.712134099594E+01 0.712561129588E+01 + 0.712988188583E+01 0.713415276570E+01 0.713842393538E+01 0.714269539481E+01 + 0.714696714387E+01 0.715123918249E+01 0.715551151057E+01 0.715978412802E+01 + 0.716405703476E+01 0.716833023068E+01 0.717260371571E+01 0.717687748975E+01 + 0.718115155271E+01 0.718542590451E+01 0.718970054505E+01 0.719397547424E+01 + 0.719825069199E+01 0.720252619821E+01 0.720680199282E+01 0.721107807572E+01 + 0.721535444683E+01 0.721963110605E+01 0.722390805330E+01 0.722818528848E+01 + 0.723246281151E+01 0.723674062229E+01 0.724101872074E+01 0.724529710678E+01 + 0.724957578030E+01 0.725385474121E+01 0.725813398945E+01 0.726241352490E+01 + 0.726669334748E+01 0.727097345711E+01 0.727525385369E+01 0.727953453714E+01 + 0.728381550737E+01 0.728809676428E+01 0.729237830780E+01 0.729666013782E+01 + 0.730094225427E+01 0.730522465705E+01 0.730950734608E+01 0.731379032126E+01 + 0.731807358251E+01 0.732235712974E+01 0.732664096286E+01 0.733092508178E+01 + 0.733520948642E+01 0.733949417668E+01 0.734377915249E+01 0.734806441374E+01 + 0.735234996035E+01 0.735663579224E+01 0.736092190931E+01 0.736520831148E+01 + 0.736949499866E+01 0.737378197076E+01 0.737806922770E+01 0.738235676938E+01 + 0.738664459572E+01 0.739093270663E+01 0.739522110203E+01 0.739950978182E+01 + 0.740379874592E+01 0.740808799424E+01 0.741237752669E+01 0.741666734318E+01 + 0.742095744364E+01 0.742524782796E+01 0.742953849607E+01 0.743382944788E+01 + 0.743812068329E+01 0.744241220223E+01 0.744670400460E+01 0.745099609031E+01 + 0.745528845929E+01 0.745958111144E+01 0.746387404668E+01 0.746816726492E+01 + 0.747246076607E+01 0.747675455005E+01 0.748104861676E+01 0.748534296613E+01 + 0.748963759806E+01 0.749393251248E+01 0.749822770928E+01 0.750252318839E+01 + 0.750681894973E+01 0.751111499319E+01 0.751541131870E+01 0.751970792617E+01 + 0.752400481552E+01 0.752830198665E+01 0.753259943949E+01 0.753689717394E+01 + 0.754119518991E+01 0.754549348734E+01 0.754979206611E+01 0.755409092616E+01 + 0.755839006740E+01 0.756268948973E+01 0.756698919308E+01 0.757128917735E+01 + 0.757558944247E+01 0.757988998834E+01 0.758419081488E+01 0.758849192200E+01 + 0.759279330963E+01 0.759709497766E+01 0.760139692603E+01 0.760569915463E+01 + 0.761000166340E+01 0.761430445223E+01 0.761860752105E+01 0.762291086977E+01 + 0.762721449831E+01 0.763151840657E+01 0.763582259448E+01 0.764012706195E+01 + 0.764443180890E+01 0.764873683523E+01 0.765304214087E+01 0.765734772573E+01 + 0.766165358972E+01 0.766595973277E+01 0.767026615477E+01 0.767457285566E+01 + 0.767887983534E+01 0.768318709374E+01 0.768749463075E+01 0.769180244631E+01 + 0.769611054033E+01 0.770041891272E+01 0.770472756340E+01 0.770903649228E+01 + 0.771334569927E+01 0.771765518431E+01 0.772196494729E+01 0.772627498814E+01 + 0.773058530677E+01 0.773489590309E+01 0.773920677703E+01 0.774351792850E+01 + 0.774782935742E+01 0.775214106369E+01 0.775645304724E+01 0.776076530799E+01 + 0.776507784584E+01 0.776939066072E+01 0.777370375254E+01 0.777801712121E+01 + 0.778233076667E+01 0.778664468881E+01 0.779095888755E+01 0.779527336282E+01 + 0.779958811453E+01 0.780390314260E+01 0.780821844694E+01 0.781253402746E+01 + 0.781684988409E+01 0.782116601675E+01 0.782548242534E+01 0.782979910979E+01 + 0.783411607001E+01 0.783843330592E+01 0.784275081743E+01 0.784706860447E+01 + 0.785138666695E+01 0.785570500478E+01 0.786002361789E+01 0.786434250618E+01 + 0.786866166959E+01 0.787298110802E+01 0.787730082139E+01 0.788162080963E+01 + 0.788594107264E+01 0.789026161034E+01 0.789458242265E+01 0.789890350949E+01 + 0.790322487078E+01 0.790754650644E+01 0.791186841637E+01 0.791619060050E+01 + 0.792051305875E+01 0.792483579103E+01 0.792915879727E+01 0.793348207737E+01 + 0.793780563126E+01 0.794212945885E+01 0.794645356007E+01 0.795077793483E+01 + 0.465848749467E+00 0.465624333529E+00 0.465399971659E+00 0.465175663857E+00 + 0.464951410123E+00 0.464727210455E+00 0.464503064856E+00 0.464278973324E+00 + 0.464054935860E+00 0.463830952463E+00 0.463607023134E+00 0.463383147873E+00 + 0.463159326679E+00 0.462935559552E+00 0.462711846494E+00 0.462488187503E+00 + 0.462264582579E+00 0.462041031723E+00 0.461817534935E+00 0.461594092214E+00 + 0.461370703561E+00 0.461147368976E+00 0.460924088458E+00 0.460700862007E+00 + 0.460477689625E+00 0.460254571310E+00 0.460031507062E+00 0.459808496882E+00 + 0.459585540770E+00 0.459362638725E+00 0.459139790748E+00 0.458916996839E+00 + 0.458694256997E+00 0.458471571223E+00 0.458248939516E+00 0.458026361877E+00 + 0.457803838305E+00 0.457581368801E+00 0.457358953365E+00 0.457136591996E+00 + 0.456914284695E+00 0.456692031462E+00 0.456469832296E+00 0.456247687198E+00 + 0.456025596167E+00 0.455803559204E+00 0.455581576308E+00 0.455359647480E+00 + 0.455137772720E+00 0.454915952027E+00 0.454694185402E+00 0.454472472845E+00 + 0.454250814355E+00 0.454029209933E+00 0.453807659578E+00 0.453586163291E+00 + 0.453364721071E+00 0.453143332919E+00 0.452921998835E+00 0.452700718818E+00 + 0.452479492869E+00 0.452258320988E+00 0.452037203174E+00 0.451816139428E+00 + 0.451595129749E+00 0.451374174138E+00 0.451153272594E+00 0.450932425118E+00 + 0.450711631710E+00 0.450490892369E+00 0.450270207096E+00 0.450049575891E+00 + 0.449828998753E+00 0.449608475682E+00 0.449388006680E+00 0.449167591745E+00 + 0.448947230877E+00 0.448726924077E+00 0.448506671345E+00 0.448286472680E+00 + 0.448066328083E+00 0.447846237554E+00 0.447626201092E+00 0.447406218697E+00 + 0.447186290371E+00 0.446966416112E+00 0.446746595920E+00 0.446526829796E+00 + 0.446307117740E+00 0.446087459751E+00 0.445867855830E+00 0.445648305976E+00 + 0.445428810191E+00 0.445209368472E+00 0.444989980821E+00 0.444770647238E+00 + 0.444551367723E+00 0.444332142275E+00 0.444112970895E+00 0.443893853582E+00 + 0.443674790337E+00 0.443455781159E+00 0.443236826049E+00 0.443017925007E+00 + 0.442799078032E+00 0.442580285125E+00 0.442361546286E+00 0.442142861514E+00 + 0.441924230809E+00 0.441705654173E+00 0.441487131604E+00 0.441268663102E+00 + 0.441050248668E+00 0.440831888302E+00 0.440613582003E+00 0.440395329772E+00 + 0.440177131608E+00 0.439958987513E+00 0.439740897484E+00 0.439522861523E+00 + 0.439304879630E+00 0.439086951805E+00 0.438869078047E+00 0.438651258357E+00 + 0.438433492734E+00 0.438215781179E+00 0.437998123691E+00 0.437780520271E+00 + 0.437562970919E+00 0.437345475634E+00 0.437128034417E+00 0.436910647268E+00 + 0.436693314186E+00 0.436476035171E+00 0.436258810225E+00 0.436041639345E+00 + 0.435824522534E+00 0.435607459790E+00 0.435390451114E+00 0.435173496505E+00 + 0.434956595964E+00 0.434739749490E+00 0.434522957084E+00 0.434306218746E+00 + 0.434089534475E+00 0.433872904272E+00 0.433656328137E+00 0.433439806069E+00 + 0.433223338068E+00 0.433006924136E+00 0.432790564270E+00 0.432574258473E+00 + 0.432358006743E+00 0.432141809081E+00 0.431925665486E+00 0.431709575959E+00 + 0.431493540499E+00 0.431277559107E+00 0.431061631783E+00 0.430845758526E+00 + 0.430629939337E+00 0.430414174215E+00 0.430198463162E+00 0.429982806175E+00 + 0.429767203256E+00 0.429551654405E+00 0.429336159622E+00 0.429120718906E+00 + 0.428905332257E+00 0.428689999677E+00 0.428474721164E+00 0.428259496718E+00 + 0.428044326340E+00 0.427829210030E+00 0.427614147787E+00 0.427399139612E+00 + 0.427184185504E+00 0.426969285464E+00 0.426754439492E+00 0.426539647587E+00 + 0.426324909750E+00 0.426110225981E+00 0.425895596279E+00 0.425681020644E+00 + 0.425466499078E+00 0.425252031578E+00 0.425037618147E+00 0.424823258783E+00 + 0.424608953487E+00 0.424394702258E+00 0.424180505097E+00 0.423966362003E+00 + 0.423752272977E+00 0.423538238019E+00 0.423324257128E+00 0.423110330305E+00 + 0.422896457549E+00 0.422682638861E+00 0.422468874241E+00 0.422255163688E+00 + 0.422041507203E+00 0.421827904786E+00 0.421614356436E+00 0.421400862153E+00 + 0.421187421938E+00 0.420974035791E+00 0.420760703712E+00 0.420547425700E+00 + 0.420334201755E+00 0.420121031879E+00 0.419907916070E+00 0.419694854328E+00 + 0.419481846654E+00 0.419268893048E+00 0.419055993509E+00 0.418843148038E+00 + 0.418630356634E+00 0.418417619298E+00 0.418204936030E+00 0.417992306829E+00 + 0.417779731696E+00 0.417567210630E+00 0.417354743632E+00 0.417142330702E+00 + 0.416929971839E+00 0.416717667044E+00 0.416505416317E+00 0.416293219657E+00 + 0.416081077064E+00 0.415868988539E+00 0.415656954082E+00 0.415444973693E+00 + 0.415233047371E+00 0.415021175116E+00 0.414809356930E+00 0.414597592810E+00 + 0.414385882759E+00 0.414174226775E+00 0.413962624859E+00 0.413751077010E+00 + 0.413539583229E+00 0.413328143515E+00 0.413116757869E+00 0.412905426291E+00 + 0.412694148780E+00 0.412482925337E+00 0.412271755961E+00 0.412060640653E+00 + 0.411849579413E+00 0.411638572240E+00 0.411427619135E+00 0.411216720097E+00 + 0.411005875127E+00 0.410795084225E+00 0.410584347390E+00 0.410373664623E+00 + 0.410163035923E+00 0.409952461292E+00 0.409741940727E+00 0.409531474230E+00 + 0.409321061801E+00 0.409110703440E+00 0.408900399146E+00 0.408690148919E+00 + 0.408479952760E+00 0.408269810669E+00 0.408059722646E+00 0.407849688690E+00 + 0.407639708801E+00 0.407429782981E+00 0.407219911227E+00 0.407010093542E+00 + 0.406800329924E+00 0.406590620373E+00 0.406380964891E+00 0.406171363475E+00 + 0.405961816128E+00 0.405752322848E+00 0.405542883636E+00 0.405333498491E+00 + 0.405124167414E+00 0.404914890404E+00 0.404705667462E+00 0.404496498588E+00 + 0.404287383781E+00 0.404078323042E+00 0.403869316370E+00 0.403660363766E+00 + 0.403451465230E+00 0.403242620761E+00 0.403033830360E+00 0.402825094026E+00 + 0.402616411760E+00 0.402407783562E+00 0.402199209431E+00 0.401990689368E+00 + 0.401782223372E+00 0.401573811444E+00 0.401365453584E+00 0.401157149791E+00 + 0.400948900066E+00 0.400740704408E+00 0.400532562818E+00 0.400324475296E+00 + 0.400116441841E+00 0.399908462454E+00 0.399700537134E+00 0.399492665882E+00 + 0.399284848698E+00 0.399077085581E+00 0.398869376532E+00 0.398661721550E+00 + 0.398454120636E+00 0.398246573790E+00 0.398039081011E+00 0.397831642300E+00 + 0.397624257656E+00 0.397416927080E+00 0.397209650572E+00 0.397002428131E+00 + 0.396795259758E+00 0.396588145452E+00 0.396381085214E+00 0.396174079044E+00 + 0.395967126941E+00 0.395760228906E+00 0.395553384938E+00 0.395346595038E+00 + 0.395139859206E+00 0.394933177441E+00 0.394726549744E+00 0.394519976114E+00 + 0.394313456552E+00 0.394106991058E+00 0.393900579631E+00 0.393694222272E+00 + 0.393487918980E+00 0.393281669756E+00 0.393075474600E+00 0.392869333511E+00 + 0.392663246490E+00 0.392457213536E+00 0.392251234650E+00 0.392045309832E+00 + 0.391839439081E+00 0.391633622398E+00 0.391427859782E+00 0.391222151234E+00 + 0.391016496754E+00 0.390810896341E+00 0.390605349996E+00 0.390399857718E+00 + 0.390194419508E+00 0.389989035366E+00 0.389783705291E+00 0.389578429284E+00 + 0.389373207344E+00 0.389168039472E+00 0.388962925668E+00 0.388757865931E+00 + 0.388552860262E+00 0.388347908660E+00 0.388143011126E+00 0.387938167660E+00 + 0.387733378261E+00 0.387528642930E+00 0.387323961666E+00 0.387119334470E+00 + 0.386914761342E+00 0.386710242281E+00 0.386505777288E+00 0.386301366362E+00 + 0.386097009504E+00 0.385892706714E+00 0.385688457991E+00 0.385484263336E+00 + 0.385280122748E+00 0.385076036228E+00 0.384872003775E+00 0.384668025391E+00 + 0.384464101073E+00 0.384260230824E+00 0.384056414642E+00 0.383852652527E+00 + 0.383648944481E+00 0.383445290501E+00 0.383241690590E+00 0.383038144746E+00 + 0.382834652969E+00 0.382631215260E+00 0.382427831619E+00 0.382224502046E+00 + 0.382021226540E+00 0.381818005101E+00 0.381614837730E+00 0.381411724427E+00 + 0.381208665191E+00 0.381005660023E+00 0.380802708923E+00 0.380599811890E+00 + 0.380396968925E+00 0.380194180027E+00 0.379991445197E+00 0.379788764435E+00 + 0.379586137740E+00 0.379383565113E+00 0.379181046553E+00 0.378978582061E+00 + 0.378776171637E+00 0.378573815280E+00 0.378371512991E+00 0.378169264769E+00 + 0.377967070615E+00 0.377764930529E+00 0.377562844510E+00 0.377360812559E+00 + 0.377158834675E+00 0.376956910859E+00 0.376755041110E+00 0.376553225430E+00 + 0.376351463816E+00 0.376149756271E+00 0.375948102793E+00 0.375746503382E+00 + 0.375544958039E+00 0.375343466764E+00 0.375142029557E+00 0.374940646417E+00 + 0.374739317344E+00 0.374538042339E+00 0.374336821402E+00 0.374135654532E+00 + 0.373934541730E+00 0.373733482996E+00 0.373532478329E+00 0.373331527730E+00 + 0.373130631198E+00 0.372929788734E+00 0.372729000338E+00 0.372528266009E+00 + 0.372327585748E+00 0.372126959554E+00 0.371926387428E+00 0.371725869369E+00 + 0.371525405379E+00 0.371324995455E+00 0.371124639600E+00 0.370924337812E+00 + 0.370724090091E+00 0.370523896438E+00 0.370323756853E+00 0.370123671336E+00 + 0.369923639885E+00 0.369723662503E+00 0.369523739188E+00 0.369323869941E+00 + 0.369124054761E+00 0.368924293649E+00 0.368724586605E+00 0.368524933628E+00 + 0.368325334719E+00 0.368125789877E+00 0.367926299103E+00 0.367726862397E+00 + 0.367527479758E+00 0.367328151186E+00 0.367128876683E+00 0.366929656247E+00 + 0.366730489878E+00 0.366531377577E+00 0.366332319344E+00 0.366133315179E+00 + 0.365934365081E+00 0.365735469050E+00 0.365536627087E+00 0.365337839192E+00 + 0.365139105364E+00 0.364940425604E+00 0.364741799912E+00 0.364543228287E+00 + 0.364344710730E+00 0.364146247240E+00 0.363947837818E+00 0.363749482464E+00 + 0.363551181177E+00 0.363352933957E+00 0.363154740806E+00 0.362956601722E+00 + 0.362758516705E+00 0.362560485756E+00 0.362362508875E+00 0.362164586061E+00 + 0.361966717315E+00 0.361768902637E+00 0.361571142026E+00 0.361373435483E+00 + 0.361175783007E+00 0.360978184599E+00 0.360780640259E+00 0.360583149986E+00 + 0.360385713781E+00 0.360188331643E+00 0.359991003573E+00 0.359793729570E+00 + 0.359596509635E+00 0.359399343768E+00 0.359202231969E+00 0.359005174236E+00 + 0.358808170572E+00 0.358611220975E+00 0.358414325446E+00 0.358217483984E+00 + 0.358020696590E+00 0.357823963264E+00 0.357627284005E+00 0.357430658814E+00 + 0.357234087690E+00 0.357037570634E+00 0.356841107645E+00 0.356644698724E+00 + 0.356448343871E+00 0.356252043086E+00 0.356055796367E+00 0.355859603717E+00 + 0.355663465134E+00 0.355467380619E+00 0.355271350171E+00 0.355075373791E+00 + 0.354879451479E+00 0.354683583234E+00 0.354487769056E+00 0.354292008947E+00 + 0.354096302905E+00 0.353900650930E+00 0.353705053023E+00 0.353509509184E+00 + 0.353314019412E+00 0.353118583708E+00 0.352923202072E+00 0.352727874503E+00 + 0.352532601002E+00 0.352337381568E+00 0.352142216202E+00 0.351947104903E+00 + 0.351752047673E+00 0.351557044509E+00 0.351362095414E+00 0.351167200386E+00 + 0.350972359425E+00 0.350777572532E+00 0.350582839707E+00 0.350388160949E+00 + 0.350193536259E+00 0.349998965637E+00 0.349804449082E+00 0.349609986595E+00 + 0.349415578175E+00 0.349221223823E+00 0.349026923538E+00 0.348832677321E+00 + 0.348638485172E+00 0.348444347090E+00 0.348250263076E+00 0.348056233130E+00 + 0.347862257251E+00 0.347668335440E+00 0.347474467696E+00 0.347280654020E+00 + 0.347086894411E+00 0.346893188871E+00 0.346699537397E+00 0.346505939992E+00 + 0.346312396653E+00 0.346118907383E+00 0.345925472180E+00 0.345732091045E+00 + 0.345538763977E+00 0.345345490977E+00 0.345152272045E+00 0.344959107180E+00 + 0.344765996382E+00 0.344572939653E+00 0.344379936991E+00 0.344186988396E+00 + 0.343994093869E+00 0.343801253410E+00 0.343608467018E+00 0.343415734694E+00 + 0.343223056438E+00 0.343030432249E+00 0.342837862127E+00 0.342645346074E+00 + 0.342452884088E+00 0.342260476169E+00 0.342068122318E+00 0.341875822535E+00 + 0.341683576819E+00 0.341491385171E+00 0.341299247591E+00 0.341107164078E+00 + 0.340915134632E+00 0.340723159255E+00 0.340531237945E+00 0.340339370702E+00 + 0.340147557527E+00 0.339955798420E+00 0.339764093380E+00 0.339572442408E+00 + 0.339380845504E+00 0.339189302667E+00 0.338997813897E+00 0.338806379196E+00 + 0.338614998562E+00 0.338423671995E+00 0.338232399496E+00 0.338041181065E+00 + 0.337850016701E+00 0.337658906405E+00 0.337467850177E+00 0.337276848016E+00 + 0.337085899922E+00 0.336895005897E+00 0.336704165939E+00 0.336513380048E+00 + 0.336322648225E+00 0.336131970470E+00 0.335941346782E+00 0.335750777162E+00 + 0.335560261610E+00 0.335369800125E+00 0.335179392707E+00 0.334989039358E+00 + 0.334798740076E+00 0.334608494861E+00 0.334418303714E+00 0.334228166635E+00 + 0.334038083623E+00 0.333848054679E+00 0.333658079802E+00 0.333468158994E+00 + 0.333278292252E+00 0.333088479579E+00 0.332898720972E+00 0.332709016434E+00 + 0.332519365963E+00 0.332329769560E+00 0.332140227224E+00 0.331950738956E+00 + 0.331761304755E+00 0.331571924622E+00 0.331382598557E+00 0.331193326559E+00 + 0.331004108629E+00 0.330814944767E+00 0.330625834972E+00 0.330436779244E+00 + 0.330247777585E+00 0.330058829993E+00 0.329869936468E+00 0.329681097011E+00 + 0.329492311622E+00 0.329303580300E+00 0.329114903046E+00 0.328926279860E+00 + 0.328737710741E+00 0.328549195689E+00 0.328360734706E+00 0.328172327789E+00 + 0.327983974941E+00 0.327795676160E+00 0.327607431447E+00 0.327419240801E+00 + 0.327231104223E+00 0.327043021712E+00 0.326854993269E+00 0.326667018894E+00 + 0.326479098586E+00 0.326291232346E+00 0.326103420174E+00 0.325915662069E+00 + 0.325727958031E+00 0.325540308062E+00 0.325352712160E+00 0.325165170325E+00 + 0.324977682558E+00 0.324790248859E+00 0.324602869227E+00 0.324415543663E+00 + 0.324228272166E+00 0.324041054737E+00 0.323853891376E+00 0.323666782082E+00 + 0.323479726856E+00 0.323292725698E+00 0.323105778607E+00 0.322918885583E+00 + 0.322732046628E+00 0.322545261740E+00 0.322358530919E+00 0.322171854166E+00 + 0.321985231481E+00 0.321798662863E+00 0.321612148313E+00 0.321425687830E+00 + 0.321239281415E+00 0.321052929068E+00 0.320866630788E+00 0.320680386576E+00 + 0.320494196432E+00 0.320308060355E+00 0.320121978345E+00 0.319935950404E+00 + 0.319749976530E+00 0.319564056723E+00 0.319378190984E+00 0.319192379313E+00 + 0.319006621709E+00 0.318820918173E+00 0.318635268704E+00 0.318449673303E+00 + 0.318264131970E+00 0.318078644704E+00 0.317893211506E+00 0.317707832376E+00 + 0.317522507313E+00 0.317337236317E+00 0.317152019390E+00 0.316966856529E+00 + 0.316781747737E+00 0.316596693012E+00 0.316411692355E+00 0.316226745765E+00 + 0.316041853243E+00 0.315857014788E+00 0.315672230401E+00 0.315487500082E+00 + 0.315302823830E+00 0.315118201646E+00 0.314933633529E+00 0.314749119480E+00 + 0.314564659499E+00 0.314380253585E+00 0.314195901739E+00 0.314011603961E+00 + 0.313827360250E+00 0.313643170606E+00 0.313459035031E+00 0.313274953522E+00 + 0.313090926082E+00 0.312906952709E+00 0.312723033404E+00 0.312539168166E+00 + 0.312355356996E+00 0.312171599893E+00 0.311987896858E+00 0.311804247891E+00 + 0.311620652991E+00 0.311437112159E+00 0.311253625394E+00 0.311070192697E+00 + 0.310886814068E+00 0.310703489506E+00 0.310520219012E+00 0.310337002586E+00 + 0.310153840227E+00 0.309970731935E+00 0.309787677712E+00 0.309604677555E+00 + 0.309421731467E+00 0.309238839446E+00 0.309056001492E+00 0.308873217607E+00 + 0.308690487789E+00 0.308507812038E+00 0.308325190355E+00 0.308142622740E+00 + 0.307960109192E+00 0.307777649712E+00 0.307595244299E+00 0.307412892954E+00 + 0.307230595677E+00 0.307048352467E+00 0.306866163325E+00 0.306684028250E+00 + 0.306501947243E+00 0.306319920304E+00 0.306137947432E+00 0.305956028628E+00 + 0.305774163892E+00 0.305592353223E+00 0.305410596621E+00 0.305228894087E+00 + 0.305047245621E+00 0.304865651223E+00 0.304684110892E+00 0.304502624628E+00 + 0.304321192433E+00 0.304139814304E+00 0.303958490244E+00 0.303777220251E+00 + 0.303596004326E+00 0.303414842468E+00 0.303233734678E+00 0.303052680955E+00 + 0.302871681300E+00 0.302690735713E+00 0.302509844193E+00 0.302329006741E+00 + 0.302148223356E+00 0.301967494039E+00 0.301786818790E+00 0.301606197608E+00 + 0.301425630494E+00 0.301245117447E+00 0.301064658468E+00 0.300884253557E+00 + 0.300703902713E+00 0.300523605937E+00 0.300343363228E+00 0.300163174587E+00 + 0.299983040014E+00 0.299802959508E+00 0.299622933070E+00 0.299442960700E+00 + 0.299263042397E+00 0.299083178161E+00 0.298903367993E+00 0.298723611893E+00 + 0.298543909861E+00 0.298364261896E+00 0.298184667998E+00 0.298005128168E+00 + 0.297825642406E+00 0.297646210712E+00 0.297466833085E+00 0.297287509525E+00 + 0.297108240034E+00 0.296929024609E+00 0.296749863253E+00 0.296570755964E+00 + 0.296391702742E+00 0.296212703589E+00 0.296033758502E+00 0.295854867484E+00 + 0.295676030533E+00 0.295497247650E+00 0.295318518834E+00 0.295139844086E+00 + 0.294961223405E+00 0.294782656792E+00 0.294604144247E+00 0.294425685769E+00 + 0.294247281359E+00 0.294068931016E+00 0.293890634741E+00 0.293712392534E+00 + 0.293534204394E+00 0.293356070322E+00 0.293177990317E+00 0.292999964380E+00 + 0.292821992511E+00 0.292644074709E+00 0.292466210975E+00 0.292288401308E+00 + 0.292110645709E+00 0.291932944178E+00 0.291755296714E+00 0.291577703318E+00 + 0.291400163989E+00 0.291222678728E+00 0.291045247535E+00 0.290867870409E+00 + 0.290690547351E+00 0.290513278360E+00 0.290336063437E+00 0.290158902582E+00 + 0.289981795794E+00 0.289804743074E+00 0.289627744421E+00 0.289450799836E+00 + 0.289273909319E+00 0.289097072869E+00 0.288920290487E+00 0.288743562172E+00 + 0.288566887925E+00 0.288390267746E+00 0.288213701634E+00 0.288037189590E+00 + 0.287860731613E+00 0.287684327704E+00 0.287507977863E+00 0.287331682089E+00 + 0.287155440383E+00 0.286979252744E+00 0.286803119173E+00 0.286627039670E+00 + 0.286451014234E+00 0.286275042866E+00 0.286099125565E+00 0.285923262332E+00 + 0.285747453167E+00 0.285571698069E+00 0.285395997039E+00 0.285220350076E+00 + 0.285044757181E+00 0.284869218354E+00 0.284693733594E+00 0.284518302902E+00 + 0.284342926277E+00 0.284167603720E+00 0.283992335231E+00 0.283817120809E+00 + 0.283641960455E+00 0.283466854168E+00 0.283291801949E+00 0.283116803798E+00 + 0.282941859714E+00 0.282766969698E+00 0.282592133749E+00 0.282417351868E+00 + 0.282242624054E+00 0.282067950309E+00 0.281893330630E+00 0.281718765020E+00 + 0.281544253477E+00 0.281369796001E+00 0.281195392594E+00 0.281021043253E+00 + 0.280846747981E+00 0.280672506776E+00 0.280498319638E+00 0.280324186569E+00 + 0.280150107566E+00 0.279976082632E+00 0.279802111765E+00 0.279628194965E+00 + 0.279454332233E+00 0.279280523569E+00 0.279106768973E+00 0.278933068444E+00 + 0.278759421982E+00 0.278585829588E+00 0.278412291262E+00 0.278238807003E+00 + 0.278065376812E+00 0.277892000689E+00 0.277718678633E+00 0.277545410645E+00 + 0.277372196724E+00 0.277199036871E+00 0.277025931086E+00 0.276852879368E+00 + 0.276679881718E+00 0.276506938135E+00 0.276334048620E+00 0.276161213173E+00 + 0.275988431793E+00 0.275815704481E+00 0.275643031236E+00 0.275470412059E+00 + 0.275297846950E+00 0.275125335908E+00 0.274952878934E+00 0.274780476027E+00 + 0.274608127188E+00 0.274435832417E+00 0.274263591713E+00 0.274091405076E+00 + 0.273919272508E+00 0.273747194007E+00 0.273575169573E+00 0.273403199208E+00 + 0.273231282909E+00 0.273059420679E+00 0.272887612516E+00 0.272715858420E+00 + 0.272544158392E+00 0.272372512432E+00 0.272200920539E+00 0.272029382714E+00 + 0.271857898957E+00 0.271686469267E+00 0.271515093645E+00 0.271343772090E+00 + 0.271172504603E+00 0.271001291184E+00 0.270830131832E+00 0.270659026548E+00 + 0.270487975331E+00 0.270316978182E+00 0.270146035101E+00 0.269975146087E+00 + 0.269804311141E+00 0.269633530262E+00 0.269462803451E+00 0.269292130707E+00 + 0.269121512032E+00 0.268950947423E+00 0.268780436883E+00 0.268609980410E+00 + 0.268439578004E+00 0.268269229666E+00 0.268098935396E+00 0.267928695194E+00 + 0.267758509058E+00 0.267588376991E+00 0.267418298991E+00 0.267248275059E+00 + 0.267078305194E+00 0.266908389397E+00 0.266738527668E+00 0.266568720006E+00 + 0.266398966412E+00 0.266229266885E+00 0.266059621426E+00 0.265890030035E+00 + 0.265720492711E+00 0.265551009454E+00 0.265381580266E+00 0.265212205145E+00 + 0.265042884091E+00 0.264873617105E+00 0.264704404187E+00 0.264535245337E+00 + 0.264366140554E+00 0.264197089838E+00 0.264028093190E+00 0.263859150610E+00 + 0.263690262097E+00 0.263521427652E+00 0.263352647275E+00 0.263183920965E+00 + 0.263015248723E+00 0.262846630548E+00 0.262678066441E+00 0.262509556402E+00 + 0.262341100430E+00 0.262172698525E+00 0.262004350689E+00 0.261836056920E+00 + 0.261667817218E+00 0.261499631584E+00 0.261331500018E+00 0.261163422519E+00 + 0.260995399088E+00 0.260827429725E+00 0.260659514429E+00 0.260491653201E+00 + 0.260323846040E+00 0.260156092947E+00 0.259988393922E+00 0.259820748964E+00 + 0.259653158074E+00 0.259485621251E+00 0.259318138496E+00 0.259150709808E+00 + 0.258983335189E+00 0.258816014636E+00 0.258648748152E+00 0.258481535735E+00 + 0.258314377385E+00 0.258147273103E+00 0.257980222889E+00 0.257813226742E+00 + 0.257646284663E+00 0.257479396652E+00 0.257312562708E+00 0.257145782832E+00 + 0.256979057023E+00 0.256812385282E+00 0.256645767608E+00 0.256479204003E+00 + 0.256312694464E+00 0.256146238994E+00 0.255979837591E+00 0.255813490255E+00 + 0.255647196987E+00 0.255480957787E+00 0.255314772654E+00 0.255148641589E+00 + 0.254982564592E+00 0.254816541662E+00 0.254650572800E+00 0.254484658005E+00 + 0.254318797278E+00 0.254152990618E+00 0.253987238026E+00 0.253821539502E+00 + 0.253655895046E+00 0.253490304656E+00 0.253324768335E+00 0.253159286081E+00 + 0.252993857895E+00 0.252828483776E+00 0.252663163725E+00 0.252497897742E+00 + 0.252332685826E+00 0.252167527977E+00 0.252002424197E+00 0.251837374484E+00 + 0.251672378838E+00 0.251507437260E+00 0.251342549750E+00 0.251177716307E+00 + 0.251012936932E+00 0.250848211625E+00 0.250683540385E+00 0.250518923213E+00 + 0.250354360108E+00 0.250189851071E+00 0.250025396101E+00 0.249860995200E+00 + 0.249696648365E+00 0.249532355599E+00 0.249368116899E+00 0.249203932268E+00 + 0.249039801704E+00 0.248875725208E+00 0.248711702779E+00 0.248547734418E+00 + 0.248383820125E+00 0.248219959899E+00 0.248056153740E+00 0.247892401650E+00 + 0.247728703627E+00 0.247565059671E+00 0.247401469783E+00 0.247237933963E+00 + 0.247074452210E+00 0.246911024525E+00 0.246747650908E+00 0.246584331358E+00 + 0.246421065876E+00 0.246257854461E+00 0.246094697114E+00 0.245931593834E+00 + 0.245768544622E+00 0.245605549478E+00 0.245442608401E+00 0.245279721392E+00 + 0.245116888451E+00 0.244954109577E+00 0.244791384771E+00 0.244628714032E+00 + 0.244466097361E+00 0.244303534757E+00 0.244141026221E+00 0.243978571753E+00 + 0.243816171352E+00 0.243653825019E+00 0.243491532754E+00 0.243329294556E+00 + 0.243167110426E+00 0.243004980363E+00 0.242842904368E+00 0.242680882440E+00 + 0.242518914580E+00 0.242357000788E+00 0.242195141063E+00 0.242033335406E+00 + 0.241871583817E+00 0.241709886295E+00 0.241548242841E+00 0.241386653454E+00 + 0.241225118135E+00 0.241063636883E+00 0.240902209699E+00 0.240740836583E+00 + 0.240579517534E+00 0.240418252553E+00 0.240257041640E+00 0.240095884794E+00 + 0.239934782016E+00 0.239773733305E+00 0.239612738662E+00 0.239451798086E+00 + 0.239290911578E+00 0.239130079138E+00 0.238969300765E+00 0.238808576460E+00 + 0.238647906223E+00 0.238487290053E+00 0.238326727951E+00 0.238166219916E+00 + 0.238005765949E+00 0.237845366049E+00 0.237685020217E+00 0.237524728453E+00 + 0.237364490756E+00 0.237204307127E+00 0.237044177566E+00 0.236884102072E+00 + 0.236724080645E+00 0.236564113287E+00 0.236404199996E+00 0.236244340772E+00 + 0.236084535616E+00 0.235924784528E+00 0.235765087507E+00 0.235605444554E+00 + 0.235445855669E+00 0.235286320851E+00 0.235126840100E+00 0.234967413418E+00 + 0.234808040803E+00 0.234648722255E+00 0.234489457775E+00 0.234330247363E+00 + 0.234171091018E+00 0.234011988741E+00 0.233852940531E+00 0.233693946389E+00 + 0.233535006315E+00 0.233376120308E+00 0.233217288369E+00 0.233058510498E+00 + 0.232899786694E+00 0.232741116958E+00 0.232582501289E+00 0.232423939688E+00 + 0.232265432154E+00 0.232106978688E+00 0.231948579290E+00 0.231790233959E+00 + 0.231631942696E+00 0.231473705501E+00 0.231315522373E+00 0.231157393312E+00 + 0.230999318320E+00 0.230841297394E+00 0.230683330537E+00 0.230525417747E+00 + 0.230367559025E+00 0.230209754370E+00 0.230052003783E+00 0.229894307263E+00 + 0.229736664811E+00 0.229579076427E+00 0.229421542110E+00 0.229264061861E+00 + 0.229106635680E+00 0.228949263566E+00 0.228791945519E+00 0.228634681541E+00 + 0.228477471630E+00 0.228320315786E+00 0.228163214010E+00 0.228006166302E+00 + 0.227849172661E+00 0.227692233088E+00 0.227535347582E+00 0.227378516144E+00 + 0.227221738774E+00 0.227065015471E+00 0.226908346236E+00 0.226751731069E+00 + 0.226595169969E+00 0.226438662936E+00 0.226282209972E+00 0.226125811075E+00 + 0.225969466245E+00 0.225813175483E+00 0.225656938789E+00 0.225500756162E+00 + 0.225344627603E+00 0.225188553111E+00 0.225032532687E+00 0.224876566331E+00 + 0.224720654042E+00 0.224564795821E+00 0.224408991668E+00 0.224253241582E+00 + 0.224097545563E+00 0.223941903613E+00 0.223786315730E+00 0.223630781914E+00 + 0.223475302166E+00 0.223319876486E+00 0.223164504873E+00 0.223009187328E+00 + 0.222853923850E+00 0.222698714440E+00 0.222543559098E+00 0.222388457823E+00 + 0.222233410616E+00 0.222078417477E+00 0.221923478405E+00 0.221768593400E+00 + 0.221613762464E+00 0.221458985594E+00 0.221304262793E+00 0.221149594059E+00 + 0.220994979393E+00 0.220840418794E+00 0.220685912263E+00 0.220531459799E+00 + 0.220377061403E+00 0.220222717075E+00 0.220068426814E+00 0.219914190621E+00 + 0.219760008495E+00 0.219605880437E+00 0.219451806447E+00 0.219297786524E+00 + 0.219143820669E+00 0.218989908882E+00 0.218836051162E+00 0.218682247509E+00 + 0.218528497925E+00 0.218374802407E+00 0.218221160958E+00 0.218067573576E+00 + 0.217914040261E+00 0.217760561015E+00 0.217607135836E+00 0.217453764724E+00 + 0.217300447680E+00 0.217147184704E+00 0.216993975795E+00 0.216840820954E+00 + 0.216687720180E+00 0.216534673474E+00 0.216381680836E+00 0.216228742265E+00 + 0.216075857762E+00 0.215923027326E+00 0.215770250958E+00 0.215617528658E+00 + 0.215464860425E+00 0.215312246260E+00 0.215159686163E+00 0.215007180133E+00 + 0.214854728170E+00 0.214702330276E+00 0.214549986448E+00 0.214397696689E+00 + 0.214245460997E+00 0.214093279373E+00 0.213941151816E+00 0.213789078327E+00 + 0.213637058905E+00 0.213485093551E+00 0.213333182265E+00 0.213181325046E+00 + 0.213029521895E+00 0.212877772811E+00 0.212726077795E+00 0.212574436847E+00 + 0.212422849966E+00 0.212271317153E+00 0.212119838407E+00 0.211968413729E+00 + 0.211817043119E+00 0.211665726576E+00 0.211514464101E+00 0.211363255694E+00 + 0.211212101354E+00 0.211061001081E+00 0.210909954876E+00 0.210758962739E+00 + 0.210608024670E+00 0.210457140668E+00 0.210306310733E+00 0.210155534867E+00 + 0.210004813067E+00 0.209854145336E+00 0.209703531672E+00 0.209552972075E+00 + 0.209402466547E+00 0.209252015085E+00 0.209101617692E+00 0.208951274366E+00 + 0.208800985108E+00 0.208650749917E+00 0.208500568794E+00 0.208350441738E+00 + 0.208200368750E+00 0.208050349830E+00 0.207900384977E+00 0.207750474192E+00 + 0.207600617474E+00 0.207450814824E+00 0.207301066242E+00 0.207151371727E+00 + 0.207001731280E+00 0.206852144900E+00 0.206702612588E+00 0.206553134344E+00 + 0.206403710167E+00 0.206254340058E+00 0.206105024016E+00 0.205955762042E+00 + 0.205806554136E+00 0.205657400297E+00 0.205508300526E+00 0.205359254822E+00 + 0.205210263186E+00 0.205061325618E+00 0.204912442117E+00 0.204763612684E+00 + 0.204614837318E+00 0.204466116021E+00 0.204317448790E+00 0.204168835627E+00 + 0.204020276532E+00 0.203871771505E+00 0.203723320545E+00 0.203574923652E+00 + 0.203426580827E+00 0.203278292070E+00 0.203130057381E+00 0.202981876759E+00 + 0.202833750204E+00 0.202685677717E+00 0.202537659298E+00 0.202389694947E+00 + 0.202241784663E+00 0.202093928446E+00 0.201946126297E+00 0.201798378216E+00 + 0.201650684203E+00 0.201503044257E+00 0.201355458378E+00 0.201207926568E+00 + 0.201060448824E+00 0.200913025149E+00 0.200765655541E+00 0.200618340000E+00 + 0.200471078528E+00 0.200323871122E+00 0.200176717785E+00 0.200029618515E+00 + 0.199882573312E+00 0.199735582178E+00 0.199588645110E+00 0.199441762111E+00 + 0.199294933179E+00 0.199148158314E+00 0.199001437518E+00 0.198854770788E+00 + 0.198708158127E+00 0.198561599533E+00 0.198415095006E+00 0.198268644548E+00 + 0.198122248156E+00 0.197975905833E+00 0.197829617577E+00 0.197683383388E+00 + 0.197537203268E+00 0.197391077214E+00 0.197245005229E+00 0.197098987311E+00 + 0.196953023460E+00 0.196807113678E+00 0.196661257962E+00 0.196515456315E+00 + 0.196369708735E+00 0.196224015222E+00 0.196078375777E+00 0.195932790400E+00 + 0.195787259091E+00 0.195641781849E+00 0.195496358674E+00 0.195350989567E+00 + 0.195205674528E+00 0.195060413557E+00 0.194915206653E+00 0.194770053816E+00 + 0.194624955047E+00 0.194479910346E+00 0.194334919713E+00 0.194189983147E+00 + 0.194045100648E+00 0.193900272217E+00 0.193755497854E+00 0.193610777559E+00 + 0.193466111330E+00 0.193321499170E+00 0.193176941077E+00 0.193032437052E+00 + 0.192887987094E+00 0.192743591204E+00 0.192599249382E+00 0.192454961627E+00 + 0.192310727940E+00 0.192166548320E+00 0.192022422768E+00 0.191878351284E+00 + 0.191734333867E+00 0.191590370518E+00 0.191446461236E+00 0.191302606022E+00 + 0.191158804876E+00 0.191015057797E+00 0.190871364786E+00 0.190727725842E+00 + 0.190584140966E+00 0.190440610158E+00 0.190297133417E+00 0.190153710744E+00 + 0.190010342138E+00 0.189867027600E+00 0.189723767130E+00 0.189580560727E+00 + 0.189437408392E+00 0.189294310124E+00 0.189151265924E+00 0.189008275792E+00 + 0.188865339727E+00 0.188722457729E+00 0.188579629800E+00 0.188436855938E+00 + 0.188294136143E+00 0.188151470417E+00 0.188008858757E+00 0.187866301166E+00 + 0.187723797642E+00 0.187581348185E+00 0.187438952796E+00 0.187296611475E+00 + 0.187154324222E+00 0.187012091036E+00 0.186869911917E+00 0.186727786866E+00 + 0.186585715883E+00 0.186443698967E+00 0.186301736119E+00 0.186159827339E+00 + 0.186017972626E+00 0.185876171981E+00 0.185734425403E+00 0.185592732893E+00 + 0.185451094451E+00 0.185309510076E+00 0.185167979769E+00 0.185026503529E+00 + 0.184885081357E+00 0.184743713253E+00 0.184602399216E+00 0.184461139247E+00 + 0.184319933345E+00 0.184178781511E+00 0.184037683744E+00 0.183896640046E+00 + 0.183755650414E+00 0.183614714851E+00 0.183473833355E+00 0.183333005926E+00 + 0.183192232565E+00 0.183051513272E+00 0.182910848047E+00 0.182770236888E+00 + 0.182629679798E+00 0.182489176775E+00 0.182348727820E+00 0.182208332932E+00 + 0.182067992112E+00 0.181927705360E+00 0.181787472675E+00 0.181647294058E+00 + 0.181507169508E+00 0.181367099026E+00 0.181227082612E+00 0.181087120265E+00 + 0.180947211986E+00 0.180807357774E+00 0.180667557630E+00 0.180527811553E+00 + 0.180388119545E+00 0.180248481603E+00 0.180108897730E+00 0.179969367924E+00 + 0.179829892185E+00 0.179690470514E+00 0.179551102911E+00 0.179411789375E+00 + 0.179272529907E+00 0.179133324507E+00 0.178994173174E+00 0.178855075909E+00 + 0.178716032711E+00 0.178577043581E+00 0.178438108519E+00 0.178299227524E+00 + 0.178160400597E+00 0.178021627737E+00 0.177882908945E+00 0.177744244220E+00 + 0.177605633564E+00 0.177467076974E+00 0.177328574453E+00 0.177190125999E+00 + 0.177051731612E+00 0.176913391293E+00 0.176775105042E+00 0.176636872858E+00 + 0.176498694742E+00 0.176360570694E+00 0.176222500713E+00 0.176084484800E+00 + 0.175946522954E+00 0.175808615176E+00 0.175670761466E+00 0.175532961823E+00 + 0.175395216247E+00 0.175257524740E+00 0.175119887300E+00 0.174982303927E+00 + 0.174844774622E+00 0.174707299385E+00 0.174569878215E+00 0.174432511113E+00 + 0.174295198079E+00 0.174157939112E+00 0.174020734213E+00 0.173883583381E+00 + 0.173746486617E+00 0.173609443921E+00 0.173472455292E+00 0.173335520730E+00 + 0.173198640237E+00 0.173061813811E+00 0.172925041452E+00 0.172788323161E+00 + 0.172651658938E+00 0.172515048782E+00 0.172378492694E+00 0.172241990674E+00 + 0.172105542721E+00 0.171969148836E+00 0.171832809018E+00 0.171696523268E+00 + 0.171560291586E+00 0.171424113971E+00 0.171287990423E+00 0.171151920944E+00 + 0.171015905532E+00 0.170879944187E+00 0.170744036910E+00 0.170608183701E+00 + 0.170472384559E+00 0.170336639485E+00 0.170200948479E+00 0.170065311540E+00 + 0.169929728669E+00 0.169794199865E+00 0.169658725129E+00 0.169523304461E+00 + 0.169387937860E+00 0.169252625326E+00 0.169117366861E+00 0.168982162463E+00 + 0.168847012132E+00 0.168711915869E+00 0.168576873674E+00 0.168441885546E+00 + 0.168306951486E+00 0.168172071494E+00 0.168037245569E+00 0.167902473712E+00 + 0.167767755922E+00 0.167633092200E+00 0.167498482545E+00 0.167363926958E+00 + 0.167229425439E+00 0.167094977987E+00 0.166960584603E+00 0.166826245287E+00 + 0.166691960038E+00 0.166557728857E+00 0.166423551743E+00 0.166289428697E+00 + 0.166155359719E+00 0.166021344808E+00 0.165887383964E+00 0.165753477189E+00 + 0.165619624481E+00 0.165485825840E+00 0.165352081267E+00 0.165218390762E+00 + 0.165084754324E+00 0.164951171954E+00 0.164817643652E+00 0.164684169417E+00 + 0.164550749249E+00 0.164417383150E+00 0.164284071118E+00 0.164150813153E+00 + 0.164017609256E+00 0.163884459427E+00 0.163751363665E+00 0.163618321971E+00 + 0.163485334345E+00 0.163352400786E+00 0.163219521295E+00 0.163086695871E+00 + 0.162953924515E+00 0.162821207226E+00 0.162688544005E+00 0.162555934852E+00 + 0.162423379766E+00 0.162290878748E+00 0.162158431798E+00 0.162026038915E+00 + 0.161893700100E+00 0.161761415352E+00 0.161629184672E+00 0.161497008059E+00 + 0.161364885514E+00 0.161232817037E+00 0.161100802627E+00 0.160968842285E+00 + 0.160836936011E+00 0.160705083804E+00 0.160573285665E+00 0.160441541593E+00 + 0.160309851589E+00 0.160178215652E+00 0.160046633783E+00 0.159915105982E+00 + 0.159783632248E+00 0.159652212582E+00 0.159520846984E+00 0.159389535453E+00 + 0.159258277990E+00 0.159127074594E+00 0.158995925266E+00 0.158864830005E+00 + 0.158733788812E+00 0.158602801687E+00 0.158471868629E+00 0.158340989639E+00 + 0.158210164717E+00 0.158079393862E+00 0.157948677075E+00 0.157818014355E+00 + 0.157687405703E+00 0.157556851118E+00 0.157426350601E+00 0.157295904152E+00 + 0.157165511770E+00 0.157035173456E+00 0.156904889210E+00 0.156774659031E+00 + 0.156644482920E+00 0.156514360876E+00 0.156384292900E+00 0.156254278991E+00 + 0.156124319150E+00 0.155994413377E+00 0.155864561671E+00 0.155734764033E+00 + 0.155605020463E+00 0.155475330960E+00 0.155345695524E+00 0.155216114157E+00 + 0.155086586857E+00 0.154957113624E+00 0.154827694459E+00 0.154698329362E+00 + 0.154569018332E+00 0.154439761370E+00 0.154310558475E+00 0.154181409649E+00 + 0.154052314889E+00 0.153923274198E+00 0.153794287573E+00 0.153665355017E+00 + 0.153536476528E+00 0.153407652107E+00 0.153278881753E+00 0.153150165467E+00 + 0.153021503248E+00 0.152892895097E+00 0.152764341014E+00 0.152635840998E+00 + 0.152507395050E+00 0.152379003170E+00 0.152250665357E+00 0.152122381611E+00 + 0.151994151934E+00 0.151865976324E+00 0.151737854781E+00 0.151609787306E+00 + 0.151481773899E+00 0.151353814559E+00 0.151225909287E+00 0.151098058082E+00 + 0.150970260946E+00 0.150842517876E+00 0.150714828874E+00 0.150587193940E+00 + 0.150459613074E+00 0.150332086275E+00 0.150204613544E+00 0.150077194880E+00 + 0.149949830284E+00 0.149822519755E+00 0.149695263294E+00 0.149568060901E+00 + 0.149440912575E+00 0.149313818317E+00 0.149186778127E+00 0.149059792004E+00 + 0.148932859948E+00 0.148805981961E+00 0.148679158040E+00 0.148552388188E+00 + 0.148425672403E+00 0.148299010686E+00 0.148172403036E+00 0.148045849454E+00 + 0.147919349939E+00 0.147792904492E+00 0.147666513113E+00 0.147540175801E+00 + 0.147413892557E+00 0.147287663381E+00 0.147161488272E+00 0.147035367230E+00 + 0.146909300257E+00 0.146783287350E+00 0.146657328512E+00 0.146531423741E+00 + 0.146405573038E+00 0.146279776402E+00 0.146154033834E+00 0.146028345333E+00 + 0.145902710900E+00 0.145777130535E+00 0.145651604237E+00 0.145526132007E+00 + 0.145400713844E+00 0.145275349750E+00 0.145150039722E+00 0.145024783762E+00 + 0.144899581870E+00 0.144774434046E+00 0.144649340289E+00 0.144524300599E+00 + 0.144399314978E+00 0.144274383424E+00 0.144149505937E+00 0.144024682518E+00 + 0.143899913167E+00 0.143775197883E+00 0.143650536667E+00 0.143525929518E+00 + 0.143401376437E+00 0.143276877424E+00 0.143152432478E+00 0.143028041600E+00 + 0.142903704790E+00 0.142779422047E+00 0.142655193371E+00 0.142531018763E+00 + 0.142406898223E+00 0.142282831751E+00 0.142158819346E+00 0.142034861008E+00 + 0.141910956739E+00 0.141787106537E+00 0.141663310402E+00 0.141539568335E+00 + 0.141415880336E+00 0.141292246404E+00 0.141168666540E+00 0.141045140743E+00 + 0.140921669014E+00 0.140798251353E+00 0.140674887759E+00 0.140551578233E+00 + 0.140428322774E+00 0.140305121384E+00 0.140181974060E+00 0.140058880804E+00 + 0.139935841616E+00 0.139812856496E+00 0.139689925443E+00 0.139567048457E+00 + 0.139444225540E+00 0.139321456689E+00 0.139198741907E+00 0.139076081192E+00 + 0.138953474545E+00 0.138830921965E+00 0.138708423453E+00 0.138585979008E+00 + 0.138463588631E+00 0.138341252322E+00 0.138218970080E+00 0.138096741906E+00 + 0.137974567799E+00 0.137852447760E+00 0.137730381789E+00 0.137608369885E+00 + 0.137486412049E+00 0.137364508280E+00 0.137242658580E+00 0.137120862946E+00 + 0.136999121380E+00 0.136877433882E+00 0.136755800452E+00 0.136634221089E+00 + 0.136512695793E+00 0.136391224566E+00 0.136269807405E+00 0.136148444313E+00 + 0.136027135288E+00 0.135905880330E+00 0.135784679441E+00 0.135663532619E+00 + 0.135542439864E+00 0.135421401177E+00 0.135300416558E+00 0.135179486006E+00 + 0.135058609522E+00 0.134937787105E+00 0.134817018756E+00 0.134696304475E+00 + 0.134575644261E+00 0.134455038115E+00 0.134334486036E+00 0.134213988025E+00 + 0.134093544082E+00 0.133973154206E+00 0.133852818398E+00 0.133732536657E+00 + 0.133612308984E+00 0.133492135379E+00 0.133372015841E+00 0.133251950371E+00 + 0.133131938968E+00 0.133011981633E+00 0.132892078366E+00 0.132772229166E+00 + 0.132652434034E+00 0.132532692970E+00 0.132413005973E+00 0.132293373043E+00 + 0.132173794181E+00 0.132054269387E+00 0.131934798661E+00 0.131815382002E+00 + 0.131696019410E+00 0.131576710887E+00 0.131457456430E+00 0.131338256042E+00 + 0.131219109721E+00 0.131100017467E+00 0.130980979282E+00 0.130861995163E+00 + 0.130743065113E+00 0.130624189130E+00 0.130505367214E+00 0.130386599367E+00 + 0.130267885587E+00 0.130149225874E+00 0.130030620229E+00 0.129912068652E+00 + 0.129793571142E+00 0.129675127700E+00 0.129556738325E+00 0.129438403018E+00 + 0.129320121779E+00 0.129201894607E+00 0.129083721503E+00 0.128965602466E+00 + 0.128847537497E+00 0.128729526596E+00 0.128611569762E+00 0.128493666996E+00 + 0.128375818297E+00 0.128258023666E+00 0.128140283103E+00 0.128022596607E+00 + 0.127904964179E+00 0.127787385818E+00 0.127669861525E+00 0.127552391300E+00 + 0.127434975142E+00 0.127317613052E+00 0.127200305029E+00 0.127083051074E+00 + 0.126965851187E+00 0.126848705367E+00 0.126731613615E+00 0.126614575930E+00 + 0.126497592313E+00 0.126380662764E+00 0.126263787282E+00 0.126146965868E+00 + 0.126030198521E+00 0.125913485242E+00 0.125796826031E+00 0.125680220887E+00 + 0.125563669811E+00 0.125447172802E+00 0.125330729861E+00 0.125214340988E+00 + 0.125098006182E+00 0.124981725444E+00 0.124865498773E+00 0.124749326170E+00 + 0.124633207635E+00 0.124517143167E+00 0.124401132767E+00 0.124285176434E+00 + 0.124169274169E+00 0.124053425972E+00 0.123937631842E+00 0.123821891780E+00 + 0.123706205785E+00 0.123590573858E+00 0.123474995999E+00 0.123359472207E+00 + 0.123244002483E+00 0.123128586826E+00 0.123013225237E+00 0.122897917716E+00 + 0.122782664262E+00 0.122667464876E+00 0.122552319557E+00 0.122437228306E+00 + 0.122322191123E+00 0.122207208007E+00 0.122092278959E+00 0.121977403978E+00 + 0.121862583065E+00 0.121747816220E+00 0.121633103442E+00 0.121518444732E+00 + 0.121403840089E+00 0.121289289514E+00 0.121174793006E+00 0.121060350567E+00 + 0.120945962194E+00 0.120831627890E+00 0.120717347653E+00 0.120603121483E+00 + 0.120488949382E+00 0.120374831347E+00 0.120260767381E+00 0.120146757482E+00 + 0.120032801650E+00 0.119918899887E+00 0.119805052190E+00 0.119691258562E+00 + 0.119577519001E+00 0.119463833507E+00 0.119350202081E+00 0.119236624723E+00 + 0.119123101433E+00 0.119009632210E+00 0.118896217054E+00 0.118782855966E+00 + 0.118669548946E+00 0.118556295993E+00 0.118443097108E+00 0.118329952291E+00 + 0.118216861541E+00 0.118103824859E+00 0.117990842244E+00 0.117877913697E+00 + 0.117765039218E+00 0.117652218806E+00 0.117539452462E+00 0.117426740185E+00 + 0.117314081976E+00 0.117201477835E+00 0.117088927761E+00 0.116976431755E+00 + 0.116863989816E+00 0.116751601945E+00 0.116639268142E+00 0.116526988406E+00 + 0.116414762738E+00 0.116302591137E+00 0.116190473604E+00 0.116078410138E+00 + 0.115966400741E+00 0.115854445410E+00 0.115742544148E+00 0.115630696953E+00 + 0.115518903825E+00 0.115407164765E+00 0.115295479773E+00 0.115183848849E+00 + 0.115072271992E+00 0.114960749202E+00 0.114849280480E+00 0.114737865826E+00 + 0.114626505239E+00 0.114515198720E+00 0.114403946269E+00 0.114292747885E+00 + 0.114181603569E+00 0.114070513320E+00 0.113959477139E+00 0.113848495026E+00 + 0.113737566980E+00 0.113626693002E+00 0.113515873091E+00 0.113405107248E+00 + 0.113294395473E+00 0.113183737765E+00 0.113073134125E+00 0.112962584552E+00 + 0.112852089047E+00 0.112741647609E+00 0.112631260240E+00 0.112520926937E+00 + 0.112410647703E+00 0.112300422536E+00 0.112190251436E+00 0.112080134404E+00 + 0.111970071440E+00 0.111860062543E+00 0.111750107714E+00 0.111640206953E+00 + 0.111530360259E+00 0.111420567633E+00 0.111310829074E+00 0.111201144583E+00 + 0.111091514160E+00 0.110981937804E+00 0.110872415516E+00 0.110762947295E+00 + 0.110653533142E+00 0.110544173056E+00 0.110434867039E+00 0.110325615088E+00 + 0.110216417206E+00 0.110107273391E+00 0.109998183643E+00 0.109889147963E+00 + 0.109780166351E+00 0.109671238806E+00 0.109562365329E+00 0.109453545920E+00 + 0.109344780578E+00 0.109236069304E+00 0.109127412097E+00 0.109018808958E+00 + 0.108910259887E+00 0.108801764883E+00 0.108693323947E+00 0.108584937078E+00 + 0.108476604277E+00 0.108368325543E+00 0.108260100878E+00 0.108151930279E+00 + 0.108043813749E+00 0.107935751286E+00 0.107827742890E+00 0.107719788562E+00 + 0.107611888302E+00 0.107504042109E+00 0.107396249984E+00 0.107288511927E+00 + 0.107180827937E+00 0.107073198015E+00 0.106965622160E+00 0.106858100373E+00 + 0.106750632654E+00 0.106643219002E+00 0.106535859417E+00 0.106428553901E+00 + 0.106321302452E+00 0.106214105070E+00 0.106106961756E+00 0.105999872510E+00 + 0.105892837331E+00 0.105785856220E+00 0.105678929177E+00 0.105572056201E+00 + 0.105465237293E+00 0.105358472452E+00 0.105251761679E+00 0.105145104974E+00 + 0.105038502336E+00 0.104931953765E+00 0.104825459263E+00 0.104719018828E+00 + 0.104612632460E+00 0.104506300160E+00 0.104400021928E+00 0.104293797763E+00 + 0.104187627666E+00 0.104081511637E+00 0.103975449675E+00 0.103869441781E+00 + 0.103763487954E+00 0.103657588195E+00 0.103551742504E+00 0.103445950880E+00 + 0.103340213323E+00 0.103234529835E+00 0.103128900414E+00 0.103023325060E+00 + 0.102917803774E+00 0.102812336556E+00 0.102706923405E+00 0.102601564322E+00 + 0.102496259307E+00 0.102391008359E+00 0.102285811479E+00 0.102180668666E+00 + 0.102075579921E+00 0.101970545243E+00 0.101865564634E+00 0.101760638091E+00 + 0.101655765617E+00 0.101550947210E+00 0.101446182870E+00 0.101341472598E+00 + 0.101236816394E+00 0.101132214257E+00 0.101027666188E+00 0.100923172187E+00 + 0.100818732253E+00 0.100714346387E+00 0.100610014588E+00 0.100505736857E+00 + 0.100401513193E+00 0.100297343597E+00 0.100193228069E+00 0.100089166608E+00 + 0.999851592153E-01 0.998812058898E-01 0.997773066320E-01 0.996734614417E-01 + 0.995696703190E-01 0.994659332639E-01 0.993622502764E-01 0.992586213565E-01 + 0.991550465042E-01 0.990515257196E-01 0.989480590025E-01 0.988446463530E-01 + 0.987412877711E-01 0.986379832568E-01 0.985347328101E-01 0.984315364310E-01 + 0.983283941195E-01 0.982253058757E-01 0.981222716994E-01 0.980192915907E-01 + 0.979163655496E-01 0.978134935761E-01 0.977106756702E-01 0.976079118319E-01 + 0.975052020612E-01 0.974025463581E-01 0.972999447226E-01 0.971973971547E-01 + 0.970949036544E-01 0.969924642217E-01 0.968900788566E-01 0.967877475592E-01 + 0.966854703293E-01 0.965832471670E-01 0.964810780723E-01 0.963789630452E-01 + 0.962769020857E-01 0.961748951938E-01 0.960729423695E-01 0.959710436128E-01 + 0.958691989237E-01 0.957674083022E-01 0.956656717483E-01 0.955639892620E-01 + 0.954623608433E-01 0.953607864922E-01 0.952592662087E-01 0.951577999928E-01 + 0.950563878445E-01 0.949550297638E-01 0.948537257507E-01 0.947524758052E-01 + 0.946512799273E-01 0.945501381170E-01 0.944490503743E-01 0.943480166992E-01 + 0.942470370917E-01 0.941461115518E-01 0.940452400794E-01 0.939444226747E-01 + 0.938436593376E-01 0.937429500681E-01 0.936422948662E-01 0.935416937319E-01 + 0.934411466652E-01 0.933406536661E-01 0.932402147346E-01 0.931398298707E-01 + 0.930394990744E-01 0.929392223457E-01 0.928389996846E-01 0.927388310911E-01 + 0.926387165651E-01 0.925386561068E-01 0.924386497161E-01 0.923386973930E-01 + 0.922387991375E-01 0.921389549496E-01 0.920391648293E-01 0.919394287766E-01 + 0.918397467915E-01 0.917401188739E-01 0.916405450240E-01 0.915410252417E-01 + 0.914415595270E-01 0.913421478799E-01 0.912427903004E-01 0.911434867885E-01 + 0.910442373441E-01 0.909450419674E-01 0.908459006583E-01 0.907468134168E-01 + 0.906477802429E-01 0.905488011366E-01 0.904498760978E-01 0.903510051267E-01 + 0.902521882232E-01 0.901534253873E-01 0.900547166190E-01 0.899560619182E-01 + 0.898574612851E-01 0.897589147196E-01 0.896604222217E-01 0.895619837914E-01 + 0.894635994286E-01 0.893652691335E-01 0.892669929060E-01 0.891687707461E-01 + 0.890706026537E-01 0.889724886290E-01 0.888744286719E-01 0.887764227824E-01 + 0.886784709605E-01 0.885805732061E-01 0.884827295194E-01 0.883849399003E-01 + 0.882872043488E-01 0.881895228648E-01 0.880918954485E-01 0.879943220998E-01 + 0.878968028186E-01 0.877993376051E-01 0.877019264592E-01 0.876045693809E-01 + 0.875072663701E-01 0.874100174270E-01 0.873128225515E-01 0.872156817435E-01 + 0.871185950032E-01 0.870215623305E-01 0.869245837254E-01 0.868276591878E-01 + 0.867307887179E-01 0.866339723156E-01 0.865372099808E-01 0.864405017137E-01 + 0.863438475142E-01 0.862472473822E-01 0.861507013179E-01 0.860542093212E-01 + 0.859577713920E-01 0.858613875305E-01 0.857650577366E-01 0.856687820102E-01 + 0.855725603515E-01 0.854763927604E-01 0.853802792368E-01 0.852842197809E-01 + 0.851882143925E-01 0.850922630718E-01 0.849963658187E-01 0.849005226331E-01 + 0.848047335152E-01 0.847089984649E-01 0.846133174821E-01 0.845176905670E-01 + 0.844221177194E-01 0.843265989395E-01 0.842311342272E-01 0.841357235824E-01 + 0.840403670053E-01 0.839450644957E-01 0.838498160538E-01 0.837546216794E-01 + 0.836594813727E-01 0.835643951336E-01 0.834693629620E-01 0.833743848581E-01 + 0.832794608217E-01 0.831845908530E-01 0.830897749518E-01 0.829950131183E-01 + 0.829003053523E-01 0.828056516540E-01 0.827110520232E-01 0.826165064601E-01 + 0.825220149646E-01 0.824275775366E-01 0.823331941763E-01 0.822388648835E-01 + 0.821445896584E-01 0.820503685008E-01 0.819562014109E-01 0.818620883885E-01 + 0.817680294338E-01 0.816740245466E-01 0.815800737271E-01 0.814861769751E-01 + 0.813923342908E-01 0.812985456740E-01 0.812048111249E-01 0.811111306433E-01 + 0.810175042294E-01 0.809239318830E-01 0.808304136042E-01 0.807369493931E-01 + 0.806435392495E-01 0.805501831736E-01 0.804568811652E-01 0.803636332245E-01 + 0.802704393513E-01 0.801772995458E-01 0.800842138078E-01 0.799911821374E-01 + 0.798982045347E-01 0.798052809995E-01 0.797124115320E-01 0.796195961320E-01 + 0.795268347997E-01 0.794341275349E-01 0.793414743377E-01 0.792488752082E-01 + 0.791563301462E-01 0.790638391519E-01 0.789714022251E-01 0.788790193659E-01 + 0.787866905744E-01 0.786944158504E-01 0.786021951940E-01 0.785100286053E-01 + 0.784179160841E-01 0.783258576306E-01 0.782338532446E-01 0.781419029262E-01 + 0.780500066755E-01 0.779581644923E-01 0.778663763767E-01 0.777746423288E-01 + 0.776829623484E-01 0.775913364356E-01 0.774997645905E-01 0.774082468129E-01 + 0.773167831029E-01 0.772253734606E-01 0.771340178858E-01 0.770427163786E-01 + 0.769514689391E-01 0.768602755671E-01 0.767691362627E-01 0.766780510260E-01 + 0.765870198568E-01 0.764960427552E-01 0.764051197212E-01 0.763142507549E-01 + 0.762234358561E-01 0.761326750249E-01 0.760419682614E-01 0.759513155654E-01 + 0.758607169370E-01 0.757701723762E-01 0.756796818831E-01 0.755892454575E-01 + 0.754988630995E-01 0.754085348091E-01 0.753182605864E-01 0.752280404312E-01 + 0.751378743436E-01 0.750477623236E-01 0.749577043713E-01 0.748677004865E-01 + 0.747777506693E-01 0.746878549197E-01 0.745980132377E-01 0.745082256234E-01 + 0.744184920766E-01 0.743288125974E-01 0.742391871858E-01 0.741496158418E-01 + 0.740600985655E-01 0.739706353567E-01 0.738812262155E-01 0.737918711419E-01 + 0.737025701359E-01 0.736133231976E-01 0.735241303268E-01 0.734349915236E-01 + 0.733459067880E-01 0.732568761200E-01 0.731678995196E-01 0.730789769869E-01 + 0.729901085217E-01 0.729012941241E-01 0.728125337941E-01 0.727238275317E-01 + 0.726351753369E-01 0.725465772097E-01 0.724580331502E-01 0.723695431582E-01 + 0.722811072338E-01 0.721927253770E-01 0.721043975878E-01 0.720161238662E-01 + 0.719279042122E-01 0.718397386258E-01 0.717516271071E-01 0.716635696559E-01 + 0.715755662723E-01 0.714876169563E-01 0.713997217079E-01 0.713118805271E-01 + 0.712240934139E-01 0.711363603683E-01 0.710486813903E-01 0.709610564799E-01 + 0.708734856371E-01 0.707859688619E-01 0.706985061543E-01 0.706110975144E-01 + 0.705237429420E-01 0.704364424372E-01 0.703491960000E-01 0.702620036304E-01 + 0.701748653284E-01 0.700877810940E-01 0.700007509272E-01 0.699137748280E-01 + 0.698268527964E-01 0.697399848324E-01 0.696531709360E-01 0.695664111072E-01 + 0.694797053460E-01 0.693930536524E-01 0.693064560264E-01 0.692199124680E-01 + 0.691334229772E-01 0.690469875540E-01 0.689606061984E-01 0.688742789104E-01 + 0.687880056900E-01 0.687017865372E-01 0.686156214520E-01 0.685295104344E-01 + 0.684434534844E-01 0.683574506020E-01 0.682715017872E-01 0.681856070400E-01 + 0.680997663604E-01 0.680139797484E-01 0.679282472040E-01 0.678425687271E-01 + 0.677569443179E-01 0.676713739763E-01 0.675858577023E-01 0.675003954959E-01 + 0.674149873571E-01 0.673296332859E-01 0.672443332823E-01 0.671590873463E-01 + 0.670738954779E-01 0.669887576771E-01 0.669036739439E-01 0.668186442782E-01 + 0.667336686802E-01 0.666487471498E-01 0.665638796870E-01 0.664790662918E-01 + 0.663943069642E-01 0.663096017042E-01 0.662249505118E-01 0.661403533870E-01 + 0.660558103297E-01 0.659713213401E-01 0.658868864181E-01 0.658025055637E-01 + 0.657181787769E-01 0.656339060577E-01 0.655496874061E-01 0.654655228220E-01 + 0.653814123056E-01 0.652973558568E-01 0.652133534756E-01 0.651294051620E-01 + 0.650455109159E-01 0.649616707375E-01 0.648778846267E-01 0.647941525835E-01 + 0.647104746079E-01 0.646268506999E-01 0.645432808594E-01 0.644597650866E-01 + 0.643763033814E-01 0.642928957438E-01 0.642095421738E-01 0.641262426713E-01 + 0.640429972365E-01 0.639598058693E-01 0.638766685697E-01 0.637935853376E-01 + 0.637105561732E-01 0.636275810764E-01 0.635446600472E-01 0.634617930855E-01 + 0.633789801915E-01 0.632962213651E-01 0.632135166063E-01 0.631308659150E-01 + 0.630482692914E-01 0.629657267354E-01 0.628832382470E-01 0.628008038261E-01 + 0.627184234729E-01 0.626360971873E-01 0.625538249692E-01 0.624716068188E-01 + 0.623894427360E-01 0.623073327208E-01 0.622252767731E-01 0.621432748931E-01 + 0.620613270807E-01 0.619794333358E-01 0.618975936586E-01 0.618158080490E-01 + 0.617340765069E-01 0.616523990325E-01 0.615707756257E-01 0.614892062864E-01 + 0.614076910148E-01 0.613262298108E-01 0.612448226743E-01 0.611634696055E-01 + 0.610821706043E-01 0.610009256706E-01 0.609197348046E-01 0.608385980062E-01 + 0.607575152753E-01 0.606764866121E-01 0.605955120165E-01 0.605145914884E-01 + 0.604337250280E-01 0.603529126351E-01 0.602721543099E-01 0.601914500523E-01 + 0.601107998622E-01 0.600302037398E-01 0.599496616849E-01 0.598691736977E-01 + 0.597887397781E-01 0.597083599260E-01 0.596280341416E-01 0.595477624247E-01 + 0.594675447755E-01 0.593873811939E-01 0.593072716798E-01 0.592272162334E-01 + 0.591472148545E-01 0.590672675433E-01 0.589873742996E-01 0.589075351236E-01 + 0.588277500151E-01 0.587480189743E-01 0.586683420011E-01 0.585887190954E-01 + 0.585091502574E-01 0.584296354869E-01 0.583501747841E-01 0.582707681488E-01 + 0.581914155812E-01 0.581121170811E-01 0.580328726487E-01 0.579536822838E-01 + 0.578745459866E-01 0.577954637569E-01 0.577164355949E-01 0.576374615004E-01 + 0.575585414736E-01 0.574796755143E-01 0.574008636227E-01 0.573221057986E-01 + 0.572434020422E-01 0.571647523533E-01 0.570861567321E-01 0.570076151784E-01 + 0.569291276924E-01 0.568506942739E-01 0.567723149230E-01 0.566939896398E-01 + 0.566157184241E-01 0.565375012761E-01 0.564593381956E-01 0.563812291828E-01 + 0.563031742375E-01 0.562251733599E-01 0.561472265498E-01 0.560693338073E-01 + 0.559914951325E-01 0.559137105252E-01 0.558359799856E-01 0.557583035135E-01 + 0.556806811090E-01 0.556031127722E-01 0.555255985029E-01 0.554481383013E-01 + 0.553707321672E-01 0.552933801007E-01 0.552160821019E-01 0.551388381706E-01 + 0.550616483070E-01 0.549845125109E-01 0.549074307824E-01 0.548304031216E-01 + 0.547534295283E-01 0.546765100026E-01 0.545996445446E-01 0.545228331541E-01 + 0.544460758312E-01 0.543693725760E-01 0.542927233883E-01 0.542161282683E-01 + 0.541395872158E-01 0.540631002309E-01 0.539866673137E-01 0.539102884640E-01 + 0.538339636819E-01 0.537576929674E-01 0.536814763206E-01 0.536053137413E-01 + 0.535292052296E-01 0.534531507856E-01 0.533771504091E-01 0.533012041002E-01 + 0.532253118590E-01 0.531494736853E-01 0.530736895792E-01 0.529979595407E-01 + 0.529222835699E-01 0.528466616666E-01 0.527710938309E-01 0.526955800628E-01 + 0.526201203624E-01 0.525447147295E-01 0.524693631642E-01 0.523940656666E-01 + 0.523188222365E-01 0.522436328740E-01 0.521684975791E-01 0.520934163518E-01 + 0.520183891922E-01 0.519434161001E-01 0.518684970756E-01 0.517936321187E-01 + 0.517188212295E-01 0.516440644078E-01 0.515693616537E-01 0.514947129672E-01 + 0.514201183483E-01 0.513455777971E-01 0.512710913134E-01 0.511966588973E-01 + 0.511222805488E-01 0.510479562679E-01 0.509736860547E-01 0.508994699090E-01 + 0.508253078309E-01 0.507511998204E-01 0.506771458775E-01 0.506031460022E-01 + 0.505292001946E-01 0.504553084545E-01 0.503814707820E-01 0.503076871771E-01 + 0.502339576398E-01 0.501602821701E-01 0.500866607681E-01 0.500130934336E-01 + 0.499395801667E-01 0.498661209674E-01 0.497927158357E-01 0.497193647716E-01 + 0.496460677751E-01 0.495728248462E-01 0.494996359849E-01 0.494265011913E-01 + 0.493534204652E-01 0.492803938067E-01 0.492074212158E-01 0.491345026925E-01 + 0.490616382368E-01 0.489888278487E-01 0.489160715282E-01 0.488433692753E-01 + 0.487707210900E-01 0.486981269723E-01 0.486255869223E-01 0.485531009398E-01 + 0.484806690249E-01 0.484082911776E-01 0.483359673979E-01 0.482636976858E-01 + 0.481914820413E-01 0.481193204644E-01 0.480472129551E-01 0.479751595134E-01 + 0.479031601393E-01 0.478312148328E-01 0.477593235939E-01 0.476874864226E-01 + 0.476157033189E-01 0.475439742828E-01 0.474722993143E-01 0.474006784134E-01 + 0.473291115801E-01 0.472575988144E-01 0.471861401163E-01 0.471147354858E-01 + 0.470433849229E-01 0.469720884276E-01 0.469008459999E-01 0.468296576398E-01 + 0.467585233473E-01 0.466874431224E-01 0.466164169651E-01 0.465454448754E-01 + 0.464745268533E-01 0.464036628988E-01 0.463328530119E-01 0.462620971926E-01 + 0.461913954409E-01 0.461207477568E-01 0.460501541403E-01 0.459796145913E-01 + 0.459091291100E-01 0.458386976963E-01 0.457683203502E-01 0.456979970717E-01 + 0.456277278608E-01 0.455575127175E-01 0.454873516418E-01 0.454172446337E-01 + 0.453471916932E-01 0.452771928203E-01 0.452072480150E-01 0.451373572772E-01 + 0.450675206071E-01 0.449977380046E-01 0.449280094697E-01 0.448583350024E-01 + 0.447887146027E-01 0.447191482706E-01 0.446496360061E-01 0.445801778091E-01 + 0.445107736798E-01 0.444414236181E-01 0.443721276240E-01 0.443028856975E-01 + 0.442336978386E-01 0.441645640473E-01 0.440954843235E-01 0.440264586674E-01 + 0.439574870789E-01 0.438885695580E-01 0.438197061047E-01 0.437508967189E-01 + 0.436821414008E-01 0.436134401503E-01 0.435447929674E-01 0.434761998521E-01 + 0.434076608044E-01 0.433391758242E-01 0.432707449117E-01 0.432023680668E-01 + 0.431340452895E-01 0.430657765797E-01 0.429975619376E-01 0.429294013631E-01 + 0.428612948562E-01 0.427932424169E-01 0.427252440451E-01 0.426572997410E-01 + 0.425894095045E-01 0.425215733356E-01 0.424537912342E-01 0.423860632005E-01 + 0.423183892344E-01 0.422507693359E-01 0.421832035049E-01 0.421156917416E-01 + 0.420482340459E-01 0.419808304178E-01 0.419134808572E-01 0.418461853643E-01 + 0.417789439390E-01 0.417117565812E-01 0.416446232911E-01 0.415775440686E-01 + 0.415105189136E-01 0.414435478263E-01 0.413766308066E-01 0.413097678545E-01 + 0.412429589699E-01 0.411762041530E-01 0.411095034037E-01 0.410428567219E-01 + 0.409762641078E-01 0.409097255613E-01 0.408432410823E-01 0.407768106710E-01 + 0.407104343273E-01 0.406441120511E-01 0.405778438426E-01 0.405116297017E-01 + 0.404454696283E-01 0.403793636226E-01 0.403133116844E-01 0.402473138139E-01 + 0.401813700110E-01 0.401154802756E-01 0.400496446079E-01 0.399838630078E-01 + 0.399181354752E-01 0.398524620103E-01 0.397868426129E-01 0.397212772832E-01 + 0.396557660211E-01 0.395903088265E-01 0.395249056996E-01 0.394595566402E-01 + 0.393942616485E-01 0.393290207244E-01 0.392638338678E-01 0.391987010789E-01 + 0.391336223575E-01 0.390685977038E-01 0.390036271176E-01 0.389387105991E-01 + 0.388738481482E-01 0.388090397648E-01 0.387442854491E-01 0.386795852009E-01 + 0.386149390204E-01 0.385503469074E-01 0.384858088621E-01 0.384213248843E-01 + 0.383568949742E-01 0.382925191316E-01 0.382281973567E-01 0.381639296493E-01 + 0.380997160096E-01 0.380355564374E-01 0.379714509329E-01 0.379073994959E-01 + 0.378434021266E-01 0.377794588248E-01 0.377155695907E-01 0.376517344241E-01 + 0.375879533252E-01 0.375242262938E-01 0.374605533301E-01 0.373969344339E-01 + 0.373333696054E-01 0.372698588444E-01 0.372064021511E-01 0.371429995253E-01 + 0.370796509672E-01 0.370163564766E-01 0.369531160537E-01 0.368899296983E-01 + 0.368267974105E-01 0.367637191904E-01 0.367006950378E-01 0.366377249529E-01 + 0.365748089355E-01 0.365119469858E-01 0.364491391036E-01 0.363863852890E-01 + 0.363236855421E-01 0.362610398627E-01 0.361984482510E-01 0.361359107068E-01 + 0.360734272302E-01 0.360109978213E-01 0.359486224799E-01 0.358863012062E-01 + 0.358240340000E-01 0.357618208614E-01 0.356996617905E-01 0.356375567871E-01 + 0.355755058514E-01 0.355135089832E-01 0.354515661826E-01 0.353896774497E-01 + 0.353278427843E-01 0.352660621865E-01 0.352043356564E-01 0.351426631938E-01 + 0.350810447988E-01 0.350194804715E-01 0.349579702117E-01 0.348965140195E-01 + 0.348351118950E-01 0.347737638380E-01 0.347124698486E-01 0.346512299269E-01 + 0.345900440727E-01 0.345289122861E-01 0.344678345672E-01 0.344068109158E-01 + 0.343458413320E-01 0.342849258158E-01 0.342240643673E-01 0.341632569863E-01 + 0.341025036729E-01 0.340418044272E-01 0.339811592490E-01 0.339205681384E-01 + 0.338600310954E-01 0.337995481201E-01 0.337391192123E-01 0.336787443721E-01 + 0.336184235995E-01 0.335581568946E-01 0.334979442572E-01 0.334377856874E-01 + 0.333776811852E-01 0.333176307507E-01 0.332576343837E-01 0.331976920843E-01 + 0.331378038525E-01 0.330779696884E-01 0.330181895918E-01 0.329584635628E-01 + 0.328987916014E-01 0.328391737076E-01 0.327796098815E-01 0.327201001229E-01 + 0.326606444319E-01 0.326012428085E-01 0.325418952527E-01 0.324826017646E-01 + 0.324233623440E-01 0.323641769910E-01 0.323050457056E-01 0.322459684878E-01 + 0.321869453376E-01 0.321279762551E-01 0.320690612401E-01 0.320102002927E-01 + 0.319513934129E-01 0.318926406007E-01 0.318339418561E-01 0.317752971792E-01 + 0.317167065698E-01 0.316581700280E-01 0.315996875538E-01 0.315412591472E-01 + 0.314828848082E-01 0.314245645368E-01 0.313662983330E-01 0.313080861969E-01 + 0.312499281283E-01 0.311918241273E-01 0.311337741939E-01 0.310757783281E-01 + 0.310178365299E-01 0.309599487993E-01 0.309021151363E-01 0.308443355409E-01 + 0.307866100131E-01 0.307289385530E-01 0.306713211604E-01 0.306137578354E-01 + 0.305562485780E-01 0.304987933882E-01 0.304413922660E-01 0.303840452114E-01 + 0.303267522244E-01 0.302695133050E-01 0.302123284532E-01 0.301551976690E-01 + 0.300981209524E-01 0.300410983034E-01 0.299841297220E-01 0.299272152082E-01 + 0.298703547620E-01 0.298135483834E-01 0.297567960724E-01 0.297000978290E-01 + 0.296434536532E-01 0.295868635450E-01 0.295303275044E-01 0.294738455314E-01 + 0.294174176260E-01 0.293610437882E-01 0.293047240180E-01 0.292484583154E-01 + 0.291922466804E-01 0.291360891130E-01 0.290799856132E-01 0.290239361810E-01 + 0.289679408164E-01 0.289119995194E-01 0.288561122900E-01 0.288002791282E-01 + 0.287445000340E-01 0.286887750074E-01 0.286331040484E-01 0.285774871570E-01 + 0.285219243332E-01 0.284664155770E-01 0.284109608884E-01 0.283555602674E-01 + 0.283002137139E-01 0.282449212281E-01 0.281896828099E-01 0.281344984593E-01 + 0.280793681763E-01 0.280242919609E-01 0.279692698131E-01 0.279143017329E-01 + 0.278593877203E-01 0.278045277753E-01 0.277497218978E-01 0.276949700880E-01 + 0.276402723458E-01 0.275856286712E-01 0.275310390642E-01 0.274765035248E-01 + 0.274220220530E-01 0.273675946488E-01 0.273132213121E-01 0.272589020431E-01 + 0.272046368417E-01 0.271504257079E-01 0.270962686417E-01 0.270421656431E-01 + 0.269881167121E-01 0.269341218486E-01 0.268801810528E-01 0.268262943246E-01 + 0.267724616640E-01 0.267186830710E-01 0.266649585455E-01 0.266112880877E-01 + 0.265576716975E-01 0.265041093749E-01 0.264506011199E-01 0.263971469325E-01 + 0.263437468126E-01 0.262904007604E-01 0.262371087758E-01 0.261838708588E-01 + 0.261306870093E-01 0.260775572275E-01 0.260244815133E-01 0.259714598667E-01 + 0.259184922877E-01 0.258655787762E-01 0.258127193324E-01 0.257599139562E-01 + 0.257071626476E-01 0.256544654065E-01 0.256018222331E-01 0.255492331273E-01 + 0.254966980891E-01 0.254442171184E-01 0.253917902154E-01 0.253394173800E-01 + 0.252870986121E-01 0.252348339119E-01 0.251826232793E-01 0.251304667143E-01 + 0.250783642168E-01 0.250263157870E-01 0.249743214248E-01 0.249223811301E-01 + 0.248704949031E-01 0.248186627437E-01 0.247668846518E-01 0.247151606276E-01 + 0.246634906710E-01 0.246118747819E-01 0.245603129605E-01 0.245088052067E-01 + 0.244573515204E-01 0.244059519018E-01 0.243546063508E-01 0.243033148673E-01 + 0.242520774515E-01 0.242008941033E-01 0.241497648226E-01 0.240986896096E-01 + 0.240476684642E-01 0.239967013863E-01 0.239457883761E-01 0.238949294335E-01 + 0.238441245584E-01 0.237933737510E-01 0.237426770111E-01 0.236920343389E-01 + 0.236414457343E-01 0.235909111972E-01 0.235404307278E-01 0.234900043259E-01 + 0.234396319917E-01 0.233893137251E-01 0.233390495260E-01 0.232888393946E-01 + 0.232386833307E-01 0.231885813345E-01 0.231385334059E-01 0.230885395448E-01 + 0.230385997514E-01 0.229887140255E-01 0.229388823673E-01 0.228891047766E-01 + 0.228393812536E-01 0.227897117981E-01 0.227400964103E-01 0.226905350900E-01 + 0.226410278374E-01 0.225915746524E-01 0.225421755349E-01 0.224928304851E-01 + 0.224435395028E-01 0.223943025882E-01 0.223451197411E-01 0.222959909617E-01 + 0.222469162498E-01 0.221978956056E-01 0.221489290289E-01 0.221000165199E-01 + 0.220511580784E-01 0.220023537046E-01 0.219536033983E-01 0.219049071597E-01 + 0.218562649886E-01 0.218076768852E-01 0.217591428493E-01 0.217106628810E-01 + 0.216622369804E-01 0.216138651473E-01 0.215655473819E-01 0.215172836840E-01 + 0.214690740538E-01 0.214209184911E-01 0.213728169961E-01 0.213247695686E-01 + 0.212767762088E-01 0.212288369165E-01 0.211809516918E-01 0.211331205348E-01 + 0.210853434453E-01 0.210376204235E-01 0.209899514692E-01 0.209423365825E-01 + 0.208947757635E-01 0.208472690120E-01 0.207998163282E-01 0.207524177119E-01 + 0.207050731632E-01 0.206577826822E-01 0.206105462687E-01 0.205633639229E-01 + 0.205162356446E-01 0.204691614339E-01 0.204221412909E-01 0.203751752154E-01 + 0.203282632075E-01 0.202814052673E-01 0.202346013946E-01 0.201878515896E-01 + 0.201411558521E-01 0.200945141822E-01 0.200479265800E-01 0.200013930453E-01 + 0.199549135782E-01 0.199084881788E-01 0.198621168469E-01 0.198157995826E-01 + 0.197695363860E-01 0.197233272569E-01 0.196771721954E-01 0.196310712015E-01 + 0.195850242753E-01 0.195390314166E-01 0.194930926255E-01 0.194472079021E-01 + 0.194013772462E-01 0.193556006579E-01 0.193098781373E-01 0.192642096842E-01 + 0.192185952987E-01 0.191730349808E-01 0.191275287306E-01 0.190820765479E-01 + 0.190366784328E-01 0.189913343853E-01 0.189460444055E-01 0.189008084932E-01 + 0.188556266485E-01 0.188104988714E-01 0.187654251620E-01 0.187204055201E-01 + 0.186754399458E-01 0.186305284391E-01 0.185856710001E-01 0.185408676286E-01 + 0.184961183247E-01 0.184514230884E-01 0.184067819197E-01 0.183621948187E-01 + 0.183176617852E-01 0.182731828193E-01 0.182287579210E-01 0.181843870903E-01 + 0.181400703273E-01 0.180958076318E-01 0.180515990039E-01 0.180074444436E-01 + 0.179633439509E-01 0.179192975259E-01 0.178753051684E-01 0.178313668785E-01 + 0.177874826562E-01 0.177436525015E-01 0.176998764144E-01 0.176561543949E-01 + 0.176124864431E-01 0.175688725588E-01 0.175253127421E-01 0.174818069930E-01 + 0.174383553115E-01 0.173949576976E-01 0.173516141513E-01 0.173083246727E-01 + 0.172650892616E-01 0.172219079181E-01 0.171787806422E-01 0.171357074339E-01 + 0.170926882932E-01 0.170497232201E-01 0.170068122146E-01 0.169639552767E-01 + 0.169211524064E-01 0.168784036038E-01 0.168357088687E-01 0.167930682012E-01 + 0.167504816013E-01 0.167079490690E-01 0.166654706043E-01 0.166230462072E-01 + 0.165806758777E-01 0.165383596158E-01 0.164960974215E-01 0.164538892948E-01 + 0.164117352357E-01 0.163696352442E-01 0.163275893203E-01 0.162855974640E-01 + 0.162436596753E-01 0.162017759542E-01 0.161599463007E-01 0.161181707148E-01 + 0.160764491965E-01 0.160347817459E-01 0.159931683628E-01 0.159516090473E-01 + 0.159101037994E-01 0.158686526191E-01 0.158272555064E-01 0.157859124613E-01 + 0.157446234838E-01 0.157033885738E-01 0.156622077315E-01 0.156210809568E-01 + 0.155800082497E-01 0.155389896102E-01 0.154980250383E-01 0.154571145340E-01 + 0.154162580973E-01 0.153754557282E-01 0.153347074267E-01 0.152940131928E-01 + 0.152533730265E-01 0.152127869278E-01 0.151722548967E-01 0.151317769332E-01 + 0.150913530373E-01 0.150509832090E-01 0.150106674483E-01 0.149704057552E-01 + 0.149301981297E-01 0.148900445717E-01 0.148499450814E-01 0.148098996587E-01 + 0.147699083036E-01 0.147299710161E-01 0.146900877962E-01 0.146502586439E-01 + 0.146104835592E-01 0.145707625421E-01 0.145310955925E-01 0.144914827106E-01 + 0.144519238963E-01 0.144124191496E-01 0.143729684705E-01 0.143335718590E-01 + 0.142942293151E-01 0.142549408388E-01 0.142157064300E-01 0.141765260889E-01 + 0.141373998154E-01 0.140983276095E-01 0.140593094712E-01 0.140203454005E-01 + 0.139814353973E-01 0.139425794618E-01 0.139037775939E-01 0.138650297936E-01 + 0.138263360609E-01 0.137876963958E-01 0.137491107982E-01 0.137105792683E-01 + 0.136721018060E-01 0.136336784113E-01 0.135953090842E-01 0.135569938246E-01 + 0.135187326327E-01 0.134805255084E-01 0.134423724517E-01 0.134042734625E-01 + 0.133662285410E-01 0.133282376871E-01 0.132903009008E-01 0.132524181821E-01 + 0.132145895309E-01 0.131768149474E-01 0.131390944315E-01 0.131014279832E-01 + 0.130638156024E-01 0.130262572893E-01 0.129887530438E-01 0.129513028658E-01 + 0.129139067555E-01 0.128765647128E-01 0.128392767377E-01 0.128020428301E-01 + 0.127648629902E-01 0.127277372179E-01 0.126906655132E-01 0.126536478760E-01 + 0.126166843065E-01 0.125797748046E-01 0.125429193702E-01 0.125061180035E-01 + 0.124693707044E-01 0.124326774728E-01 0.123960383089E-01 0.123594532126E-01 + 0.123229221838E-01 0.122864452227E-01 0.122500223292E-01 0.122136535032E-01 + 0.121773387449E-01 0.121410780542E-01 0.121048714310E-01 0.120687188755E-01 + 0.120326203876E-01 0.119965759672E-01 0.119605856145E-01 0.119246493294E-01 + 0.118887671118E-01 0.118529389619E-01 0.118171648795E-01 0.117814448648E-01 + 0.117457789177E-01 0.117101670381E-01 0.116746092262E-01 0.116391054818E-01 + 0.116036558051E-01 0.115682601960E-01 0.115329186544E-01 0.114976311805E-01 + 0.114623977741E-01 0.114272184354E-01 0.113920931643E-01 0.113570219607E-01 + 0.113220048248E-01 0.112870417564E-01 0.112521327557E-01 0.112172778225E-01 + 0.111824769570E-01 0.111477301591E-01 0.111130374287E-01 0.110783987660E-01 + 0.110438141708E-01 0.110092836433E-01 0.109748071833E-01 0.109403847910E-01 + 0.109060164662E-01 0.108717022091E-01 0.108374420195E-01 0.108032358976E-01 + 0.107690838432E-01 0.107349858565E-01 0.107009419373E-01 0.106669520858E-01 + 0.106330163018E-01 0.105991345855E-01 0.105653069367E-01 0.105315333556E-01 + 0.104978138420E-01 0.104641483961E-01 0.104305370177E-01 0.103969797070E-01 + 0.103634764638E-01 0.103300272883E-01 0.102966321803E-01 0.102632911400E-01 + 0.102300041672E-01 0.101967712621E-01 0.101635924245E-01 0.101304676545E-01 + 0.100973969522E-01 0.100643803174E-01 0.100314177503E-01 0.999850925072E-02 + 0.996565481876E-02 0.993285445440E-02 0.990010815765E-02 0.986741592849E-02 + 0.983477776693E-02 0.980219367297E-02 0.976966364661E-02 0.973718768785E-02 + 0.970476579669E-02 0.967239797313E-02 0.964008421717E-02 0.960782452881E-02 + 0.957561890805E-02 0.954346735488E-02 0.951136986932E-02 0.947932645136E-02 + 0.944733710100E-02 0.941540181823E-02 0.938352060307E-02 0.935169345551E-02 + 0.931992037554E-02 0.928820136318E-02 0.925653641841E-02 0.922492554125E-02 + 0.919336873168E-02 0.916186598971E-02 0.913041731535E-02 0.909902270858E-02 + 0.906768216941E-02 0.903639569784E-02 0.900516329388E-02 0.897398495751E-02 + 0.894286068874E-02 0.891179048757E-02 0.888077435400E-02 0.884981228803E-02 + 0.881890428966E-02 0.878805035889E-02 0.875725049572E-02 0.872650470015E-02 + 0.869581297218E-02 0.866517531180E-02 0.863459171903E-02 0.860406219386E-02 + 0.857358673629E-02 0.854316534631E-02 0.851279802394E-02 0.848248476916E-02 + 0.845222558199E-02 0.842202046241E-02 0.839186941044E-02 0.836177242606E-02 + 0.833172950929E-02 0.830174066011E-02 0.827180587853E-02 0.824192516456E-02 + 0.821209851818E-02 0.818232593940E-02 0.815260742822E-02 0.812294298465E-02 + 0.809333260867E-02 0.806377630029E-02 0.803427405951E-02 0.800482588633E-02 + 0.797543178075E-02 0.794609174277E-02 0.791680577239E-02 0.788757386960E-02 + 0.785839603442E-02 0.782927226684E-02 0.780020256686E-02 0.777118693448E-02 + 0.774222536969E-02 0.771331787251E-02 0.768446444292E-02 0.765566508094E-02 + 0.762691978656E-02 0.759822855977E-02 0.756959140059E-02 0.754100830900E-02 + 0.751247928501E-02 0.748400432863E-02 0.745558343984E-02 0.742721661865E-02 + 0.739890386507E-02 0.737064517908E-02 0.734244056069E-02 0.731429000990E-02 + 0.728619352671E-02 0.725815111112E-02 0.723016276313E-02 0.720222848274E-02 + 0.717434826995E-02 0.714652212476E-02 0.711875004717E-02 0.709103203718E-02 + 0.706336809479E-02 0.703575822000E-02 0.700820241280E-02 0.698070067321E-02 + 0.695325300122E-02 0.692585939682E-02 0.689851986003E-02 0.687123439084E-02 + 0.684400298924E-02 0.681682565525E-02 0.678970238885E-02 0.676263319005E-02 + 0.673561805886E-02 0.670865699526E-02 0.668174999926E-02 0.665489707087E-02 + 0.662809821007E-02 0.660135341687E-02 0.657466269127E-02 0.654802603327E-02 + 0.652144344288E-02 0.649491492008E-02 0.646844046488E-02 0.644202007728E-02 + 0.641565375728E-02 0.638934150488E-02 0.636308332007E-02 0.633687920287E-02 + 0.631072915327E-02 0.628463317127E-02 0.625859125687E-02 0.623260341006E-02 + 0.620666963086E-02 0.618078991926E-02 0.615496427525E-02 0.612919269885E-02 + 0.610347519004E-02 0.607781174884E-02 0.605220237523E-02 0.602664706923E-02 + 0.600114583082E-02 0.597569866001E-02 0.595030555681E-02 0.592496652120E-02 + 0.589968155319E-02 0.587445065278E-02 0.584927381998E-02 0.582415105477E-02 + 0.579908235716E-02 0.577406772715E-02 0.574910716474E-02 0.572420066993E-02 + 0.569934824272E-02 0.567454988311E-02 0.564980559110E-02 0.562511536668E-02 + 0.560047920987E-02 0.557589712066E-02 0.555136909905E-02 0.552689514503E-02 + 0.550247525862E-02 0.547810943981E-02 0.545379768859E-02 0.542954000498E-02 + 0.540533638896E-02 0.538118684055E-02 0.535709135973E-02 0.533304994652E-02 + 0.530906260090E-02 0.528512932288E-02 0.526125011247E-02 0.523742496965E-02 + 0.521365389443E-02 0.518993688681E-02 0.516627394680E-02 0.514266507438E-02 + 0.511911026956E-02 0.509560953234E-02 0.507216286272E-02 0.504877026070E-02 + 0.502543172628E-02 0.500214725946E-02 0.497891686023E-02 0.495574052861E-02 + 0.493261826459E-02 0.490955006817E-02 0.488653593935E-02 0.486357587812E-02 + 0.484066988450E-02 0.481781795848E-02 0.479502010005E-02 0.477227630923E-02 + 0.474958658600E-02 0.472695093038E-02 0.470436934235E-02 0.468184182193E-02 + 0.465936836910E-02 0.463694898387E-02 0.461458366624E-02 0.459227241622E-02 + 0.457001523379E-02 0.454781211896E-02 0.452566307173E-02 0.450356809210E-02 + 0.448152718007E-02 0.445954033565E-02 0.443760755882E-02 0.441572884959E-02 + 0.439390420795E-02 0.437213363392E-02 0.435041712749E-02 0.432875468866E-02 + 0.430714631743E-02 0.428559201380E-02 0.426409177776E-02 0.424264560933E-02 + 0.422125350850E-02 0.419991547526E-02 0.417863150963E-02 0.415740161159E-02 + 0.413622578116E-02 0.411510401832E-02 0.409403632309E-02 0.407302269545E-02 + 0.405206313541E-02 0.403115764298E-02 0.401030621814E-02 0.398950886090E-02 + 0.396876557127E-02 0.394807634923E-02 0.392744119479E-02 0.390686010795E-02 + 0.388633308871E-02 0.386586013707E-02 0.384544125303E-02 0.382507643659E-02 + 0.380476568775E-02 0.378450900651E-02 0.376430639287E-02 0.374415784683E-02 + 0.372406336838E-02 0.370402295754E-02 0.368403661430E-02 0.366410433865E-02 + 0.364422613061E-02 0.362440199017E-02 0.360463191732E-02 0.358491591208E-02 + 0.356525397443E-02 0.354564610439E-02 0.352609230194E-02 0.350659256710E-02 + 0.348714689985E-02 0.346775530020E-02 0.344841776816E-02 0.342913430371E-02 + 0.340990490686E-02 0.339072957761E-02 0.337160831596E-02 0.335254112191E-02 + 0.333352799546E-02 0.331456893661E-02 0.329566394536E-02 0.327681302171E-02 + 0.325801616566E-02 0.323927337721E-02 0.322058465636E-02 0.320195000311E-02 + 0.318336941746E-02 0.316484289940E-02 0.314637044895E-02 0.312795206610E-02 + 0.310958775084E-02 0.309127750319E-02 0.307302132314E-02 0.305481921068E-02 + 0.303667116583E-02 0.301857718857E-02 0.300053727891E-02 0.298255143686E-02 + 0.296461966240E-02 0.294674195554E-02 0.292891831629E-02 0.291114874463E-02 + 0.289343324057E-02 0.287577180411E-02 0.285816443525E-02 0.284061113400E-02 + 0.282311190034E-02 0.280566673428E-02 0.278827563582E-02 0.277093860496E-02 + 0.275365564169E-02 0.273642674603E-02 0.271925191797E-02 0.270213115751E-02 + 0.268506446465E-02 0.266805183938E-02 0.265109328172E-02 0.263418879166E-02 + 0.261733836919E-02 0.260054201433E-02 0.258379972707E-02 0.256711150740E-02 + 0.255047735534E-02 0.253389727087E-02 0.251737125400E-02 0.250089930474E-02 + 0.248448142307E-02 0.246811760900E-02 0.245180786254E-02 0.243555218367E-02 + 0.241935057240E-02 0.240320302873E-02 0.238710955266E-02 0.237107014420E-02 + 0.235508480333E-02 0.233915353006E-02 0.232327632439E-02 0.230745318632E-02 + 0.229168411584E-02 0.227596911297E-02 0.226030817770E-02 0.224470131003E-02 + 0.222914850996E-02 0.221364977748E-02 0.219820511261E-02 0.218281451534E-02 + 0.216747798566E-02 0.215219552359E-02 0.213696712911E-02 0.212179280224E-02 + 0.210667254296E-02 0.209160635129E-02 0.207659422721E-02 0.206163617074E-02 + 0.204673218186E-02 0.203188226058E-02 0.201708640691E-02 0.200234462083E-02 + 0.198765690235E-02 0.197302325147E-02 0.195844366819E-02 0.194391815251E-02 + 0.192944670443E-02 0.191502932395E-02 0.190066601107E-02 0.188635676579E-02 + 0.187210158811E-02 0.185790047803E-02 0.184375343555E-02 0.182966046067E-02 + 0.181562155338E-02 0.180163671370E-02 0.178770594162E-02 0.177382923713E-02 + 0.176000660025E-02 0.174623803097E-02 0.173252352928E-02 0.171886309520E-02 + 0.170525672871E-02 0.169170442983E-02 0.167820619854E-02 0.166476203485E-02 + 0.165137193877E-02 0.163803591028E-02 0.162475394939E-02 0.161152605610E-02 + 0.159835223042E-02 0.158523247233E-02 0.157216678184E-02 0.155915515895E-02 + 0.154619760366E-02 0.153329411597E-02 0.152044469588E-02 0.150764934339E-02 + 0.149490805850E-02 0.148222084121E-02 0.146958769151E-02 0.145700860942E-02 + 0.144448359493E-02 0.143201264804E-02 0.141959576874E-02 0.140723295705E-02 + 0.139492421296E-02 0.138266953646E-02 0.137046892757E-02 0.135832238627E-02 + 0.134622991258E-02 0.133419150648E-02 0.132220716798E-02 0.131027689709E-02 + 0.129840069379E-02 0.128657855809E-02 0.127481049000E-02 0.126309648950E-02 + 0.125143655660E-02 0.123983069130E-02 0.122827889360E-02 0.121678116350E-02 + 0.120533750100E-02 0.119394790610E-02 0.118261237880E-02 0.117133091910E-02 + 0.116010352700E-02 0.114893020250E-02 0.113781094560E-02 0.112674575630E-02 + 0.111573463459E-02 0.110477758049E-02 0.109387459399E-02 0.108302567508E-02 + 0.107223082378E-02 0.106149004007E-02 0.105080332397E-02 0.104017067546E-02 + 0.102959209456E-02 0.101906758125E-02 0.100859713555E-02 0.998180757440E-03 + 0.987818446933E-03 0.977510204026E-03 0.967256028718E-03 0.957055921010E-03 + 0.946909880902E-03 0.936817908393E-03 0.926780003484E-03 0.916796166175E-03 + 0.906866396465E-03 0.896990694355E-03 0.887169059844E-03 0.877401492933E-03 + 0.867687993622E-03 0.858028561911E-03 0.848423197799E-03 0.838871901286E-03 + 0.829374672374E-03 0.819931511061E-03 0.810542417347E-03 0.801207391233E-03 + 0.791926432719E-03 0.782699541805E-03 0.773526718490E-03 0.764407962775E-03 + 0.755343274659E-03 0.746332654143E-03 0.737376101227E-03 0.728473615911E-03 + 0.719625198194E-03 0.710830848076E-03 0.702090565558E-03 0.693404350640E-03 + 0.684772203322E-03 0.676194123603E-03 0.667670111484E-03 0.659200166965E-03 + 0.650784290045E-03 0.642422480724E-03 0.634114739004E-03 0.625861064883E-03 + 0.617661458362E-03 0.609515919440E-03 0.601424448118E-03 0.593387044396E-03 + 0.585403708273E-03 0.577474439750E-03 0.569599238826E-03 0.561778105502E-03 + 0.554011039778E-03 0.546298041654E-03 0.538639111129E-03 0.531034248204E-03 + 0.523483452878E-03 0.515986725152E-03 0.508544065026E-03 0.501155472499E-03 + 0.493820947572E-03 0.486540490244E-03 0.479314100517E-03 0.472141778389E-03 + 0.465023523860E-03 0.457959336931E-03 0.450949217602E-03 0.443993165872E-03 + 0.437091181742E-03 0.430243265212E-03 0.423449416282E-03 0.416709634951E-03 + 0.410023921219E-03 0.403392275087E-03 0.396814696555E-03 0.390291185623E-03 + 0.383821742290E-03 0.377406366557E-03 0.371045058423E-03 0.364737817889E-03 + 0.358484644955E-03 0.352285539621E-03 0.346140501886E-03 0.340049531750E-03 + 0.334012629215E-03 0.328029794279E-03 0.322101026942E-03 0.316226327205E-03 + 0.310405695068E-03 0.304639130531E-03 0.298926633593E-03 0.293268204255E-03 + 0.287663842516E-03 0.282113548377E-03 0.276617321838E-03 0.271175162898E-03 + 0.265787071558E-03 0.260453047818E-03 0.255173091677E-03 0.249947203136E-03 + 0.244775382195E-03 0.239657628853E-03 0.234593943111E-03 0.229584324968E-03 + 0.224628774425E-03 0.219727291482E-03 0.214879876138E-03 0.210086528395E-03 + 0.205347248250E-03 0.200662035706E-03 0.196030890760E-03 0.191453813415E-03 + 0.186930803669E-03 0.182461861523E-03 0.178046986977E-03 0.173686180030E-03 + 0.169379440683E-03 0.165126768935E-03 0.160928164787E-03 0.156783628239E-03 + 0.152693159290E-03 0.148656757941E-03 0.144674424192E-03 0.140746158042E-03 + 0.136871959492E-03 0.133051828542E-03 0.129285765191E-03 0.125573769440E-03 + 0.121915841288E-03 0.118311980736E-03 0.114762187784E-03 0.111266462432E-03 + 0.107824804679E-03 0.104437214525E-03 0.101103691972E-03 0.978242370176E-04 + 0.945988496632E-04 0.914275299084E-04 0.883102777533E-04 0.852470931978E-04 + 0.822379762420E-04 0.792829268858E-04 0.763819451293E-04 0.735350309723E-04 + 0.707421844151E-04 0.680034054574E-04 0.653186940995E-04 0.626880503411E-04 + 0.601114741824E-04 0.575889656233E-04 0.551205246639E-04 0.527061513041E-04 + 0.503458455440E-04 0.480396073835E-04 0.457874368226E-04 0.435893338614E-04 + 0.414452984998E-04 0.393553307378E-04 0.373194305755E-04 0.353375980129E-04 + 0.334098330498E-04 0.315361356865E-04 0.297165059227E-04 0.279509437586E-04 + 0.262394491941E-04 0.245820222293E-04 0.229786628641E-04 0.214293710986E-04 + 0.199341469327E-04 0.184929903664E-04 0.171059013998E-04 0.157728800328E-04 + 0.144939262655E-04 0.132690400978E-04 0.120982215297E-04 0.109814705613E-04 + 0.991878719252E-05 0.891017142339E-05 0.795562325389E-05 0.705514268403E-05 + 0.620872971381E-05 0.541638434323E-05 0.467810657229E-05 0.399389640100E-05 + 0.336375382934E-05 0.278767885732E-05 0.226567148495E-05 0.179773171221E-05 + 0.138385953911E-05 0.102405496566E-05 0.718317991844E-06 0.466648617669E-06 + 0.269046843134E-06 0.125512668240E-06 0.360460929862E-07 0.647117372696E-09 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + -0.000000000000E+00 0.962656473170E+04 0.952060180728E+04 0.941660095608E+04 + 0.931451277905E+04 0.921428927649E+04 0.911588380694E+04 0.901925104722E+04 + 0.892434695369E+04 0.883112872469E+04 0.873955476402E+04 0.864958464563E+04 + 0.856117907921E+04 0.847429987694E+04 0.838890992111E+04 0.830497313281E+04 + 0.822245444145E+04 0.814131975528E+04 0.806153593268E+04 0.798307075444E+04 + 0.790589289671E+04 0.782997190485E+04 0.775527816809E+04 0.768178289477E+04 + 0.760945808856E+04 0.753827652516E+04 0.746821172982E+04 0.739923795550E+04 + 0.733133016169E+04 0.726446399378E+04 0.719861576317E+04 0.713376242785E+04 + 0.706988157364E+04 0.700695139592E+04 0.694495068198E+04 0.688385879379E+04 + 0.682365565140E+04 0.676432171672E+04 0.670583797782E+04 0.664818593377E+04 + 0.659134757980E+04 0.653530539297E+04 0.648004231829E+04 0.642554175518E+04 + 0.637178754437E+04 0.631876395521E+04 0.626645567330E+04 0.621484778851E+04 + 0.616392578339E+04 0.611367552188E+04 0.606408323831E+04 0.601513552688E+04 + 0.596681933125E+04 0.591912193459E+04 0.587203094987E+04 0.582553431039E+04 + 0.577962026069E+04 0.573427734765E+04 0.568949441187E+04 0.564526057929E+04 + 0.560156525314E+04 0.555839810599E+04 0.551574907213E+04 0.547360834019E+04 + 0.543196634587E+04 0.539081376502E+04 0.535014150678E+04 0.530994070706E+04 + 0.527020272214E+04 0.523091912240E+04 0.519208168641E+04 0.515368239497E+04 + 0.511571342551E+04 0.507816714657E+04 0.504103611242E+04 0.500431305791E+04 + 0.496799089342E+04 0.493206269995E+04 0.489652172441E+04 0.486136137497E+04 + 0.482657521662E+04 0.479215696679E+04 0.475810049119E+04 0.472439979965E+04 + 0.469104904219E+04 0.465804250517E+04 0.462537460749E+04 0.459303989700E+04 + 0.456103304697E+04 0.452934885263E+04 0.449798222787E+04 0.446692820198E+04 + 0.443618191655E+04 0.440573862239E+04 0.437559367659E+04 0.434574253963E+04 + 0.431618077260E+04 0.428690403452E+04 0.425790807964E+04 0.422918875495E+04 + 0.420074199767E+04 0.417256383284E+04 0.414465037101E+04 0.411699780590E+04 + 0.408960241228E+04 0.406246054376E+04 0.403556863074E+04 0.400892317838E+04 + 0.398252076463E+04 0.395635803833E+04 0.393043171737E+04 0.390473858685E+04 + 0.387927549738E+04 0.385403936335E+04 0.382902716128E+04 0.380423592825E+04 + 0.377966276029E+04 0.375530481091E+04 0.373115928963E+04 0.370722346052E+04 + 0.368349464084E+04 0.365997019967E+04 0.363664755662E+04 0.361352418057E+04 + 0.359059758839E+04 0.356786534376E+04 0.354532505601E+04 0.352297437899E+04 + 0.350081100994E+04 0.347883268842E+04 0.345703719532E+04 0.343542235177E+04 + 0.341398601820E+04 0.339272609340E+04 0.337164051354E+04 0.335072725129E+04 + 0.332998431495E+04 0.330940974760E+04 0.328900162623E+04 0.326875806098E+04 + 0.324867719431E+04 0.322875720027E+04 0.320899628375E+04 0.318939267975E+04 + 0.316994465267E+04 0.315065049564E+04 0.313150852986E+04 0.311251710394E+04 + 0.309367459328E+04 0.307497939945E+04 0.305642994959E+04 0.303802469587E+04 + 0.301976211488E+04 0.300164070709E+04 0.298365899635E+04 0.296581552933E+04 + 0.294810887504E+04 0.293053762434E+04 0.291310038944E+04 0.289579580346E+04 + 0.287862251996E+04 0.286157921250E+04 0.284466457424E+04 0.282787731746E+04 + 0.281121617323E+04 0.279467989094E+04 0.277826723799E+04 0.276197699933E+04 + 0.274580797716E+04 0.272975899057E+04 0.271382887514E+04 0.269801648267E+04 + 0.268232068079E+04 0.266674035269E+04 0.265127439677E+04 0.263592172637E+04 + 0.262068126943E+04 0.260555196824E+04 0.259053277916E+04 0.257562267230E+04 + 0.256082063129E+04 0.254612565302E+04 0.253153674738E+04 0.251705293700E+04 + 0.250267325702E+04 0.248839675484E+04 0.247422248994E+04 0.246014953358E+04 + 0.244617696863E+04 0.243230388935E+04 0.241852940119E+04 0.240485262056E+04 + 0.239127267464E+04 0.237778870122E+04 0.236439984846E+04 0.235110527476E+04 + 0.233790414853E+04 0.232479564805E+04 0.231177896127E+04 0.229885328569E+04 + 0.228601782812E+04 0.227327180462E+04 0.226061444025E+04 0.224804496897E+04 + 0.223556263350E+04 0.222316668514E+04 0.221085638363E+04 0.219863099706E+04 + 0.218648980167E+04 0.217443208177E+04 0.216245712957E+04 0.215056424510E+04 + 0.213875273602E+04 0.212702191759E+04 0.211537111245E+04 0.210379965059E+04 + 0.209230686919E+04 0.208089211252E+04 0.206955473185E+04 0.205829408530E+04 + 0.204710953779E+04 0.203600046091E+04 0.202496623281E+04 0.201400623814E+04 + 0.200311986791E+04 0.199230651944E+04 0.198156559623E+04 0.197089650792E+04 + 0.196029867014E+04 0.194977150448E+04 0.193931443837E+04 0.192892690501E+04 + 0.191860834332E+04 0.190835819779E+04 0.189817591849E+04 0.188806096090E+04 + 0.187801278594E+04 0.186803085980E+04 0.185811465394E+04 0.184826364497E+04 + 0.183847731462E+04 0.182875514965E+04 0.181909664180E+04 0.180950128769E+04 + 0.179996858881E+04 0.179049805142E+04 0.178108918650E+04 0.177174150968E+04 + 0.176245454121E+04 0.175322780585E+04 0.174406083289E+04 0.173495315601E+04 + 0.172590431328E+04 0.171691384710E+04 0.170798130413E+04 0.169910623524E+04 + 0.169028819547E+04 0.168152674400E+04 0.167282144403E+04 0.166417186281E+04 + 0.165557757156E+04 0.164703814542E+04 0.163855316339E+04 0.163012220833E+04 + 0.162174486687E+04 0.161342072939E+04 0.160514938998E+04 0.159693044636E+04 + 0.158876349991E+04 0.158064815556E+04 0.157258402178E+04 0.156457071053E+04 + 0.155660783724E+04 0.154869502076E+04 0.154083188332E+04 0.153301805047E+04 + 0.152525315111E+04 0.151753681739E+04 0.150986868468E+04 0.150224839157E+04 + 0.149467557983E+04 0.148714989433E+04 0.147967098306E+04 0.147223849707E+04 + 0.146485209045E+04 0.145751142027E+04 0.145021614661E+04 0.144296593245E+04 + 0.143576044370E+04 0.142859934913E+04 0.142148232039E+04 0.141440903191E+04 + 0.140737916094E+04 0.140039238748E+04 0.139344839426E+04 0.138654686671E+04 + 0.137968749296E+04 0.137286996377E+04 0.136609397254E+04 0.135935921525E+04 + 0.135266539046E+04 0.134601219928E+04 0.133939934535E+04 0.133282653477E+04 + 0.132629347616E+04 0.131979988055E+04 0.131334546141E+04 0.130692993460E+04 + 0.130055301836E+04 0.129421443329E+04 0.128791390231E+04 0.128165115065E+04 + 0.127542590582E+04 0.126923789760E+04 0.126308685802E+04 0.125697252131E+04 + 0.125089462391E+04 0.124485290443E+04 0.123884710365E+04 0.123287696448E+04 + 0.122694223195E+04 0.122104265317E+04 0.121517797734E+04 0.120934795573E+04 + 0.120355234162E+04 0.119779089033E+04 0.119206335917E+04 0.118636950743E+04 + 0.118070909637E+04 0.117508188920E+04 0.116948765103E+04 0.116392614892E+04 + 0.115839715179E+04 0.115290043044E+04 0.114743575753E+04 0.114200290757E+04 + 0.113660165687E+04 0.113123178357E+04 0.112589306759E+04 0.112058529062E+04 + 0.111530823610E+04 0.111006168925E+04 0.110484543696E+04 0.109965926789E+04 + 0.109450297233E+04 0.108937634232E+04 0.108427917150E+04 0.107921125520E+04 + 0.107417239038E+04 0.106916237561E+04 0.106418101107E+04 0.105922809853E+04 + 0.105430344134E+04 0.104940684442E+04 0.104453811422E+04 0.103969705875E+04 + 0.103488348752E+04 0.103009721157E+04 0.102533804343E+04 0.102060579709E+04 + 0.101590028804E+04 0.101122133321E+04 0.100656875097E+04 0.100194236115E+04 + 0.997341984955E+03 0.992767445028E+03 0.988218565393E+03 0.983695171460E+03 + 0.979197090007E+03 0.974724149170E+03 0.970276178430E+03 0.965853008604E+03 + 0.961454471830E+03 0.957080401560E+03 0.952730632543E+03 0.948405000818E+03 + 0.944103343701E+03 0.939825499775E+03 0.935571308880E+03 0.931340612098E+03 + 0.927133251748E+03 0.922949071369E+03 0.918787915718E+03 0.914649630750E+03 + 0.910534063615E+03 0.906441062645E+03 0.902370477343E+03 0.898322158375E+03 + 0.894295957558E+03 0.890291727854E+03 0.886309323354E+03 0.882348599276E+03 + 0.878409411947E+03 0.874491618801E+03 0.870595078367E+03 0.866719650258E+03 + 0.862865195163E+03 0.859031574838E+03 0.855218652099E+03 0.851426290809E+03 + 0.847654355872E+03 0.843902713224E+03 0.840171229822E+03 0.836459773640E+03 + 0.832768213655E+03 0.829096419842E+03 0.825444263167E+03 0.821811615572E+03 + 0.818198349976E+03 0.814604340259E+03 0.811029461259E+03 0.807473588760E+03 + 0.803936599488E+03 0.800418371101E+03 0.796918782180E+03 0.793437712224E+03 + 0.789975041642E+03 0.786530651744E+03 0.783104424732E+03 0.779696243697E+03 + 0.776305992608E+03 0.772933556307E+03 0.769578820501E+03 0.766241671752E+03 + 0.762921997474E+03 0.759619685926E+03 0.756334626200E+03 0.753066708220E+03 + 0.749815822732E+03 0.746581861298E+03 0.743364716287E+03 0.740164280873E+03 + 0.736980449025E+03 0.733813115500E+03 0.730662175839E+03 0.727527526359E+03 + 0.724409064147E+03 0.721306687052E+03 0.718220293683E+03 0.715149783397E+03 + 0.712095056298E+03 0.709056013227E+03 0.706032555760E+03 0.703024586199E+03 + 0.700032007564E+03 0.697054723593E+03 0.694092638731E+03 0.691145658129E+03 + 0.688213687632E+03 0.685296633778E+03 0.682394403793E+03 0.679506905580E+03 + 0.676634047720E+03 0.673775739462E+03 0.670931890719E+03 0.668102412062E+03 + 0.665287214718E+03 0.662486210559E+03 0.659699312100E+03 0.656926432495E+03 + 0.654167485529E+03 0.651422385615E+03 0.648691047788E+03 0.645973387698E+03 + 0.643269321610E+03 0.640578766394E+03 0.637901639524E+03 0.635237859070E+03 + 0.632587343694E+03 0.629950012646E+03 0.627325785761E+03 0.624714583450E+03 + 0.622116326698E+03 0.619530937058E+03 0.616958336651E+03 0.614398448154E+03 + 0.611851194801E+03 0.609316500377E+03 0.606794289213E+03 0.604284486182E+03 + 0.601787016695E+03 0.599301806697E+03 0.596828782661E+03 0.594367871585E+03 + 0.591919000989E+03 0.589482098909E+03 0.587057093892E+03 0.584643914994E+03 + 0.582242491778E+03 0.579852754302E+03 0.577474633126E+03 0.575108059297E+03 + 0.572752964354E+03 0.570409280319E+03 0.568076939695E+03 0.565755875461E+03 + 0.563446021070E+03 0.561147310445E+03 0.558859677972E+03 0.556583058500E+03 + 0.554317387338E+03 0.552062600247E+03 0.549818633439E+03 0.547585423576E+03 + 0.545362907760E+03 0.543151023537E+03 0.540949708888E+03 0.538758902226E+03 + 0.536578542397E+03 0.534408568672E+03 0.532248920744E+03 0.530099538728E+03 + 0.527960363154E+03 0.525831334966E+03 0.523712395519E+03 0.521603486573E+03 + 0.519504550292E+03 0.517415529240E+03 0.515336366381E+03 0.513267005070E+03 + 0.511207389054E+03 0.509157462469E+03 0.507117169835E+03 0.505086456055E+03 + 0.503065266408E+03 0.501053546553E+03 0.499051242520E+03 0.497058300710E+03 + 0.495074667889E+03 0.493100291190E+03 0.491135118108E+03 0.489179096493E+03 + 0.487232174556E+03 0.485294300856E+03 0.483365424307E+03 0.481445494168E+03 + 0.479534460044E+03 0.477632271882E+03 0.475738879969E+03 0.473854234929E+03 + 0.471978287720E+03 0.470110989632E+03 0.468252292285E+03 0.466402147625E+03 + 0.464560507922E+03 0.462727325769E+03 0.460902554077E+03 0.459086146074E+03 + 0.457278055303E+03 0.455478235618E+03 0.453686641182E+03 0.451903226468E+03 + 0.450127946251E+03 0.448360755608E+03 0.446601609919E+03 0.444850464860E+03 + 0.443107276401E+03 0.441372000809E+03 0.439644594639E+03 0.437925014735E+03 + 0.436213218229E+03 0.434509162537E+03 0.432812805356E+03 0.431124104665E+03 + 0.429443018719E+03 0.427769506049E+03 0.426103525462E+03 0.424445036034E+03 + 0.422793997111E+03 0.421150368308E+03 0.419514109504E+03 0.417885180841E+03 + 0.416263542725E+03 0.414649155819E+03 0.413041981045E+03 0.411441979579E+03 + 0.409849112852E+03 0.408263342545E+03 0.406684630593E+03 0.405112939173E+03 + 0.403548230712E+03 0.401990467880E+03 0.400439613591E+03 0.398895630996E+03 + 0.397358483487E+03 0.395828134694E+03 0.394304548481E+03 0.392787688943E+03 + 0.391277520411E+03 0.389774007443E+03 0.388277114825E+03 0.386786807572E+03 + 0.385303050921E+03 0.383825810334E+03 0.382355051492E+03 0.380890740299E+03 + 0.379432842875E+03 0.377981325557E+03 0.376536154897E+03 0.375097297659E+03 + 0.373664720822E+03 0.372238391571E+03 0.370818277302E+03 0.369404345619E+03 + 0.367996564328E+03 0.366594901442E+03 0.365199325175E+03 0.363809803943E+03 + 0.362426306360E+03 0.361048801240E+03 0.359677257592E+03 0.358311644619E+03 + 0.356951931721E+03 0.355598088487E+03 0.354250084699E+03 0.352907890327E+03 + 0.351571475529E+03 0.350240810650E+03 0.348915866222E+03 0.347596612958E+03 + 0.346283021755E+03 0.344975063690E+03 0.343672710022E+03 0.342375932188E+03 + 0.341084701800E+03 0.339798990649E+03 0.338518770698E+03 0.337244014087E+03 + 0.335974693123E+03 0.334710780289E+03 0.333452248235E+03 0.332199069780E+03 + 0.330951217909E+03 0.329708665775E+03 0.328471386694E+03 0.327239354148E+03 + 0.326012541778E+03 0.324790923390E+03 0.323574472947E+03 0.322363164571E+03 + 0.321156972545E+03 0.319955871305E+03 0.318759835445E+03 0.317568839711E+03 + 0.316382859005E+03 0.315201868378E+03 0.314025843036E+03 0.312854758331E+03 + 0.311688589767E+03 0.310527312994E+03 0.309370903810E+03 0.308219338157E+03 + 0.307072592124E+03 0.305930641943E+03 0.304793463986E+03 0.303661034772E+03 + 0.302533330954E+03 0.301410329331E+03 0.300292006836E+03 0.299178340542E+03 + 0.298069307658E+03 0.296964885529E+03 0.295865051635E+03 0.294769783587E+03 + 0.293679059134E+03 0.292592856152E+03 0.291511152652E+03 0.290433926771E+03 + 0.289361156778E+03 0.288292821070E+03 0.287228898170E+03 0.286169366729E+03 + 0.285114205522E+03 0.284063393450E+03 0.283016909536E+03 0.281974732930E+03 + 0.280936842898E+03 0.279903218832E+03 0.278873840243E+03 0.277848686760E+03 + 0.276827738134E+03 0.275810974230E+03 0.274798375033E+03 0.273789920642E+03 + 0.272785591274E+03 0.271785367259E+03 0.270789229040E+03 0.269797157175E+03 + 0.268809132333E+03 0.267825135295E+03 0.266845146953E+03 0.265869148307E+03 + 0.264897120469E+03 0.263929044657E+03 0.262964902199E+03 0.262004674529E+03 + 0.261048343186E+03 0.260095889815E+03 0.259147296168E+03 0.258202544098E+03 + 0.257261615563E+03 0.256324492623E+03 0.255391157441E+03 0.254461592279E+03 + 0.253535779503E+03 0.252613701575E+03 0.251695341058E+03 0.250780680616E+03 + 0.249869703005E+03 0.248962391084E+03 0.248058727805E+03 0.247158696218E+03 + 0.246262279465E+03 0.245369460787E+03 0.244480223515E+03 0.243594551075E+03 + 0.242712426987E+03 0.241833834861E+03 0.240958758398E+03 0.240087181392E+03 + 0.239219087726E+03 0.238354461373E+03 0.237493286393E+03 0.236635546938E+03 + 0.235781227245E+03 0.234930311640E+03 0.234082784533E+03 0.233238630423E+03 + 0.232397833893E+03 0.231560379611E+03 0.230726252331E+03 0.229895436888E+03 + 0.229067918201E+03 0.228243681274E+03 0.227422711190E+03 0.226604993117E+03 + 0.225790512300E+03 0.224979254067E+03 0.224171203827E+03 0.223366347066E+03 + 0.222564669350E+03 0.221766156323E+03 0.220970793709E+03 0.220178567306E+03 + 0.219389462992E+03 0.218603466719E+03 0.217820564517E+03 0.217040742490E+03 + 0.216263986816E+03 0.215490283750E+03 0.214719619619E+03 0.213951980825E+03 + 0.213187353840E+03 0.212425725212E+03 0.211667081559E+03 0.210911409571E+03 + 0.210158696009E+03 0.209408927705E+03 0.208662091561E+03 0.207918174549E+03 + 0.207177163709E+03 0.206439046151E+03 0.205703809054E+03 0.204971439663E+03 + 0.204241925292E+03 0.203515253322E+03 0.202791411201E+03 0.202070386441E+03 + 0.201352166621E+03 0.200636739388E+03 0.199924092450E+03 0.199214213582E+03 + 0.198507090621E+03 0.197802711471E+03 0.197101064096E+03 0.196402136525E+03 + 0.195705916848E+03 0.195012393219E+03 0.194321553852E+03 0.193633387024E+03 + 0.192947881071E+03 0.192265024390E+03 0.191584805440E+03 0.190907212739E+03 + 0.190232234862E+03 0.189559860447E+03 0.188890078187E+03 0.188222876837E+03 + 0.187558245206E+03 0.186896172164E+03 0.186236646636E+03 0.185579657605E+03 + 0.184925194111E+03 0.184273245249E+03 0.183623800169E+03 0.182976848079E+03 + 0.182332378240E+03 0.181690379970E+03 0.181050842639E+03 0.180413755672E+03 + 0.179779108548E+03 0.179146890800E+03 0.178517092013E+03 0.177889701826E+03 + 0.177264709929E+03 0.176642106065E+03 0.176021880029E+03 0.175404021667E+03 + 0.174788520876E+03 0.174175367606E+03 0.173564551854E+03 0.172956063670E+03 + 0.172349893152E+03 0.171746030451E+03 0.171144465763E+03 0.170545189335E+03 + 0.169948191465E+03 0.169353462495E+03 0.168760992818E+03 0.168170772875E+03 + 0.167582793153E+03 0.166997044188E+03 0.166413516561E+03 0.165832200903E+03 + 0.165253087887E+03 0.164676168235E+03 0.164101432716E+03 0.163528872141E+03 + 0.162958477369E+03 0.162390239304E+03 0.161824148893E+03 0.161260197130E+03 + 0.160698375051E+03 0.160138673736E+03 0.159581084312E+03 0.159025597945E+03 + 0.158472205848E+03 0.157920899275E+03 0.157371669521E+03 0.156824507928E+03 + 0.156279405877E+03 0.155736354791E+03 0.155195346135E+03 0.154656371417E+03 + 0.154119422185E+03 0.153584490027E+03 0.153051566572E+03 0.152520643492E+03 + 0.151991712497E+03 0.151464765337E+03 0.150939793802E+03 0.150416789722E+03 + 0.149895744967E+03 0.149376651444E+03 0.148859501100E+03 0.148344285922E+03 + 0.147830997933E+03 0.147319629196E+03 0.146810171811E+03 0.146302617916E+03 + 0.145796959686E+03 0.145293189335E+03 0.144791299112E+03 0.144291281305E+03 + 0.143793128237E+03 0.143296832267E+03 0.142802385792E+03 0.142309781246E+03 + 0.141819011094E+03 0.141330067842E+03 0.140842944029E+03 0.140357632228E+03 + 0.139874125051E+03 0.139392415140E+03 0.138912495174E+03 0.138434357868E+03 + 0.137957995969E+03 0.137483402258E+03 0.137010569550E+03 0.136539490696E+03 + 0.136070158577E+03 0.135602566110E+03 0.135136706243E+03 0.134672571959E+03 + 0.134210156272E+03 0.133749452228E+03 0.133290452909E+03 0.132833151424E+03 + 0.132377540919E+03 0.131923614568E+03 0.131471365579E+03 0.131020787190E+03 + 0.130571872671E+03 0.130124615323E+03 0.129679008478E+03 0.129235045498E+03 + 0.128792719777E+03 0.128352024738E+03 0.127912953836E+03 0.127475500555E+03 + 0.127039658407E+03 0.126605420938E+03 0.126172781720E+03 0.125741734356E+03 + 0.125312272478E+03 0.124884389747E+03 0.124458079853E+03 0.124033336516E+03 + 0.123610153481E+03 0.123188524526E+03 0.122768443455E+03 0.122349904099E+03 + 0.121932900320E+03 0.121517426005E+03 0.121103475071E+03 0.120691041462E+03 + 0.120280119147E+03 0.119870702125E+03 0.119462784422E+03 0.119056360090E+03 + 0.118651423207E+03 0.118247967880E+03 0.117845988241E+03 0.117445478449E+03 + 0.117046432688E+03 0.116648845169E+03 0.116252710129E+03 0.115858021832E+03 + 0.115464774565E+03 0.115072962643E+03 0.114682580405E+03 0.114293622215E+03 + 0.113906082464E+03 0.113519955566E+03 0.113135235962E+03 0.112751918115E+03 + 0.112369996514E+03 0.111989465673E+03 0.111610320131E+03 0.111232554448E+03 + 0.110856163212E+03 0.110481141032E+03 0.110107482542E+03 0.109735182400E+03 + 0.109361885830E+03 0.108991616236E+03 0.108622087069E+03 0.108253300141E+03 + 0.107885257238E+03 0.107517960120E+03 0.107151410521E+03 0.106785610147E+03 + 0.106420560679E+03 0.106056263771E+03 0.105692721052E+03 0.105329934124E+03 + 0.104967904564E+03 0.104606633923E+03 0.104246123727E+03 0.103886375475E+03 + 0.103527390642E+03 0.103169170678E+03 0.102811717007E+03 0.102455031028E+03 + 0.102099114116E+03 0.101743967621E+03 0.101389592868E+03 0.101035991157E+03 + 0.100683163765E+03 0.100331111944E+03 0.999798369217E+02 0.996293399015E+02 + 0.992796220635E+02 0.989306845638E+02 0.985825285348E+02 0.982351550854E+02 + 0.978885653007E+02 0.975427602431E+02 0.971977409511E+02 0.968535084407E+02 + 0.965100637045E+02 0.961674077124E+02 0.958255414117E+02 0.954844657269E+02 + 0.951441815601E+02 0.948046897908E+02 0.944659912766E+02 0.941280868526E+02 + 0.937909773322E+02 0.934546635067E+02 0.931191461456E+02 0.927844259967E+02 + 0.924505037865E+02 0.921173802197E+02 0.917850559799E+02 0.914535317296E+02 + 0.911228081100E+02 0.907928857415E+02 0.904637652234E+02 0.901354471347E+02 + 0.898079320333E+02 0.894812204571E+02 0.891553129232E+02 0.888302099287E+02 + 0.885059119505E+02 0.881824194455E+02 0.878597328506E+02 0.875378525830E+02 + 0.872167790402E+02 0.868965126002E+02 0.865770536215E+02 0.862584024434E+02 + 0.859405593857E+02 0.856235247495E+02 0.853072988166E+02 0.849918818502E+02 + 0.846772740947E+02 0.843634757756E+02 0.840504871004E+02 0.837383082577E+02 + 0.834269394183E+02 0.831163807344E+02 0.828066323404E+02 0.824976943527E+02 + 0.821895668700E+02 0.818822499732E+02 0.815757437255E+02 0.812700481728E+02 + 0.809651633436E+02 0.806610892492E+02 0.803578258836E+02 0.800553732239E+02 + 0.797537312303E+02 0.794528998461E+02 0.791528789982E+02 0.788536685966E+02 + 0.785552685351E+02 0.782576786908E+02 0.779608989251E+02 0.776649290827E+02 + 0.773697689929E+02 0.770754184685E+02 0.767818773069E+02 0.764891452897E+02 + 0.761972221829E+02 0.759061077372E+02 0.756158016878E+02 0.753263037547E+02 + 0.750376136428E+02 0.747497310420E+02 0.744626556271E+02 0.741763870584E+02 + 0.738909249812E+02 0.736062690266E+02 0.733224188108E+02 0.730393739360E+02 + 0.727571339898E+02 0.724756985459E+02 0.721950671638E+02 0.719152393893E+02 + 0.716362147539E+02 0.713579927759E+02 0.710805729595E+02 0.708039547958E+02 + 0.705281377623E+02 0.702531213230E+02 0.699789049290E+02 0.697054880182E+02 + 0.694328700154E+02 0.691610503326E+02 0.688900283690E+02 0.686198035111E+02 + 0.683503751329E+02 0.680817425956E+02 0.678139052485E+02 0.675468624283E+02 + 0.672806134594E+02 0.670151576546E+02 0.667504943142E+02 0.664866227269E+02 + 0.662235421696E+02 0.659612519076E+02 0.656997511943E+02 0.654390392720E+02 + 0.651791153715E+02 0.649199787120E+02 0.646616285021E+02 0.644040639387E+02 + 0.641472842083E+02 0.638912884860E+02 0.636360759364E+02 0.633816457132E+02 + 0.631279969598E+02 0.628751288088E+02 0.626230403824E+02 0.623717307927E+02 + 0.621211991414E+02 0.618714445201E+02 0.616224660104E+02 0.613742626838E+02 + 0.611268336022E+02 0.608801778177E+02 0.606342943724E+02 0.603891822993E+02 + 0.601448406216E+02 0.599012683532E+02 0.596584644988E+02 0.594164280537E+02 + 0.591751580043E+02 0.589346533277E+02 0.586949129923E+02 0.584559359575E+02 + 0.582177211741E+02 0.579802675841E+02 0.577435741209E+02 0.575076397094E+02 + 0.572724632663E+02 0.570380436997E+02 0.568043799096E+02 0.565714707877E+02 + 0.563393152180E+02 0.561079120762E+02 0.558772602300E+02 0.556473585398E+02 + 0.554182058577E+02 0.551898010285E+02 0.549621428893E+02 0.547352302699E+02 + 0.545090619925E+02 0.542836368721E+02 0.540589537165E+02 0.538350113263E+02 + 0.536118084950E+02 0.533893440092E+02 0.531676166485E+02 0.529466251858E+02 + 0.527263683872E+02 0.525068450121E+02 0.522880538134E+02 0.520699935374E+02 + 0.518526629241E+02 0.516360607069E+02 0.514201856133E+02 0.512050363643E+02 + 0.509906116749E+02 0.507769102541E+02 0.505639308049E+02 0.503516720242E+02 + 0.501401326036E+02 0.499293112283E+02 0.497192065785E+02 0.495098173283E+02 + 0.493011421465E+02 0.490931796965E+02 0.488859286362E+02 0.486793876183E+02 + 0.484735552902E+02 0.482684302943E+02 0.480640112677E+02 0.478602968425E+02 + 0.476572856462E+02 0.474549763011E+02 0.472533674247E+02 0.470524576300E+02 + 0.468522455250E+02 0.466527297136E+02 0.464539087946E+02 0.462557813628E+02 + 0.460583460084E+02 0.458616013174E+02 0.456655458714E+02 0.454701782479E+02 + 0.452754970202E+02 0.450815007578E+02 0.448881880258E+02 0.446955573858E+02 + 0.445036073953E+02 0.443123366080E+02 0.441217435740E+02 0.439318268396E+02 + 0.437425849475E+02 0.435540164371E+02 0.433661198440E+02 0.431788937005E+02 + 0.429923365357E+02 0.428064468752E+02 0.426212232414E+02 0.424366641537E+02 + 0.422527681282E+02 0.420695336781E+02 0.418869593134E+02 0.417050435414E+02 + 0.415237848664E+02 0.413431817898E+02 0.411632328106E+02 0.409839364247E+02 + 0.408052911256E+02 0.406272954041E+02 0.404499477485E+02 0.402732466447E+02 + 0.400971905761E+02 0.399217780238E+02 0.397470074665E+02 0.395728773808E+02 + 0.393993862410E+02 0.392265325193E+02 0.390543146859E+02 0.388827312087E+02 + 0.387117805540E+02 0.385414611858E+02 0.383717715665E+02 0.382027101565E+02 + 0.380342754146E+02 0.378664657978E+02 0.376992797614E+02 0.375327157591E+02 + 0.373667722431E+02 0.372014476639E+02 0.370367404709E+02 0.368726491116E+02 + 0.367091720326E+02 0.365463076789E+02 0.363840544942E+02 0.362224109213E+02 + 0.360613754013E+02 0.359009463748E+02 0.357411222808E+02 0.355819015575E+02 + 0.354232826421E+02 0.352652639708E+02 0.351078439791E+02 0.349510211013E+02 + 0.347947937712E+02 0.346391604217E+02 0.344841194850E+02 0.343296693927E+02 + 0.341758085757E+02 0.340225354643E+02 0.338698484883E+02 0.337177460771E+02 + 0.335662266594E+02 0.334152886637E+02 0.332649305181E+02 0.331151506502E+02 + 0.329659474876E+02 0.328173194573E+02 0.326692649865E+02 0.325217825019E+02 + 0.323748704301E+02 0.322285271979E+02 0.320827512316E+02 0.319375409580E+02 + 0.317928948036E+02 0.316488111949E+02 0.315052885588E+02 0.313623253222E+02 + 0.312199199120E+02 0.310780707556E+02 0.309367762806E+02 0.307960349148E+02 + 0.306558450863E+02 0.305162052237E+02 0.303771137559E+02 0.302385691123E+02 + 0.301005697226E+02 0.299631140173E+02 0.298262004272E+02 0.296898273838E+02 + 0.295539933191E+02 0.294186966658E+02 0.292839358573E+02 0.291497093277E+02 + 0.290160155119E+02 0.288828528453E+02 0.287502197644E+02 0.286181147064E+02 + 0.284865361096E+02 0.283554824127E+02 0.282249520559E+02 0.280949434800E+02 + 0.279654551268E+02 0.278364854394E+02 0.277080328616E+02 0.275800958386E+02 + 0.274526728165E+02 0.273257622426E+02 0.271993625653E+02 0.270734722344E+02 + 0.269480897008E+02 0.268232134166E+02 0.266988418352E+02 0.265749734115E+02 + 0.264516066015E+02 0.263287398626E+02 0.262063716538E+02 0.260845004352E+02 + 0.259631246686E+02 0.258422428172E+02 0.257218533457E+02 0.256019547202E+02 + 0.254825454085E+02 0.253636238800E+02 0.252451886056E+02 0.251272380577E+02 + 0.250097707107E+02 0.248927850404E+02 0.247762795242E+02 0.246602526416E+02 + 0.245447028735E+02 0.244296287028E+02 0.243150286139E+02 0.242009010932E+02 + 0.240872446290E+02 0.239740577114E+02 0.238613388323E+02 0.237490864855E+02 + 0.236372991667E+02 0.235259753738E+02 0.234151136064E+02 0.233047123660E+02 + 0.231947701564E+02 0.230852854833E+02 0.229762568543E+02 0.228676827793E+02 + 0.227595617701E+02 0.226518923407E+02 0.225446730072E+02 0.224379022878E+02 + 0.223315787029E+02 0.222257007751E+02 0.221202670291E+02 0.220152759920E+02 + 0.219107261930E+02 0.218066161634E+02 0.217029444371E+02 0.215997095501E+02 + 0.214969100407E+02 0.213945444496E+02 0.212926113196E+02 0.211911091963E+02 + 0.210900366272E+02 0.209893921624E+02 0.208891743545E+02 0.207893817583E+02 + 0.206900129312E+02 0.205910664329E+02 0.204925408258E+02 0.203944346744E+02 + 0.202967465461E+02 0.201994750105E+02 0.201026186399E+02 0.200061760091E+02 + 0.199101456954E+02 0.198145262787E+02 0.197193163414E+02 0.196245144686E+02 + 0.195301192479E+02 0.194361292697E+02 0.193425431267E+02 0.192493594147E+02 + 0.191565767317E+02 0.190641936786E+02 0.189722088589E+02 0.188806208789E+02 + 0.187894283475E+02 0.186986298763E+02 0.186082240798E+02 0.185182095750E+02 + 0.184285849817E+02 0.183393489226E+02 0.182505000230E+02 0.181620369111E+02 + 0.180739582179E+02 0.179862625771E+02 0.178989486251E+02 0.178120150015E+02 + 0.177254603484E+02 0.176392833109E+02 0.175534825368E+02 0.174680566769E+02 + 0.173830043848E+02 0.172983243170E+02 0.172140151329E+02 0.171300754947E+02 + 0.170465040676E+02 0.169632995197E+02 0.168804605220E+02 0.167979857484E+02 + 0.167158738757E+02 0.166341235838E+02 0.165527335555E+02 0.164717024763E+02 + 0.163910290351E+02 0.163107119233E+02 0.162307498358E+02 0.161511414699E+02 + 0.160718855264E+02 0.159929807089E+02 0.159144257239E+02 0.158362192811E+02 + 0.157583600930E+02 0.156808468754E+02 0.156036783469E+02 0.155268532292E+02 + 0.154503702471E+02 0.153742281283E+02 0.152984256038E+02 0.152229614075E+02 + 0.151478342763E+02 0.150730429502E+02 0.149985861724E+02 0.149244626891E+02 + 0.148506712494E+02 0.147772106059E+02 0.147040795139E+02 0.146312767319E+02 + 0.145588010216E+02 0.144866511477E+02 0.144148258782E+02 0.143433239838E+02 + 0.142721442387E+02 0.142012854201E+02 0.141307463083E+02 0.140605256866E+02 + 0.139906223418E+02 0.139210350633E+02 0.138517626441E+02 0.137828038802E+02 + 0.137141575705E+02 0.136458225173E+02 0.135777975260E+02 0.135100814052E+02 + 0.134426729664E+02 0.133755710246E+02 0.133087743976E+02 0.132422819066E+02 + 0.131760923759E+02 0.131102046329E+02 0.130446175082E+02 0.129793298355E+02 + 0.129143404519E+02 0.128496481974E+02 0.127852519152E+02 0.127211504517E+02 + 0.126573426565E+02 0.125938273825E+02 0.125306034854E+02 0.124676698245E+02 + 0.124050252619E+02 0.123426686631E+02 0.122805988967E+02 0.122188148344E+02 + 0.121573153513E+02 0.120960993255E+02 0.120351656382E+02 0.119745131739E+02 + 0.119141408203E+02 0.118540474681E+02 0.117942320114E+02 0.117346933474E+02 + 0.116754303762E+02 0.116164420016E+02 0.115577271301E+02 0.114992846716E+02 + 0.114411135390E+02 0.113832126487E+02 0.113255809198E+02 0.112682172751E+02 + 0.112111206400E+02 0.111542899436E+02 0.110977241178E+02 0.110414220977E+02 + 0.109853828218E+02 0.109296052314E+02 0.108740882714E+02 0.108188308894E+02 + 0.107638320365E+02 0.107090906668E+02 0.106546057375E+02 0.106003762091E+02 + 0.105464010452E+02 0.104926792124E+02 0.104392096807E+02 0.103859914230E+02 + 0.103330234155E+02 0.102803046374E+02 0.102278340713E+02 0.101756107026E+02 + 0.101236335200E+02 0.100719015153E+02 0.100204136835E+02 0.996916902260E+01 + 0.991816653382E+01 0.986740522144E+01 0.981688409287E+01 0.976660215864E+01 + 0.971655843237E+01 0.966675193081E+01 0.961718167379E+01 0.956784668426E+01 + 0.951874598826E+01 0.946987861491E+01 0.942124359645E+01 0.937283996818E+01 + 0.932466676848E+01 0.927672303885E+01 0.922900782381E+01 0.918152017101E+01 + 0.913425913113E+01 0.908722375793E+01 0.904041310824E+01 0.899382624192E+01 + 0.894746222193E+01 0.890132011425E+01 0.885539898790E+01 0.880969791497E+01 + 0.876421597057E+01 0.871895223287E+01 0.867390578303E+01 0.862907570527E+01 + 0.858446108683E+01 0.854006101795E+01 0.849587459192E+01 0.845190090499E+01 + 0.840813905647E+01 0.836458814863E+01 0.832124728676E+01 0.827811557914E+01 + 0.823519213703E+01 0.819247607468E+01 0.814996650932E+01 0.810766256115E+01 + 0.806556335335E+01 0.802366801206E+01 0.798197566637E+01 0.794048544834E+01 + 0.789919649299E+01 0.785810793826E+01 0.781721892504E+01 0.777652859719E+01 + 0.773603610145E+01 0.769574058751E+01 0.765564120800E+01 0.761573711844E+01 + 0.757602747728E+01 0.753651144585E+01 0.749718818842E+01 0.745805687213E+01 + 0.741911666702E+01 0.738036674600E+01 0.734180628490E+01 0.730343446238E+01 + 0.726525045999E+01 0.722725346217E+01 0.718944265617E+01 0.715181723213E+01 + 0.711437638302E+01 0.707711930468E+01 0.704004519575E+01 0.700315325773E+01 + 0.696644269495E+01 0.692991271453E+01 0.689356252645E+01 0.685739134345E+01 + 0.682139838112E+01 0.678558285783E+01 0.674994399473E+01 0.671448101579E+01 + 0.667919314773E+01 0.664407962006E+01 0.660913966506E+01 0.657437251778E+01 + 0.653977741602E+01 0.650535360034E+01 0.647110031404E+01 0.643701680317E+01 + 0.640310231651E+01 0.636935610556E+01 0.633577742457E+01 0.630236553049E+01 + 0.626911968297E+01 0.623603914440E+01 0.620312317984E+01 0.617037105706E+01 + 0.613778204650E+01 0.610535542131E+01 0.607309045729E+01 0.604098643293E+01 + 0.600904262937E+01 0.597725833040E+01 0.594563282249E+01 0.591416539474E+01 + 0.588285533888E+01 0.585170194928E+01 0.582070452295E+01 0.578986235951E+01 + 0.575917476118E+01 0.572864103281E+01 0.569826048186E+01 0.566803241835E+01 + 0.563795615493E+01 0.560803100681E+01 0.557825629178E+01 0.554863133021E+01 + 0.551915544503E+01 0.548982796172E+01 0.546064820833E+01 0.543161551544E+01 + 0.540272921619E+01 0.537398864622E+01 0.534539314374E+01 0.531694204944E+01 + 0.528863470655E+01 0.526047046080E+01 0.523244866043E+01 0.520456865616E+01 + 0.517682980121E+01 0.514923145129E+01 0.512177296456E+01 0.509445370168E+01 + 0.506727302576E+01 0.504023030236E+01 0.501332489950E+01 0.498655618765E+01 + 0.495992353971E+01 0.493342633101E+01 0.490706393931E+01 0.488083574478E+01 + 0.485474113002E+01 0.482877948002E+01 0.480295018217E+01 0.477725262627E+01 + 0.475168620449E+01 0.472625031138E+01 0.470094434387E+01 0.467576770126E+01 + 0.465071978520E+01 0.462579999971E+01 0.460100775115E+01 0.457634244821E+01 + 0.455180350194E+01 0.452739032569E+01 0.450310233516E+01 0.447893894834E+01 + 0.445489958556E+01 0.443098366942E+01 0.440719062484E+01 0.438351987901E+01 + 0.435997086143E+01 0.433654300386E+01 0.431323574033E+01 0.429004850713E+01 + 0.426698074282E+01 0.424403188821E+01 0.422120138635E+01 0.419848868253E+01 + 0.417589322427E+01 0.415341446132E+01 0.413105184564E+01 0.410880483141E+01 + 0.408667287502E+01 0.406465543506E+01 0.404275197230E+01 0.402096194971E+01 + 0.399928483243E+01 0.397772008780E+01 0.395626718529E+01 0.393492559655E+01 + 0.391369479540E+01 0.389257425778E+01 0.387156346180E+01 0.385066188767E+01 + 0.382986901778E+01 0.380918433659E+01 0.378860733072E+01 0.376813748887E+01 + 0.374777430187E+01 0.372751726261E+01 0.370736586612E+01 0.368731960948E+01 + 0.366737799186E+01 0.364754051449E+01 0.362780668070E+01 0.360817599585E+01 + 0.358864796735E+01 0.356922210467E+01 0.354989791933E+01 0.353067492487E+01 + 0.351155263685E+01 0.349253057288E+01 0.347360825256E+01 0.345478519752E+01 + 0.343606093136E+01 0.341743497972E+01 0.339890687021E+01 0.338047613241E+01 + 0.336214229790E+01 0.334390490023E+01 0.332576347491E+01 0.330771755941E+01 + 0.328976669315E+01 0.327191041751E+01 0.325414827580E+01 0.323647981326E+01 + 0.321890457708E+01 0.320142211635E+01 0.318403198209E+01 0.316673372724E+01 + 0.314952690661E+01 0.313241107694E+01 0.311538579686E+01 0.309845062686E+01 + 0.308160512935E+01 0.306484886857E+01 0.304818141067E+01 0.303160232364E+01 + 0.301511117732E+01 0.299870754340E+01 0.298239099545E+01 0.296616110882E+01 + 0.295001746074E+01 0.293395963025E+01 0.291798719819E+01 0.290209974725E+01 + 0.288629686190E+01 0.287057812842E+01 0.285494313489E+01 0.283939147118E+01 + 0.282392272895E+01 0.280853650161E+01 0.279323238438E+01 0.277800997423E+01 + 0.276286886988E+01 0.274780867183E+01 0.273282898230E+01 0.271792940528E+01 + 0.270310954649E+01 0.268836901336E+01 0.267370741507E+01 0.265912436252E+01 + 0.264461946831E+01 0.263019234677E+01 0.261584261390E+01 0.260156988743E+01 + 0.258737378677E+01 0.257325393300E+01 0.255920994891E+01 0.254524145893E+01 + 0.253134808920E+01 0.251752946748E+01 0.250378522321E+01 0.249011498749E+01 + 0.247651839305E+01 0.246299507426E+01 0.244954466714E+01 0.243616680932E+01 + 0.242286114006E+01 0.240962730026E+01 0.239646493241E+01 0.238337368060E+01 + 0.237035319054E+01 0.235740310953E+01 0.234452308646E+01 0.233171277180E+01 + 0.231897181762E+01 0.230629987754E+01 0.229369660676E+01 0.228116166204E+01 + 0.226869470169E+01 0.225629538561E+01 0.224396337519E+01 0.223169833341E+01 + 0.221949992476E+01 0.220736781527E+01 0.219530167249E+01 0.218330116551E+01 + 0.217136596491E+01 0.215949574280E+01 0.214769017277E+01 0.213594892993E+01 + 0.212427169089E+01 0.211265813373E+01 0.210110793801E+01 0.208962078480E+01 + 0.207819635661E+01 0.206683433744E+01 0.205553441273E+01 0.204429626941E+01 + 0.203311959583E+01 0.202200408181E+01 0.201094941860E+01 0.199995529890E+01 + 0.198902141682E+01 0.197814746793E+01 0.196733314919E+01 0.195657815899E+01 + 0.194588219714E+01 0.193524496484E+01 0.192466616472E+01 0.191414550077E+01 + 0.190368267840E+01 0.189327740439E+01 0.188292938693E+01 0.187263833554E+01 + 0.186240396116E+01 0.185222597607E+01 0.184210409392E+01 0.183203802972E+01 + 0.182202749983E+01 0.181207222195E+01 0.180217191515E+01 0.179232629980E+01 + 0.178253509764E+01 0.177279803172E+01 0.176311482640E+01 0.175348520740E+01 + 0.174390890171E+01 0.173438563766E+01 0.172491514488E+01 0.171549715428E+01 + 0.170613139810E+01 0.169681760984E+01 0.168755552430E+01 0.167834487756E+01 + 0.166918540699E+01 0.166007685120E+01 0.165101895010E+01 0.164201144485E+01 + 0.163305407787E+01 0.162414659283E+01 0.161528873466E+01 0.160648024952E+01 + 0.159772088483E+01 0.158901038924E+01 0.158034851261E+01 0.157173500605E+01 + 0.156316962190E+01 0.155465211369E+01 0.154618223618E+01 0.153775974535E+01 + 0.152938439837E+01 0.152105595361E+01 0.151277417064E+01 0.150453881023E+01 + 0.149634963432E+01 0.148820640605E+01 0.148010888973E+01 0.147205685085E+01 + 0.146405005606E+01 0.145608827319E+01 0.144817127123E+01 0.144029882031E+01 + 0.143247069173E+01 0.142468665794E+01 0.141694649252E+01 0.140924997021E+01 + 0.140159686688E+01 0.139398695953E+01 0.138642002627E+01 0.137889584638E+01 + 0.137141420021E+01 0.136397486925E+01 0.135657763612E+01 0.134922228451E+01 + 0.134190859923E+01 0.133463636620E+01 0.132740537243E+01 0.132021540600E+01 + 0.131306625612E+01 0.130595771305E+01 0.129888956813E+01 0.129186161380E+01 + 0.128487364354E+01 0.127792545194E+01 0.127101683460E+01 0.126414758823E+01 + 0.125731751057E+01 0.125052640041E+01 0.124377405760E+01 0.123706028303E+01 + 0.123038487863E+01 0.122374764737E+01 0.121714839325E+01 0.121058692129E+01 + 0.120406303756E+01 0.119757654913E+01 0.119112726410E+01 0.118471408412E+01 + 0.117830890526E+01 0.117189861140E+01 0.116548335146E+01 0.115906327466E+01 + 0.115263853054E+01 0.114620926893E+01 0.113977563998E+01 0.113333779415E+01 + 0.112689588219E+01 0.112045005518E+01 0.111400046449E+01 0.110754726180E+01 + 0.110109059911E+01 0.109463062870E+01 0.108816750320E+01 0.108170137550E+01 + 0.107523239883E+01 0.106876072672E+01 0.106228651300E+01 0.105580991181E+01 + 0.104933107761E+01 0.104285016514E+01 0.103636732947E+01 0.102988272597E+01 + 0.102339651033E+01 0.101690883852E+01 0.101041986684E+01 0.100392975189E+01 + 0.997438650578E+00 0.990946720118E+00 0.984454118032E+00 0.977961002150E+00 + 0.971467530609E+00 0.964973861853E+00 0.958480154633E+00 0.951986568009E+00 + 0.945493261347E+00 0.939000394319E+00 0.932508126908E+00 0.926016619400E+00 + 0.919526032392E+00 0.913036526786E+00 0.906548263793E+00 0.900061404929E+00 + 0.893576112019E+00 0.887092547196E+00 0.880610872899E+00 0.874131251874E+00 + 0.867653847176E+00 0.861178822165E+00 0.854706340511E+00 0.848236566189E+00 + 0.841769663484E+00 0.835305796984E+00 0.828845131588E+00 0.822387832503E+00 + 0.815934065239E+00 0.809483995617E+00 0.803037789764E+00 0.796595614114E+00 + 0.790157635411E+00 0.783724020701E+00 0.777294937343E+00 0.770870553000E+00 + 0.764451035643E+00 0.758036553550E+00 0.751627275308E+00 0.745223369809E+00 + 0.738825006253E+00 0.732432354149E+00 0.726045583311E+00 0.719664863863E+00 + 0.713290366232E+00 0.706922261157E+00 0.700560719682E+00 0.694205913159E+00 + 0.687858013246E+00 0.681517191909E+00 0.675183621423E+00 0.668857474368E+00 + 0.662538923632E+00 0.656228142412E+00 0.649925304209E+00 0.643630582834E+00 + 0.637344152405E+00 0.631066187347E+00 0.624796862390E+00 0.618536352576E+00 + 0.612284833251E+00 0.606042480069E+00 0.599809468991E+00 0.593585976286E+00 + 0.587372178531E+00 0.581168252608E+00 0.574974375708E+00 0.568790725330E+00 + 0.562617479279E+00 0.556454815667E+00 0.550302912914E+00 0.544161949748E+00 + 0.538032105203E+00 0.531913558622E+00 0.525806489653E+00 0.519711078253E+00 + 0.513627504687E+00 0.507555949524E+00 0.501496593645E+00 0.495449618234E+00 + 0.489415204786E+00 0.483393535099E+00 0.477384791283E+00 0.471389155752E+00 + 0.465406811230E+00 0.459437940744E+00 0.453482727634E+00 0.447541355543E+00 + 0.441614008423E+00 0.435700870533E+00 0.429802126439E+00 0.423917961016E+00 + 0.418048559443E+00 0.412194107211E+00 0.406354790113E+00 0.400530794254E+00 + 0.394722306043E+00 0.388929512198E+00 0.383152599744E+00 0.377391756014E+00 + 0.371647168646E+00 0.365919025589E+00 0.360207515095E+00 0.354512825728E+00 + 0.348835146354E+00 0.343174666151E+00 0.337531574603E+00 0.331906061499E+00 + 0.326298316939E+00 0.320708531327E+00 0.315136895377E+00 0.309583600108E+00 + 0.304048836848E+00 0.298532797232E+00 0.293035673202E+00 0.287557657007E+00 + 0.282098941204E+00 0.276659718656E+00 0.271240182536E+00 0.265840526322E+00 + 0.260460943799E+00 0.255101629062E+00 0.249762776511E+00 0.244444580853E+00 + 0.239147237105E+00 0.233870940588E+00 0.228615886932E+00 0.223382272075E+00 + 0.218170292262E+00 0.212980144044E+00 0.207812024280E+00 0.202666130137E+00 + 0.197542659088E+00 0.192441808916E+00 0.187363777708E+00 0.182308763859E+00 + 0.177276966074E+00 0.172268583363E+00 0.167283815043E+00 0.162322860739E+00 + 0.157385920384E+00 0.152473194217E+00 0.147584882787E+00 0.142721186945E+00 + 0.137882307856E+00 0.133068446987E+00 0.128279806114E+00 0.123516587322E+00 + 0.118778993002E+00 0.114067225851E+00 0.109381488875E+00 0.104721985388E+00 + 0.100088919008E+00 0.954824936648E-01 0.909029135920E-01 0.863503833322E-01 + 0.818251077348E-01 0.773272919566E-01 0.728571414618E-01 0.684148620218E-01 + 0.640006504297E-01 0.596145160188E-01 0.552562935829E-01 0.509258108889E-01 + 0.466228952827E-01 0.423473736896E-01 0.380990726143E-01 0.338778181407E-01 + 0.296834359318E-01 0.255157512301E-01 0.213745888574E-01 0.172597732146E-01 + 0.131711282820E-01 0.910847761918E-02 0.507164436489E-02 0.106045123729E-02 + -0.292527946626E-02 -0.688572586909E-02 -0.108210665153E-01 -0.147314803695E-01 + -0.186171468174E-01 -0.224782456652E-01 -0.263149571397E-01 -0.301274618887E-01 + -0.339159409806E-01 -0.376805759043E-01 -0.414215485699E-01 -0.451390413078E-01 + -0.488332368694E-01 -0.525043184265E-01 -0.561524695720E-01 -0.597778743192E-01 + -0.633807171023E-01 -0.669611827763E-01 -0.705194566166E-01 -0.740557243197E-01 + -0.775701720026E-01 -0.810629862030E-01 -0.845343538794E-01 -0.879844624111E-01 + -0.914134995980E-01 -0.948216536606E-01 -0.982091132405E-01 -0.101576067400E+00 + -0.104922705621E+00 -0.108249217808E+00 -0.111555794285E+00 -0.114842625797E+00 + -0.118109903509E+00 -0.121357819008E+00 -0.124586564302E+00 -0.127796331818E+00 + -0.130987314404E+00 -0.134159705330E+00 -0.137313698286E+00 -0.140449487383E+00 + -0.143567267152E+00 -0.146667232546E+00 -0.149749578937E+00 -0.152814502118E+00 + -0.155862198306E+00 -0.158892864133E+00 -0.161906696657E+00 -0.164903893353E+00 + -0.167884652120E+00 -0.170849171274E+00 -0.173797649555E+00 -0.176730286122E+00 + -0.179647280555E+00 -0.182548832856E+00 -0.185435143445E+00 -0.188306413165E+00 + -0.191162843278E+00 -0.194004635470E+00 -0.196831991843E+00 -0.199645114924E+00 + -0.202444207658E+00 -0.205229473412E+00 -0.208001115973E+00 -0.210759339550E+00 + -0.213504348770E+00 -0.216236348684E+00 -0.218955544762E+00 -0.221662142895E+00 + -0.224356349394E+00 -0.227038370992E+00 -0.229708414842E+00 -0.232366688517E+00 + -0.235013400013E+00 -0.237648757745E+00 -0.240272970548E+00 -0.242886247680E+00 + -0.245488798817E+00 -0.248080834059E+00 -0.250662563715E+00 -0.253234147329E+00 + -0.255795626811E+00 -0.258347027627E+00 -0.260888375319E+00 -0.263419695508E+00 + -0.265941013894E+00 -0.268452356255E+00 -0.270953748446E+00 -0.273445216401E+00 + -0.275926786134E+00 -0.278398483735E+00 -0.280860335374E+00 -0.283312367299E+00 + -0.285754605834E+00 -0.288187077385E+00 -0.290609808434E+00 -0.293022825542E+00 + -0.295426155348E+00 -0.297819824569E+00 -0.300203860002E+00 -0.302578288520E+00 + -0.304943137077E+00 -0.307298432702E+00 -0.309644202505E+00 -0.311980473674E+00 + -0.314307273473E+00 -0.316624629247E+00 -0.318932568419E+00 -0.321231118489E+00 + -0.323520307036E+00 -0.325800161718E+00 -0.328070710269E+00 -0.330331980505E+00 + -0.332584000316E+00 -0.334826797675E+00 -0.337060400629E+00 -0.339284837306E+00 + -0.341500135911E+00 -0.343706324729E+00 -0.345903432121E+00 -0.348091486528E+00 + -0.350270516469E+00 -0.352440550541E+00 -0.354601617419E+00 -0.356753745857E+00 + -0.358896964686E+00 -0.361031302819E+00 -0.363156789242E+00 -0.365273453024E+00 + -0.367381323309E+00 -0.369480429321E+00 -0.371570800363E+00 -0.373652465813E+00 + -0.375725455132E+00 -0.377789797855E+00 -0.379845523599E+00 -0.381892662056E+00 + -0.383931242999E+00 -0.385961296277E+00 -0.387982851820E+00 -0.389995939633E+00 + -0.392000589803E+00 -0.393996832492E+00 -0.395984697943E+00 -0.397964216475E+00 + -0.399935418487E+00 -0.401898334455E+00 -0.403852994935E+00 -0.405799430560E+00 + -0.407737672041E+00 -0.409667750169E+00 -0.411589695812E+00 -0.413503539916E+00 + -0.415409313507E+00 -0.417307047687E+00 -0.419196773638E+00 -0.421078522621E+00 + -0.422952325972E+00 -0.424818215110E+00 -0.426676221528E+00 -0.428526376800E+00 + -0.430368712577E+00 -0.432203260590E+00 -0.434030052645E+00 -0.435849120630E+00 + -0.437660496509E+00 -0.439464212325E+00 -0.441260300201E+00 -0.443048792334E+00 + -0.444829721004E+00 -0.446603118567E+00 -0.448369017456E+00 -0.450127450187E+00 + -0.451878449348E+00 -0.453622043059E+00 -0.455358230684E+00 -0.457087000361E+00 + -0.458808340203E+00 -0.460522238321E+00 -0.462228682826E+00 -0.463927661829E+00 + -0.465619163441E+00 -0.467303175770E+00 -0.468979686926E+00 -0.470648685017E+00 + -0.472310158152E+00 -0.473964094438E+00 -0.475610481983E+00 -0.477249308893E+00 + -0.478880563275E+00 -0.480504233234E+00 -0.482120306875E+00 -0.483728772304E+00 + -0.485329617624E+00 -0.486922830939E+00 -0.488508400353E+00 -0.490086313968E+00 + -0.491656559887E+00 -0.493219126211E+00 -0.494774001042E+00 -0.496321172480E+00 + -0.497860628626E+00 -0.499392357580E+00 -0.500916347442E+00 -0.502432586309E+00 + -0.503941062280E+00 -0.505441763454E+00 -0.506934677928E+00 -0.508419793798E+00 + -0.509897099161E+00 -0.511366582113E+00 -0.512828230750E+00 -0.514282033166E+00 + -0.515727977456E+00 -0.517166051714E+00 -0.518596244033E+00 -0.520018542506E+00 + -0.521432935226E+00 -0.522839410285E+00 -0.524237955775E+00 -0.525628559786E+00 + -0.527011210408E+00 -0.528385895733E+00 -0.529752603850E+00 -0.531111322847E+00 + -0.532462040814E+00 -0.533804745838E+00 -0.535139426007E+00 -0.536466069408E+00 + -0.537784664128E+00 -0.539095198253E+00 -0.540397659868E+00 -0.541692037059E+00 + -0.542978317911E+00 -0.544256490507E+00 -0.545526542932E+00 -0.546788463268E+00 + -0.548042239599E+00 -0.549287860006E+00 -0.550525312571E+00 -0.551754585375E+00 + -0.552975666500E+00 -0.554188544026E+00 -0.555393206032E+00 -0.556589640597E+00 + -0.557777835801E+00 -0.558957779722E+00 -0.560129460437E+00 -0.561292866024E+00 + -0.562447984560E+00 -0.563594804120E+00 -0.564733312782E+00 -0.565863498621E+00 + -0.566985349710E+00 -0.568098854125E+00 -0.569203999940E+00 -0.570300775227E+00 + -0.571389168061E+00 -0.572469166513E+00 -0.573540758655E+00 -0.574603932559E+00 + -0.575658676295E+00 -0.576704977935E+00 -0.577742825548E+00 -0.578772207204E+00 + -0.579793110971E+00 -0.580805524919E+00 -0.581809437115E+00 -0.582804837464E+00 + -0.583791756332E+00 -0.584770263646E+00 -0.585740431114E+00 -0.586702330587E+00 + -0.587656034054E+00 -0.588601613647E+00 -0.589539141638E+00 -0.590468690440E+00 + -0.591390332606E+00 -0.592304140832E+00 -0.593210187953E+00 -0.594108546945E+00 + -0.594999290926E+00 -0.595882493155E+00 -0.596758227030E+00 -0.597626566091E+00 + -0.598487584020E+00 -0.599341354638E+00 -0.600187951908E+00 -0.601027449933E+00 + -0.601859922959E+00 -0.602685445370E+00 -0.603504091692E+00 -0.604315936594E+00 + -0.605121054882E+00 -0.605919521507E+00 -0.606711411557E+00 -0.607496800263E+00 + -0.608275762997E+00 -0.609048375272E+00 -0.609814712740E+00 -0.610574851196E+00 + -0.611328866575E+00 -0.612076834954E+00 -0.612818832548E+00 -0.613554935717E+00 + -0.614285220957E+00 -0.615009764910E+00 -0.615728644355E+00 -0.616441936215E+00 + -0.617149717550E+00 -0.617852065564E+00 -0.618549057601E+00 -0.619240771147E+00 + -0.619927283826E+00 -0.620608673406E+00 -0.621285017793E+00 -0.621956395037E+00 + -0.622622883327E+00 -0.623284560992E+00 -0.623941506505E+00 -0.624593798476E+00 + -0.625241515659E+00 -0.625884736948E+00 -0.626523541377E+00 -0.627158008122E+00 + -0.627788216498E+00 -0.628414245964E+00 -0.629036176118E+00 -0.629654086698E+00 + -0.630268057584E+00 -0.630878168798E+00 -0.631484500502E+00 -0.632087132996E+00 + -0.632686146726E+00 -0.633281622276E+00 -0.633873640370E+00 -0.634462281875E+00 + -0.635047627798E+00 -0.635629759288E+00 -0.636208757632E+00 -0.636784704260E+00 + -0.637357680743E+00 -0.637927768793E+00 -0.638495050261E+00 -0.639059607142E+00 + -0.639621521569E+00 -0.640180875817E+00 -0.640737752302E+00 -0.641292233581E+00 + -0.641844402351E+00 -0.642394341452E+00 -0.642942133862E+00 -0.643487862702E+00 + -0.644031611233E+00 -0.644573462858E+00 -0.645113501118E+00 -0.645651809699E+00 + -0.646188472424E+00 -0.646723573260E+00 -0.647257196313E+00 -0.647789425830E+00 + -0.648320346200E+00 -0.648850041862E+00 -0.649378568178E+00 -0.649905909597E+00 + -0.650432039962E+00 -0.650956933077E+00 -0.651480562707E+00 -0.652002902576E+00 + -0.652523926370E+00 -0.653043607733E+00 -0.653561920270E+00 -0.654078837547E+00 + -0.654594333089E+00 -0.655108380383E+00 -0.655620952874E+00 -0.656132023968E+00 + -0.656641567031E+00 -0.657149555390E+00 -0.657655962332E+00 -0.658160761103E+00 + -0.658663924911E+00 -0.659165426923E+00 -0.659665240266E+00 -0.660163338028E+00 + -0.660659693256E+00 -0.661154278959E+00 -0.661647068105E+00 -0.662138033622E+00 + -0.662627148399E+00 -0.663114385284E+00 -0.663599717087E+00 -0.664083116576E+00 + -0.664564556481E+00 -0.665044009492E+00 -0.665521448257E+00 -0.665996845387E+00 + -0.666470173452E+00 -0.666941404982E+00 -0.667410512468E+00 -0.667877468360E+00 + -0.668342245069E+00 -0.668804814966E+00 -0.669265150382E+00 -0.669723223608E+00 + -0.670179006897E+00 -0.670632472459E+00 -0.671083592467E+00 -0.671532339053E+00 + -0.671978684309E+00 -0.672422600287E+00 -0.672864059001E+00 -0.673303032423E+00 + -0.673739492486E+00 -0.674173411083E+00 -0.674604760068E+00 -0.675033511255E+00 + -0.675459636416E+00 -0.675883107287E+00 -0.676303895562E+00 -0.676721972894E+00 + -0.677137310898E+00 -0.677549881149E+00 -0.677959655182E+00 -0.678366604492E+00 + -0.678770700535E+00 -0.679171914725E+00 -0.679570218439E+00 -0.679965583012E+00 + -0.680357979740E+00 -0.680747379880E+00 -0.681133754648E+00 -0.681517075220E+00 + -0.681897312734E+00 -0.682274438286E+00 -0.682648422934E+00 -0.683019237694E+00 + -0.683386853545E+00 -0.683751241424E+00 -0.684112372229E+00 -0.684470216818E+00 + -0.684824746010E+00 -0.685175930582E+00 -0.685523741274E+00 -0.685868148784E+00 + -0.686209123772E+00 -0.686546636857E+00 -0.686880658617E+00 -0.687211159594E+00 + -0.687538110285E+00 -0.687861481152E+00 -0.688181242615E+00 -0.688497365054E+00 + -0.688809818809E+00 -0.689118574181E+00 -0.689423601431E+00 -0.689724870781E+00 + -0.690022355670E+00 -0.690316051401E+00 -0.690605962289E+00 -0.690892092692E+00 + -0.691174446982E+00 -0.691453029545E+00 -0.691727844780E+00 -0.691998897099E+00 + -0.692266190931E+00 -0.692529730716E+00 -0.692789520909E+00 -0.693045565979E+00 + -0.693297870409E+00 -0.693546438693E+00 -0.693791275344E+00 -0.694032384884E+00 + -0.694269771852E+00 -0.694503440800E+00 -0.694733396293E+00 -0.694959642910E+00 + -0.695182185245E+00 -0.695401027906E+00 -0.695616175512E+00 -0.695827632699E+00 + -0.696035404115E+00 -0.696239494424E+00 -0.696439908301E+00 -0.696636650437E+00 + -0.696829725536E+00 -0.697019138315E+00 -0.697204893507E+00 -0.697386995857E+00 + -0.697565450124E+00 -0.697740261083E+00 -0.697911433519E+00 -0.698078972235E+00 + -0.698242882044E+00 -0.698403167777E+00 -0.698559834274E+00 -0.698712886394E+00 + -0.698862329005E+00 -0.699008166992E+00 -0.699150405254E+00 -0.699289048701E+00 + -0.699424102260E+00 -0.699555570869E+00 -0.699683459483E+00 -0.699807773069E+00 + -0.699928516607E+00 -0.700045695093E+00 -0.700159313535E+00 -0.700269376956E+00 + -0.700375890392E+00 -0.700478858894E+00 -0.700578287525E+00 -0.700674181364E+00 + -0.700766545503E+00 -0.700855385047E+00 -0.700940705116E+00 -0.701022510843E+00 + -0.701100807375E+00 -0.701175599873E+00 -0.701246893514E+00 -0.701314693484E+00 + -0.701379004987E+00 -0.701439833239E+00 -0.701497183471E+00 -0.701551060927E+00 + -0.701601470864E+00 -0.701648418555E+00 -0.701691909285E+00 -0.701731948354E+00 + -0.701768541076E+00 -0.701801692777E+00 -0.701831408799E+00 -0.701857694496E+00 + -0.701880555238E+00 -0.701899996407E+00 -0.701916023399E+00 -0.701928641626E+00 + -0.701937856510E+00 -0.701943673491E+00 -0.701946098020E+00 -0.701945135562E+00 + -0.701940791598E+00 -0.701933071621E+00 -0.701921981138E+00 -0.701907525670E+00 + -0.701889710753E+00 -0.701868541934E+00 -0.701844024777E+00 -0.701816164859E+00 + -0.701784967769E+00 -0.701750439112E+00 -0.701712584168E+00 -0.701671400089E+00 + -0.701626875684E+00 -0.701578999371E+00 -0.701527759553E+00 -0.701473144625E+00 + -0.701415142966E+00 -0.701353742946E+00 -0.701288932920E+00 -0.701220701233E+00 + -0.701149036217E+00 -0.701073926191E+00 -0.700995359463E+00 -0.700913324329E+00 + -0.700827809072E+00 -0.700738801962E+00 -0.700646291259E+00 -0.700550265209E+00 + -0.700450712047E+00 -0.700347619995E+00 -0.700240977263E+00 -0.700130772050E+00 + -0.700016992540E+00 -0.699899626908E+00 -0.699778663315E+00 -0.699654089910E+00 + -0.699525894830E+00 -0.699394066200E+00 -0.699258592133E+00 -0.699119460729E+00 + -0.698976660077E+00 -0.698830178252E+00 -0.698680003318E+00 -0.698526123328E+00 + -0.698368526321E+00 -0.698207200324E+00 -0.698042133352E+00 -0.697873313409E+00 + -0.697700728485E+00 -0.697524366559E+00 -0.697344215598E+00 -0.697160263555E+00 + -0.696972498372E+00 -0.696780907981E+00 -0.696585480298E+00 -0.696386203229E+00 + -0.696183064667E+00 -0.695976052494E+00 -0.695765154578E+00 -0.695550358777E+00 + -0.695331652934E+00 -0.695109024883E+00 -0.694882462444E+00 -0.694651953425E+00 + -0.694417485621E+00 -0.694179046817E+00 -0.693936624783E+00 -0.693690207280E+00 + -0.693439782055E+00 -0.693185336842E+00 -0.692926859364E+00 -0.692664337332E+00 + -0.692397758445E+00 -0.692127110388E+00 -0.691852380836E+00 -0.691573557450E+00 + -0.691290627881E+00 -0.691003579765E+00 -0.690712400729E+00 -0.690417078385E+00 + -0.690117600334E+00 -0.689813954165E+00 -0.689506127455E+00 -0.689194107768E+00 + -0.688877882656E+00 -0.688557439660E+00 -0.688232766307E+00 -0.687903850113E+00 + -0.687570678581E+00 -0.687233239203E+00 -0.686891519459E+00 -0.686545506814E+00 + -0.686195188723E+00 -0.685840552630E+00 -0.685481585965E+00 -0.685118276146E+00 + -0.684750610578E+00 -0.684378576657E+00 -0.684002161763E+00 -0.683621353266E+00 + -0.683236138523E+00 -0.682846504879E+00 -0.682452439668E+00 -0.682053930211E+00 + -0.681650963815E+00 -0.681243527777E+00 -0.680831609381E+00 -0.680415195900E+00 + -0.679994274593E+00 -0.679568832707E+00 -0.679138857480E+00 -0.678704336132E+00 + -0.678265255877E+00 -0.677821603912E+00 -0.677373367425E+00 -0.676920533590E+00 + -0.676463089569E+00 -0.676001022513E+00 -0.675534319559E+00 -0.675062967834E+00 + -0.674586954451E+00 -0.674106266512E+00 -0.673620891105E+00 -0.673130815309E+00 + -0.672636026187E+00 -0.672136510793E+00 -0.671632256167E+00 -0.671123249337E+00 + -0.670609477320E+00 -0.670090927120E+00 -0.669567585729E+00 -0.669039440125E+00 + -0.668506477278E+00 -0.667968684141E+00 -0.667426047658E+00 -0.666878554760E+00 + -0.666326192366E+00 -0.665768947381E+00 -0.665206806702E+00 -0.664639757209E+00 + -0.664067785772E+00 -0.663490879250E+00 -0.662909024488E+00 -0.662322208320E+00 + -0.661730417566E+00 -0.661133639037E+00 -0.660531859528E+00 -0.659925065824E+00 + -0.659313244699E+00 -0.658696382911E+00 -0.658074467211E+00 -0.657447484332E+00 + -0.656815421000E+00 -0.656178263926E+00 -0.655535999809E+00 -0.654888615336E+00 + -0.654236097183E+00 -0.653578432012E+00 -0.652915606475E+00 -0.652247607209E+00 + -0.651574420841E+00 -0.650896033986E+00 -0.650212433244E+00 -0.649523605206E+00 + -0.648829536450E+00 -0.648130213540E+00 -0.647425623031E+00 -0.646715751462E+00 + -0.646000585364E+00 -0.645280111252E+00 -0.644554315632E+00 -0.643823184995E+00 + -0.643086705821E+00 -0.642344864579E+00 -0.641597647725E+00 -0.640845041701E+00 + -0.640087032939E+00 -0.639323607859E+00 -0.638554752868E+00 -0.637780454359E+00 + -0.637000698717E+00 -0.636215472312E+00 -0.635424761501E+00 -0.634628552631E+00 + -0.633826832036E+00 -0.633019586038E+00 -0.632206800945E+00 -0.631388463057E+00 + -0.630564558657E+00 -0.629735074018E+00 -0.628899995403E+00 -0.628059309058E+00 + -0.627213001222E+00 -0.626361058117E+00 -0.625503465956E+00 -0.624640210940E+00 + -0.623771279255E+00 -0.622896657077E+00 -0.622016330571E+00 -0.621130290055E+00 + -0.620238555577E+00 -0.619341160129E+00 -0.618438136813E+00 -0.617529518782E+00 + -0.616615339245E+00 -0.615695631464E+00 -0.614770428756E+00 -0.613839764491E+00 + -0.612903672093E+00 -0.611962185041E+00 -0.611015336867E+00 -0.610063161158E+00 + -0.609105691554E+00 -0.608142961749E+00 -0.607175005492E+00 -0.606201856585E+00 + -0.605223548885E+00 -0.604240116302E+00 -0.603251592801E+00 -0.602258012399E+00 + -0.601259409171E+00 -0.600255817241E+00 -0.599247270790E+00 -0.598233804054E+00 + -0.597215451320E+00 -0.596192246932E+00 -0.595164225284E+00 -0.594131420829E+00 + -0.593093868070E+00 -0.592051601566E+00 -0.591004655930E+00 -0.589953065828E+00 + -0.588896865981E+00 -0.587836091163E+00 -0.586770776203E+00 -0.585700955983E+00 + -0.584626665441E+00 -0.583547939566E+00 -0.582464813403E+00 -0.581377322051E+00 + -0.580285500662E+00 -0.579189384444E+00 -0.578089008656E+00 -0.576984408613E+00 + -0.575875619684E+00 -0.574762677292E+00 -0.573645616913E+00 -0.572524474078E+00 + -0.571399284371E+00 -0.570270083432E+00 -0.569136906953E+00 -0.567999790680E+00 + -0.566858770414E+00 -0.565713882011E+00 -0.564565161378E+00 -0.563412644479E+00 + -0.562256367330E+00 -0.561096366002E+00 -0.559932676619E+00 -0.558765335361E+00 + -0.557594378460E+00 -0.556419842203E+00 -0.555241762930E+00 -0.554060177037E+00 + -0.552875120972E+00 -0.551686631239E+00 -0.550494744393E+00 -0.549299497045E+00 + -0.548100925861E+00 -0.546899067560E+00 -0.545693958913E+00 -0.544485636748E+00 + -0.543274137947E+00 -0.542059499442E+00 -0.540841758224E+00 -0.539620951336E+00 + -0.538397115873E+00 -0.537170288988E+00 -0.535940507885E+00 -0.534707809822E+00 + -0.533472232113E+00 -0.532233812125E+00 -0.530992587278E+00 -0.529748595048E+00 + -0.528501872963E+00 -0.527252458607E+00 -0.526000389616E+00 -0.524745703681E+00 + -0.523488438547E+00 -0.522228632013E+00 -0.520966321932E+00 -0.519701546212E+00 + -0.518434342812E+00 -0.517164749749E+00 -0.515892805090E+00 -0.514618546960E+00 + -0.513342013534E+00 -0.512063243045E+00 -0.510782273777E+00 -0.509499144069E+00 + -0.508213892314E+00 -0.506926556959E+00 -0.505637176506E+00 -0.504345789508E+00 + -0.503052434577E+00 -0.501757150373E+00 -0.500459975616E+00 -0.499160949075E+00 + -0.497860109575E+00 -0.496557495997E+00 -0.495253147272E+00 -0.493947102389E+00 + -0.492639400387E+00 -0.491330080364E+00 -0.490019181466E+00 -0.488706742898E+00 + -0.487392803917E+00 -0.486077403834E+00 -0.484760582014E+00 -0.483442377876E+00 + -0.482122830894E+00 -0.480801980594E+00 -0.479479866558E+00 -0.478156528422E+00 + -0.476832005873E+00 -0.475506338656E+00 -0.474179566568E+00 -0.472851729459E+00 + -0.471522867236E+00 -0.470193019857E+00 -0.468862227336E+00 -0.467530529740E+00 + -0.466197967190E+00 -0.464864579861E+00 -0.463530407984E+00 -0.462195491840E+00 + -0.460859871768E+00 -0.459523588158E+00 -0.458186681456E+00 -0.456849192162E+00 + -0.455511160828E+00 -0.454172628062E+00 -0.452833634525E+00 -0.451494220933E+00 + -0.450154428055E+00 -0.448814296715E+00 -0.447473867789E+00 -0.446133182209E+00 + -0.444792280960E+00 -0.443451205083E+00 -0.442109995669E+00 -0.440768693868E+00 + -0.439427340879E+00 -0.438085977959E+00 -0.436744646416E+00 -0.435403387616E+00 + -0.434062242973E+00 -0.432721253961E+00 -0.431380462105E+00 -0.430039908984E+00 + -0.428699636232E+00 -0.427359685535E+00 -0.426020098636E+00 -0.424680917331E+00 + -0.423342183467E+00 -0.422003938950E+00 -0.420666225736E+00 -0.419329085838E+00 + -0.417992561320E+00 -0.416656694302E+00 -0.415321526958E+00 -0.413987101515E+00 + -0.412653460255E+00 -0.411320645513E+00 -0.409988699679E+00 -0.408657665197E+00 + -0.407327584563E+00 -0.405998500331E+00 -0.404670455104E+00 -0.403343491543E+00 + -0.402017652362E+00 -0.400692980328E+00 -0.399369518263E+00 -0.398047309042E+00 + -0.396726395595E+00 -0.395406820905E+00 -0.394088628011E+00 -0.392771860004E+00 + -0.391456560010E+00 -0.390142771160E+00 -0.388830536630E+00 -0.387519899648E+00 + -0.386210903497E+00 -0.384903591516E+00 -0.383598007094E+00 -0.382294193677E+00 + -0.380992194764E+00 -0.379692053907E+00 -0.378393814713E+00 -0.377097520842E+00 + -0.375803216009E+00 -0.374510943983E+00 -0.373220748585E+00 -0.371932673692E+00 + -0.370646763234E+00 -0.369363061194E+00 -0.368081611611E+00 -0.366802458576E+00 + -0.365525646236E+00 -0.364251218788E+00 -0.362979220488E+00 -0.361709695643E+00 + -0.360442688613E+00 -0.359178243814E+00 -0.357916405715E+00 -0.356657218839E+00 + -0.355400727763E+00 -0.354146977117E+00 -0.352896011587E+00 -0.351647875911E+00 + -0.350402614882E+00 -0.349160273346E+00 -0.347920896203E+00 -0.346684528407E+00 + -0.345451214967E+00 -0.344221000945E+00 -0.342993931456E+00 -0.341770051671E+00 + -0.340549406813E+00 -0.339332042160E+00 -0.338118003043E+00 -0.336907334848E+00 + -0.335700083014E+00 -0.334496293035E+00 -0.333296010458E+00 -0.332099280883E+00 + -0.330906149966E+00 -0.329716663415E+00 -0.328530866994E+00 -0.327348806519E+00 + -0.326170527860E+00 -0.324996076942E+00 -0.323825499744E+00 -0.322658842298E+00 + -0.321496150690E+00 -0.320337471060E+00 -0.319182849602E+00 -0.318032332564E+00 + -0.316885966248E+00 -0.315743797009E+00 -0.314605871258E+00 -0.313472235457E+00 + -0.312342936125E+00 -0.311218019832E+00 -0.310097533203E+00 -0.308981522919E+00 + -0.307870035712E+00 -0.306763118368E+00 -0.305660817729E+00 -0.304563180690E+00 + -0.303470254198E+00 -0.302382085258E+00 -0.301298720924E+00 -0.300220208308E+00 + -0.299146594574E+00 -0.298077926940E+00 -0.297014252678E+00 -0.295955619114E+00 + -0.294902073628E+00 -0.293853663654E+00 -0.292810436679E+00 -0.291772440246E+00 + -0.290739721948E+00 -0.289712329437E+00 -0.288690310415E+00 -0.287673712640E+00 + -0.286662583922E+00 -0.285656972126E+00 -0.284656925173E+00 -0.283662491033E+00 + -0.282673717735E+00 -0.281690653359E+00 -0.280713340869E+00 -0.279741784118E+00 + -0.278775969023E+00 -0.277815881384E+00 -0.276861506971E+00 -0.275912831532E+00 + -0.274969840785E+00 -0.274032520426E+00 -0.273100856122E+00 -0.272174833513E+00 + -0.271254438216E+00 -0.270339655819E+00 -0.269430471886E+00 -0.268526871953E+00 + -0.267628841531E+00 -0.266736366104E+00 -0.265849431132E+00 -0.264968022045E+00 + -0.264092124251E+00 -0.263221723128E+00 -0.262356804031E+00 -0.261497352287E+00 + -0.260643353198E+00 -0.259794792038E+00 -0.258951654057E+00 -0.258113924478E+00 + -0.257281588497E+00 -0.256454631285E+00 -0.255633037987E+00 -0.254816793720E+00 + -0.254005883578E+00 -0.253200292624E+00 -0.252400005901E+00 -0.251605008420E+00 + -0.250815285170E+00 -0.250030821112E+00 -0.249251601180E+00 -0.248477610285E+00 + -0.247708833308E+00 -0.246945255107E+00 -0.246186860512E+00 -0.245433634326E+00 + -0.244685561329E+00 -0.243942626273E+00 -0.243204813882E+00 -0.242472108858E+00 + -0.241744495873E+00 -0.241021959574E+00 -0.240304484584E+00 -0.239592055496E+00 + -0.238884656881E+00 -0.238182273280E+00 -0.237484889210E+00 -0.236792489162E+00 + -0.236105057599E+00 -0.235422578960E+00 -0.234745037657E+00 -0.234072418076E+00 + -0.233404704575E+00 -0.232741881490E+00 -0.232083933126E+00 -0.231430843764E+00 + -0.230782597661E+00 -0.230139179044E+00 -0.229500572117E+00 -0.228866761056E+00 + -0.228237730010E+00 -0.227613463105E+00 -0.226993944437E+00 -0.226379158080E+00 + -0.225769088079E+00 -0.225163718452E+00 -0.224563033194E+00 -0.223967016272E+00 + -0.223375651627E+00 -0.222788923173E+00 -0.222206814799E+00 -0.221629310368E+00 + -0.221056393717E+00 -0.220488048654E+00 -0.219924258965E+00 -0.219365008408E+00 + -0.218810280714E+00 -0.218260059588E+00 -0.217714328710E+00 -0.217173071734E+00 + -0.216636272286E+00 -0.216103913967E+00 -0.215575980352E+00 -0.215052454990E+00 + -0.214533321404E+00 -0.214018563088E+00 -0.213508163515E+00 -0.213002106126E+00 + -0.212500374341E+00 -0.212002951552E+00 -0.211509821122E+00 -0.211020966393E+00 + -0.210536370676E+00 -0.210056017259E+00 -0.209579889403E+00 -0.209107970343E+00 + -0.208640243286E+00 -0.208176691416E+00 -0.207717297888E+00 -0.207262045833E+00 + -0.206810918355E+00 -0.206363898530E+00 -0.205920969411E+00 -0.205482114024E+00 + -0.205047315366E+00 -0.204616556413E+00 -0.204189820109E+00 -0.203767089377E+00 + -0.203348347110E+00 -0.202933576177E+00 -0.202522759421E+00 -0.202115879657E+00 + -0.201712919675E+00 -0.201313862240E+00 -0.200918690088E+00 -0.200527385932E+00 + -0.200139932457E+00 -0.199756312321E+00 -0.199376508158E+00 -0.199000502574E+00 + -0.198628278151E+00 -0.198259817442E+00 -0.197895102976E+00 -0.197534117256E+00 + -0.197176842757E+00 -0.196823261928E+00 -0.196473357195E+00 -0.196127110954E+00 + -0.195784505577E+00 -0.195445523408E+00 -0.195110146767E+00 -0.194778357948E+00 + -0.194450139216E+00 -0.194125472812E+00 -0.193804340950E+00 -0.193486725820E+00 + -0.193172609582E+00 -0.192861974373E+00 -0.192554802303E+00 -0.192251075455E+00 + -0.191950775886E+00 -0.191653885629E+00 -0.191360386687E+00 -0.191070261041E+00 + -0.190783490642E+00 -0.190500057418E+00 -0.190219943268E+00 -0.189943130068E+00 + -0.189669599666E+00 -0.189399333882E+00 -0.189132314514E+00 -0.188868523331E+00 + -0.188607942077E+00 -0.188350552468E+00 -0.188096336196E+00 -0.187845274926E+00 + -0.187597350297E+00 -0.187352543922E+00 -0.187110837387E+00 -0.186872212252E+00 + -0.186636650052E+00 -0.186404132295E+00 -0.186174640463E+00 -0.185948156011E+00 + -0.185724660369E+00 -0.185504134941E+00 -0.185286561104E+00 -0.185071920208E+00 + -0.184860193580E+00 -0.184651362517E+00 -0.184445408292E+00 -0.184242312152E+00 + -0.184042055317E+00 -0.183844618981E+00 -0.183649984312E+00 -0.183458132452E+00 + -0.183269044516E+00 -0.183082701595E+00 -0.182899084751E+00 -0.182718175022E+00 + -0.182539953418E+00 -0.182364400925E+00 -0.182191498501E+00 -0.182021227079E+00 + -0.181853567564E+00 -0.181688500838E+00 -0.181526007755E+00 -0.181366069141E+00 + -0.181208665799E+00 -0.181053778505E+00 -0.180901388008E+00 -0.180751475031E+00 + -0.180604020272E+00 -0.180459004400E+00 -0.180316408062E+00 -0.180176211874E+00 + -0.180038396431E+00 -0.179902942299E+00 -0.179769830016E+00 -0.179639040098E+00 + -0.179510553032E+00 -0.179384349280E+00 -0.179260409277E+00 -0.179138713433E+00 + -0.179019242130E+00 -0.178901975726E+00 -0.178786894552E+00 -0.178673978912E+00 + -0.178563209085E+00 -0.178454565322E+00 -0.178348027851E+00 -0.178243576872E+00 + -0.178141192557E+00 -0.178040855056E+00 -0.177942544489E+00 -0.177846240952E+00 + -0.177751924514E+00 -0.177659575218E+00 -0.177569173081E+00 -0.177480698094E+00 + -0.177394130221E+00 -0.177309449401E+00 -0.177226635546E+00 -0.177145668542E+00 + -0.177066528250E+00 -0.176989194502E+00 -0.176913647106E+00 -0.176839865845E+00 + -0.176767830473E+00 -0.176697520719E+00 -0.176628916287E+00 -0.176561996853E+00 + -0.176496742068E+00 -0.176433131556E+00 -0.176371144916E+00 -0.176310761719E+00 + -0.176251961513E+00 -0.176194723816E+00 -0.176139028122E+00 -0.176084853900E+00 + -0.176032180590E+00 -0.175980987607E+00 -0.175931254341E+00 -0.175882960154E+00 + -0.175836084384E+00 -0.175790606340E+00 -0.175746505307E+00 -0.175703760544E+00 + -0.175662351282E+00 -0.175622256728E+00 -0.175583456060E+00 -0.175545928434E+00 + -0.175509652975E+00 -0.175474608786E+00 -0.175440774942E+00 -0.175408130491E+00 + -0.175376654457E+00 -0.175346325835E+00 -0.175317123597E+00 -0.175289026687E+00 + -0.175262014023E+00 -0.175236064496E+00 -0.175211156974E+00 -0.175187270294E+00 + -0.175164383272E+00 -0.175142474694E+00 -0.175121523321E+00 -0.175101507889E+00 + -0.175082407107E+00 -0.175064199656E+00 -0.175046864194E+00 -0.175030379351E+00 + -0.175014723731E+00 -0.174999875912E+00 -0.174985814447E+00 -0.174972517861E+00 + -0.174959964653E+00 -0.174948133297E+00 -0.174937002240E+00 -0.174926549904E+00 + -0.174916754682E+00 -0.174907594945E+00 -0.174899049035E+00 -0.174891095267E+00 + -0.174883711933E+00 -0.174876877296E+00 -0.174870569595E+00 -0.174864767042E+00 + -0.174859447821E+00 -0.174854590092E+00 -0.174850171990E+00 -0.174846171620E+00 + -0.174842567064E+00 -0.174839336378E+00 -0.174836457588E+00 -0.174833908699E+00 + -0.174831667686E+00 -0.174829712500E+00 -0.174828021064E+00 -0.174826571277E+00 + -0.174825341010E+00 -0.174824308109E+00 -0.174823450393E+00 -0.174822745655E+00 + -0.174822171663E+00 -0.174821706158E+00 -0.174821326854E+00 -0.174821011439E+00 + -0.174820737577E+00 -0.174820482904E+00 -0.174820225029E+00 -0.174819941536E+00 + -0.174819609984E+00 -0.174819207904E+00 -0.174818712802E+00 -0.174818102156E+00 + -0.174817353421E+00 -0.174816444022E+00 -0.174815351361E+00 -0.174814052812E+00 + -0.174812525725E+00 -0.174810747421E+00 -0.174808695196E+00 -0.174806346321E+00 + -0.174803678039E+00 -0.174800667568E+00 -0.174797292100E+00 -0.174793528800E+00 + -0.174789354807E+00 -0.174784747235E+00 -0.174779683169E+00 -0.174774139672E+00 + -0.174768093777E+00 -0.174761522493E+00 -0.174754402803E+00 -0.174746711661E+00 + -0.174738425999E+00 -0.174729522720E+00 -0.174719978701E+00 -0.174709770795E+00 + -0.174698875826E+00 -0.174687270593E+00 -0.174674931870E+00 -0.174661836403E+00 + -0.174647960913E+00 -0.174633282095E+00 -0.174617776616E+00 -0.174601421119E+00 + -0.174584192220E+00 -0.174566066509E+00 -0.174547020550E+00 -0.174527030879E+00 + -0.174506074009E+00 -0.174484126424E+00 -0.174461164584E+00 -0.174437164921E+00 + -0.174412103843E+00 -0.174385957729E+00 -0.174358702934E+00 -0.174330315787E+00 + -0.174300772590E+00 -0.174270049617E+00 -0.174238123120E+00 -0.174204969322E+00 + -0.174170564419E+00 -0.174134884585E+00 -0.174097905962E+00 -0.174059604672E+00 + -0.174019956805E+00 -0.173978938430E+00 -0.173936525586E+00 -0.173892694661E+00 + -0.173847433988E+00 -0.173800746119E+00 -0.173752634440E+00 -0.173703102338E+00 + -0.173652153211E+00 -0.173599790457E+00 -0.173546017482E+00 -0.173490837697E+00 + -0.173434254518E+00 -0.173376271366E+00 -0.173316891667E+00 -0.173256118853E+00 + -0.173193956361E+00 -0.173130407633E+00 -0.173065476116E+00 -0.172999165262E+00 + -0.172931478529E+00 -0.172862419381E+00 -0.172791991284E+00 -0.172720197714E+00 + -0.172647042148E+00 -0.172572528070E+00 -0.172496658969E+00 -0.172419438339E+00 + -0.172340869681E+00 -0.172260956498E+00 -0.172179702301E+00 -0.172097110604E+00 + -0.172013184929E+00 -0.171927928801E+00 -0.171841345750E+00 -0.171753439313E+00 + -0.171664213031E+00 -0.171573670451E+00 -0.171481815124E+00 -0.171388650607E+00 + -0.171294180463E+00 -0.171198408259E+00 -0.171101337567E+00 -0.171002971966E+00 + -0.170903315038E+00 -0.170802370373E+00 -0.170700141562E+00 -0.170596632206E+00 + -0.170491845908E+00 -0.170385786277E+00 -0.170278456928E+00 -0.170169861481E+00 + -0.170060003560E+00 -0.169948886795E+00 -0.169836514822E+00 -0.169722891282E+00 + -0.169608019820E+00 -0.169491904087E+00 -0.169374547739E+00 -0.169255954438E+00 + -0.169136127851E+00 -0.169015071649E+00 -0.168892789510E+00 -0.168769285116E+00 + -0.168644562155E+00 -0.168518624319E+00 -0.168391475306E+00 -0.168263118820E+00 + -0.168133558569E+00 -0.168002798267E+00 -0.167870841633E+00 -0.167737692390E+00 + -0.167603354269E+00 -0.167467831004E+00 -0.167331126335E+00 -0.167193244006E+00 + -0.167054187769E+00 -0.166913961378E+00 -0.166772568594E+00 -0.166630013184E+00 + -0.166486298918E+00 -0.166341429573E+00 -0.166195408930E+00 -0.166048240777E+00 + -0.165899928905E+00 -0.165750477112E+00 -0.165599889199E+00 -0.165448168976E+00 + -0.165295320255E+00 -0.165141346854E+00 -0.164986252596E+00 -0.164830041311E+00 + -0.164672716831E+00 -0.164514282997E+00 -0.164354743652E+00 -0.164194102646E+00 + -0.164032363834E+00 -0.163869531076E+00 -0.163705608237E+00 -0.163540599187E+00 + -0.163374507802E+00 -0.163207337963E+00 -0.163039093556E+00 -0.162869778472E+00 + -0.162699396609E+00 -0.162527951867E+00 -0.162355448154E+00 -0.162181889382E+00 + -0.162007279469E+00 -0.161831622336E+00 -0.161654921913E+00 -0.161477182132E+00 + -0.161298406931E+00 -0.161118600255E+00 -0.160937766051E+00 -0.160755908275E+00 + -0.160573030884E+00 -0.160389137845E+00 -0.160204233125E+00 -0.160018320701E+00 + -0.159831404553E+00 -0.159643488666E+00 -0.159454577029E+00 -0.159264673641E+00 + -0.159073782500E+00 -0.158881907614E+00 -0.158689052995E+00 -0.158495222658E+00 + -0.158300420626E+00 -0.158104650926E+00 -0.157907917590E+00 -0.157710224656E+00 + -0.157511576167E+00 -0.157311976171E+00 -0.157111428722E+00 -0.156909937876E+00 + -0.156707507700E+00 -0.156504142261E+00 -0.156299845633E+00 -0.156094621897E+00 + -0.155888475136E+00 -0.155681409441E+00 -0.155473428906E+00 -0.155264537632E+00 + -0.155054739725E+00 -0.154844039295E+00 -0.154632440459E+00 -0.154419947337E+00 + -0.154206564055E+00 -0.153992294747E+00 -0.153777143547E+00 -0.153561114600E+00 + -0.153344212051E+00 -0.153126440054E+00 -0.152907802766E+00 -0.152688304350E+00 + -0.152467948975E+00 -0.152246740813E+00 -0.152024684045E+00 -0.151801782853E+00 + -0.151578041426E+00 -0.151353463960E+00 -0.151128054653E+00 -0.150901817710E+00 + -0.150674757343E+00 -0.150446877764E+00 -0.150218183196E+00 -0.149988677864E+00 + -0.149758365999E+00 -0.149527251836E+00 -0.149295339618E+00 -0.149062633591E+00 + -0.148829138006E+00 -0.148594857122E+00 -0.148359795199E+00 -0.148123956506E+00 + -0.147887345316E+00 -0.147649965905E+00 -0.147411822558E+00 -0.147172919563E+00 + -0.146933261213E+00 -0.146692851808E+00 -0.146451695651E+00 -0.146209797051E+00 + -0.145967160324E+00 -0.145723789789E+00 -0.145479689770E+00 -0.145234864599E+00 + -0.144989318610E+00 -0.144743056144E+00 -0.144496081547E+00 -0.144248399170E+00 + -0.144000013370E+00 -0.143750928508E+00 -0.143501148950E+00 -0.143250679069E+00 + -0.142999523242E+00 -0.142747685851E+00 -0.142495171284E+00 -0.142241983934E+00 + -0.141988128199E+00 -0.141733608483E+00 -0.141478429193E+00 -0.141222594744E+00 + -0.140966109554E+00 -0.140708978049E+00 -0.140451204657E+00 -0.140192793812E+00 + -0.139933749956E+00 -0.139674077533E+00 -0.139413780993E+00 -0.139152864793E+00 + -0.138891333392E+00 -0.138629191257E+00 -0.138366442859E+00 -0.138103092675E+00 + -0.137839145185E+00 -0.137574604879E+00 -0.137309476246E+00 -0.137043763785E+00 + -0.136777471999E+00 -0.136510605394E+00 -0.136243168485E+00 -0.135975165789E+00 + -0.135706601830E+00 -0.135437481137E+00 -0.135167808244E+00 -0.134897587689E+00 + -0.134626824018E+00 -0.134355521779E+00 -0.134083685528E+00 -0.133811319825E+00 + -0.133538429234E+00 -0.133265018327E+00 -0.132991091680E+00 -0.132716653873E+00 + -0.132441709492E+00 -0.132166263129E+00 -0.131890319380E+00 -0.131613882848E+00 + -0.131336958139E+00 -0.131059549866E+00 -0.130781662646E+00 -0.130503301102E+00 + -0.130224469863E+00 -0.129945173560E+00 -0.129665416833E+00 -0.129385204326E+00 + -0.129104540687E+00 -0.128823430570E+00 -0.128541878634E+00 -0.128259889545E+00 + -0.127977467972E+00 -0.127694618590E+00 -0.127411346079E+00 -0.127127655125E+00 + -0.126843550418E+00 -0.126559036655E+00 -0.126274118535E+00 -0.125988800767E+00 + -0.125703088061E+00 -0.125416985134E+00 -0.125130496708E+00 -0.124843627511E+00 + -0.124556382274E+00 -0.124268765736E+00 -0.123980782639E+00 -0.123692437733E+00 + -0.123403735769E+00 -0.123114681507E+00 -0.122825279710E+00 -0.122535535147E+00 + -0.122245452594E+00 -0.121955036829E+00 -0.121664292636E+00 -0.121373224807E+00 + -0.121081838136E+00 -0.120790137423E+00 -0.120498127474E+00 -0.120205813100E+00 + -0.119913199117E+00 -0.119620290347E+00 -0.119327091615E+00 -0.119033607754E+00 + -0.118739843600E+00 -0.118445803996E+00 -0.118151493789E+00 -0.117856917832E+00 + -0.117562080982E+00 -0.117266988103E+00 -0.116971644064E+00 -0.116676053736E+00 + -0.116380222000E+00 -0.116084153739E+00 -0.115787853843E+00 -0.115491327206E+00 + -0.115194578727E+00 -0.114897613312E+00 -0.114600435870E+00 -0.114303051317E+00 + -0.114005464574E+00 -0.113707680566E+00 -0.113409704224E+00 -0.113111540485E+00 + -0.112813194289E+00 -0.112514670584E+00 -0.112215974322E+00 -0.111917110459E+00 + -0.111618083958E+00 -0.111318899787E+00 -0.111019562918E+00 -0.110720078330E+00 + -0.110420451005E+00 -0.110120685932E+00 -0.109820788105E+00 -0.109520762523E+00 + -0.109220614189E+00 -0.108920348114E+00 -0.108619969312E+00 -0.108319482802E+00 + -0.108018893610E+00 -0.107718206766E+00 -0.107417427305E+00 -0.107116560269E+00 + -0.106815610703E+00 -0.106514583658E+00 -0.106213484190E+00 -0.105912317362E+00 + -0.105611088240E+00 -0.105309801897E+00 -0.105008463408E+00 -0.104707077858E+00 + -0.104405650334E+00 -0.104104185928E+00 -0.103802689739E+00 -0.103501166870E+00 + -0.103199622430E+00 -0.102898061534E+00 -0.102596489299E+00 -0.102294910850E+00 + -0.101993331317E+00 -0.101691755834E+00 -0.101390189542E+00 -0.101088637585E+00 + -0.100787105115E+00 -0.100485597286E+00 -0.100184119260E+00 -0.998826762025E-01 + -0.995812732852E-01 -0.992799156846E-01 -0.989786085823E-01 -0.986773571655E-01 + -0.983761666262E-01 -0.980750421621E-01 -0.977739889756E-01 -0.974730122749E-01 + -0.971721172729E-01 -0.968713091881E-01 -0.965705932439E-01 -0.962699746692E-01 + -0.959694586981E-01 -0.956690505697E-01 -0.953687555286E-01 -0.950685788244E-01 + -0.947685257121E-01 -0.944686014517E-01 -0.941688113087E-01 -0.938691605537E-01 + -0.935696544625E-01 -0.932702983161E-01 -0.929710974008E-01 -0.926720570080E-01 + -0.923731824346E-01 -0.920744789824E-01 -0.917759519586E-01 -0.914776066756E-01 + -0.911794484510E-01 -0.908814826076E-01 -0.905837144736E-01 -0.902861493821E-01 + -0.899887926718E-01 -0.896916496863E-01 -0.893947257746E-01 -0.890980262909E-01 + -0.888015565946E-01 -0.885053220503E-01 -0.882093280279E-01 -0.879135799024E-01 + -0.876180830543E-01 -0.873228428690E-01 -0.870278647372E-01 -0.867331540550E-01 + -0.864387162235E-01 -0.861445566492E-01 -0.858506807437E-01 -0.855570939240E-01 + -0.852638016121E-01 -0.849708092353E-01 -0.846781222262E-01 -0.843857460226E-01 + -0.840936860675E-01 -0.838019478090E-01 -0.835105367008E-01 -0.832194582013E-01 + -0.829287177746E-01 -0.826383208897E-01 -0.823482730209E-01 -0.820585796480E-01 + -0.817692462556E-01 -0.814802783338E-01 -0.811916813778E-01 -0.809034608881E-01 + -0.806156223704E-01 -0.803281713357E-01 -0.800411132999E-01 -0.797544537846E-01 + -0.794681983163E-01 -0.791823524268E-01 -0.788969216532E-01 -0.786119115377E-01 + -0.783273276279E-01 -0.780431754763E-01 -0.777594606411E-01 -0.774761886853E-01 + -0.771933651773E-01 -0.769109956908E-01 -0.766290858045E-01 -0.763476411026E-01 + -0.760666671743E-01 -0.757861696141E-01 -0.755061540218E-01 -0.752266260023E-01 + -0.749475911658E-01 -0.746690551278E-01 -0.743910235088E-01 -0.741135019347E-01 + -0.738364960365E-01 -0.735600114507E-01 -0.732840538187E-01 -0.730086287873E-01 + -0.727337420084E-01 -0.724593991393E-01 -0.721856058424E-01 -0.719123677853E-01 + -0.716396906409E-01 -0.713675800873E-01 -0.710960418079E-01 -0.708250814912E-01 + -0.705547048309E-01 -0.702849175261E-01 -0.700157252810E-01 -0.697471338050E-01 + -0.694791488128E-01 -0.692117760244E-01 -0.689450211648E-01 -0.686788899643E-01 + -0.684133881586E-01 -0.681485214884E-01 -0.678842956998E-01 -0.676207165440E-01 + -0.673577897774E-01 -0.670955211618E-01 -0.668339164641E-01 -0.665729814564E-01 + -0.663127219161E-01 -0.660531436258E-01 -0.657942523732E-01 -0.655360539515E-01 + -0.652785541589E-01 -0.650217587988E-01 -0.647656736801E-01 -0.645103046166E-01 + -0.642556574274E-01 -0.640017379371E-01 -0.637485519751E-01 -0.634961049260E-01 + -0.632443980678E-01 -0.629934304777E-01 -0.627432012108E-01 -0.624937093205E-01 + -0.622449538583E-01 -0.619969338746E-01 -0.617496484177E-01 -0.615030965345E-01 + -0.612572772703E-01 -0.610121896686E-01 -0.607678327716E-01 -0.605242056194E-01 + -0.602813072511E-01 -0.600391367036E-01 -0.597976930124E-01 -0.595569752116E-01 + -0.593169823334E-01 -0.590777134084E-01 -0.588391674657E-01 -0.586013435326E-01 + -0.583642406351E-01 -0.581278577973E-01 -0.578921940417E-01 -0.576572483893E-01 + -0.574230198594E-01 -0.571895074697E-01 -0.569567102362E-01 -0.567246271735E-01 + -0.564932572944E-01 -0.562625996100E-01 -0.560326531301E-01 -0.558034168625E-01 + -0.555748898136E-01 -0.553470709882E-01 -0.551199593893E-01 -0.548935540185E-01 + -0.546678538757E-01 -0.544428579590E-01 -0.542185652652E-01 -0.539949747892E-01 + -0.537720855244E-01 -0.535498964626E-01 -0.533284065940E-01 -0.531076149071E-01 + -0.528875203888E-01 -0.526681220244E-01 -0.524494187976E-01 -0.522314096904E-01 + -0.520140936832E-01 -0.517974697548E-01 -0.515815368826E-01 -0.513662940419E-01 + -0.511517402068E-01 -0.509378743496E-01 -0.507246954410E-01 -0.505122024501E-01 + -0.503003943443E-01 -0.500892700896E-01 -0.498788286500E-01 -0.496690689883E-01 + -0.494599900655E-01 -0.492515908408E-01 -0.490438702720E-01 -0.488368273154E-01 + -0.486304609252E-01 -0.484247700546E-01 -0.482197536546E-01 -0.480154106750E-01 + -0.478117400638E-01 -0.476087407673E-01 -0.474064117304E-01 -0.472047518963E-01 + -0.470037602064E-01 -0.468034356007E-01 -0.466037770175E-01 -0.464047833934E-01 + -0.462064536636E-01 -0.460087867615E-01 -0.458117816189E-01 -0.456154371659E-01 + -0.454197523312E-01 -0.452247260418E-01 -0.450303572229E-01 -0.448366447983E-01 + -0.446435876901E-01 -0.444511848187E-01 -0.442594351031E-01 -0.440683374604E-01 + -0.438778908062E-01 -0.436880940547E-01 -0.434989461181E-01 -0.433104459071E-01 + -0.431225923311E-01 -0.429353842973E-01 -0.427488207118E-01 -0.425629004788E-01 + -0.423776225009E-01 -0.421929856793E-01 -0.420089889133E-01 -0.418256311007E-01 + -0.416429111376E-01 -0.414608279187E-01 -0.412793803368E-01 -0.410985672833E-01 + -0.409183876479E-01 -0.407388403185E-01 -0.405599241818E-01 -0.403816381225E-01 + -0.402039810237E-01 -0.400269517672E-01 -0.398505492329E-01 -0.396747722991E-01 + -0.394996198425E-01 -0.393250907383E-01 -0.391511838599E-01 -0.389778980793E-01 + -0.388052322666E-01 -0.386331852904E-01 -0.384617560179E-01 -0.382909433143E-01 + -0.381207460435E-01 -0.379511630675E-01 -0.377821932470E-01 -0.376138354408E-01 + -0.374460885061E-01 -0.372789512987E-01 -0.371124226726E-01 -0.369465014802E-01 + -0.367811865724E-01 -0.366164767982E-01 -0.364523710053E-01 -0.362888680397E-01 + -0.361259667455E-01 -0.359636659656E-01 -0.358019645409E-01 -0.356408613111E-01 + -0.354803551138E-01 -0.353204447853E-01 -0.351611291603E-01 -0.350024070717E-01 + -0.348442773508E-01 -0.346867388275E-01 -0.345297903297E-01 -0.343734306840E-01 + -0.342176587154E-01 -0.340624732469E-01 -0.339078731003E-01 -0.337538570957E-01 + -0.336004240513E-01 -0.334475727839E-01 -0.332953021088E-01 -0.331436108394E-01 + -0.329924977877E-01 -0.328419617639E-01 -0.326920015768E-01 -0.325426160333E-01 + -0.323938039390E-01 -0.322455640975E-01 -0.320978953112E-01 -0.319507963806E-01 + -0.318042661045E-01 -0.316583032805E-01 -0.315129067041E-01 -0.313680751695E-01 + -0.312238074691E-01 -0.310801023938E-01 -0.309369587328E-01 -0.307943752737E-01 + -0.306523508026E-01 -0.305108841036E-01 -0.303699739598E-01 -0.302296191520E-01 + -0.300898184599E-01 -0.299505706614E-01 -0.298118745326E-01 -0.296737288483E-01 + -0.295361323814E-01 -0.293990839035E-01 -0.292625821842E-01 -0.291266259917E-01 + -0.289912140926E-01 -0.288563452518E-01 -0.287220182325E-01 -0.285882317966E-01 + -0.284549847040E-01 -0.283222757131E-01 -0.281901035809E-01 -0.280584670624E-01 + -0.279273649114E-01 -0.277967958797E-01 -0.276667587176E-01 -0.275372521740E-01 + -0.274082749958E-01 -0.272798259287E-01 -0.271519037164E-01 -0.270245071011E-01 + -0.268976348236E-01 -0.267712856227E-01 -0.266454582359E-01 -0.265201513989E-01 + -0.263953638459E-01 -0.262710943093E-01 -0.261473415202E-01 -0.260241042076E-01 + -0.259013810994E-01 -0.257791709215E-01 -0.256574723984E-01 -0.255362842528E-01 + -0.254156052059E-01 -0.252954339773E-01 -0.251757692848E-01 -0.250566098449E-01 + -0.249379543722E-01 -0.248198015798E-01 -0.247021501791E-01 -0.245849988800E-01 + -0.244683463906E-01 -0.243521914176E-01 -0.242365326660E-01 -0.241213688390E-01 + -0.240066986384E-01 -0.238925207643E-01 -0.237788339153E-01 -0.236656367881E-01 + -0.235529280780E-01 -0.234407064787E-01 -0.233289706821E-01 -0.232177193787E-01 + -0.231069512572E-01 -0.229966650048E-01 -0.228868593069E-01 -0.227775328475E-01 + -0.226686843089E-01 -0.225603123717E-01 -0.224524157150E-01 -0.223449930162E-01 + -0.222380429511E-01 -0.221315641939E-01 -0.220255554171E-01 -0.219200152917E-01 + -0.218149424871E-01 -0.217103356708E-01 -0.216061935091E-01 -0.215025146663E-01 + -0.213992978054E-01 -0.212965415874E-01 -0.211942446721E-01 -0.210924057173E-01 + -0.209910233795E-01 -0.208900963135E-01 -0.207896231722E-01 -0.206896026072E-01 + -0.205900332685E-01 -0.204909138042E-01 -0.203922428609E-01 -0.202940190838E-01 + -0.201962411162E-01 -0.200989075998E-01 -0.200020171749E-01 -0.199055684800E-01 + -0.198095601519E-01 -0.197139908260E-01 -0.196188591359E-01 -0.195241637138E-01 + -0.194299031900E-01 -0.193360761933E-01 -0.192426813510E-01 -0.191497172886E-01 + -0.190571826300E-01 -0.189650759977E-01 -0.188733960123E-01 -0.187821412928E-01 + -0.186913104569E-01 -0.186009021202E-01 -0.185109148971E-01 -0.184213474002E-01 + -0.183321982404E-01 -0.182434660271E-01 -0.181551493681E-01 -0.180672468695E-01 + -0.179797571358E-01 -0.178926787699E-01 -0.178060103731E-01 -0.177197505449E-01 + -0.176338978835E-01 -0.175484509852E-01 -0.174634084448E-01 -0.173787688555E-01 + -0.172945308089E-01 -0.172106928948E-01 -0.171272537016E-01 -0.170442118159E-01 + -0.169615658228E-01 -0.168793143058E-01 -0.167974558466E-01 -0.167159890255E-01 + -0.166349124211E-01 -0.165542246103E-01 -0.164739241684E-01 -0.163940096692E-01 + -0.163144796849E-01 -0.162353327857E-01 -0.161565675407E-01 -0.160781825171E-01 + -0.160001762804E-01 -0.159225473947E-01 -0.158452944224E-01 -0.157684159242E-01 + -0.156919104593E-01 -0.156157765851E-01 -0.155400128576E-01 -0.154646178310E-01 + -0.153895900580E-01 -0.153149280897E-01 -0.152406304754E-01 -0.151666957630E-01 + -0.150931224986E-01 -0.150199092268E-01 -0.149470544904E-01 -0.148745568309E-01 + -0.148024147880E-01 -0.147306268996E-01 -0.146591917022E-01 -0.145881077308E-01 + -0.145173735184E-01 -0.144469875967E-01 -0.143769484957E-01 -0.143072547437E-01 + -0.142379048674E-01 -0.141688973919E-01 -0.141002308408E-01 -0.140319037359E-01 + -0.139639145974E-01 -0.138962619440E-01 -0.138289442927E-01 -0.137619601589E-01 + -0.136953080563E-01 -0.136289864972E-01 -0.135629939919E-01 -0.134973290495E-01 + -0.134319901772E-01 -0.133669758806E-01 -0.133022846639E-01 -0.132379150294E-01 + -0.131738654780E-01 -0.131101345089E-01 -0.130467206195E-01 -0.129836223059E-01 + -0.129208380624E-01 -0.128583663816E-01 -0.127962057547E-01 -0.127343546711E-01 + -0.126728116187E-01 -0.126115750836E-01 -0.125506435506E-01 -0.124900155025E-01 + -0.124296894207E-01 -0.123696637850E-01 -0.123099370735E-01 -0.122505077627E-01 + -0.121913743274E-01 -0.121325352410E-01 -0.120739889750E-01 -0.120157339995E-01 + -0.119577687829E-01 -0.119000917919E-01 -0.118427014918E-01 -0.117855963460E-01 + -0.117287748165E-01 -0.116722353635E-01 -0.116159764458E-01 -0.115599965204E-01 + -0.115042940427E-01 -0.114488674665E-01 -0.113937152441E-01 -0.113388358260E-01 + -0.112842276611E-01 -0.112298891969E-01 -0.111758188789E-01 -0.111220151514E-01 + -0.110684764568E-01 -0.110152012358E-01 -0.109621879279E-01 -0.109094349705E-01 + -0.108569407996E-01 -0.108047038497E-01 -0.107527225535E-01 -0.107009953420E-01 + -0.106495206449E-01 -0.105982968900E-01 -0.105473225036E-01 -0.104965959103E-01 + -0.104461155332E-01 -0.103958797936E-01 -0.103458871114E-01 -0.102961359047E-01 + -0.102466245900E-01 -0.101973515823E-01 -0.101483152950E-01 -0.100995141396E-01 + -0.100509465262E-01 -0.100026108633E-01 -0.995450555777E-02 -0.990662901473E-02 + -0.985897963778E-02 -0.981155582890E-02 -0.976435598842E-02 -0.971737851507E-02 + -0.967062180595E-02 -0.962408425653E-02 -0.957776426070E-02 -0.953166021067E-02 + -0.948577049708E-02 -0.944009350893E-02 -0.939462763359E-02 -0.934937125682E-02 + -0.930432276277E-02 -0.925948053395E-02 -0.921484295126E-02 -0.917040839398E-02 + -0.912617523977E-02 -0.908214186466E-02 -0.903830664308E-02 -0.899466794781E-02 + -0.895122415004E-02 -0.890797361932E-02 -0.886491472359E-02 -0.882204582916E-02 + -0.877936530072E-02 -0.873687150136E-02 -0.869456279253E-02 -0.865243753405E-02 + -0.861049408415E-02 -0.856873079941E-02 -0.852714603482E-02 -0.848573814371E-02 + -0.844450547783E-02 -0.840344638729E-02 -0.836255922058E-02 -0.832184232456E-02 + -0.828129404449E-02 -0.824091272401E-02 -0.820069670511E-02 -0.816064432819E-02 + -0.812075393202E-02 -0.808102385375E-02 -0.804145242891E-02 -0.800203799140E-02 + -0.796277887351E-02 -0.792367340591E-02 -0.788471991765E-02 -0.784591673615E-02 + -0.780726218723E-02 -0.776875459506E-02 -0.773039228221E-02 -0.769217356963E-02 + -0.765409677664E-02 -0.761616022095E-02 -0.757836221864E-02 -0.754070108418E-02 + -0.750317513041E-02 -0.746578266854E-02 -0.742852200820E-02 -0.739139145735E-02 + -0.735438932236E-02 -0.731751390798E-02 -0.728076351731E-02 -0.724413645187E-02 + -0.720763101154E-02 -0.717124549457E-02 -0.713497819762E-02 -0.709882770631E-02 + -0.706279364322E-02 -0.702687586234E-02 -0.699107421747E-02 -0.695538856216E-02 + -0.691981874978E-02 -0.688436463347E-02 -0.684902606616E-02 -0.681380290056E-02 + -0.677869498919E-02 -0.674370218433E-02 -0.670882433807E-02 -0.667406130226E-02 + -0.663941292856E-02 -0.660487906841E-02 -0.657045957304E-02 -0.653615429346E-02 + -0.650196308046E-02 -0.646788578465E-02 -0.643392225639E-02 -0.640007234584E-02 + -0.636633590295E-02 -0.633271277747E-02 -0.629920281890E-02 -0.626580587657E-02 + -0.623252179957E-02 -0.619935043677E-02 -0.616629163686E-02 -0.613334524829E-02 + -0.610051111930E-02 -0.606778909793E-02 -0.603517903199E-02 -0.600268076909E-02 + -0.597029415663E-02 -0.593801904178E-02 -0.590585527152E-02 -0.587380269258E-02 + -0.584186115152E-02 -0.581003049466E-02 -0.577831056812E-02 -0.574670121780E-02 + -0.571520228939E-02 -0.568381362836E-02 -0.565253507998E-02 -0.562136648930E-02 + -0.559030770115E-02 -0.555935856015E-02 -0.552851891073E-02 -0.549778859707E-02 + -0.546716746316E-02 -0.543665535278E-02 -0.540625210948E-02 -0.537595757660E-02 + -0.534577159729E-02 -0.531569401446E-02 -0.528572467082E-02 -0.525586340885E-02 + -0.522611007086E-02 -0.519646449889E-02 -0.516692653481E-02 -0.513749602026E-02 + -0.510817279666E-02 -0.507895670524E-02 -0.504984758700E-02 -0.502084528272E-02 + -0.499194963298E-02 -0.496316047816E-02 -0.493447765839E-02 -0.490590101362E-02 + -0.487743038357E-02 -0.484906560775E-02 -0.482080652547E-02 -0.479265297581E-02 + -0.476460479764E-02 -0.473666182962E-02 -0.470882391021E-02 -0.468109087763E-02 + -0.465346256990E-02 -0.462593882484E-02 -0.459851948004E-02 -0.457120437287E-02 + -0.454399334052E-02 -0.451688621994E-02 -0.448988284786E-02 -0.446298306083E-02 + -0.443618669516E-02 -0.440949358694E-02 -0.438290357208E-02 -0.435641648625E-02 + -0.433003216492E-02 -0.430375044334E-02 -0.427757115654E-02 -0.425149413936E-02 + -0.422551922641E-02 -0.419964625209E-02 -0.417387505059E-02 -0.414820545587E-02 + -0.412263730171E-02 -0.409717042165E-02 -0.407180464902E-02 -0.404653981696E-02 + -0.402137575836E-02 -0.399631230592E-02 -0.397134929213E-02 -0.394648654926E-02 + -0.392172390937E-02 -0.389706120430E-02 -0.387249826568E-02 -0.384803492493E-02 + -0.382367101325E-02 -0.379940636164E-02 -0.377524080089E-02 -0.375117416154E-02 + -0.372720627397E-02 -0.370333696830E-02 -0.367956607447E-02 -0.365589342219E-02 + -0.363231884097E-02 -0.360884216008E-02 -0.358546320861E-02 -0.356218181542E-02 + -0.353899780916E-02 -0.351591101827E-02 -0.349292127097E-02 -0.347002839526E-02 + -0.344723221896E-02 -0.342453256964E-02 -0.340192927467E-02 -0.337942216121E-02 + -0.335701105622E-02 -0.333469578641E-02 -0.331247617832E-02 -0.329035205824E-02 + -0.326832325228E-02 -0.324638958631E-02 -0.322455088600E-02 -0.320280697681E-02 + -0.318115768397E-02 -0.315960283252E-02 -0.313814224727E-02 -0.311677575283E-02 + -0.309550317358E-02 -0.307432433370E-02 -0.305323905716E-02 -0.303224716770E-02 + -0.301134848887E-02 -0.299054284399E-02 -0.296983005617E-02 -0.294920994831E-02 + -0.292868234309E-02 -0.290824706300E-02 -0.288790393028E-02 -0.286765276699E-02 + -0.284749339496E-02 -0.282742563580E-02 -0.280744931094E-02 -0.278756424157E-02 + -0.276777024865E-02 -0.274806715298E-02 -0.272845477509E-02 -0.270893293534E-02 + -0.268950145385E-02 -0.267016015054E-02 -0.265090884512E-02 -0.263174735708E-02 + -0.261267550569E-02 -0.259369311002E-02 -0.257479998892E-02 -0.255599596103E-02 + -0.253728084478E-02 -0.251865445838E-02 -0.250011661983E-02 -0.248166714692E-02 + -0.246330585722E-02 -0.244503256809E-02 -0.242684709669E-02 -0.240874925994E-02 + -0.239073887456E-02 -0.237281575708E-02 -0.235497972378E-02 -0.233723059075E-02 + -0.231956817386E-02 -0.230199228876E-02 -0.228450275090E-02 -0.226709937551E-02 + -0.224978197761E-02 -0.223255037200E-02 -0.221540437329E-02 -0.219834379583E-02 + -0.218136845381E-02 -0.216447816118E-02 -0.214767273167E-02 -0.213095197881E-02 + -0.211431571592E-02 -0.209776375610E-02 -0.208129591224E-02 -0.206491199701E-02 + -0.204861182288E-02 -0.203239520209E-02 -0.201626194669E-02 -0.200021186849E-02 + -0.198424477910E-02 -0.196836048993E-02 -0.195255881215E-02 -0.193683955674E-02 + -0.192120253446E-02 -0.190564755585E-02 -0.189017443125E-02 -0.187478297078E-02 + -0.185947298433E-02 -0.184424428161E-02 -0.182909667210E-02 -0.181402996505E-02 + -0.179904396954E-02 -0.178413849440E-02 -0.176931334825E-02 -0.175456833952E-02 + -0.173990327640E-02 -0.172531796689E-02 -0.171081221876E-02 -0.169638583958E-02 + -0.168203863670E-02 -0.166777041725E-02 -0.165358098816E-02 -0.163947015614E-02 + -0.162543772769E-02 -0.161148350910E-02 -0.159760730643E-02 -0.158380892555E-02 + -0.157008817211E-02 -0.155644485154E-02 -0.154287876905E-02 -0.152938972967E-02 + -0.151597753817E-02 -0.150264199915E-02 -0.148938291697E-02 -0.147620009579E-02 + -0.146309333955E-02 -0.145006245198E-02 -0.143710723660E-02 -0.142422749671E-02 + -0.141142303541E-02 -0.139869365556E-02 -0.138603915984E-02 -0.137345935070E-02 + -0.136095403037E-02 -0.134852300089E-02 -0.133616606406E-02 -0.132388302149E-02 + -0.131167367456E-02 -0.129953782444E-02 -0.128747527210E-02 -0.127548581829E-02 + -0.126356926354E-02 -0.125172540817E-02 -0.123995405229E-02 -0.122825499579E-02 + -0.121662803837E-02 -0.120507297949E-02 -0.119358961841E-02 -0.118217775416E-02 + -0.117083718559E-02 -0.115956771131E-02 -0.114836912973E-02 -0.113724123903E-02 + -0.112618383720E-02 -0.111519672200E-02 -0.110427969099E-02 -0.109343254151E-02 + -0.108265507068E-02 -0.107194707542E-02 -0.106130835242E-02 -0.105073869819E-02 + -0.104023790898E-02 -0.102980578087E-02 -0.101944210971E-02 -0.100914669112E-02 + -0.998919320539E-03 -0.988759793170E-03 -0.978667904011E-03 -0.968643447848E-03 + -0.958686219251E-03 -0.948796012579E-03 -0.938972621976E-03 -0.929215841376E-03 + -0.919525464498E-03 -0.909901284847E-03 -0.900343095718E-03 -0.890850690191E-03 + -0.881423861132E-03 -0.872062401197E-03 -0.862766102826E-03 -0.853534758249E-03 + -0.844368159481E-03 -0.835266098323E-03 -0.826228366366E-03 -0.817254754986E-03 + -0.808345055346E-03 -0.799499058397E-03 -0.790716554876E-03 -0.781997335308E-03 + -0.773341190005E-03 -0.764747909064E-03 -0.756217282371E-03 -0.747749099599E-03 + -0.739343150207E-03 -0.730999223443E-03 -0.722717108338E-03 -0.714496593715E-03 + -0.706337468180E-03 -0.698239520129E-03 -0.690202537742E-03 -0.682226308988E-03 + -0.674310621623E-03 -0.666455263190E-03 -0.658660021019E-03 -0.650924682224E-03 + -0.643249033712E-03 -0.635632862172E-03 -0.628075954081E-03 -0.620578095705E-03 + -0.613139073095E-03 -0.605758672090E-03 -0.598436678316E-03 -0.591172877185E-03 + -0.583967053898E-03 -0.576818993440E-03 -0.569728480585E-03 -0.562695299895E-03 + -0.555719235718E-03 -0.548800072187E-03 -0.541937593225E-03 -0.535131582540E-03 + -0.528381823629E-03 -0.521688099774E-03 -0.515050194045E-03 -0.508467889298E-03 + -0.501940968179E-03 -0.495469213117E-03 -0.489052406330E-03 -0.482690329824E-03 + -0.476382765390E-03 -0.470129494608E-03 -0.463930298842E-03 -0.457784959246E-03 + -0.451693256760E-03 -0.445654972112E-03 -0.439669885814E-03 -0.433737778167E-03 + -0.427858429261E-03 -0.422031618969E-03 -0.416257126954E-03 -0.410534732665E-03 + -0.404864215338E-03 -0.399245353996E-03 -0.393677927448E-03 -0.388161714292E-03 + -0.382696492913E-03 -0.377282041480E-03 -0.371918137953E-03 -0.366604560075E-03 + -0.361341085381E-03 -0.356127491187E-03 -0.350963554601E-03 -0.345849052516E-03 + -0.340783761612E-03 -0.335767458355E-03 -0.330799919001E-03 -0.325880919590E-03 + -0.321010235951E-03 -0.316187643698E-03 -0.311412918234E-03 -0.306685834748E-03 + -0.302006168217E-03 -0.297373693403E-03 -0.292788184857E-03 -0.288249416916E-03 + -0.283757163704E-03 -0.279311199133E-03 -0.274911296901E-03 -0.270557230493E-03 + -0.266248773181E-03 -0.261985698025E-03 -0.257767777871E-03 -0.253594785353E-03 + -0.249466492891E-03 -0.245382672691E-03 -0.241343096750E-03 -0.237347536847E-03 + -0.233395764551E-03 -0.229487551218E-03 -0.225622667990E-03 -0.221800885796E-03 + -0.218021975354E-03 -0.214285707166E-03 -0.210591851522E-03 -0.206940178501E-03 + -0.203330457967E-03 -0.199762459570E-03 -0.196235952751E-03 -0.192750706733E-03 + -0.189306490530E-03 -0.185903072942E-03 -0.182540222554E-03 -0.179217707740E-03 + -0.175935296661E-03 -0.172692757265E-03 -0.169489857285E-03 -0.166326364244E-03 + -0.163202045450E-03 -0.160116667999E-03 -0.157069998773E-03 -0.154061804442E-03 + -0.151091851463E-03 -0.148159906078E-03 -0.145265734320E-03 -0.142409102005E-03 + -0.139589774738E-03 -0.136807517911E-03 -0.134062096703E-03 -0.131353276078E-03 + -0.128680820791E-03 -0.126044495380E-03 -0.123444064173E-03 -0.120879291283E-03 + -0.118349940611E-03 -0.115855775844E-03 -0.113396560458E-03 -0.110972057714E-03 + -0.108582030661E-03 -0.106226242135E-03 -0.103904454758E-03 -0.101616430941E-03 + -0.993619328796E-04 -0.971407225587E-04 -0.949525617487E-04 -0.927972120075E-04 + -0.906744346800E-04 -0.885839908980E-04 -0.865256415805E-04 -0.844991474333E-04 + -0.825042689494E-04 -0.805407664086E-04 -0.786083998780E-04 -0.767069292115E-04 + -0.748361140499E-04 -0.729957138213E-04 -0.711854877407E-04 -0.694051948100E-04 + -0.676545938182E-04 -0.659334433414E-04 -0.642415017425E-04 -0.625785271716E-04 + -0.609442775656E-04 -0.593385106488E-04 -0.577609839320E-04 -0.562114547134E-04 + -0.546896800780E-04 -0.531954168979E-04 -0.517284218323E-04 -0.502884513272E-04 + -0.488752616157E-04 -0.474886087180E-04 -0.461282484413E-04 -0.447939363795E-04 + -0.434854279140E-04 -0.422024782128E-04 -0.409448422312E-04 -0.397122747113E-04 + -0.385045301824E-04 -0.373213629606E-04 -0.361625271491E-04 -0.350277766382E-04 + -0.339168651052E-04 -0.328295460142E-04 -0.317655726165E-04 -0.307246979505E-04 + -0.297066748413E-04 -0.287112559012E-04 -0.277381935296E-04 -0.267872399128E-04 + -0.258581470241E-04 -0.249506666238E-04 -0.240645502592E-04 -0.231995492647E-04 + -0.223554147617E-04 -0.215318976585E-04 -0.207287486506E-04 -0.199457182202E-04 + -0.191825566368E-04 -0.184390139568E-04 -0.177148400237E-04 -0.170097844678E-04 + -0.163235967066E-04 -0.156560259446E-04 -0.150068211731E-04 -0.143757311708E-04 + -0.137625045030E-04 -0.131668895222E-04 -0.125886343680E-04 -0.120274869669E-04 + -0.114831950323E-04 -0.109555060649E-04 -0.104441673521E-04 -0.994892596857E-05 + -0.946952877578E-05 -0.900572242234E-05 -0.855725334382E-05 -0.812386776282E-05 + -0.770531168894E-05 -0.730133091880E-05 -0.691167103602E-05 -0.653607741123E-05 + -0.617429520207E-05 -0.582606935320E-05 -0.549114459628E-05 -0.516926544999E-05 + -0.486017622000E-05 -0.456362099902E-05 -0.427934366674E-05 -0.400708788989E-05 + -0.374659712218E-05 -0.349761460436E-05 -0.325988336415E-05 -0.303314621633E-05 + -0.281714576266E-05 -0.261162439190E-05 -0.241632427985E-05 -0.223098738930E-05 + -0.205535547006E-05 -0.188917005894E-05 -0.173217247977E-05 -0.158410384338E-05 + -0.144470504763E-05 -0.131371677736E-05 -0.119087950444E-05 -0.107593348776E-05 + -0.968618773196E-06 -0.868675193645E-06 -0.775842369015E-06 -0.689859706225E-06 + -0.610466399201E-06 -0.537401428880E-06 -0.470403563212E-06 -0.409211357153E-06 + -0.353563152672E-06 -0.303197078747E-06 -0.257851051365E-06 -0.217262773527E-06 + -0.181169735240E-06 -0.149309213523E-06 -0.121418272404E-06 -0.972337629242E-07 + -0.764923231313E-07 -0.589303780852E-07 -0.442841398553E-07 -0.322896075212E-07 + -0.226825671729E-07 -0.151985919102E-07 -0.957304184337E-08 -0.554106409261E-08 + -0.283759278835E-08 -0.119734907117E-08 -0.354841091778E-09 -0.443640110494E-10 + 0.000000000000E+00 0.241875568529E+01 0.483006574477E+01 0.723394173288E+01 + 0.963039519606E+01 0.120194376727E+02 0.144010806932E+02 0.167753357799E+02 + 0.191422144472E+02 0.215017282014E+02 0.238538885407E+02 0.261987069555E+02 + 0.285361949280E+02 0.308663639324E+02 0.331892254349E+02 0.355047908937E+02 + 0.378130717590E+02 0.401140794729E+02 0.424078254695E+02 0.446943211750E+02 + 0.469735780073E+02 0.492456073765E+02 0.515104206847E+02 0.537680293259E+02 + 0.560184446860E+02 0.582616781430E+02 0.604977410669E+02 0.627266448194E+02 + 0.649484007547E+02 0.671630202184E+02 0.693705145484E+02 0.715708950747E+02 + 0.737641731189E+02 0.759503599948E+02 0.781294670083E+02 0.803015054570E+02 + 0.824664866306E+02 0.846244218109E+02 0.867753222715E+02 0.889191992780E+02 + 0.910560640881E+02 0.931859279513E+02 0.953088021093E+02 0.974246977956E+02 + 0.995336262357E+02 0.101635598647E+03 0.103730626239E+03 0.105818720214E+03 + 0.107899891764E+03 0.109974152075E+03 0.112041512325E+03 0.114101983683E+03 + 0.116155577310E+03 0.118202304360E+03 0.120242175977E+03 0.122275203300E+03 + 0.124301397457E+03 0.126320769570E+03 0.128333330752E+03 0.130339092107E+03 + 0.132338064734E+03 0.134330259722E+03 0.136315688151E+03 0.138294361094E+03 + 0.140266289617E+03 0.142231484777E+03 0.144189957623E+03 0.146141719196E+03 + 0.148086780528E+03 0.150025152646E+03 0.151956846565E+03 0.153881873294E+03 + 0.155800243835E+03 0.157711969181E+03 0.159617060316E+03 0.161515528217E+03 + 0.163407383852E+03 0.165292638184E+03 0.167171302164E+03 0.169043386737E+03 + 0.170908902841E+03 0.172767861402E+03 0.174620273344E+03 0.176466149577E+03 + 0.178305501006E+03 0.180138338529E+03 0.181964673034E+03 0.183784515401E+03 + 0.185597876503E+03 0.187404767205E+03 0.189205198362E+03 0.190999180824E+03 + 0.192786725430E+03 0.194567843014E+03 0.196342544400E+03 0.198110840403E+03 + 0.199872741833E+03 0.201628259490E+03 0.203377404166E+03 0.205120186645E+03 + 0.206856617704E+03 0.208586708111E+03 0.210310468626E+03 0.212027910001E+03 + 0.213739042981E+03 0.215443878301E+03 0.217142426690E+03 0.218834698868E+03 + 0.220520705547E+03 0.222200457431E+03 0.223873965217E+03 0.225541239591E+03 + 0.227202291235E+03 0.228857130819E+03 0.230505769009E+03 0.232148216460E+03 + 0.233784483819E+03 0.235414581728E+03 0.237038520817E+03 0.238656311711E+03 + 0.240267965025E+03 0.241873491367E+03 0.243472901337E+03 0.245066205527E+03 + 0.246653414520E+03 0.248234538893E+03 0.249809589212E+03 0.251378576037E+03 + 0.252941509921E+03 0.254498401407E+03 0.256049261029E+03 0.257594099317E+03 + 0.259132926789E+03 0.260665753957E+03 0.262192591325E+03 0.263713449388E+03 + 0.265228338633E+03 0.266737269540E+03 0.268240252580E+03 0.269737298217E+03 + 0.271228416906E+03 0.272713619094E+03 0.274192915221E+03 0.275666315718E+03 + 0.277133831009E+03 0.278595471508E+03 0.280051247623E+03 0.281501169753E+03 + 0.282945248289E+03 0.284383493614E+03 0.285815916104E+03 0.287242526126E+03 + 0.288663334039E+03 0.290078350193E+03 0.291487584932E+03 0.292891048592E+03 + 0.294288751498E+03 0.295680703970E+03 0.297066916319E+03 0.298447398848E+03 + 0.299822161852E+03 0.301191215617E+03 0.302554570423E+03 0.303912236540E+03 + 0.305264224232E+03 0.306610543753E+03 0.307951205349E+03 0.309286219260E+03 + 0.310615595717E+03 0.311939344941E+03 0.313257477149E+03 0.314570002545E+03 + 0.315876931330E+03 0.317178273694E+03 0.318474039819E+03 0.319764239880E+03 + 0.321048884043E+03 0.322327982467E+03 0.323601545303E+03 0.324869582693E+03 + 0.326132104771E+03 0.327389121665E+03 0.328640643491E+03 0.329886680362E+03 + 0.331127242379E+03 0.332362339636E+03 0.333591982220E+03 0.334816180209E+03 + 0.336034943674E+03 0.337248282677E+03 0.338456207271E+03 0.339658727504E+03 + 0.340855853413E+03 0.342047595029E+03 0.343233962374E+03 0.344414965461E+03 + 0.345590614297E+03 0.346760918881E+03 0.347925889202E+03 0.349085535242E+03 + 0.350239866975E+03 0.351388894367E+03 0.352532627377E+03 0.353671075954E+03 + 0.354804250040E+03 0.355932159569E+03 0.357054814467E+03 0.358172224651E+03 + 0.359284400033E+03 0.360391350512E+03 0.361493085984E+03 0.362589616334E+03 + 0.363680951440E+03 0.364767101171E+03 0.365848075390E+03 0.366923883949E+03 + 0.367994536695E+03 0.369060043465E+03 0.370120414089E+03 0.371175658388E+03 + 0.372225786176E+03 0.373270807259E+03 0.374310731434E+03 0.375345568490E+03 + 0.376375328210E+03 0.377400020366E+03 0.378419654724E+03 0.379434241041E+03 + 0.380443789067E+03 0.381448308543E+03 0.382447809203E+03 0.383442300771E+03 + 0.384431792966E+03 0.385416295496E+03 0.386395818062E+03 0.387370370359E+03 + 0.388339962071E+03 0.389304602874E+03 0.390264302440E+03 0.391219070428E+03 + 0.392168916491E+03 0.393113850276E+03 0.394053881418E+03 0.394989019548E+03 + 0.395919274285E+03 0.396844655243E+03 0.397765172028E+03 0.398680834235E+03 + 0.399591651454E+03 0.400497633266E+03 0.401398789244E+03 0.402295128953E+03 + 0.403186661948E+03 0.404073397781E+03 0.404955345990E+03 0.405832516109E+03 + 0.406704917663E+03 0.407572560168E+03 0.408435453133E+03 0.409293606059E+03 + 0.410147028439E+03 0.410995729757E+03 0.411839719489E+03 0.412679007105E+03 + 0.413513602065E+03 0.414343513821E+03 0.415168751819E+03 0.415989325493E+03 + 0.416805244274E+03 0.417616517582E+03 0.418423154829E+03 0.419225165418E+03 + 0.420022558748E+03 0.420815344206E+03 0.421603531173E+03 0.422387129020E+03 + 0.423166147113E+03 0.423940594807E+03 0.424710481451E+03 0.425475816385E+03 + 0.426236608941E+03 0.426992868443E+03 0.427744604209E+03 0.428491825545E+03 + 0.429234541751E+03 0.429972762121E+03 0.430706495938E+03 0.431435752479E+03 + 0.432160541010E+03 0.432880870793E+03 0.433596751079E+03 0.434308191112E+03 + 0.435015200128E+03 0.435717787356E+03 0.436415962014E+03 0.437109733316E+03 + 0.437799110464E+03 0.438484102655E+03 0.439164719076E+03 0.439840968907E+03 + 0.440512861321E+03 0.441180405480E+03 0.441843610541E+03 0.442502485651E+03 + 0.443157039950E+03 0.443807282569E+03 0.444453222632E+03 0.445094869256E+03 + 0.445732231547E+03 0.446365318604E+03 0.446994139521E+03 0.447618703379E+03 + 0.448239019255E+03 0.448855096215E+03 0.449466943321E+03 0.450074569622E+03 + 0.450677984163E+03 0.451277195978E+03 0.451872214096E+03 0.452463047535E+03 + 0.453049705306E+03 0.453632196414E+03 0.454210529853E+03 0.454784714611E+03 + 0.455354759667E+03 0.455920673991E+03 0.456482466548E+03 0.457040146293E+03 + 0.457593722172E+03 0.458143203124E+03 0.458688598082E+03 0.459229915967E+03 + 0.459767165696E+03 0.460300356174E+03 0.460829496301E+03 0.461354594968E+03 + 0.461875661058E+03 0.462392703446E+03 0.462905730999E+03 0.463414752576E+03 + 0.463919777027E+03 0.464420813195E+03 0.464917869916E+03 0.465410956015E+03 + 0.465900080313E+03 0.466385251619E+03 0.466866478737E+03 0.467343770460E+03 + 0.467817135577E+03 0.468286582864E+03 0.468752121094E+03 0.469213759029E+03 + 0.469671505423E+03 0.470125369022E+03 0.470575358567E+03 0.471021482786E+03 + 0.471463750402E+03 0.471902170131E+03 0.472336750678E+03 0.472767500743E+03 + 0.473194429014E+03 0.473617544175E+03 0.474036854901E+03 0.474452369856E+03 + 0.474864097701E+03 0.475272047085E+03 0.475676226650E+03 0.476076645031E+03 + 0.476473310854E+03 0.476866232737E+03 0.477255419291E+03 0.477640879117E+03 + 0.478022620809E+03 0.478400652955E+03 0.478774984131E+03 0.479145622909E+03 + 0.479512577850E+03 0.479875857507E+03 0.480235470428E+03 0.480591425150E+03 + 0.480943730204E+03 0.481292394110E+03 0.481637425383E+03 0.481978832530E+03 + 0.482316624047E+03 0.482650808425E+03 0.482981394145E+03 0.483308389682E+03 + 0.483631803501E+03 0.483951644059E+03 0.484267919808E+03 0.484580639188E+03 + 0.484889810633E+03 0.485195442568E+03 0.485497543413E+03 0.485796121575E+03 + 0.486091185457E+03 0.486382743452E+03 0.486670803946E+03 0.486955375317E+03 + 0.487236465933E+03 0.487514084157E+03 0.487788238342E+03 0.488058936833E+03 + 0.488326187968E+03 0.488590000077E+03 0.488850381480E+03 0.489107340491E+03 + 0.489360885415E+03 0.489611024550E+03 0.489857766185E+03 0.490101118601E+03 + 0.490341090072E+03 0.490577688862E+03 0.490810923229E+03 0.491040801423E+03 + 0.491267331684E+03 0.491490522245E+03 0.491710381332E+03 0.491926917162E+03 + 0.492140137943E+03 0.492350051877E+03 0.492556667157E+03 0.492759991968E+03 + 0.492960034486E+03 0.493156802882E+03 0.493350305315E+03 0.493540549939E+03 + 0.493727544898E+03 0.493911298330E+03 0.494091818363E+03 0.494269113118E+03 + 0.494443190708E+03 0.494614059238E+03 0.494781726805E+03 0.494946201496E+03 + 0.495107491394E+03 0.495265604570E+03 0.495420549089E+03 0.495572333008E+03 + 0.495720964376E+03 0.495866451233E+03 0.496008801612E+03 0.496148023537E+03 + 0.496284125025E+03 0.496417114084E+03 0.496546998715E+03 0.496673786911E+03 + 0.496797486655E+03 0.496918105924E+03 0.497035652687E+03 0.497150134904E+03 + 0.497261560528E+03 0.497369937502E+03 0.497475273763E+03 0.497577577239E+03 + 0.497676855851E+03 0.497773117511E+03 0.497866370122E+03 0.497956621582E+03 + 0.498043879778E+03 0.498128152591E+03 0.498209447892E+03 0.498287773547E+03 + 0.498363137410E+03 0.498435547330E+03 0.498505011147E+03 0.498571536693E+03 + 0.498635131792E+03 0.498695804260E+03 0.498753561905E+03 0.498808412526E+03 + 0.498860363917E+03 0.498909423860E+03 0.498955600132E+03 0.498998900500E+03 + 0.499039332724E+03 0.499076904556E+03 0.499111623740E+03 0.499143498011E+03 + 0.499172535098E+03 0.499198742720E+03 0.499222128588E+03 0.499242700406E+03 + 0.499260465870E+03 0.499275432668E+03 0.499287608479E+03 0.499297000975E+03 + 0.499303617818E+03 0.499307466666E+03 0.499308555165E+03 0.499306890954E+03 + 0.499302481666E+03 0.499295334923E+03 0.499285458342E+03 0.499272859529E+03 + 0.499257546083E+03 0.499239525597E+03 0.499218805653E+03 0.499195393827E+03 + 0.499169297687E+03 0.499140524790E+03 0.499109082689E+03 0.499074978927E+03 + 0.499038221038E+03 0.498998816551E+03 0.498956772984E+03 0.498912097848E+03 + 0.498864798647E+03 0.498814882875E+03 0.498762358020E+03 0.498707231561E+03 + 0.498649510968E+03 0.498589203705E+03 0.498526317226E+03 0.498460858979E+03 + 0.498392836402E+03 0.498322256927E+03 0.498249127976E+03 0.498173456964E+03 + 0.498095251298E+03 0.498014518376E+03 0.497931265590E+03 0.497845500322E+03 + 0.497757229948E+03 0.497666461833E+03 0.497573203336E+03 0.497477461808E+03 + 0.497379244592E+03 0.497278559023E+03 0.497175412426E+03 0.497069812121E+03 + 0.496961765418E+03 0.496851279620E+03 0.496738362020E+03 0.496623019907E+03 + 0.496505260557E+03 0.496385091242E+03 0.496262519224E+03 0.496137551757E+03 + 0.496010196088E+03 0.495880459455E+03 0.495748349088E+03 0.495613872211E+03 + 0.495477036036E+03 0.495337847771E+03 0.495196314613E+03 0.495052443753E+03 + 0.494906242372E+03 0.494757717646E+03 0.494606876741E+03 0.494453726813E+03 + 0.494298275014E+03 0.494140528486E+03 0.493980494363E+03 0.493818179770E+03 + 0.493653591826E+03 0.493486737640E+03 0.493317624316E+03 0.493146258946E+03 + 0.492972648617E+03 0.492796800406E+03 0.492618721383E+03 0.492438418611E+03 + 0.492255899143E+03 0.492071170025E+03 0.491884238294E+03 0.491695110981E+03 + 0.491503795107E+03 0.491310297686E+03 0.491114625724E+03 0.490916786218E+03 + 0.490716786158E+03 0.490514632526E+03 0.490310332294E+03 0.490103892430E+03 + 0.489895319890E+03 0.489684621624E+03 0.489471804574E+03 0.489256875672E+03 + 0.489039841845E+03 0.488820710010E+03 0.488599487077E+03 0.488376179946E+03 + 0.488150795511E+03 0.487923340657E+03 0.487693822263E+03 0.487462247196E+03 + 0.487228622320E+03 0.486992954486E+03 0.486755250539E+03 0.486515517319E+03 + 0.486273761652E+03 0.486029990362E+03 0.485784210260E+03 0.485536428152E+03 + 0.485286650835E+03 0.485034885098E+03 0.484781137722E+03 0.484525415481E+03 + 0.484267725139E+03 0.484008073454E+03 0.483746467173E+03 0.483482913039E+03 + 0.483217417785E+03 0.482949988134E+03 0.482680630804E+03 0.482409352505E+03 + 0.482136159936E+03 0.481861059790E+03 0.481584058753E+03 0.481305163502E+03 + 0.481024380704E+03 0.480741717020E+03 0.480457179104E+03 0.480170773601E+03 + 0.479882507146E+03 0.479592386368E+03 0.479300417888E+03 0.479006608319E+03 + 0.478710964265E+03 0.478413492323E+03 0.478114199081E+03 0.477813091120E+03 + 0.477510175013E+03 0.477205457323E+03 0.476898944607E+03 0.476590643414E+03 + 0.476280560284E+03 0.475968701749E+03 0.475655074334E+03 0.475339684555E+03 + 0.475022538921E+03 0.474703643931E+03 0.474383006078E+03 0.474060631847E+03 + 0.473736527713E+03 0.473410700144E+03 0.473083155601E+03 0.472753900536E+03 + 0.472422941394E+03 0.472090284609E+03 0.471755936611E+03 0.471419903819E+03 + 0.471082192645E+03 0.470742809494E+03 0.470401760761E+03 0.470059052835E+03 + 0.469714692095E+03 0.469368684913E+03 0.469021037653E+03 0.468671756672E+03 + 0.468320848316E+03 0.467968318926E+03 0.467614174833E+03 0.467258422362E+03 + 0.466901067828E+03 0.466542117538E+03 0.466181577794E+03 0.465819454885E+03 + 0.465455755097E+03 0.465090484704E+03 0.464723649975E+03 0.464355257168E+03 + 0.463985312536E+03 0.463613822322E+03 0.463240792761E+03 0.462866230082E+03 + 0.462490140503E+03 0.462112530236E+03 0.461733405485E+03 0.461352772444E+03 + 0.460970637302E+03 0.460587006238E+03 0.460201885423E+03 0.459815281021E+03 + 0.459427199186E+03 0.459037646066E+03 0.458646627801E+03 0.458254150521E+03 + 0.457860220351E+03 0.457464843404E+03 0.457068025789E+03 0.456669773604E+03 + 0.456270092940E+03 0.455868989881E+03 0.455466470502E+03 0.455062540870E+03 + 0.454657207044E+03 0.454250475074E+03 0.453842351005E+03 0.453432840871E+03 + 0.453021950698E+03 0.452609686506E+03 0.452196054306E+03 0.451781060101E+03 + 0.451364709885E+03 0.450947009645E+03 0.450527965361E+03 0.450107583002E+03 + 0.449685868533E+03 0.449262827907E+03 0.448838467071E+03 0.448412791964E+03 + 0.447985808517E+03 0.447557522652E+03 0.447127940284E+03 0.446697067319E+03 + 0.446264909657E+03 0.445831473188E+03 0.445396763794E+03 0.444960787350E+03 + 0.444523549722E+03 0.444085056769E+03 0.443645314342E+03 0.443204328282E+03 + 0.442762104425E+03 0.442318648596E+03 0.441873966614E+03 0.441428064289E+03 + 0.440980947424E+03 0.440532621813E+03 0.440083093243E+03 0.439632367490E+03 + 0.439180450327E+03 0.438727347515E+03 0.438273064807E+03 0.437817607952E+03 + 0.437360982685E+03 0.436903194739E+03 0.436444249834E+03 0.435984153685E+03 + 0.435522911997E+03 0.435060530470E+03 0.434597014793E+03 0.434132370647E+03 + 0.433666603708E+03 0.433199719641E+03 0.432731724103E+03 0.432262622745E+03 + 0.431792421208E+03 0.431321125127E+03 0.430848740127E+03 0.430375271827E+03 + 0.429900725835E+03 0.429425107754E+03 0.428948423177E+03 0.428470677691E+03 + 0.427991876872E+03 0.427512026291E+03 0.427031131509E+03 0.426549198079E+03 + 0.426066231549E+03 0.425582237454E+03 0.425097221325E+03 0.424611188683E+03 + 0.424124145041E+03 0.423636095906E+03 0.423147046774E+03 0.422657003135E+03 + 0.422165970471E+03 0.421673954255E+03 0.421180959952E+03 0.420686993020E+03 + 0.420192058908E+03 0.419696163057E+03 0.419199310900E+03 0.418701507864E+03 + 0.418202759365E+03 0.417703070812E+03 0.417202447607E+03 0.416700895142E+03 + 0.416198418804E+03 0.415695023968E+03 0.415190716005E+03 0.414685500275E+03 + 0.414179382132E+03 0.413672366920E+03 0.413164459976E+03 0.412655666630E+03 + 0.412145992202E+03 0.411635442006E+03 0.411124021345E+03 0.410611735519E+03 + 0.410098589814E+03 0.409584589512E+03 0.409069739887E+03 0.408554046201E+03 + 0.408037513714E+03 0.407520147672E+03 0.407001953318E+03 0.406482935884E+03 + 0.405963100593E+03 0.405442452664E+03 0.404920997305E+03 0.404398739717E+03 + 0.403875685091E+03 0.403351838613E+03 0.402827205460E+03 0.402301790799E+03 + 0.401775599792E+03 0.401248637591E+03 0.400720909339E+03 0.400192420175E+03 + 0.399663175226E+03 0.399133179613E+03 0.398602438448E+03 0.398070956835E+03 + 0.397538739871E+03 0.397005792645E+03 0.396472120235E+03 0.395937727716E+03 + 0.395402620151E+03 0.394866802595E+03 0.394330280099E+03 0.393793057701E+03 + 0.393255140433E+03 0.392716533321E+03 0.392177241380E+03 0.391637269618E+03 + 0.391096623036E+03 0.390555306624E+03 0.390013325369E+03 0.389470684244E+03 + 0.388927388219E+03 0.388383442254E+03 0.387838851300E+03 0.387293620301E+03 + 0.386747754193E+03 0.386201257904E+03 0.385654136355E+03 0.385106394455E+03 + 0.384558037111E+03 0.384009069217E+03 0.383459495661E+03 0.382909321323E+03 + 0.382358551074E+03 0.381807189779E+03 0.381255242293E+03 0.380702713463E+03 + 0.380149608130E+03 0.379595931124E+03 0.379041687270E+03 0.378486881383E+03 + 0.377931518271E+03 0.377375602732E+03 0.376819139560E+03 0.376262133536E+03 + 0.375704589437E+03 0.375146512029E+03 0.374587906074E+03 0.374028776320E+03 + 0.373469127514E+03 0.372908964388E+03 0.372348291671E+03 0.371787114083E+03 + 0.371225436333E+03 0.370663263126E+03 0.370100599158E+03 0.369537449114E+03 + 0.368973817674E+03 0.368409709510E+03 0.367845129284E+03 0.367280081652E+03 + 0.366714571260E+03 0.366148602749E+03 0.365582180748E+03 0.365015309881E+03 + 0.364447994763E+03 0.363880240001E+03 0.363312050194E+03 0.362743429932E+03 + 0.362174383799E+03 0.361604916370E+03 0.361035032211E+03 0.360464735881E+03 + 0.359894031932E+03 0.359322924905E+03 0.358751419336E+03 0.358179519752E+03 + 0.357607230671E+03 0.357034556603E+03 0.356461502053E+03 0.355888071513E+03 + 0.355314269471E+03 0.354740100406E+03 0.354165568788E+03 0.353590679080E+03 + 0.353015435736E+03 0.352439843202E+03 0.351863905918E+03 0.351287628314E+03 + 0.350711014812E+03 0.350134069827E+03 0.349556797765E+03 0.348979203024E+03 + 0.348401289995E+03 0.347823063060E+03 0.347244526594E+03 0.346665684963E+03 + 0.346086542525E+03 0.345507103630E+03 0.344927372621E+03 0.344347353832E+03 + 0.343767051589E+03 0.343186470210E+03 0.342605614006E+03 0.342024487278E+03 + 0.341443094321E+03 0.340861439420E+03 0.340279526854E+03 0.339697360893E+03 + 0.339114945799E+03 0.338532285825E+03 0.337949385219E+03 0.337366248217E+03 + 0.336782879049E+03 0.336199281939E+03 0.335615461098E+03 0.335031420734E+03 + 0.334447165045E+03 0.333862698219E+03 0.333278024438E+03 0.332693147878E+03 + 0.332108072702E+03 0.331522803070E+03 0.330937343130E+03 0.330351697024E+03 + 0.329765868887E+03 0.329179862843E+03 0.328593683010E+03 0.328007333498E+03 + 0.327420818409E+03 0.326834141835E+03 0.326247307863E+03 0.325660320570E+03 + 0.325073184025E+03 0.324485902291E+03 0.323898479419E+03 0.323310919456E+03 + 0.322723226440E+03 0.322135404398E+03 0.321547457354E+03 0.320959389320E+03 + 0.320371204301E+03 0.319782906295E+03 0.319194499291E+03 0.318605987270E+03 + 0.318017374205E+03 0.317428664062E+03 0.316839860798E+03 0.316250968361E+03 + 0.315661990694E+03 0.315072931728E+03 0.314483795390E+03 0.313894585596E+03 + 0.313305306255E+03 0.312715961268E+03 0.312126554529E+03 0.311537089922E+03 + 0.310947571324E+03 0.310358002603E+03 0.309768387622E+03 0.309178730233E+03 + 0.308589034280E+03 0.307999303600E+03 0.307409542023E+03 0.306819753369E+03 + 0.306229941450E+03 0.305640110072E+03 0.305050263032E+03 0.304460404117E+03 + 0.303870537109E+03 0.303280665780E+03 0.302690793895E+03 0.302100925210E+03 + 0.301511063474E+03 0.300921212428E+03 0.300331375804E+03 0.299741557326E+03 + 0.299151760712E+03 0.298561989669E+03 0.297972247898E+03 0.297382539092E+03 + 0.296792866934E+03 0.296203235102E+03 0.295613647263E+03 0.295024107078E+03 + 0.294434618199E+03 0.293845184271E+03 0.293255808929E+03 0.292666495803E+03 + 0.292077248511E+03 0.291488070667E+03 0.290898965874E+03 0.290309937729E+03 + 0.289720989820E+03 0.289132125727E+03 0.288543349022E+03 0.287954663269E+03 + 0.287366072024E+03 0.286777578835E+03 0.286189187242E+03 0.285600900777E+03 + 0.285012722964E+03 0.284424657319E+03 0.283836707350E+03 0.283248876557E+03 + 0.282661168431E+03 0.282073586457E+03 0.281486134110E+03 0.280898814858E+03 + 0.280311632161E+03 0.279724589470E+03 0.279137690229E+03 0.278550937875E+03 + 0.277964335834E+03 0.277377887526E+03 0.276791596364E+03 0.276205465749E+03 + 0.275619499079E+03 0.275033699741E+03 0.274448071114E+03 0.273862616569E+03 + 0.273277339471E+03 0.272692243174E+03 0.272107331027E+03 0.271522606368E+03 + 0.270938072529E+03 0.270353732833E+03 0.269769590597E+03 0.269185649126E+03 + 0.268601911721E+03 0.268018381672E+03 0.267435062263E+03 0.266851956770E+03 + 0.266269068459E+03 0.265686400590E+03 0.265103956413E+03 0.264521739172E+03 + 0.263939752103E+03 0.263357998432E+03 0.262776481378E+03 0.262195204152E+03 + 0.261614169958E+03 0.261033381991E+03 0.260452843437E+03 0.259872557475E+03 + 0.259292527277E+03 0.258712756005E+03 0.258133246814E+03 0.257554002852E+03 + 0.256975027256E+03 0.256396323159E+03 0.255817893682E+03 0.255239741940E+03 + 0.254661871041E+03 0.254084284083E+03 0.253506984156E+03 0.252929974344E+03 + 0.252353257722E+03 0.251776837355E+03 0.251200716302E+03 0.250624897614E+03 + 0.250049384335E+03 0.249474179497E+03 0.248899286128E+03 0.248324707247E+03 + 0.247750445863E+03 0.247176504980E+03 0.246602887591E+03 0.246029596684E+03 + 0.245456635236E+03 0.244884006218E+03 0.244311712593E+03 0.243739757315E+03 + 0.243168143329E+03 0.242596873575E+03 0.242025950983E+03 0.241455378474E+03 + 0.240885158964E+03 0.240315295358E+03 0.239745790555E+03 0.239176647444E+03 + 0.238607868909E+03 0.238039457822E+03 0.237471417051E+03 0.236903749452E+03 + 0.236336457877E+03 0.235769545168E+03 0.235203014157E+03 0.234636867672E+03 + 0.234071108530E+03 0.233505739542E+03 0.232940763508E+03 0.232376183224E+03 + 0.231812001474E+03 0.231248221038E+03 0.230684844684E+03 0.230121875174E+03 + 0.229559315262E+03 0.228997167695E+03 0.228435435209E+03 0.227874120535E+03 + 0.227313226394E+03 0.226752755499E+03 0.226192710557E+03 0.225633094265E+03 + 0.225073909313E+03 0.224515158382E+03 0.223956844146E+03 0.223398969271E+03 + 0.222841536413E+03 0.222284548223E+03 0.221728007341E+03 0.221171916402E+03 + 0.220616278031E+03 0.220061094845E+03 0.219506369453E+03 0.218952104458E+03 + 0.218398302451E+03 0.217844966019E+03 0.217292097740E+03 0.216739700181E+03 + 0.216187775904E+03 0.215636327463E+03 0.215085357403E+03 0.214534868261E+03 + 0.213984862566E+03 0.213435342840E+03 0.212886311594E+03 0.212337771336E+03 + 0.211789724561E+03 0.211242173758E+03 0.210695121409E+03 0.210148569987E+03 + 0.209602521956E+03 0.209056979774E+03 0.208511945889E+03 0.207967422743E+03 + 0.207423412768E+03 0.206879918389E+03 0.206336942024E+03 0.205794486080E+03 + 0.205252552959E+03 0.204711145053E+03 0.204170264747E+03 0.203629914418E+03 + 0.203090096435E+03 0.202550813158E+03 0.202012066940E+03 0.201473860126E+03 + 0.200936195052E+03 0.200399074046E+03 0.199862499430E+03 0.199326473516E+03 + 0.198790998609E+03 0.198256077004E+03 0.197721710991E+03 0.197187902850E+03 + 0.196654654853E+03 0.196121969265E+03 0.195589848342E+03 0.195058294333E+03 + 0.194527309477E+03 0.193996896008E+03 0.193467056149E+03 0.192937792117E+03 + 0.192409106120E+03 0.191881000359E+03 0.191353477025E+03 0.190826538302E+03 + 0.190300186368E+03 0.189774423389E+03 0.189249251527E+03 0.188724672933E+03 + 0.188200689751E+03 0.187677304118E+03 0.187154518161E+03 0.186632334001E+03 + 0.186110753748E+03 0.185589779509E+03 0.185069413377E+03 0.184549657442E+03 + 0.184030513783E+03 0.183511984472E+03 0.182994071573E+03 0.182476777142E+03 + 0.181960103226E+03 0.181444051866E+03 0.180928625092E+03 0.180413824930E+03 + 0.179899653394E+03 0.179386112492E+03 0.178873204224E+03 0.178360930582E+03 + 0.177849293549E+03 0.177338295100E+03 0.176827937204E+03 0.176318221821E+03 + 0.175809150900E+03 0.175300726387E+03 0.174792950216E+03 0.174285824315E+03 + 0.173779350603E+03 0.173273530992E+03 0.172768367386E+03 0.172263861679E+03 + 0.171760015759E+03 0.171256831506E+03 0.170754310790E+03 0.170252455475E+03 + 0.169751267416E+03 0.169250748461E+03 0.168750900449E+03 0.168251725210E+03 + 0.167753224568E+03 0.167255400339E+03 0.166758254329E+03 0.166261788338E+03 + 0.165766004156E+03 0.165270903567E+03 0.164776488345E+03 0.164282760258E+03 + 0.163789721065E+03 0.163297372516E+03 0.162805716356E+03 0.162314754317E+03 + 0.161824488128E+03 0.161334919508E+03 0.160846050167E+03 0.160357881808E+03 + 0.159870416125E+03 0.159383654807E+03 0.158897599531E+03 0.158412251968E+03 + 0.157927613781E+03 0.157443686625E+03 0.156960472146E+03 0.156477971983E+03 + 0.155996187767E+03 0.155515121120E+03 0.155034773657E+03 0.154555146984E+03 + 0.154076242700E+03 0.153598062396E+03 0.153120607654E+03 0.152643880048E+03 + 0.152167881146E+03 0.151692612504E+03 0.151218075675E+03 0.150744272200E+03 + 0.150271203613E+03 0.149798871441E+03 0.149327277203E+03 0.148856422408E+03 + 0.148386308559E+03 0.147916937150E+03 0.147448309667E+03 0.146980427589E+03 + 0.146513292386E+03 0.146046905520E+03 0.145581268444E+03 0.145116382606E+03 + 0.144652249443E+03 0.144188870386E+03 0.143726246856E+03 0.143264380267E+03 + 0.142803272026E+03 0.142342923530E+03 0.141883336170E+03 0.141424511327E+03 + 0.140966450375E+03 0.140509154680E+03 0.140052625601E+03 0.139596864486E+03 + 0.139141872678E+03 0.138687651511E+03 0.138234202310E+03 0.137781526393E+03 + 0.137329625070E+03 0.136878499643E+03 0.136428151405E+03 0.135978581641E+03 + 0.135529791631E+03 0.135081782642E+03 0.134634555937E+03 0.134188112770E+03 + 0.133742454386E+03 0.133297582022E+03 0.132853496908E+03 0.132410200266E+03 + 0.131967693308E+03 0.131525977241E+03 0.131085053262E+03 0.130644922561E+03 + 0.130205586317E+03 0.129767045706E+03 0.129329301892E+03 0.128892356033E+03 + 0.128456209278E+03 0.128020862768E+03 0.127586317636E+03 0.127152575009E+03 + 0.126719636002E+03 0.126287501725E+03 0.125856173279E+03 0.125425651758E+03 + 0.124995938246E+03 0.124567033820E+03 0.124138939551E+03 0.123711656497E+03 + 0.123285185714E+03 0.122859528245E+03 0.122434685128E+03 0.122010657392E+03 + 0.121587446057E+03 0.121165052137E+03 0.120743476636E+03 0.120322720551E+03 + 0.119902784871E+03 0.119483670577E+03 0.119065378642E+03 0.118647910030E+03 + 0.118231265698E+03 0.117815446596E+03 0.117400453663E+03 0.116986287832E+03 + 0.116572950028E+03 0.116160441168E+03 0.115748762160E+03 0.115337913905E+03 + 0.114927897295E+03 0.114518713216E+03 0.114110362542E+03 0.113702846144E+03 + 0.113296164881E+03 0.112890319606E+03 0.112485311164E+03 0.112081140390E+03 + 0.111677808114E+03 0.111275315155E+03 0.110873662325E+03 0.110472850430E+03 + 0.110072880266E+03 0.109673752620E+03 0.109275468274E+03 0.108878027998E+03 + 0.108481432559E+03 0.108085682711E+03 0.107690779202E+03 0.107296722774E+03 + 0.106903514158E+03 0.106511154078E+03 0.106119643250E+03 0.105728982383E+03 + 0.105339172176E+03 0.104950213322E+03 0.104562106504E+03 0.104174852398E+03 + 0.103788451673E+03 0.103402904987E+03 0.103018212994E+03 0.102634376337E+03 + 0.102251395652E+03 0.101869271566E+03 0.101488004700E+03 0.101107595665E+03 + 0.100728045065E+03 0.100349353496E+03 0.999715215455E+02 0.995945497931E+02 + 0.992184388105E+02 0.988431891614E+02 0.984688014015E+02 0.980952760782E+02 + 0.977226137313E+02 0.973508148923E+02 0.969798800847E+02 0.966098098240E+02 + 0.962406046177E+02 0.958722649654E+02 0.955047913583E+02 0.951381842801E+02 + 0.947724442060E+02 0.944075716034E+02 0.940435669318E+02 0.936804306424E+02 + 0.933181631786E+02 0.929567649756E+02 0.925962364607E+02 0.922365780532E+02 + 0.918777901643E+02 0.915198731972E+02 0.911628275470E+02 0.908066536010E+02 + 0.904513517382E+02 0.900969223297E+02 0.897433657388E+02 0.893906823203E+02 + 0.890388724214E+02 0.886879363811E+02 0.883378745303E+02 0.879886871921E+02 + 0.876403746815E+02 0.872929373052E+02 0.869463753623E+02 0.866006891437E+02 + 0.862558789321E+02 0.859119450025E+02 0.855688876216E+02 0.852267070483E+02 + 0.848854035334E+02 0.845449773194E+02 0.842054286413E+02 0.838667577258E+02 + 0.835289647914E+02 0.831920500488E+02 0.828560137008E+02 0.825208559419E+02 + 0.821865769586E+02 0.818531769297E+02 0.815206560256E+02 0.811890144088E+02 + 0.808582522339E+02 0.805283696473E+02 0.801993667875E+02 0.798712437849E+02 + 0.795440007620E+02 0.792176378331E+02 0.788921551046E+02 0.785675526749E+02 + 0.782438306343E+02 0.779209890650E+02 0.775990280414E+02 0.772779476297E+02 + 0.769577478881E+02 0.766384288669E+02 0.763199906082E+02 0.760024331463E+02 + 0.756857565072E+02 0.753699607091E+02 0.750550457620E+02 0.747410116681E+02 + 0.744278584214E+02 0.741155860080E+02 0.738041944058E+02 0.734936835848E+02 + 0.731840535070E+02 0.728753041264E+02 0.725674353888E+02 0.722604472322E+02 + 0.719543395864E+02 0.716491123733E+02 0.713447655067E+02 0.710412988925E+02 + 0.707387124283E+02 0.704370060040E+02 0.701361795013E+02 0.698362327939E+02 + 0.695371657475E+02 0.692389782198E+02 0.689416700604E+02 0.686452411110E+02 + 0.683496912052E+02 0.680550201685E+02 0.677612278185E+02 0.674683139648E+02 + 0.671762784088E+02 0.668851209440E+02 0.665948413560E+02 0.663054394222E+02 + 0.660169149119E+02 0.657292675867E+02 0.654424971998E+02 0.651566034966E+02 + 0.648715862145E+02 0.645874450828E+02 0.643041798227E+02 0.640217901476E+02 + 0.637402757627E+02 0.634596363651E+02 0.631798716442E+02 0.629009812810E+02 + 0.626229649487E+02 0.623458223126E+02 0.620695530296E+02 0.617941567488E+02 + 0.615196331114E+02 0.612459817503E+02 0.609732022907E+02 0.607012943494E+02 + 0.604302575355E+02 0.601600914499E+02 0.598907956855E+02 0.596223698273E+02 + 0.593548134521E+02 0.590881261288E+02 0.588223074182E+02 0.585573568732E+02 + 0.582932740386E+02 0.580300584510E+02 0.577677096394E+02 0.575062271243E+02 + 0.572456104185E+02 0.569858590267E+02 0.567269724456E+02 0.564689501638E+02 + 0.562117916618E+02 0.559554964124E+02 0.557000638800E+02 0.554454935212E+02 + 0.551917847845E+02 0.549389371105E+02 0.546869499316E+02 0.544358226723E+02 + 0.541855547489E+02 0.539361455700E+02 0.536875945360E+02 0.534399010391E+02 + 0.531930644637E+02 0.529470841862E+02 0.527019595748E+02 0.524576899898E+02 + 0.522142747836E+02 0.519717133002E+02 0.517300048760E+02 0.514891488391E+02 + 0.512491445096E+02 0.510099911998E+02 0.507716882137E+02 0.505342348475E+02 + 0.502976303892E+02 0.500618741188E+02 0.498269653085E+02 0.495929032222E+02 + 0.493596871158E+02 0.491273162374E+02 0.488957898269E+02 0.486651071162E+02 + 0.484352673293E+02 0.482062696819E+02 0.479781133819E+02 0.477507976292E+02 + 0.475243216156E+02 0.472986845248E+02 0.470738855327E+02 0.468499238069E+02 + 0.466267985071E+02 0.464045087851E+02 0.461830537846E+02 0.459624326411E+02 + 0.457426444823E+02 0.455236884279E+02 0.453055635893E+02 0.450882690702E+02 + 0.448718039660E+02 0.446561673644E+02 0.444413583447E+02 0.442273759785E+02 + 0.440142193292E+02 0.438018874522E+02 0.435903793950E+02 0.433796941968E+02 + 0.431698308891E+02 0.429607884952E+02 0.427525660304E+02 0.425451625020E+02 + 0.423385769093E+02 0.421328082435E+02 0.419278554878E+02 0.417237176174E+02 + 0.415203935995E+02 0.413178823933E+02 0.411161829498E+02 0.409152942123E+02 + 0.407152151157E+02 0.405159445871E+02 0.403174815457E+02 0.401198249023E+02 + 0.399229735601E+02 0.397269264139E+02 0.395316823508E+02 0.393372402496E+02 + 0.391435989812E+02 0.389507574087E+02 0.387587143867E+02 0.385674687621E+02 + 0.383770193738E+02 0.381873650526E+02 0.379985046212E+02 0.378104368944E+02 + 0.376231606789E+02 0.374366747733E+02 0.372509779685E+02 0.370660690470E+02 + 0.368819467835E+02 0.366986099446E+02 0.365160572889E+02 0.363342875669E+02 + 0.361532995212E+02 0.359730918864E+02 0.357936633889E+02 0.356150127472E+02 + 0.354371386718E+02 0.352600398651E+02 0.350837150214E+02 0.349081628273E+02 + 0.347333819611E+02 0.345593710931E+02 0.343861288856E+02 0.342136539929E+02 + 0.340419450613E+02 0.338710007291E+02 0.337008196265E+02 0.335314003757E+02 + 0.333627415909E+02 0.331948418783E+02 0.330276998360E+02 0.328613140540E+02 + 0.326956831146E+02 0.325308055918E+02 0.323666800516E+02 0.322033050521E+02 + 0.320406791433E+02 0.318788008671E+02 0.317176687576E+02 0.315572813406E+02 + 0.313976371341E+02 0.312387346480E+02 0.310805723841E+02 0.309231488364E+02 + 0.307664624905E+02 0.306105118244E+02 0.304552953078E+02 0.303008114025E+02 + 0.301470585622E+02 0.299940352326E+02 0.298417398514E+02 0.296901708483E+02 + 0.295393266449E+02 0.293892056549E+02 0.292398062839E+02 0.290911269294E+02 + 0.289431659810E+02 0.287959218202E+02 0.286493928206E+02 0.285035773476E+02 + 0.283584737587E+02 0.282140804034E+02 0.280703956230E+02 0.279274177510E+02 + 0.277851451127E+02 0.276435760256E+02 0.275027087989E+02 0.273625417339E+02 + 0.272230731240E+02 0.270843012543E+02 0.269462244022E+02 0.268088408369E+02 + 0.266721488195E+02 0.265361466033E+02 0.264008324333E+02 0.262662045468E+02 + 0.261322611728E+02 0.259990005324E+02 0.258664208386E+02 0.257345202966E+02 + 0.256032971033E+02 0.254727494477E+02 0.253428755109E+02 0.252136734656E+02 + 0.250851414770E+02 0.249572777018E+02 0.248300802890E+02 0.247035473794E+02 + 0.245776771059E+02 0.244524675933E+02 0.243279169583E+02 0.242040233098E+02 + 0.240807847485E+02 0.239581993671E+02 0.238362652503E+02 0.237149804748E+02 + 0.235943431092E+02 0.234743512143E+02 0.233550028425E+02 0.232362960386E+02 + 0.231182288390E+02 0.230007992723E+02 0.228840053591E+02 0.227678451118E+02 + 0.226523165349E+02 0.225374176249E+02 0.224231463702E+02 0.223095007511E+02 + 0.221964787402E+02 0.220840783018E+02 0.219722973922E+02 0.218611339596E+02 + 0.217505859446E+02 0.216406512792E+02 0.215313278878E+02 0.214226136865E+02 + 0.213145065837E+02 0.212070044795E+02 0.211001052660E+02 0.209938068273E+02 + 0.208881070397E+02 0.207830037712E+02 0.206784948819E+02 0.205745782238E+02 + 0.204712516409E+02 0.203685129693E+02 0.202663600370E+02 0.201647906638E+02 + 0.200638026618E+02 0.199633938349E+02 0.198635619789E+02 0.197643048817E+02 + 0.196656203232E+02 0.195675060752E+02 0.194699599015E+02 0.193729795579E+02 + 0.192765627922E+02 0.191807073440E+02 0.190854109451E+02 0.189906713192E+02 + 0.188964861819E+02 0.188028532410E+02 0.187097701960E+02 0.186172347385E+02 + 0.185252445521E+02 0.184337973123E+02 0.183428906868E+02 0.182525223349E+02 + 0.181626899083E+02 0.180733910503E+02 0.179846233964E+02 0.178963845740E+02 + 0.178086722026E+02 0.177214838935E+02 0.176348172500E+02 0.175486698675E+02 + 0.174630393333E+02 0.173779232267E+02 0.172933191189E+02 0.172092245733E+02 + 0.171256371449E+02 0.170425543810E+02 0.169599738209E+02 0.168778929955E+02 + 0.167963094281E+02 0.167152206338E+02 0.166346241196E+02 0.165545173846E+02 + 0.164748979199E+02 0.163957632085E+02 0.163171107253E+02 0.162389379373E+02 + 0.161612423036E+02 0.160840212749E+02 0.160072722943E+02 0.159309927965E+02 + 0.158551802085E+02 0.157798319491E+02 0.157049454291E+02 0.156305180513E+02 + 0.155565472105E+02 0.154830302934E+02 0.154099646787E+02 0.153373477372E+02 + 0.152651768315E+02 0.151934493163E+02 0.151221625382E+02 0.150513138358E+02 + 0.149809005397E+02 0.149109199725E+02 0.148413694488E+02 0.147722462750E+02 + 0.147035477496E+02 0.146352711632E+02 0.145674137981E+02 0.144999729289E+02 + 0.144329458218E+02 0.143663297354E+02 0.143001219200E+02 0.142343196179E+02 + 0.141689200634E+02 0.141039204828E+02 0.140393180945E+02 0.139751101086E+02 + 0.139112937274E+02 0.138478661451E+02 0.137848245479E+02 0.137221661140E+02 + 0.136598880134E+02 0.135979874083E+02 0.135364614529E+02 0.134753072931E+02 + 0.134145220670E+02 0.133541029046E+02 0.132940469281E+02 0.132343512512E+02 + 0.131750129801E+02 0.131160292126E+02 0.130573970386E+02 0.129991135401E+02 + 0.129411757909E+02 0.128835808568E+02 0.128263257957E+02 0.127694076574E+02 + 0.127128234837E+02 0.126565703083E+02 0.126006451570E+02 0.125450450474E+02 + 0.124897669893E+02 0.124348079844E+02 0.123801650262E+02 0.123258351004E+02 + 0.122718151846E+02 0.122181022484E+02 0.121646932533E+02 0.121115851529E+02 + 0.120587748927E+02 0.120062594101E+02 0.119540356346E+02 0.119021004878E+02 + 0.118504508829E+02 0.117990837254E+02 0.117479959127E+02 0.116971843341E+02 + 0.116466458709E+02 0.115963773965E+02 0.115463757762E+02 0.114966378671E+02 + 0.114471605186E+02 0.113979405719E+02 0.113489748601E+02 0.113002602085E+02 + 0.112517934341E+02 0.112035713462E+02 0.111555907457E+02 0.111078484259E+02 + 0.110603411718E+02 0.110130657603E+02 0.109660189606E+02 0.109191975335E+02 + 0.108725982322E+02 0.108262178015E+02 0.107800529783E+02 0.107341004916E+02 + 0.106883570622E+02 0.106428194030E+02 0.105974842189E+02 0.105523482066E+02 + 0.105074080550E+02 0.104626604447E+02 0.104181020486E+02 0.103737295314E+02 + 0.103295395498E+02 0.102855287524E+02 0.102416937799E+02 0.101980312650E+02 + 0.101545378322E+02 0.101112100982E+02 0.100680446715E+02 0.100250381526E+02 + 0.998218713412E+01 0.993948820051E+01 0.989693792825E+01 0.985453288579E+01 + 0.981226963357E+01 0.977014472399E+01 0.972815470145E+01 0.968629610230E+01 + 0.964456545488E+01 0.960295927952E+01 0.956147408851E+01 0.952010638612E+01 + 0.947885266861E+01 0.943770942420E+01 0.939667313311E+01 0.935574026751E+01 + 0.931490729156E+01 0.927417066142E+01 0.923352682518E+01 0.919297222829E+01 + 0.915250433861E+01 0.911212287042E+01 0.907182783450E+01 0.903161924121E+01 + 0.899149710048E+01 0.895146142182E+01 0.891151221429E+01 0.887164948653E+01 + 0.883187324678E+01 0.879218350279E+01 0.875258026195E+01 0.871306353116E+01 + 0.867363331693E+01 0.863428962533E+01 0.859503246199E+01 0.855586183213E+01 + 0.851677774053E+01 0.847778019154E+01 0.843886918909E+01 0.840004473666E+01 + 0.836130683733E+01 0.832265549373E+01 0.828409070807E+01 0.824561248212E+01 + 0.820722081724E+01 0.816891571434E+01 0.813069717392E+01 0.809256519603E+01 + 0.805451978031E+01 0.801656092596E+01 0.797868863177E+01 0.794090289606E+01 + 0.790320371676E+01 0.786559109136E+01 0.782806501692E+01 0.779062549006E+01 + 0.775327250698E+01 0.771600606345E+01 0.767882615482E+01 0.764173277600E+01 + 0.760472592148E+01 0.756780558530E+01 0.753097176109E+01 0.749422444206E+01 + 0.745756362096E+01 0.742098929013E+01 0.738450144149E+01 0.734810006652E+01 + 0.731178515626E+01 0.727555670134E+01 0.723941469195E+01 0.720335911785E+01 + 0.716738996838E+01 0.713150723245E+01 0.709571089853E+01 0.706000095467E+01 + 0.702437738849E+01 0.698884018718E+01 0.695338933749E+01 0.691802482576E+01 + 0.688274663789E+01 0.684755475936E+01 0.681244917521E+01 0.677742987004E+01 + 0.674249682806E+01 0.670765003302E+01 0.667288946823E+01 0.663821511661E+01 + 0.660362696063E+01 0.656912498231E+01 0.653470916328E+01 0.650037948471E+01 + 0.646613592737E+01 0.643197847157E+01 0.639790709720E+01 0.636392178375E+01 + 0.633002251023E+01 0.629620925527E+01 0.626248199703E+01 0.622884071327E+01 + 0.619528538131E+01 0.616181597804E+01 0.612843247993E+01 0.609513486300E+01 + 0.606192310286E+01 0.602879717469E+01 0.599575705323E+01 0.596280271280E+01 + 0.592993412729E+01 0.589715127016E+01 0.586445411443E+01 0.583184263272E+01 + 0.579931679718E+01 0.576687657956E+01 0.573452195118E+01 0.570225288292E+01 + 0.567006934523E+01 0.563797130815E+01 0.560595874127E+01 0.557403161375E+01 + 0.554218989434E+01 0.551043355135E+01 0.547876255266E+01 0.544717686572E+01 + 0.541567645755E+01 0.538426129474E+01 0.535293134347E+01 0.532168656946E+01 + 0.529052693803E+01 0.525945241405E+01 0.522846296197E+01 0.519755854581E+01 + 0.516673912916E+01 0.513600467517E+01 0.510535514659E+01 0.507479050572E+01 + 0.504431071442E+01 0.501391573415E+01 0.498360552592E+01 0.495338005031E+01 + 0.492323926749E+01 0.489318313719E+01 0.486321161869E+01 0.483332467088E+01 + 0.480352225219E+01 0.477380432064E+01 0.474417083381E+01 0.471462174885E+01 + 0.468515702250E+01 0.465577661103E+01 0.462648047033E+01 0.459726855583E+01 + 0.456814082254E+01 0.453909722503E+01 0.451013771746E+01 0.448126225356E+01 + 0.445247078660E+01 0.442376326947E+01 0.439513965458E+01 0.436659989395E+01 + 0.433814393915E+01 0.430977174132E+01 0.428148325120E+01 0.425327841906E+01 + 0.422515719477E+01 0.419711952775E+01 0.416916536701E+01 0.414129466112E+01 + 0.411350735822E+01 0.408580340604E+01 0.405818275184E+01 0.403064534250E+01 + 0.400319112444E+01 0.397582004365E+01 0.394853204570E+01 0.392132707574E+01 + 0.389420507847E+01 0.386716599819E+01 0.384020977873E+01 0.381333636353E+01 + 0.378654569557E+01 0.375983771743E+01 0.373321237124E+01 0.370666959871E+01 + 0.368020934111E+01 0.365383153930E+01 0.362753613370E+01 0.360132306429E+01 + 0.357519227064E+01 0.354914369188E+01 0.352317726672E+01 0.349729293343E+01 + 0.347149062985E+01 0.344577029341E+01 0.342013186109E+01 0.339457526944E+01 + 0.336910045461E+01 0.334370735228E+01 0.331839589773E+01 0.329316602581E+01 + 0.326801767092E+01 0.324295076705E+01 0.321796524775E+01 0.319306104616E+01 + 0.316823809496E+01 0.314349632642E+01 0.311883567239E+01 0.309425606427E+01 + 0.306975743305E+01 0.304533970927E+01 0.302100282305E+01 0.299674670410E+01 + 0.297257128167E+01 0.294847648460E+01 0.292446224130E+01 0.290052847974E+01 + 0.287667512747E+01 0.285290211161E+01 0.282920935885E+01 0.280559679544E+01 + 0.278206434724E+01 0.275861193962E+01 0.273523949757E+01 0.271194694563E+01 + 0.268873420792E+01 0.266560120813E+01 0.264254786950E+01 0.261957411487E+01 + 0.259667986665E+01 0.257386504678E+01 0.255112957683E+01 0.252847337789E+01 + 0.250589637066E+01 0.248339847539E+01 0.246097961189E+01 0.243863969958E+01 + 0.241637865740E+01 0.239419640391E+01 0.237209285720E+01 0.235006793496E+01 + 0.232812155444E+01 0.230625363245E+01 0.228446408540E+01 0.226275282924E+01 + 0.224111977951E+01 0.221956485131E+01 0.219808795932E+01 0.217668901778E+01 + 0.215536794051E+01 0.213412464090E+01 0.211295903191E+01 0.209187102607E+01 + 0.207086053548E+01 0.204992747182E+01 0.202907174632E+01 0.200829326979E+01 + 0.198759195264E+01 0.196696770480E+01 0.194642043581E+01 0.192595005477E+01 + 0.190555647034E+01 0.188523959076E+01 0.186499932384E+01 0.184483557697E+01 + 0.182474825710E+01 0.180473727075E+01 0.178480252401E+01 0.176494392255E+01 + 0.174516137160E+01 0.172545477598E+01 0.170582404005E+01 0.168626906778E+01 + 0.166678976267E+01 0.164738602782E+01 0.162805776589E+01 0.160880487912E+01 + 0.158962726930E+01 0.157052483781E+01 0.155149748559E+01 0.153254511317E+01 + 0.151366762063E+01 0.149486490762E+01 0.147613687338E+01 0.145748341670E+01 + 0.143890443596E+01 0.142039982910E+01 0.140196949363E+01 0.138361332663E+01 + 0.136533122476E+01 0.134712308425E+01 0.132898880088E+01 0.131092827004E+01 + 0.129294138664E+01 0.127502804522E+01 0.125718813983E+01 0.123942156415E+01 + 0.122172821137E+01 0.120410797431E+01 0.118656074533E+01 0.116908641635E+01 + 0.115168487888E+01 0.113435602401E+01 0.111709974237E+01 0.109991592419E+01 + 0.108280445926E+01 0.106576523693E+01 0.104879814613E+01 0.103190307538E+01 + 0.101507991274E+01 0.998328545848E+00 0.981648861930E+00 0.965040747768E+00 + 0.948504089719E+00 0.932038773709E+00 0.915644685238E+00 0.899321709375E+00 + 0.883069730760E+00 0.866888633604E+00 0.850778301690E+00 0.834738618371E+00 + 0.818769466570E+00 0.802870728784E+00 0.787042287076E+00 0.771284023086E+00 + 0.755595818019E+00 0.739977552655E+00 0.724429107343E+00 0.708950362004E+00 + 0.693541196130E+00 0.678201488782E+00 0.662931118594E+00 0.647729963770E+00 + 0.632597902085E+00 0.617534810885E+00 0.602540567087E+00 0.587615047180E+00 + 0.572758127221E+00 0.557969682841E+00 0.543249589240E+00 0.528597721190E+00 + 0.514013953033E+00 0.499498158683E+00 0.485050211624E+00 0.470669984912E+00 + 0.456357351172E+00 0.442112182602E+00 0.427934350970E+00 0.413823727615E+00 + 0.399780183446E+00 0.385803588945E+00 0.371893814164E+00 0.358050728724E+00 + 0.344274201820E+00 0.330564102216E+00 0.316920298247E+00 0.303342657820E+00 + 0.289831048413E+00 0.276385337073E+00 0.263005390420E+00 0.249691074643E+00 + 0.236442255504E+00 0.223258798334E+00 0.210140568037E+00 0.197087429086E+00 + 0.184099245526E+00 0.171175880973E+00 0.158317198612E+00 0.145523061202E+00 + 0.132793331071E+00 0.120127870119E+00 0.107526539814E+00 0.949892033467E-01 + 0.825157397472E-01 0.701060351005E-01 0.577599751474E-01 0.454774452458E-01 + 0.332583303706E-01 0.211025151142E-01 0.900988368594E-02 -0.301968008762E-02 + -0.149862927627E-01 -0.268900712783E-01 -0.387311329564E-01 -0.505095955017E-01 + -0.622255770017E-01 -0.738791959267E-01 -0.854705711299E-01 -0.969998218474E-01 + -0.108467067698E+00 -0.119872428683E+00 -0.131216025187E+00 -0.142497977978E+00 + -0.153718408206E+00 -0.164877437402E+00 -0.175975187485E+00 -0.187011780751E+00 + -0.197987339882E+00 -0.208901987943E+00 -0.219755848380E+00 -0.230549045024E+00 + -0.241281702086E+00 -0.251953944164E+00 -0.262565896234E+00 -0.273117683659E+00 + -0.283609432182E+00 -0.294041267929E+00 -0.304413317412E+00 -0.314725707521E+00 + -0.324978565533E+00 -0.335172019105E+00 -0.345306196278E+00 -0.355381225477E+00 + -0.365397235508E+00 -0.375354355559E+00 -0.385252715204E+00 -0.395092444397E+00 + -0.404873673477E+00 -0.414596533163E+00 -0.424261154560E+00 -0.433867669154E+00 + -0.443416208814E+00 -0.452906905792E+00 -0.462339892722E+00 -0.471715302623E+00 + -0.481033268895E+00 -0.490293925320E+00 -0.499497406066E+00 -0.508643845682E+00 + -0.517733379098E+00 -0.526766141629E+00 -0.535742268974E+00 -0.544661897211E+00 + -0.553525162805E+00 -0.562332202601E+00 -0.571083153827E+00 -0.579778154095E+00 + -0.588417341400E+00 -0.597000854119E+00 -0.605528831011E+00 -0.614001411220E+00 + -0.622418734271E+00 -0.630780940072E+00 -0.639088168915E+00 -0.647340561474E+00 + -0.655538258806E+00 -0.663681402350E+00 -0.671770133929E+00 -0.679804595749E+00 + -0.687784930398E+00 -0.695711280846E+00 -0.703583790448E+00 -0.711402602940E+00 + -0.719167862442E+00 -0.726879713456E+00 -0.734538300867E+00 -0.742143769944E+00 + -0.749696266336E+00 -0.757195936078E+00 -0.764642925586E+00 -0.772037381659E+00 + -0.779379451480E+00 -0.786669282613E+00 -0.793907023007E+00 -0.801092820990E+00 + -0.808226825278E+00 -0.815309184966E+00 -0.822340049533E+00 -0.829319568842E+00 + -0.836247893136E+00 -0.843125173043E+00 -0.849951559573E+00 -0.856727204121E+00 + -0.863452258461E+00 -0.870126874753E+00 -0.876751205537E+00 -0.883325403739E+00 + -0.889849622666E+00 -0.896324016008E+00 -0.902748737837E+00 -0.909123942610E+00 + -0.915449785165E+00 -0.921726420723E+00 -0.927954004888E+00 -0.934132693649E+00 + -0.940262643373E+00 -0.946344010815E+00 -0.952376953110E+00 -0.958361627775E+00 + -0.964298192712E+00 -0.970186806205E+00 -0.976027626922E+00 -0.981820813910E+00 + -0.987566526603E+00 -0.993264924816E+00 -0.998916168748E+00 -0.100452041898E+01 + -0.101007783647E+01 -0.101558858257E+01 -0.102105281901E+01 -0.102647070791E+01 + -0.103184241174E+01 -0.103716809340E+01 -0.104244791615E+01 -0.104768204362E+01 + -0.105287063985E+01 -0.105801386924E+01 -0.106311189659E+01 -0.106816488706E+01 + -0.107317300623E+01 -0.107813642002E+01 -0.108305529476E+01 -0.108792979716E+01 + -0.109276009431E+01 -0.109754635367E+01 -0.110228874311E+01 -0.110698743085E+01 + -0.111164258553E+01 -0.111625437614E+01 -0.112082297207E+01 -0.112534854308E+01 + -0.112983125934E+01 -0.113427129136E+01 -0.113866881008E+01 -0.114302398679E+01 + -0.114733699317E+01 -0.115160800129E+01 -0.115583718360E+01 -0.116002471292E+01 + -0.116417076248E+01 -0.116827550586E+01 -0.117233911706E+01 -0.117636177043E+01 + -0.118034364071E+01 -0.118428490304E+01 -0.118818573292E+01 -0.119204630626E+01 + -0.119586679932E+01 -0.119964738877E+01 -0.120338825164E+01 -0.120708956537E+01 + -0.121075150776E+01 -0.121437425700E+01 -0.121795799167E+01 -0.122150289072E+01 + -0.122500913349E+01 -0.122847689970E+01 -0.123190636946E+01 -0.123529772326E+01 + -0.123865114196E+01 -0.124196680682E+01 -0.124524489948E+01 -0.124848560196E+01 + -0.125168909665E+01 -0.125485556634E+01 -0.125798519420E+01 -0.126107816378E+01 + -0.126413465901E+01 -0.126715486421E+01 -0.127013896408E+01 -0.127308714370E+01 + -0.127599958852E+01 -0.127887648441E+01 -0.128171801759E+01 -0.128452437467E+01 + -0.128729574265E+01 -0.129003230891E+01 -0.129273426120E+01 -0.129540178768E+01 + -0.129803507687E+01 -0.130063431768E+01 -0.130319969940E+01 -0.130573141170E+01 + -0.130822964466E+01 -0.131069458870E+01 -0.131312643465E+01 -0.131552537371E+01 + -0.131789159749E+01 -0.132022529794E+01 -0.132252666743E+01 -0.132479589869E+01 + -0.132703318485E+01 -0.132923871940E+01 -0.133141269624E+01 -0.133355530963E+01 + -0.133566675422E+01 -0.133774722506E+01 -0.133979691755E+01 -0.134181602750E+01 + -0.134380475110E+01 -0.134576328490E+01 -0.134769182586E+01 -0.134959057131E+01 + -0.135145971896E+01 -0.135329946692E+01 -0.135511001366E+01 -0.135689155804E+01 + -0.135864429931E+01 -0.136036843711E+01 -0.136206417143E+01 -0.136373170269E+01 + -0.136537123164E+01 -0.136698295946E+01 -0.136856708769E+01 -0.137012381825E+01 + -0.137165335345E+01 -0.137315589598E+01 -0.137463164892E+01 -0.137608081573E+01 + -0.137750360023E+01 -0.137890020667E+01 -0.138027083964E+01 -0.138161570412E+01 + -0.138293500550E+01 -0.138422894953E+01 -0.138549774233E+01 -0.138674159044E+01 + -0.138796070076E+01 -0.138915528056E+01 -0.139032553753E+01 -0.139147167970E+01 + -0.139259391551E+01 -0.139369245379E+01 -0.139476750372E+01 -0.139581927490E+01 + -0.139684797728E+01 -0.139785382122E+01 -0.139883701744E+01 -0.139979777705E+01 + -0.140073631157E+01 -0.140165283286E+01 -0.140254755318E+01 -0.140342068519E+01 + -0.140427244190E+01 -0.140510303673E+01 -0.140591268348E+01 -0.140670159631E+01 + -0.140746998979E+01 -0.140821807887E+01 -0.140894607885E+01 -0.140965420546E+01 + -0.141034267477E+01 -0.141101170328E+01 -0.141166150782E+01 -0.141229230564E+01 + -0.141290431436E+01 -0.141349775199E+01 -0.141407283691E+01 -0.141462978789E+01 + -0.141516882409E+01 -0.141569016504E+01 -0.141619403065E+01 -0.141668064124E+01 + -0.141715021749E+01 -0.141760298045E+01 -0.141803915159E+01 -0.141845895273E+01 + -0.141886260609E+01 -0.141925033426E+01 -0.141962236024E+01 -0.141997890738E+01 + -0.142032019942E+01 -0.142064646051E+01 -0.142095791515E+01 -0.142125478823E+01 + -0.142153730504E+01 -0.142180569124E+01 -0.142206017286E+01 -0.142230097634E+01 + -0.142252832848E+01 -0.142274245648E+01 -0.142294358791E+01 -0.142313195073E+01 + -0.142330777328E+01 -0.142347128429E+01 -0.142362271285E+01 -0.142376228846E+01 + -0.142389024100E+01 -0.142400680071E+01 -0.142411219823E+01 -0.142420666458E+01 + -0.142429043117E+01 -0.142436372979E+01 -0.142442679259E+01 -0.142447985214E+01 + -0.142452314136E+01 -0.142455689358E+01 -0.142458134250E+01 -0.142459672219E+01 + -0.142460326713E+01 -0.142460121215E+01 -0.142459079250E+01 -0.142457224379E+01 + -0.142454580201E+01 -0.142451170355E+01 -0.142447018517E+01 -0.142442148400E+01 + -0.142436583759E+01 -0.142430348384E+01 -0.142423466105E+01 -0.142415960789E+01 + -0.142407856342E+01 -0.142399176709E+01 -0.142389945872E+01 -0.142380187851E+01 + -0.142369926707E+01 -0.142359186536E+01 -0.142347991474E+01 -0.142336365695E+01 + -0.142324333411E+01 -0.142311918872E+01 -0.142299146368E+01 -0.142286040226E+01 + -0.142272624810E+01 -0.142258924525E+01 -0.142244963812E+01 -0.142230767152E+01 + -0.142216359063E+01 -0.142201764102E+01 -0.142187006864E+01 -0.142172111981E+01 + -0.142157104127E+01 -0.142142008011E+01 -0.142126848148E+01 -0.142111638763E+01 + -0.142096379844E+01 -0.142081070343E+01 -0.142065709207E+01 -0.142050295382E+01 + -0.142034827813E+01 -0.142019305445E+01 -0.142003727217E+01 -0.141988092070E+01 + -0.141972398943E+01 -0.141956646772E+01 -0.141940834492E+01 -0.141924961038E+01 + -0.141909025339E+01 -0.141893026327E+01 -0.141876962931E+01 -0.141860834077E+01 + -0.141844638690E+01 -0.141828375694E+01 -0.141812044012E+01 -0.141795642563E+01 + -0.141779170267E+01 -0.141762626041E+01 -0.141746008799E+01 -0.141729317457E+01 + -0.141712550926E+01 -0.141695708117E+01 -0.141678787939E+01 -0.141661789300E+01 + -0.141644711104E+01 -0.141627552257E+01 -0.141610311661E+01 -0.141592988217E+01 + -0.141575580823E+01 -0.141558088378E+01 -0.141540509778E+01 -0.141522843917E+01 + -0.141505089687E+01 -0.141487245981E+01 -0.141469311686E+01 -0.141451285692E+01 + -0.141433166884E+01 -0.141414954147E+01 -0.141396646364E+01 -0.141378242417E+01 + -0.141359741184E+01 -0.141341141545E+01 -0.141322442375E+01 -0.141303642549E+01 + -0.141284740941E+01 -0.141265736422E+01 -0.141246627862E+01 -0.141227414130E+01 + -0.141208094092E+01 -0.141188666613E+01 -0.141169130556E+01 -0.141149484784E+01 + -0.141129728157E+01 -0.141109859533E+01 -0.141089877768E+01 -0.141069781719E+01 + -0.141049570239E+01 -0.141029242181E+01 -0.141008796393E+01 -0.140988231726E+01 + -0.140967547026E+01 -0.140946741139E+01 -0.140925812908E+01 -0.140904761177E+01 + -0.140883584785E+01 -0.140862282572E+01 -0.140840853376E+01 -0.140819296030E+01 + -0.140797609371E+01 -0.140775792230E+01 -0.140753843439E+01 -0.140731761826E+01 + -0.140709546219E+01 -0.140687195444E+01 -0.140664708326E+01 -0.140642083687E+01 + -0.140619320348E+01 -0.140596417128E+01 -0.140573372847E+01 -0.140550186319E+01 + -0.140526856360E+01 -0.140503381781E+01 -0.140479761396E+01 -0.140455994013E+01 + -0.140432078440E+01 -0.140408013484E+01 -0.140383797950E+01 -0.140359430640E+01 + -0.140334910357E+01 -0.140310235901E+01 -0.140285406069E+01 -0.140260419658E+01 + -0.140235275463E+01 -0.140209972279E+01 -0.140184508896E+01 -0.140158884104E+01 + -0.140133096693E+01 -0.140107145449E+01 -0.140081029157E+01 -0.140054746601E+01 + -0.140028296564E+01 -0.140001677825E+01 -0.139974889163E+01 -0.139947929355E+01 + -0.139920797177E+01 -0.139893491403E+01 -0.139866010805E+01 -0.139838354153E+01 + -0.139810520217E+01 -0.139782507764E+01 -0.139754315560E+01 -0.139725942368E+01 + -0.139697386951E+01 -0.139668648071E+01 -0.139639724486E+01 -0.139610614954E+01 + -0.139581318230E+01 -0.139551833070E+01 -0.139522158226E+01 -0.139492292448E+01 + -0.139462234487E+01 -0.139431983091E+01 -0.139401537004E+01 -0.139370894973E+01 + -0.139340055740E+01 -0.139309018046E+01 -0.139277780631E+01 -0.139246342232E+01 + -0.139214701587E+01 -0.139182857431E+01 -0.139150808496E+01 -0.139118553513E+01 + -0.139086091214E+01 -0.139053420325E+01 -0.139020539574E+01 -0.138987447686E+01 + -0.138954143384E+01 -0.138920625390E+01 -0.138886892424E+01 -0.138852943205E+01 + -0.138818776449E+01 -0.138784390872E+01 -0.138749785187E+01 -0.138714958107E+01 + -0.138679908341E+01 -0.138644634598E+01 -0.138609135587E+01 -0.138573410011E+01 + -0.138537456575E+01 -0.138501273981E+01 -0.138464860930E+01 -0.138428216121E+01 + -0.138391338251E+01 -0.138354226015E+01 -0.138316878109E+01 -0.138279293223E+01 + -0.138241470050E+01 -0.138203407278E+01 -0.138165103595E+01 -0.138126557687E+01 + -0.138087768238E+01 -0.138048733931E+01 -0.138009453447E+01 -0.137969925465E+01 + -0.137930148663E+01 -0.137890121718E+01 -0.137849843303E+01 -0.137809312093E+01 + -0.137768526757E+01 -0.137727485966E+01 -0.137686188388E+01 -0.137644632689E+01 + -0.137602817534E+01 -0.137560741586E+01 -0.137518403507E+01 -0.137475801957E+01 + -0.137432935593E+01 -0.137389803072E+01 -0.137346403050E+01 -0.137302734180E+01 + -0.137258795113E+01 -0.137214584500E+01 -0.137170100990E+01 -0.137125343228E+01 + -0.137080309860E+01 -0.137034999531E+01 -0.136989410881E+01 -0.136943542551E+01 + -0.136897393181E+01 -0.136850961406E+01 -0.136804245863E+01 -0.136757245186E+01 + -0.136709958006E+01 -0.136662382954E+01 -0.136614518659E+01 -0.136566363748E+01 + -0.136517916848E+01 -0.136469176582E+01 -0.136420141572E+01 -0.136370810440E+01 + -0.136321181804E+01 -0.136271254283E+01 -0.136221026492E+01 -0.136170497045E+01 + -0.136119664555E+01 -0.136068527634E+01 -0.136017084890E+01 -0.135965334931E+01 + -0.135913276364E+01 -0.135860907793E+01 -0.135808227820E+01 -0.135755235048E+01 + -0.135701928076E+01 -0.135648305501E+01 -0.135594365921E+01 -0.135540107930E+01 + -0.135485530121E+01 -0.135430631085E+01 -0.135375409413E+01 -0.135319863693E+01 + -0.135263992511E+01 -0.135207794452E+01 -0.135151268101E+01 -0.135094412037E+01 + -0.135037224842E+01 -0.134979705095E+01 -0.134921851371E+01 -0.134863662246E+01 + -0.134805136294E+01 -0.134746272086E+01 -0.134687068194E+01 -0.134627523185E+01 + -0.134567635627E+01 -0.134507404085E+01 -0.134446827123E+01 -0.134385903304E+01 + -0.134324631187E+01 -0.134263009332E+01 -0.134201036296E+01 -0.134138710635E+01 + -0.134076030903E+01 -0.134012995651E+01 -0.133949603432E+01 -0.133885852794E+01 + -0.133821742285E+01 -0.133757270450E+01 -0.133692435834E+01 -0.133627236980E+01 + -0.133561672428E+01 -0.133495740718E+01 -0.133429440388E+01 -0.133362769974E+01 + -0.133295728011E+01 -0.133228313030E+01 -0.133160523564E+01 -0.133092358143E+01 + -0.133023815293E+01 -0.132954893542E+01 -0.132885591414E+01 -0.132815907433E+01 + -0.132745840119E+01 -0.132675387993E+01 -0.132604549574E+01 -0.132533323376E+01 + -0.132461707917E+01 -0.132389701708E+01 -0.132317303261E+01 -0.132244511088E+01 + -0.132171323695E+01 -0.132097739591E+01 -0.132023757280E+01 -0.131949375265E+01 + -0.131874592049E+01 -0.131799406132E+01 -0.131723816013E+01 -0.131647820189E+01 + -0.131571417154E+01 -0.131494605404E+01 -0.131417383430E+01 -0.131339749723E+01 + -0.131261702771E+01 -0.131183241062E+01 -0.131104363082E+01 -0.131025067314E+01 + -0.130945352242E+01 -0.130865216345E+01 -0.130784658103E+01 -0.130703675994E+01 + -0.130622268493E+01 -0.130540434075E+01 -0.130458171212E+01 -0.130375478375E+01 + -0.130292354034E+01 -0.130208796657E+01 -0.130124804709E+01 -0.130040376654E+01 + -0.129955510957E+01 -0.129870206078E+01 -0.129784460477E+01 -0.129698272612E+01 + -0.129611640938E+01 -0.129524563911E+01 -0.129437039985E+01 -0.129349067609E+01 + -0.129260645235E+01 -0.129171771310E+01 -0.129082444282E+01 -0.128992662594E+01 + -0.128902424690E+01 -0.128811729013E+01 -0.128720574001E+01 -0.128628958094E+01 + -0.128536879729E+01 -0.128444337340E+01 -0.128351329360E+01 -0.128257854223E+01 + -0.128163910358E+01 -0.128069496195E+01 -0.127974610159E+01 -0.127879250676E+01 + -0.127783416171E+01 -0.127687105065E+01 -0.127590315779E+01 -0.127493046732E+01 + -0.127395296341E+01 -0.127297063021E+01 -0.127198345187E+01 -0.127099141252E+01 + -0.126999449625E+01 -0.126899268716E+01 -0.126798596933E+01 -0.126697432681E+01 + -0.126595774365E+01 -0.126493620387E+01 -0.126390969148E+01 -0.126287819048E+01 + -0.126184168484E+01 -0.126080015853E+01 -0.125975359549E+01 -0.125870197964E+01 + -0.125764529490E+01 -0.125658352517E+01 -0.125551665433E+01 -0.125444466623E+01 + -0.125336754473E+01 -0.125228527366E+01 -0.125119784152E+01 -0.125010525786E+01 + -0.124900753812E+01 -0.124790469778E+01 -0.124679675234E+01 -0.124568371733E+01 + -0.124456560831E+01 -0.124344244086E+01 -0.124231423058E+01 -0.124118099312E+01 + -0.124004274414E+01 -0.123889949932E+01 -0.123775127439E+01 -0.123659808508E+01 + -0.123543994717E+01 -0.123427687644E+01 -0.123310888873E+01 -0.123193599988E+01 + -0.123075822577E+01 -0.122957558230E+01 -0.122838808541E+01 -0.122719575104E+01 + -0.122599859518E+01 -0.122479663385E+01 -0.122358988307E+01 -0.122237835891E+01 + -0.122116207746E+01 -0.121994105484E+01 -0.121871530718E+01 -0.121748485067E+01 + -0.121624970149E+01 -0.121500987587E+01 -0.121376539007E+01 -0.121251626035E+01 + -0.121126250301E+01 -0.121000413440E+01 -0.120874117087E+01 -0.120747362879E+01 + -0.120620152459E+01 -0.120492487469E+01 -0.120364369557E+01 -0.120235800370E+01 + -0.120106781562E+01 -0.119977314786E+01 -0.119847401699E+01 -0.119717043960E+01 + -0.119586243234E+01 -0.119455001184E+01 -0.119323319477E+01 -0.119191199786E+01 + -0.119058643782E+01 -0.118925653141E+01 -0.118792229542E+01 -0.118658374666E+01 + -0.118524090197E+01 -0.118389377820E+01 -0.118254239226E+01 -0.118118676105E+01 + -0.117982690153E+01 -0.117846283066E+01 -0.117709456544E+01 -0.117572212289E+01 + -0.117434552007E+01 -0.117296477406E+01 -0.117157990195E+01 -0.117019092089E+01 + -0.116879784802E+01 -0.116740070053E+01 -0.116599949564E+01 -0.116459425058E+01 + -0.116318498262E+01 -0.116177170904E+01 -0.116035444717E+01 -0.115893321434E+01 + -0.115750802794E+01 -0.115607890536E+01 -0.115464586403E+01 -0.115320892139E+01 + -0.115176809492E+01 -0.115032340214E+01 -0.114887486056E+01 -0.114742248776E+01 + -0.114596630130E+01 -0.114450631882E+01 -0.114304255794E+01 -0.114157503633E+01 + -0.114010377168E+01 -0.113862878171E+01 -0.113715008417E+01 -0.113566769683E+01 + -0.113418163748E+01 -0.113269192395E+01 -0.113119857410E+01 -0.112970160580E+01 + -0.112820103696E+01 -0.112669688550E+01 -0.112518916940E+01 -0.112367790663E+01 + -0.112216311521E+01 -0.112064481317E+01 -0.111912301859E+01 -0.111759774955E+01 + -0.111606902417E+01 -0.111453686060E+01 -0.111300127701E+01 -0.111146229161E+01 + -0.110991992260E+01 -0.110837418826E+01 -0.110682510686E+01 -0.110527269670E+01 + -0.110371697611E+01 -0.110215796346E+01 -0.110059567714E+01 -0.109903013555E+01 + -0.109746135713E+01 -0.109588936036E+01 -0.109431416371E+01 -0.109273578573E+01 + -0.109115424494E+01 -0.108956955992E+01 -0.108798174928E+01 -0.108639083163E+01 + -0.108479682563E+01 -0.108319974997E+01 -0.108159962335E+01 -0.107999646449E+01 + -0.107839029217E+01 -0.107678112516E+01 -0.107516898229E+01 -0.107355388238E+01 + -0.107193584432E+01 -0.107031488698E+01 -0.106869102929E+01 -0.106706429021E+01 + -0.106543468869E+01 -0.106380224375E+01 -0.106216697440E+01 -0.106052889971E+01 + -0.105888803875E+01 -0.105724441062E+01 -0.105559803447E+01 -0.105394892946E+01 + -0.105229711476E+01 -0.105064260960E+01 -0.104898543321E+01 -0.104732560487E+01 + -0.104566314386E+01 -0.104399806951E+01 -0.104233040116E+01 -0.104066015819E+01 + -0.103898736000E+01 -0.103731202601E+01 -0.103563417569E+01 -0.103395382850E+01 + -0.103227100396E+01 -0.103058572161E+01 -0.102889800100E+01 -0.102720786172E+01 + -0.102551532338E+01 -0.102382040564E+01 -0.102212312814E+01 -0.102042351060E+01 + -0.101872157272E+01 -0.101701733426E+01 -0.101531081500E+01 -0.101360203473E+01 + -0.101189101327E+01 -0.101017777050E+01 -0.100846232628E+01 -0.100674470052E+01 + -0.100502491317E+01 -0.100330298418E+01 -0.100157893353E+01 -0.999852781255E+00 + -0.998124547381E+00 -0.996394251981E+00 -0.994661915150E+00 -0.992927557010E+00 + -0.991191197708E+00 -0.989452857420E+00 -0.987712556348E+00 -0.985970314719E+00 + -0.984226152790E+00 -0.982480090841E+00 -0.980732149182E+00 -0.978982348148E+00 + -0.977230708100E+00 -0.975477249427E+00 -0.973721992545E+00 -0.971964957896E+00 + -0.970206165948E+00 -0.968445637197E+00 -0.966683392164E+00 -0.964919451400E+00 + -0.963153835478E+00 -0.961386565002E+00 -0.959617660601E+00 -0.957847142929E+00 + -0.956075032670E+00 -0.954301350533E+00 -0.952526117252E+00 -0.950749353592E+00 + -0.948971080340E+00 -0.947191318312E+00 -0.945410088352E+00 -0.943627411328E+00 + -0.941843308137E+00 -0.940057799700E+00 -0.938270906968E+00 -0.936482650916E+00 + -0.934693052548E+00 -0.932902132892E+00 -0.931109913004E+00 -0.929316413968E+00 + -0.927521656893E+00 -0.925725662916E+00 -0.923928453199E+00 -0.922130048932E+00 + -0.920330471331E+00 -0.918529741639E+00 -0.916727881127E+00 -0.914924911090E+00 + -0.913120852852E+00 -0.911315727763E+00 -0.909509557198E+00 -0.907702362562E+00 + -0.905894165285E+00 -0.904084986822E+00 -0.902274848657E+00 -0.900463772301E+00 + -0.898651779291E+00 -0.896838891189E+00 -0.895025129585E+00 -0.893210516097E+00 + -0.891395072369E+00 -0.889578820070E+00 -0.887761780897E+00 -0.885943976575E+00 + -0.884125428852E+00 -0.882306159508E+00 -0.880486190345E+00 -0.878665543193E+00 + -0.876844239910E+00 -0.875022302381E+00 -0.873199752514E+00 -0.871376612248E+00 + -0.869552903547E+00 -0.867728648401E+00 -0.865903868828E+00 -0.864078586871E+00 + -0.862252824602E+00 -0.860426604118E+00 -0.858599947542E+00 -0.856772877027E+00 + -0.854945414750E+00 -0.853117582914E+00 -0.851289403751E+00 -0.849460899518E+00 + -0.847632092501E+00 -0.845803005009E+00 -0.843973659381E+00 -0.842144077982E+00 + -0.840314283201E+00 -0.838484297458E+00 -0.836654143197E+00 -0.834823842889E+00 + -0.832993419032E+00 -0.831162894151E+00 -0.829332290796E+00 -0.827501631548E+00 + -0.825670939009E+00 -0.823840235812E+00 -0.822009544614E+00 -0.820178888101E+00 + -0.818348288984E+00 -0.816517770002E+00 -0.814687353919E+00 -0.812857063528E+00 + -0.811026921645E+00 -0.809196951118E+00 -0.807367174817E+00 -0.805537615641E+00 + -0.803708296514E+00 -0.801879240390E+00 -0.800050470247E+00 -0.798222009089E+00 + -0.796393879949E+00 -0.794566105886E+00 -0.792738709985E+00 -0.790911715358E+00 + -0.789085145144E+00 -0.787259022508E+00 -0.785433370642E+00 -0.783608212766E+00 + -0.781783572125E+00 -0.779959471992E+00 -0.778135935665E+00 -0.776312986470E+00 + -0.774490647759E+00 -0.772668942912E+00 -0.770847895334E+00 -0.769027528459E+00 + -0.767207865744E+00 -0.765388930676E+00 -0.763570746768E+00 -0.761753337559E+00 + -0.759936726614E+00 -0.758120937528E+00 -0.756305993918E+00 -0.754491919431E+00 + -0.752678737741E+00 -0.750866472545E+00 -0.749055147572E+00 -0.747244786573E+00 + -0.745435413328E+00 -0.743627051644E+00 -0.741819725353E+00 -0.740013458316E+00 + -0.738208274418E+00 -0.736404197573E+00 -0.734601251720E+00 -0.732799460827E+00 + -0.730998848886E+00 -0.729199439917E+00 -0.727401257967E+00 -0.725604327109E+00 + -0.723808671444E+00 -0.722014315097E+00 -0.720221282223E+00 -0.718429597001E+00 + -0.716639283638E+00 -0.714850366369E+00 -0.713062869452E+00 -0.711276817175E+00 + -0.709492233852E+00 -0.707709143823E+00 -0.705927571454E+00 -0.704147541141E+00 + -0.702369077302E+00 -0.700592204386E+00 -0.698816946865E+00 -0.697043329242E+00 + -0.695271376042E+00 -0.693501111819E+00 -0.691732561156E+00 -0.689965748658E+00 + -0.688200698959E+00 -0.686437436721E+00 -0.684675986631E+00 -0.682916373404E+00 + -0.681158621779E+00 -0.679402756021E+00 -0.677648791071E+00 -0.675896733609E+00 + -0.674146590037E+00 -0.672398366760E+00 -0.670652070190E+00 -0.668907706740E+00 + -0.667165282829E+00 -0.665424804881E+00 -0.663686279323E+00 -0.661949712586E+00 + -0.660215111108E+00 -0.658482481329E+00 -0.656751829693E+00 -0.655023162651E+00 + -0.653296486655E+00 -0.651571808163E+00 -0.649849133639E+00 -0.648128469548E+00 + -0.646409822362E+00 -0.644693198555E+00 -0.642978604609E+00 -0.641266047006E+00 + -0.639555532235E+00 -0.637847066789E+00 -0.636140657165E+00 -0.634436309865E+00 + -0.632734031393E+00 -0.631033828261E+00 -0.629335706983E+00 -0.627639674077E+00 + -0.625945736067E+00 -0.624253899480E+00 -0.622564170848E+00 -0.620876556708E+00 + -0.619191063600E+00 -0.617507698068E+00 -0.615826466662E+00 -0.614147375936E+00 + -0.612470432448E+00 -0.610795642759E+00 -0.609123013436E+00 -0.607452551052E+00 + -0.605784262179E+00 -0.604118153400E+00 -0.602454231296E+00 -0.600792502457E+00 + -0.599132973476E+00 -0.597475650949E+00 -0.595820541479E+00 -0.594167651669E+00 + -0.592516988132E+00 -0.590868557481E+00 -0.589222366334E+00 -0.587578421316E+00 + -0.585936729053E+00 -0.584297296177E+00 -0.582660129325E+00 -0.581025235137E+00 + -0.579392620258E+00 -0.577762291337E+00 -0.576134255027E+00 -0.574508517987E+00 + -0.572885086879E+00 -0.571263968369E+00 -0.569645169128E+00 -0.568028695832E+00 + -0.566414555160E+00 -0.564802753796E+00 -0.563193298428E+00 -0.561586195750E+00 + -0.559981452457E+00 -0.558379075252E+00 -0.556779070840E+00 -0.555181445932E+00 + -0.553586207241E+00 -0.551993361486E+00 -0.550402915390E+00 -0.548814875682E+00 + -0.547229249092E+00 -0.545646042356E+00 -0.544065262216E+00 -0.542486915416E+00 + -0.540911008705E+00 -0.539337548836E+00 -0.537766542569E+00 -0.536197996663E+00 + -0.534631917887E+00 -0.533068313011E+00 -0.531507188811E+00 -0.529948552065E+00 + -0.528392409558E+00 -0.526838768079E+00 -0.525287634419E+00 -0.523739015376E+00 + -0.522192917751E+00 -0.520649348349E+00 -0.519108313981E+00 -0.517569821462E+00 + -0.516033877608E+00 -0.514500489245E+00 -0.512969663199E+00 -0.511441406302E+00 + -0.509915725389E+00 -0.508392627302E+00 -0.506872118885E+00 -0.505354206988E+00 + -0.503838898463E+00 -0.502326200169E+00 -0.500816118967E+00 -0.499308661725E+00 + -0.497803835312E+00 -0.496301646605E+00 -0.494802102483E+00 -0.493305209829E+00 + -0.491810975532E+00 -0.490319406484E+00 -0.488830509583E+00 -0.487344291730E+00 + -0.485860759830E+00 -0.484379920793E+00 -0.482901781533E+00 -0.481426348970E+00 + -0.479953630026E+00 -0.478483631628E+00 -0.477016360709E+00 -0.475551824203E+00 + -0.474090029053E+00 -0.472630982202E+00 -0.471174690599E+00 -0.469721161198E+00 + -0.468270400957E+00 -0.466822416837E+00 -0.465377215805E+00 -0.463934804833E+00 + -0.462495190895E+00 -0.461058380970E+00 -0.459624382043E+00 -0.458193201101E+00 + -0.456764845138E+00 -0.455339321149E+00 -0.453916636137E+00 -0.452496797107E+00 + -0.451079811069E+00 -0.449665685037E+00 -0.448254426029E+00 -0.446846041069E+00 + -0.445440537184E+00 -0.444037921405E+00 -0.442638200769E+00 -0.441241382316E+00 + -0.439847473091E+00 -0.438456480142E+00 -0.437068410523E+00 -0.435683271292E+00 + -0.434301069510E+00 -0.432921812245E+00 -0.431545506567E+00 -0.430172159551E+00 + -0.428801778277E+00 -0.427434369827E+00 -0.426069941292E+00 -0.424708499762E+00 + -0.423350052335E+00 -0.421994606112E+00 -0.420642168199E+00 -0.419292745704E+00 + -0.417946345744E+00 -0.416602975436E+00 -0.415262641903E+00 -0.413925352272E+00 + -0.412591113675E+00 -0.411259933248E+00 -0.409931818132E+00 -0.408606775470E+00 + -0.407284812412E+00 -0.405965936112E+00 -0.404650153726E+00 -0.403337472417E+00 + -0.402027899351E+00 -0.400721441700E+00 -0.399418106637E+00 -0.398117901343E+00 + -0.396820833001E+00 -0.395526908800E+00 -0.394236135931E+00 -0.392948521592E+00 + -0.391664072983E+00 -0.390382797311E+00 -0.389104701785E+00 -0.387829793619E+00 + -0.386558080032E+00 -0.385289568247E+00 -0.384024265490E+00 -0.382762178994E+00 + -0.381503315994E+00 -0.380247683731E+00 -0.378995289449E+00 -0.377746140397E+00 + -0.376500243828E+00 -0.375257607001E+00 -0.374018237176E+00 -0.372782141621E+00 + -0.371549327606E+00 -0.370319802406E+00 -0.369093573301E+00 -0.367870647574E+00 + -0.366651032513E+00 -0.365434735410E+00 -0.364221763564E+00 -0.363012124273E+00 + -0.361805824845E+00 -0.360602872588E+00 -0.359403274817E+00 -0.358207038851E+00 + -0.357014172011E+00 -0.355824681626E+00 -0.354638575027E+00 -0.353455859550E+00 + -0.352276542535E+00 -0.351100631326E+00 -0.349928133273E+00 -0.348759055728E+00 + -0.347593406050E+00 -0.346431191600E+00 -0.345272419745E+00 -0.344117097854E+00 + -0.342965233304E+00 -0.341816833474E+00 -0.340671905746E+00 -0.339530457510E+00 + -0.338392496157E+00 -0.337258029085E+00 -0.336127063693E+00 -0.334999607389E+00 + -0.333875667581E+00 -0.332755251683E+00 -0.331638367115E+00 -0.330525021298E+00 + -0.329415221661E+00 -0.328308975634E+00 -0.327206290653E+00 -0.326107174158E+00 + -0.325011633594E+00 -0.323919676410E+00 -0.322831310060E+00 -0.321746541999E+00 + -0.320665379692E+00 -0.319587830602E+00 -0.318513902203E+00 -0.317443601967E+00 + -0.316376937375E+00 -0.315313915910E+00 -0.314254545061E+00 -0.313198832319E+00 + -0.312146785181E+00 -0.311098411148E+00 -0.310053717726E+00 -0.309012712424E+00 + -0.307975402756E+00 -0.306941796241E+00 -0.305911900401E+00 -0.304885722764E+00 + -0.303863270861E+00 -0.302844552228E+00 -0.301829574404E+00 -0.300818344935E+00 + -0.299810871369E+00 -0.298807161260E+00 -0.297807222164E+00 -0.296811061644E+00 + -0.295818687266E+00 -0.294830106601E+00 -0.293845327223E+00 -0.292864356711E+00 + -0.291887202650E+00 -0.290913872627E+00 -0.289944374235E+00 -0.288978715069E+00 + -0.288016902732E+00 -0.287058944828E+00 -0.286104848967E+00 -0.285154622763E+00 + -0.284208273834E+00 -0.283265809804E+00 -0.282327238299E+00 -0.281392566950E+00 + -0.280461803394E+00 -0.279534955270E+00 -0.278612030223E+00 -0.277693035901E+00 + -0.276777979959E+00 -0.275866870052E+00 -0.274959713844E+00 -0.274056518999E+00 + -0.273157293190E+00 -0.272262044090E+00 -0.271370779379E+00 -0.270483506740E+00 + -0.269600233861E+00 -0.268720968435E+00 -0.267845718158E+00 -0.266974490731E+00 + -0.266107293859E+00 -0.265244135252E+00 -0.264385022624E+00 -0.263529963693E+00 + -0.262678966182E+00 -0.261832037818E+00 -0.260989186332E+00 -0.260150419460E+00 + -0.259315744942E+00 -0.258485170522E+00 -0.257658703949E+00 -0.256836352977E+00 + -0.256018125362E+00 -0.255204028866E+00 -0.254394071256E+00 -0.253588260302E+00 + -0.252786603779E+00 -0.251989109465E+00 -0.251195785146E+00 -0.250406638607E+00 + -0.249621677642E+00 -0.248840910047E+00 -0.248064343623E+00 -0.247291986175E+00 + -0.246523845513E+00 -0.245759929451E+00 -0.245000245806E+00 -0.244244802403E+00 + -0.243493607066E+00 -0.242746667629E+00 -0.242003991926E+00 -0.241265587798E+00 + -0.240531463089E+00 -0.239801625647E+00 -0.239076083326E+00 -0.238354843983E+00 + -0.237637915480E+00 -0.236925305682E+00 -0.236217022461E+00 -0.235513073691E+00 + -0.234813467251E+00 -0.234118211024E+00 -0.233427312900E+00 -0.232740780768E+00 + -0.232058622527E+00 -0.231380846077E+00 -0.230707459323E+00 -0.230038470174E+00 + -0.229373886537E+00 -0.228713710891E+00 -0.228057931016E+00 -0.227406532211E+00 + -0.226759499753E+00 -0.226116818901E+00 -0.225478474891E+00 -0.224844452941E+00 + -0.224214738245E+00 -0.223589315981E+00 -0.222968171304E+00 -0.222351289348E+00 + -0.221738655228E+00 -0.221130254037E+00 -0.220526070851E+00 -0.219926090720E+00 + -0.219330298679E+00 -0.218738679740E+00 -0.218151218893E+00 -0.217567901111E+00 + -0.216988711344E+00 -0.216413634523E+00 -0.215842655558E+00 -0.215275759338E+00 + -0.214712930732E+00 -0.214154154588E+00 -0.213599415736E+00 -0.213048698983E+00 + -0.212501989115E+00 -0.211959270900E+00 -0.211420529085E+00 -0.210885748394E+00 + -0.210354913534E+00 -0.209828009189E+00 -0.209305020025E+00 -0.208785930684E+00 + -0.208270725791E+00 -0.207759389950E+00 -0.207251907742E+00 -0.206748263730E+00 + -0.206248442456E+00 -0.205752428442E+00 -0.205260206188E+00 -0.204771760175E+00 + -0.204287074862E+00 -0.203806134690E+00 -0.203328924078E+00 -0.202855427425E+00 + -0.202385629108E+00 -0.201919513485E+00 -0.201457064894E+00 -0.200998267652E+00 + -0.200543106056E+00 -0.200091564380E+00 -0.199643626882E+00 -0.199199277795E+00 + -0.198758501335E+00 -0.198321281695E+00 -0.197887603051E+00 -0.197457449554E+00 + -0.197030805338E+00 -0.196607654515E+00 -0.196187981178E+00 -0.195771769397E+00 + -0.195359003224E+00 -0.194949666689E+00 -0.194543743803E+00 -0.194141218555E+00 + -0.193742074914E+00 -0.193346296830E+00 -0.192953868231E+00 -0.192564773025E+00 + -0.192178995098E+00 -0.191796518319E+00 -0.191417326534E+00 -0.191041403568E+00 + -0.190668733228E+00 -0.190299299299E+00 -0.189933085545E+00 -0.189570075711E+00 + -0.189210253521E+00 -0.188853602679E+00 -0.188500106866E+00 -0.188149749746E+00 + -0.187802514961E+00 -0.187458386133E+00 -0.187117346861E+00 -0.186779380729E+00 + -0.186444471295E+00 -0.186112602099E+00 -0.185783756661E+00 -0.185457918480E+00 + -0.185135071034E+00 -0.184815197782E+00 -0.184498282160E+00 -0.184184307586E+00 + -0.183873257457E+00 -0.183565115149E+00 -0.183259864018E+00 -0.182957487399E+00 + -0.182657968606E+00 -0.182361290935E+00 -0.182067437660E+00 -0.181776392033E+00 + -0.181488137288E+00 -0.181202656638E+00 -0.180919933275E+00 -0.180639950370E+00 + -0.180362691075E+00 -0.180088138521E+00 -0.179816275817E+00 -0.179547086055E+00 + -0.179280552304E+00 -0.179016657612E+00 -0.178755385008E+00 -0.178496717500E+00 + -0.178240638076E+00 -0.177987129704E+00 -0.177736175329E+00 -0.177487757879E+00 + -0.177241860259E+00 -0.176998465355E+00 -0.176757556032E+00 -0.176519115134E+00 + -0.176283125485E+00 -0.176049569889E+00 -0.175818431129E+00 -0.175589691969E+00 + -0.175363335149E+00 -0.175139343393E+00 -0.174917699401E+00 -0.174698385854E+00 + -0.174481385414E+00 -0.174266680719E+00 -0.174054254390E+00 -0.173844089026E+00 + -0.173636167205E+00 -0.173430471486E+00 -0.173226984406E+00 -0.173025688484E+00 + -0.172826566215E+00 -0.172629600076E+00 -0.172434772523E+00 -0.172242065993E+00 + -0.172051462899E+00 -0.171862945636E+00 -0.171676496580E+00 -0.171492098082E+00 + -0.171309732478E+00 -0.171129382079E+00 -0.170951029179E+00 -0.170774656048E+00 + -0.170600244939E+00 -0.170427778082E+00 -0.170257237689E+00 -0.170088605949E+00 + -0.169921865032E+00 -0.169756997088E+00 -0.169593984244E+00 -0.169432808611E+00 + -0.169273452274E+00 -0.169115897302E+00 -0.168960125743E+00 -0.168806119622E+00 + -0.168653860945E+00 -0.168503331698E+00 -0.168354513847E+00 -0.168207389337E+00 + -0.168061940090E+00 -0.167918148013E+00 -0.167775994987E+00 -0.167635462875E+00 + -0.167496533521E+00 -0.167359188747E+00 -0.167223410353E+00 -0.167089180122E+00 + -0.166956479813E+00 -0.166825291168E+00 -0.166695595905E+00 -0.166567375725E+00 + -0.166440612306E+00 -0.166315287307E+00 -0.166191382365E+00 -0.166068879099E+00 + -0.165947759106E+00 -0.165828003961E+00 -0.165709595222E+00 -0.165592514424E+00 + -0.165476743082E+00 -0.165362262691E+00 -0.165249054727E+00 -0.165137100642E+00 + -0.165026381870E+00 -0.164916879825E+00 -0.164808575898E+00 -0.164701451463E+00 + -0.164595487870E+00 -0.164490666452E+00 -0.164386968518E+00 -0.164284375360E+00 + -0.164182868247E+00 -0.164082428429E+00 -0.163983037134E+00 -0.163884675572E+00 + -0.163787324930E+00 -0.163690966377E+00 -0.163595581059E+00 -0.163501150103E+00 + -0.163407654615E+00 -0.163315075682E+00 -0.163223394369E+00 -0.163132591721E+00 + -0.163042648761E+00 -0.162953546496E+00 -0.162865265907E+00 -0.162777787959E+00 + -0.162691093593E+00 -0.162605163733E+00 -0.162519979280E+00 -0.162435521115E+00 + -0.162351770100E+00 -0.162268707075E+00 -0.162186312859E+00 -0.162104568253E+00 + -0.162023454036E+00 -0.161942950966E+00 -0.161863039782E+00 -0.161783701201E+00 + -0.161704915921E+00 -0.161626664619E+00 -0.161548927951E+00 -0.161471686552E+00 + -0.161394921039E+00 -0.161318612007E+00 -0.161242740031E+00 -0.161167285664E+00 + -0.161092229440E+00 -0.161017551872E+00 -0.160943233454E+00 -0.160869254658E+00 + -0.160795595936E+00 -0.160722237719E+00 -0.160649160418E+00 -0.160576344424E+00 + -0.160503770107E+00 -0.160431417817E+00 -0.160359267883E+00 -0.160287300614E+00 + -0.160215496298E+00 -0.160143835202E+00 -0.160072297576E+00 -0.160000863644E+00 + -0.159929513615E+00 -0.159858227674E+00 -0.159786985987E+00 -0.159715768699E+00 + -0.159644555934E+00 -0.159573327798E+00 -0.159502064373E+00 -0.159430745724E+00 + -0.159359351893E+00 -0.159287862903E+00 -0.159216258755E+00 -0.159144519432E+00 + -0.159072624895E+00 -0.159000555084E+00 -0.158928289919E+00 -0.158855809301E+00 + -0.158783093109E+00 -0.158710121201E+00 -0.158636873416E+00 -0.158563329572E+00 + -0.158489469467E+00 -0.158415272878E+00 -0.158340719561E+00 -0.158265789253E+00 + -0.158190461669E+00 -0.158114716505E+00 -0.158038533435E+00 -0.157961892114E+00 + -0.157884772177E+00 -0.157807153235E+00 -0.157729014883E+00 -0.157650336694E+00 + -0.157571098218E+00 -0.157491278989E+00 -0.157410858517E+00 -0.157329816293E+00 + -0.157248131787E+00 -0.157165784450E+00 -0.157082753711E+00 -0.156999018978E+00 + -0.156914559641E+00 -0.156829355068E+00 -0.156743384605E+00 -0.156656627581E+00 + -0.156569063303E+00 -0.156480671055E+00 -0.156391430105E+00 -0.156301319698E+00 + -0.156210319059E+00 -0.156118407392E+00 -0.156025563882E+00 -0.155931767691E+00 + -0.155836997963E+00 -0.155741233822E+00 -0.155644454369E+00 -0.155546638685E+00 + -0.155447765833E+00 -0.155347814853E+00 -0.155246764766E+00 -0.155144594572E+00 + -0.155041283250E+00 -0.154936809760E+00 -0.154831153039E+00 -0.154724292008E+00 + -0.154616205562E+00 -0.154506872580E+00 -0.154396271918E+00 -0.154284382413E+00 + -0.154171182881E+00 -0.154056652117E+00 -0.153940768896E+00 -0.153823511974E+00 + -0.153704860084E+00 -0.153584791939E+00 -0.153463286234E+00 -0.153340321641E+00 + -0.153215876813E+00 -0.153089930380E+00 -0.152962460956E+00 -0.152833447130E+00 + -0.152702867474E+00 -0.152570700538E+00 -0.152436924851E+00 -0.152301518922E+00 + -0.152164461241E+00 -0.152025730275E+00 -0.151885304473E+00 -0.151743162262E+00 + -0.151599282049E+00 -0.151453642220E+00 -0.151306221142E+00 -0.151156997160E+00 + -0.151005948600E+00 -0.150853053766E+00 -0.150698290942E+00 -0.150541638392E+00 + -0.150383074360E+00 -0.150222577069E+00 -0.150060124721E+00 -0.149895695498E+00 + -0.149729269417E+00 -0.149560844539E+00 -0.149390429102E+00 -0.149218031472E+00 + -0.149043660020E+00 -0.148867323131E+00 -0.148689029197E+00 -0.148508786620E+00 + -0.148326603814E+00 -0.148142489201E+00 -0.147956451212E+00 -0.147768498290E+00 + -0.147578638886E+00 -0.147386881462E+00 -0.147193234488E+00 -0.146997706446E+00 + -0.146800305826E+00 -0.146601041129E+00 -0.146399920865E+00 -0.146196953555E+00 + -0.145992147728E+00 -0.145785511924E+00 -0.145577054692E+00 -0.145366784591E+00 + -0.145154710192E+00 -0.144940840071E+00 -0.144725182818E+00 -0.144507747032E+00 + -0.144288541320E+00 -0.144067574300E+00 -0.143844854600E+00 -0.143620390858E+00 + -0.143394191721E+00 -0.143166265845E+00 -0.142936621898E+00 -0.142705268556E+00 + -0.142472214506E+00 -0.142237468443E+00 -0.142001039074E+00 -0.141762935115E+00 + -0.141523165291E+00 -0.141281738337E+00 -0.141038662998E+00 -0.140793948030E+00 + -0.140547602197E+00 -0.140299634273E+00 -0.140050053042E+00 -0.139798867299E+00 + -0.139546085848E+00 -0.139291717501E+00 -0.139035771083E+00 -0.138778255426E+00 + -0.138519179374E+00 -0.138258551778E+00 -0.137996381502E+00 -0.137732677418E+00 + -0.137467448407E+00 -0.137200703362E+00 -0.136932451184E+00 -0.136662700785E+00 + -0.136391461086E+00 -0.136118741017E+00 -0.135844549520E+00 -0.135568895545E+00 + -0.135291788052E+00 -0.135013236011E+00 -0.134733248403E+00 -0.134451834216E+00 + -0.134169002451E+00 -0.133884762116E+00 -0.133599122231E+00 -0.133312091824E+00 + -0.133023679934E+00 -0.132733895609E+00 -0.132442747908E+00 -0.132150245897E+00 + -0.131856398656E+00 -0.131561215271E+00 -0.131264704839E+00 -0.130966876468E+00 + -0.130667739275E+00 -0.130367302386E+00 -0.130065574937E+00 -0.129762566074E+00 + -0.129458284955E+00 -0.129152740743E+00 -0.128845942616E+00 -0.128537899757E+00 + -0.128228621363E+00 -0.127918116638E+00 -0.127606394796E+00 -0.127293465063E+00 + -0.126979336672E+00 -0.126664018867E+00 -0.126347520902E+00 -0.126029852041E+00 + -0.125711021557E+00 -0.125391038733E+00 -0.125069912862E+00 -0.124747653246E+00 + -0.124424269199E+00 -0.124099770042E+00 -0.123774165108E+00 -0.123447463737E+00 + -0.123119675283E+00 -0.122790809106E+00 -0.122460874577E+00 -0.122129881077E+00 + -0.121797837997E+00 -0.121464754738E+00 -0.121130640710E+00 -0.120795505333E+00 + -0.120459358036E+00 -0.120122208260E+00 -0.119784065453E+00 -0.119444939076E+00 + -0.119104838596E+00 -0.118763773494E+00 -0.118421753256E+00 -0.118078787383E+00 + -0.117734885380E+00 -0.117390056768E+00 -0.117044311073E+00 -0.116697657833E+00 + -0.116350106594E+00 -0.116001666915E+00 -0.115652348362E+00 -0.115302160511E+00 + -0.114951112949E+00 -0.114599215271E+00 -0.114246477085E+00 -0.113892908005E+00 + -0.113538517658E+00 -0.113183315678E+00 -0.112827311710E+00 -0.112470515410E+00 + -0.112112936441E+00 -0.111754584479E+00 -0.111395469208E+00 -0.111035600321E+00 + -0.110674987522E+00 -0.110313640525E+00 -0.109951569054E+00 -0.109588782840E+00 + -0.109225291628E+00 -0.108861105170E+00 -0.108496233228E+00 -0.108130685574E+00 + -0.107764471992E+00 -0.107397602271E+00 -0.107030086214E+00 -0.106661933633E+00 + -0.106293154348E+00 -0.105923758191E+00 -0.105553755001E+00 -0.105183154630E+00 + -0.104811966938E+00 -0.104440201795E+00 -0.104067869081E+00 -0.103694978685E+00 + -0.103321540507E+00 -0.102947564456E+00 -0.102573060451E+00 -0.102198038421E+00 + -0.101822508304E+00 -0.101446480049E+00 -0.101069963613E+00 -0.100692968965E+00 + -0.100315506082E+00 -0.999375849517E-01 -0.995592155714E-01 -0.991804079481E-01 + -0.988011720985E-01 -0.984215180492E-01 -0.980414558366E-01 -0.976609955068E-01 + -0.972801471158E-01 -0.968989207292E-01 -0.965173264226E-01 -0.961353742812E-01 + -0.957530744000E-01 -0.953704368840E-01 -0.949874718477E-01 -0.946041894156E-01 + -0.942205997218E-01 -0.938367129102E-01 -0.934525391347E-01 -0.930680885588E-01 + -0.926833713558E-01 -0.922983977088E-01 -0.919131778106E-01 -0.915277218640E-01 + -0.911420400813E-01 -0.907561426848E-01 -0.903700399066E-01 -0.899837419883E-01 + -0.895972591816E-01 -0.892106017478E-01 -0.888237799581E-01 -0.884368040934E-01 + -0.880496844444E-01 -0.876624313116E-01 -0.872750550052E-01 -0.868875658453E-01 + -0.864999741617E-01 -0.861122902941E-01 -0.857245245918E-01 -0.853366874141E-01 + -0.849487891298E-01 -0.845608401178E-01 -0.841728507665E-01 -0.837848314743E-01 + -0.833967926492E-01 -0.830087447092E-01 -0.826206980818E-01 -0.822326632046E-01 + -0.818446505248E-01 -0.814566704993E-01 -0.810687335949E-01 -0.806808502882E-01 + -0.802930310656E-01 -0.799052864232E-01 -0.795176268669E-01 -0.791300629124E-01 + -0.787426050852E-01 -0.783552639205E-01 -0.779680499634E-01 -0.775809737688E-01 + -0.771940459012E-01 -0.768072769350E-01 -0.764206774544E-01 -0.760342580533E-01 + -0.756480293356E-01 -0.752620019147E-01 -0.748761864138E-01 -0.744905934662E-01 + -0.741052337147E-01 -0.737201178119E-01 -0.733352564203E-01 -0.729506602120E-01 + -0.725663398691E-01 -0.721823060834E-01 -0.717985695564E-01 -0.714151409995E-01 + -0.710320311337E-01 -0.706492506901E-01 -0.702668104092E-01 -0.698847210417E-01 + -0.695029933476E-01 -0.691216380972E-01 -0.687406660701E-01 -0.683600880560E-01 + -0.679799148543E-01 -0.676001572741E-01 -0.672208261345E-01 -0.668419322641E-01 + -0.664634865014E-01 -0.660854996948E-01 -0.657079827024E-01 -0.653309463919E-01 + -0.649544016411E-01 -0.645783593374E-01 -0.642028303779E-01 -0.638278256697E-01 + -0.634533561296E-01 -0.630794326841E-01 -0.627060662695E-01 -0.623332678320E-01 + -0.619610483275E-01 -0.615894187217E-01 -0.612183899900E-01 -0.608479731177E-01 + -0.604781790998E-01 -0.601090189411E-01 -0.597405036563E-01 -0.593726442697E-01 + -0.590054518155E-01 -0.586389373376E-01 -0.582731118898E-01 -0.579079865356E-01 + -0.575435723482E-01 -0.571798804107E-01 -0.568169218161E-01 -0.564547076669E-01 + -0.560932490756E-01 -0.557325571643E-01 -0.553726430651E-01 -0.550135179197E-01 + -0.546551928797E-01 -0.542976791065E-01 -0.539409877710E-01 -0.535851300543E-01 + -0.532301171470E-01 -0.528759602496E-01 -0.525226705723E-01 -0.521702593351E-01 + -0.518187377680E-01 -0.514681171103E-01 -0.511184086117E-01 -0.507696235311E-01 + -0.504217731376E-01 -0.500748687098E-01 -0.497289215363E-01 -0.493839429153E-01 + -0.490399441550E-01 -0.486969365731E-01 -0.483549314974E-01 -0.480139402652E-01 + -0.476739742237E-01 -0.473350447299E-01 -0.469971631507E-01 -0.466603408624E-01 + -0.463245892515E-01 -0.459899197141E-01 -0.456563436560E-01 -0.453238724930E-01 + -0.449925176505E-01 -0.446622905637E-01 -0.443332026777E-01 -0.440052654473E-01 + -0.436784903370E-01 -0.433528888213E-01 -0.430284723842E-01 -0.427052525198E-01 + -0.423832407317E-01 -0.420624485334E-01 -0.417428874483E-01 -0.414245690093E-01 + -0.411075047594E-01 -0.407917062512E-01 -0.404771850470E-01 -0.401639527191E-01 + -0.398520208495E-01 -0.395414010299E-01 -0.392321048618E-01 -0.389241439566E-01 + -0.386175299354E-01 -0.383122744290E-01 -0.380083890783E-01 -0.377058855335E-01 + -0.374047754549E-01 -0.371050705126E-01 -0.368067823863E-01 -0.365099227657E-01 + -0.362145033501E-01 -0.359205358487E-01 -0.356280319803E-01 -0.353370034737E-01 + -0.350474620675E-01 -0.347594195097E-01 -0.344728875587E-01 -0.341878779116E-01 + -0.339043969037E-01 -0.336224418137E-01 -0.333420090443E-01 -0.330630949939E-01 + -0.327856960568E-01 -0.325098086226E-01 -0.322354290767E-01 -0.319625538002E-01 + -0.316911791697E-01 -0.314213015574E-01 -0.311529173315E-01 -0.308860228553E-01 + -0.306206144882E-01 -0.303566885850E-01 -0.300942414961E-01 -0.298332695679E-01 + -0.295737691419E-01 -0.293157365557E-01 -0.290591681422E-01 -0.288040602302E-01 + -0.285504091441E-01 -0.282982112037E-01 -0.280474627247E-01 -0.277981600183E-01 + -0.275502993915E-01 -0.273038771468E-01 -0.270588895823E-01 -0.268153329919E-01 + -0.265732036649E-01 -0.263324978866E-01 -0.260932119375E-01 -0.258553420942E-01 + -0.256188846285E-01 -0.253838358081E-01 -0.251501918964E-01 -0.249179491522E-01 + -0.246871038301E-01 -0.244576521803E-01 -0.242295904486E-01 -0.240029148766E-01 + -0.237776217013E-01 -0.235537071555E-01 -0.233311674676E-01 -0.231099988617E-01 + -0.228901975574E-01 -0.226717597700E-01 -0.224546817106E-01 -0.222389595856E-01 + -0.220245895973E-01 -0.218115679437E-01 -0.215998908181E-01 -0.213895544098E-01 + -0.211805549036E-01 -0.209728884799E-01 -0.207665513148E-01 -0.205615395799E-01 + -0.203578494426E-01 -0.201554770660E-01 -0.199544186086E-01 -0.197546702247E-01 + -0.195562280642E-01 -0.193590882727E-01 -0.191632469913E-01 -0.189687003570E-01 + -0.187754445020E-01 -0.185834755546E-01 -0.183927896385E-01 -0.182033828730E-01 + -0.180152513733E-01 -0.178283912499E-01 -0.176427986092E-01 -0.174584695530E-01 + -0.172754001790E-01 -0.170935865804E-01 -0.169130248461E-01 -0.167337110605E-01 + -0.165556413038E-01 -0.163788116518E-01 -0.162032181758E-01 -0.160288569429E-01 + -0.158557240159E-01 -0.156838154531E-01 -0.155131273083E-01 -0.153436556314E-01 + -0.151753964674E-01 -0.150083458573E-01 -0.148424998376E-01 -0.146778544405E-01 + -0.145144056938E-01 -0.143521496209E-01 -0.141910822409E-01 -0.140311995687E-01 + -0.138724976144E-01 -0.137149723841E-01 -0.135586198796E-01 -0.134034360980E-01 + -0.132494170322E-01 -0.130965586709E-01 -0.129448569983E-01 -0.127943079941E-01 + -0.126449076340E-01 -0.124966518889E-01 -0.123495367256E-01 -0.122035581066E-01 + -0.120587119899E-01 -0.119149943291E-01 -0.117724010736E-01 -0.116309281684E-01 + -0.114905715539E-01 -0.113513271666E-01 -0.112131909382E-01 -0.110761587962E-01 + -0.109402266638E-01 -0.108053904599E-01 -0.106716460988E-01 -0.105389894905E-01 + -0.104074165409E-01 -0.102769231513E-01 -0.101475052185E-01 -0.100191586354E-01 + -0.989187929014E-02 -0.976566306661E-02 -0.964050584438E-02 -0.951640349863E-02 + -0.939335190020E-02 -0.927134691554E-02 -0.915038440676E-02 -0.903046023159E-02 + -0.891157024344E-02 -0.879371029130E-02 -0.867687621986E-02 -0.856106386940E-02 + -0.844626907587E-02 -0.833248767084E-02 -0.821971548153E-02 -0.810794833081E-02 + -0.799718203717E-02 -0.788741241474E-02 -0.777863527330E-02 -0.767084641827E-02 + -0.756404165070E-02 -0.745821676729E-02 -0.735336756036E-02 -0.724948981789E-02 + -0.714657932349E-02 -0.704463185642E-02 -0.694364319156E-02 -0.684360909945E-02 + -0.674452534624E-02 -0.664638769376E-02 -0.654919189944E-02 -0.645293371639E-02 + -0.635760889331E-02 -0.626321317458E-02 -0.616974230021E-02 -0.607719200584E-02 + -0.598555802274E-02 -0.589483607786E-02 -0.580502189374E-02 -0.571611118859E-02 + -0.562809967625E-02 -0.554098306620E-02 -0.545475706357E-02 -0.536941736911E-02 + -0.528495967921E-02 -0.520137968593E-02 -0.511867307693E-02 -0.503683553553E-02 + -0.495586274068E-02 -0.487575036700E-02 -0.479649408469E-02 -0.471808955965E-02 + -0.464053245339E-02 -0.456381842305E-02 -0.448794312143E-02 -0.441290219696E-02 + -0.433869129372E-02 -0.426530605140E-02 -0.419274210537E-02 -0.412099508660E-02 + -0.405006062174E-02 -0.397993433304E-02 -0.391061183841E-02 -0.384208875140E-02 + -0.377436068119E-02 -0.370742323261E-02 -0.364127200612E-02 -0.357590259783E-02 + -0.351131059947E-02 -0.344749159844E-02 -0.338444117775E-02 -0.332215491606E-02 + -0.326062838767E-02 -0.319985716253E-02 -0.313983680621E-02 -0.308056287993E-02 + -0.302203094054E-02 -0.296423654055E-02 -0.290717522808E-02 -0.285084254693E-02 + -0.279523403649E-02 -0.274034523183E-02 -0.268617166363E-02 -0.263270885824E-02 + -0.257995233761E-02 -0.252789761938E-02 -0.247654021678E-02 -0.242587563870E-02 + -0.237589938968E-02 -0.232660696988E-02 -0.227799387512E-02 -0.223005559683E-02 + -0.218278762212E-02 -0.213618543369E-02 -0.209024450993E-02 -0.204496032483E-02 + -0.200032834803E-02 -0.195634404483E-02 -0.191300287614E-02 -0.187030029853E-02 + -0.182823176420E-02 -0.178679272098E-02 -0.174597861237E-02 -0.170578487748E-02 + -0.166620695106E-02 -0.162724026352E-02 -0.158888024090E-02 -0.155112230487E-02 + -0.151396187274E-02 -0.147739435748E-02 -0.144141516768E-02 -0.140601970757E-02 + -0.137120337703E-02 -0.133696157157E-02 -0.130328968234E-02 -0.127018309613E-02 + -0.123763719538E-02 -0.120564735815E-02 -0.117420895816E-02 -0.114331736476E-02 + -0.111296794292E-02 -0.108315605329E-02 -0.105387705212E-02 -0.102512629133E-02 + -0.996899118461E-03 -0.969190876695E-03 -0.941996904858E-03 -0.915312537415E-03 + -0.889133104468E-03 -0.863453931761E-03 -0.838270340674E-03 -0.813577648229E-03 + -0.789371167087E-03 -0.765646205547E-03 -0.742398067549E-03 -0.719622052671E-03 + -0.697313456131E-03 -0.675467568787E-03 -0.654079677134E-03 -0.633145063309E-03 + -0.612659005087E-03 -0.592616775882E-03 -0.573013644749E-03 -0.553844876380E-03 + -0.535105731109E-03 -0.516791464907E-03 -0.498897329386E-03 -0.481418571796E-03 + -0.464350435027E-03 -0.447688157608E-03 -0.431426973708E-03 -0.415562113135E-03 + -0.400088801337E-03 -0.385002259399E-03 -0.370297704049E-03 -0.355970347650E-03 + -0.342015398209E-03 -0.328428059369E-03 -0.315203530413E-03 -0.302337006264E-03 + -0.289823677484E-03 -0.277658730274E-03 -0.265837346476E-03 -0.254354703569E-03 + -0.243205974672E-03 -0.232386328545E-03 -0.221890929585E-03 -0.211714937830E-03 + -0.201853508956E-03 -0.192301794280E-03 -0.183054940758E-03 -0.174108090983E-03 + -0.165456383190E-03 -0.157094951252E-03 -0.149018924682E-03 -0.141223428633E-03 + -0.133703583896E-03 -0.126454506901E-03 -0.119471309719E-03 -0.112749100060E-03 + -0.106282981271E-03 -0.100068052341E-03 -0.940994078987E-04 -0.883721382096E-04 + -0.828813291803E-04 -0.776220623563E-04 -0.725894149225E-04 -0.677784597030E-04 + -0.631842651615E-04 -0.588018954008E-04 -0.546264101632E-04 -0.506528648301E-04 + -0.468763104226E-04 -0.432917936009E-04 -0.398943566644E-04 -0.366790375523E-04 + -0.336408698427E-04 -0.307748827533E-04 -0.280761011409E-04 -0.255395455019E-04 + -0.231602319719E-04 -0.209331723259E-04 -0.188533739781E-04 -0.169158399823E-04 + -0.151155690313E-04 -0.134475554576E-04 -0.119067892327E-04 -0.104882559677E-04 + -0.918693691300E-05 -0.799780895817E-05 -0.691584463227E-05 -0.593601210366E-05 + -0.505327518005E-05 -0.426259330848E-05 -0.355892157533E-05 -0.293721070632E-05 + -0.239240706651E-05 -0.191945266031E-05 -0.151328513145E-05 -0.116883776302E-05 + -0.881039477431E-06 -0.644814836447E-06 -0.455084041170E-06 -0.306762932037E-06 + -0.194762988828E-06 -0.113991330664E-06 -0.593507160017E-07 -0.257395426412E-07 + -0.805184772101E-08 -0.117730771947E-08 -0.123845479832E-11 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.338814412521E+01 0.676275747085E+01 0.101238780515E+02 + 0.134715437875E+02 0.168057925049E+02 0.201266619362E+02 0.234341897201E+02 + 0.267284134019E+02 0.300093704336E+02 0.332770981745E+02 0.365316338911E+02 + 0.397730147570E+02 0.430012778541E+02 0.462164601716E+02 0.494185986073E+02 + 0.526077299671E+02 0.557838909656E+02 0.589471182259E+02 0.620974482805E+02 + 0.652349175709E+02 0.683595624479E+02 0.714714191721E+02 0.745705239141E+02 + 0.776569127542E+02 0.807306216832E+02 0.837916866025E+02 0.868401433240E+02 + 0.898760275706E+02 0.928993749763E+02 0.959102210865E+02 0.989086013580E+02 + 0.101894551160E+03 0.104868105772E+03 0.107829300388E+03 0.110778170113E+03 + 0.113714749964E+03 0.116639074872E+03 0.119551179681E+03 0.122451099148E+03 + 0.125338867942E+03 0.128214520649E+03 0.131078091764E+03 0.133929615701E+03 + 0.136769126785E+03 0.139596659257E+03 0.142412247271E+03 0.145215924897E+03 + 0.148007726122E+03 0.150787684844E+03 0.153555834879E+03 0.156312209960E+03 + 0.159056843732E+03 0.161789769760E+03 0.164511021522E+03 0.167220632415E+03 + 0.169918635752E+03 0.172605064761E+03 0.175279952590E+03 0.177943332303E+03 + 0.180595236879E+03 0.183235699219E+03 0.185864752139E+03 0.188482428374E+03 + 0.191088760576E+03 0.193683781318E+03 0.196267523089E+03 0.198840018297E+03 + 0.201401299272E+03 0.203951398259E+03 0.206490347426E+03 0.209018178858E+03 + 0.211534924561E+03 0.214040616460E+03 0.216535286403E+03 0.219018966154E+03 + 0.221491687401E+03 0.223953481751E+03 0.226404380733E+03 0.228844415796E+03 + 0.231273618311E+03 0.233692019570E+03 0.236099650787E+03 0.238496543099E+03 + 0.240882727562E+03 0.243258235157E+03 0.245623096787E+03 0.247977343276E+03 + 0.250321005373E+03 0.252654113748E+03 0.254976698995E+03 0.257288791632E+03 + 0.259590422100E+03 0.261881620762E+03 0.264162417907E+03 0.266432843749E+03 + 0.268692928423E+03 0.270942701991E+03 0.273182194438E+03 0.275411435676E+03 + 0.277630455539E+03 0.279839283788E+03 0.282037950110E+03 0.284226484115E+03 + 0.286404915341E+03 0.288573273251E+03 0.290731587234E+03 0.292879886606E+03 + 0.295018200607E+03 0.297146558407E+03 0.299264989100E+03 0.301373521708E+03 + 0.303472185181E+03 0.305561008393E+03 0.307640020150E+03 0.309709249182E+03 + 0.311768724149E+03 0.313818473637E+03 0.315858526162E+03 0.317888910168E+03 + 0.319909654025E+03 0.321920786036E+03 0.323922334429E+03 0.325914327364E+03 + 0.327896792926E+03 0.329869759134E+03 0.331833253934E+03 0.333787305202E+03 + 0.335731940745E+03 0.337667188297E+03 0.339593075525E+03 0.341509630025E+03 + 0.343416879326E+03 0.345314850883E+03 0.347203572087E+03 0.349083070255E+03 + 0.350953372640E+03 0.352814506422E+03 0.354666498717E+03 0.356509376567E+03 + 0.358343166952E+03 0.360167896780E+03 0.361983592891E+03 0.363790282060E+03 + 0.365587990993E+03 0.367376746328E+03 0.369156574637E+03 0.370927502423E+03 + 0.372689556126E+03 0.374442762115E+03 0.376187146694E+03 0.377922736103E+03 + 0.379649556512E+03 0.381367634027E+03 0.383076994688E+03 0.384777664469E+03 + 0.386469669278E+03 0.388153034958E+03 0.389827787287E+03 0.391493951978E+03 + 0.393151554677E+03 0.394800620968E+03 0.396441176369E+03 0.398073246334E+03 + 0.399696856251E+03 0.401312031446E+03 0.402918797180E+03 0.404517178651E+03 + 0.406107200991E+03 0.407688889271E+03 0.409262268496E+03 0.410827363612E+03 + 0.412384199496E+03 0.413932800968E+03 0.415473192780E+03 0.417005399625E+03 + 0.418529446133E+03 0.420045356869E+03 0.421553156338E+03 0.423052868983E+03 + 0.424544519186E+03 0.426028131264E+03 0.427503729475E+03 0.428971338015E+03 + 0.430430981018E+03 0.431882682558E+03 0.433326466648E+03 0.434762357239E+03 + 0.436190378221E+03 0.437610553425E+03 0.439022906621E+03 0.440427461519E+03 + 0.441824241767E+03 0.443213270955E+03 0.444594572613E+03 0.445968170211E+03 + 0.447334087159E+03 0.448692346807E+03 0.450042972449E+03 0.451385987315E+03 + 0.452721414580E+03 0.454049277358E+03 0.455369598706E+03 0.456682401621E+03 + 0.457987709041E+03 0.459285543849E+03 0.460575928865E+03 0.461858886856E+03 + 0.463134440527E+03 0.464402612529E+03 0.465663425451E+03 0.466916901830E+03 + 0.468163064141E+03 0.469401934803E+03 0.470633536181E+03 0.471857890579E+03 + 0.473075020246E+03 0.474284947376E+03 0.475487694103E+03 0.476683282508E+03 + 0.477871734614E+03 0.479053072388E+03 0.480227317743E+03 0.481394492532E+03 + 0.482554618558E+03 0.483707717564E+03 0.484853811238E+03 0.485992921217E+03 + 0.487125069077E+03 0.488250276343E+03 0.489368564484E+03 0.490479954914E+03 + 0.491584468993E+03 0.492682128026E+03 0.493772953264E+03 0.494856965903E+03 + 0.495934187088E+03 0.497004637905E+03 0.498068339391E+03 0.499125312526E+03 + 0.500175578239E+03 0.501219157403E+03 0.502256070841E+03 0.503286339319E+03 + 0.504309983554E+03 0.505327024206E+03 0.506337481887E+03 0.507341377151E+03 + 0.508338730504E+03 0.509329562397E+03 0.510313893230E+03 0.511291743351E+03 + 0.512263133055E+03 0.513228082586E+03 0.514186612135E+03 0.515138741843E+03 + 0.516084491800E+03 0.517023882041E+03 0.517956932555E+03 0.518883663275E+03 + 0.519804094086E+03 0.520718244821E+03 0.521626135263E+03 0.522527785144E+03 + 0.523423214145E+03 0.524312441897E+03 0.525195487982E+03 0.526072371930E+03 + 0.526943113221E+03 0.527807731286E+03 0.528666245508E+03 0.529518675216E+03 + 0.530365039693E+03 0.531205358172E+03 0.532039649835E+03 0.532867933817E+03 + 0.533690229204E+03 0.534506555030E+03 0.535316930284E+03 0.536121373904E+03 + 0.536919904781E+03 0.537712541755E+03 0.538499303621E+03 0.539280209123E+03 + 0.540055276959E+03 0.540824525778E+03 0.541587974180E+03 0.542345640720E+03 + 0.543097543904E+03 0.543843702189E+03 0.544584133987E+03 0.545318857661E+03 + 0.546047891529E+03 0.546771253859E+03 0.547488962875E+03 0.548201036751E+03 + 0.548907493618E+03 0.549608351557E+03 0.550303628606E+03 0.550993342752E+03 + 0.551677511940E+03 0.552356154068E+03 0.553029286986E+03 0.553696928499E+03 + 0.554359096369E+03 0.555015808307E+03 0.555667081983E+03 0.556312935020E+03 + 0.556953384995E+03 0.557588449441E+03 0.558218145844E+03 0.558842491646E+03 + 0.559461504246E+03 0.560075200995E+03 0.560683599202E+03 0.561286716129E+03 + 0.561884568995E+03 0.562477174974E+03 0.563064551197E+03 0.563646714750E+03 + 0.564223682675E+03 0.564795471968E+03 0.565362099586E+03 0.565923582438E+03 + 0.566479937391E+03 0.567031181268E+03 0.567577330850E+03 0.568118402873E+03 + 0.568654414031E+03 0.569185380973E+03 0.569711320308E+03 0.570232248601E+03 + 0.570748182372E+03 0.571259138102E+03 0.571765132226E+03 0.572266181139E+03 + 0.572762301194E+03 0.573253508698E+03 0.573739819921E+03 0.574221251087E+03 + 0.574697818380E+03 0.575169537942E+03 0.575636425873E+03 0.576098498230E+03 + 0.576555771031E+03 0.577008260251E+03 0.577455981825E+03 0.577898951645E+03 + 0.578337185563E+03 0.578770699390E+03 0.579199508895E+03 0.579623629808E+03 + 0.580043077817E+03 0.580457868569E+03 0.580868017673E+03 0.581273540694E+03 + 0.581674453159E+03 0.582070770555E+03 0.582462508328E+03 0.582849681883E+03 + 0.583232306587E+03 0.583610397766E+03 0.583983970708E+03 0.584353040658E+03 + 0.584717622826E+03 0.585077732377E+03 0.585433384443E+03 0.585784594111E+03 + 0.586131376432E+03 0.586473746418E+03 0.586811719041E+03 0.587145309235E+03 + 0.587474531894E+03 0.587799401874E+03 0.588119933994E+03 0.588436143031E+03 + 0.588748043727E+03 0.589055650784E+03 0.589358978867E+03 0.589658042601E+03 + 0.589952856574E+03 0.590243435337E+03 0.590529793403E+03 0.590811945245E+03 + 0.591089905300E+03 0.591363687970E+03 0.591633307614E+03 0.591898778559E+03 + 0.592160115091E+03 0.592417331461E+03 0.592670441882E+03 0.592919460530E+03 + 0.593164401544E+03 0.593405279027E+03 0.593642107045E+03 0.593874899627E+03 + 0.594103670766E+03 0.594328434417E+03 0.594549204501E+03 0.594765994900E+03 + 0.594978819464E+03 0.595187692002E+03 0.595392626290E+03 0.595593636067E+03 + 0.595790735038E+03 0.595983936869E+03 0.596173255194E+03 0.596358703608E+03 + 0.596540295673E+03 0.596718044915E+03 0.596891964824E+03 0.597062068855E+03 + 0.597228370429E+03 0.597390882931E+03 0.597549619710E+03 0.597704594083E+03 + 0.597855819330E+03 0.598003308696E+03 0.598147075393E+03 0.598287132597E+03 + 0.598423493452E+03 0.598556171064E+03 0.598685178508E+03 0.598810528823E+03 + 0.598932235014E+03 0.599050310054E+03 0.599164766878E+03 0.599275618392E+03 + 0.599382877464E+03 0.599486556931E+03 0.599586669595E+03 0.599683228227E+03 + 0.599776245560E+03 0.599865734298E+03 0.599951707110E+03 0.600034176631E+03 + 0.600113155465E+03 0.600188656180E+03 0.600260691315E+03 0.600329273371E+03 + 0.600394414822E+03 0.600456128105E+03 0.600514425627E+03 0.600569319760E+03 + 0.600620822845E+03 0.600668947192E+03 0.600713705075E+03 0.600755108740E+03 + 0.600793170398E+03 0.600827902229E+03 0.600859316380E+03 0.600887424968E+03 + 0.600912240077E+03 0.600933773759E+03 0.600952038035E+03 0.600967044895E+03 + 0.600978806295E+03 0.600987334162E+03 0.600992640391E+03 0.600994736845E+03 + 0.600993635357E+03 0.600989347729E+03 0.600981885730E+03 0.600971261100E+03 + 0.600957485547E+03 0.600940570749E+03 0.600920528353E+03 0.600897369974E+03 + 0.600871107199E+03 0.600841751583E+03 0.600809314651E+03 0.600773807896E+03 + 0.600735242782E+03 0.600693630745E+03 0.600648983187E+03 0.600601311482E+03 + 0.600550626974E+03 0.600496940977E+03 0.600440264774E+03 0.600380609620E+03 + 0.600317986739E+03 0.600252407327E+03 0.600183882548E+03 0.600112423538E+03 + 0.600038041404E+03 0.599960747224E+03 0.599880552045E+03 0.599797466885E+03 + 0.599711502735E+03 0.599622670555E+03 0.599530981277E+03 0.599436445804E+03 + 0.599339075009E+03 0.599238879738E+03 0.599135870807E+03 0.599030059005E+03 + 0.598921455090E+03 0.598810069794E+03 0.598695913819E+03 0.598578997840E+03 + 0.598459332502E+03 0.598336928423E+03 0.598211796194E+03 0.598083946375E+03 + 0.597953389500E+03 0.597820136076E+03 0.597684196580E+03 0.597545581462E+03 + 0.597404301144E+03 0.597260366023E+03 0.597113786464E+03 0.596964572809E+03 + 0.596812735368E+03 0.596658284428E+03 0.596501230246E+03 0.596341583052E+03 + 0.596179353051E+03 0.596014550418E+03 0.595847185302E+03 0.595677267827E+03 + 0.595504808086E+03 0.595329816150E+03 0.595152302060E+03 0.594972275831E+03 + 0.594789747452E+03 0.594604726885E+03 0.594417224065E+03 0.594227248902E+03 + 0.594034811278E+03 0.593839921050E+03 0.593642588048E+03 0.593442822077E+03 + 0.593240632914E+03 0.593036030311E+03 0.592829023994E+03 0.592619623664E+03 + 0.592407838995E+03 0.592193679635E+03 0.591977155207E+03 0.591758275308E+03 + 0.591537049510E+03 0.591313487359E+03 0.591087598376E+03 0.590859392056E+03 + 0.590628877868E+03 0.590396065258E+03 0.590160963644E+03 0.589923582422E+03 + 0.589683930960E+03 0.589442018603E+03 0.589197854669E+03 0.588951448453E+03 + 0.588702809226E+03 0.588451946230E+03 0.588198868687E+03 0.587943585793E+03 + 0.587686106717E+03 0.587426440606E+03 0.587164596581E+03 0.586900583742E+03 + 0.586634411160E+03 0.586366087884E+03 0.586095622939E+03 0.585823025325E+03 + 0.585548304019E+03 0.585271467973E+03 0.584992526116E+03 0.584711487351E+03 + 0.584428360559E+03 0.584143154598E+03 0.583855878299E+03 0.583566540473E+03 + 0.583275149905E+03 0.582981715357E+03 0.582686245567E+03 0.582388749252E+03 + 0.582089235102E+03 0.581787711786E+03 0.581484187950E+03 0.581178672214E+03 + 0.580871173179E+03 0.580561699419E+03 0.580250259488E+03 0.579936861914E+03 + 0.579621515206E+03 0.579304227845E+03 0.578985008294E+03 0.578663864991E+03 + 0.578340806351E+03 0.578015840767E+03 0.577688976610E+03 0.577360222227E+03 + 0.577029585943E+03 0.576697076062E+03 0.576362700864E+03 0.576026468607E+03 + 0.575688387526E+03 0.575348465837E+03 0.575006711730E+03 0.574663133375E+03 + 0.574317738919E+03 0.573970536488E+03 0.573621534185E+03 0.573270740092E+03 + 0.572918162269E+03 0.572563808753E+03 0.572207687562E+03 0.571849806690E+03 + 0.571490174110E+03 0.571128797773E+03 0.570765685611E+03 0.570400845530E+03 + 0.570034285419E+03 0.569666013143E+03 0.569296036547E+03 0.568924363455E+03 + 0.568551001668E+03 0.568175958968E+03 0.567799243114E+03 0.567420861846E+03 + 0.567040822882E+03 0.566659133918E+03 0.566275802631E+03 0.565890836677E+03 + 0.565504243689E+03 0.565116031283E+03 0.564726207050E+03 0.564334778564E+03 + 0.563941753378E+03 0.563547139022E+03 0.563150943007E+03 0.562753172826E+03 + 0.562353835947E+03 0.561952939821E+03 0.561550491878E+03 0.561146499527E+03 + 0.560740970158E+03 0.560333911141E+03 0.559925329824E+03 0.559515233538E+03 + 0.559103629590E+03 0.558690525272E+03 0.558275927852E+03 0.557859844581E+03 + 0.557442282688E+03 0.557023249383E+03 0.556602751859E+03 0.556180797284E+03 + 0.555757392812E+03 0.555332545574E+03 0.554906262683E+03 0.554478551231E+03 + 0.554049418294E+03 0.553618870924E+03 0.553186916157E+03 0.552753561010E+03 + 0.552318812479E+03 0.551882677542E+03 0.551445163156E+03 0.551006276263E+03 + 0.550566023782E+03 0.550124412615E+03 0.549681449645E+03 0.549237141736E+03 + 0.548791495732E+03 0.548344518461E+03 0.547896216729E+03 0.547446597326E+03 + 0.546995667022E+03 0.546543432569E+03 0.546089900700E+03 0.545635078131E+03 + 0.545178971557E+03 0.544721587656E+03 0.544262933088E+03 0.543803014494E+03 + 0.543341838499E+03 0.542879411705E+03 0.542415740701E+03 0.541950832055E+03 + 0.541484692317E+03 0.541017328021E+03 0.540548745680E+03 0.540078951791E+03 + 0.539607952834E+03 0.539135755268E+03 0.538662365538E+03 0.538187790068E+03 + 0.537712035267E+03 0.537235107523E+03 0.536757013211E+03 0.536277758683E+03 + 0.535797350278E+03 0.535315794316E+03 0.534833097099E+03 0.534349264911E+03 + 0.533864304020E+03 0.533378220677E+03 0.532891021114E+03 0.532402711547E+03 + 0.531913298174E+03 0.531422787178E+03 0.530931184722E+03 0.530438496953E+03 + 0.529944730003E+03 0.529449889982E+03 0.528953982989E+03 0.528457015103E+03 + 0.527958992385E+03 0.527459920883E+03 0.526959806623E+03 0.526458655620E+03 + 0.525956473868E+03 0.525453267346E+03 0.524949042017E+03 0.524443803826E+03 + 0.523937558702E+03 0.523430312558E+03 0.522922071291E+03 0.522412840779E+03 + 0.521902626888E+03 0.521391435463E+03 0.520879272335E+03 0.520366143320E+03 + 0.519852054216E+03 0.519337010805E+03 0.518821018853E+03 0.518304084110E+03 + 0.517786212311E+03 0.517267409173E+03 0.516747680398E+03 0.516227031673E+03 + 0.515705468668E+03 0.515182997038E+03 0.514659622420E+03 0.514135350438E+03 + 0.513610186700E+03 0.513084136795E+03 0.512557206302E+03 0.512029400778E+03 + 0.511500725770E+03 0.510971186806E+03 0.510440789399E+03 0.509909539049E+03 + 0.509377441237E+03 0.508844501432E+03 0.508310725084E+03 0.507776117631E+03 + 0.507240684495E+03 0.506704431081E+03 0.506167362780E+03 0.505629484968E+03 + 0.505090803007E+03 0.504551322241E+03 0.504011048001E+03 0.503469985604E+03 + 0.502928140349E+03 0.502385517522E+03 0.501842122395E+03 0.501297960222E+03 + 0.500753036246E+03 0.500207355693E+03 0.499660923773E+03 0.499113745685E+03 + 0.498565826611E+03 0.498017171717E+03 0.497467786157E+03 0.496917675070E+03 + 0.496366843579E+03 0.495815296794E+03 0.495263039809E+03 0.494710077705E+03 + 0.494156415549E+03 0.493602058392E+03 0.493047011271E+03 0.492491279210E+03 + 0.491934867217E+03 0.491377780288E+03 0.490820023402E+03 0.490261601527E+03 + 0.489702519614E+03 0.489142782602E+03 0.488582395415E+03 0.488021362963E+03 + 0.487459690141E+03 0.486897381834E+03 0.486334442908E+03 0.485770878219E+03 + 0.485206692607E+03 0.484641890898E+03 0.484076477906E+03 0.483510458431E+03 + 0.482943837258E+03 0.482376619158E+03 0.481808808891E+03 0.481240411201E+03 + 0.480671430820E+03 0.480101872464E+03 0.479531740839E+03 0.478961040634E+03 + 0.478389776528E+03 0.477817953184E+03 0.477245575252E+03 0.476672647370E+03 + 0.476099174162E+03 0.475525160238E+03 0.474950610196E+03 0.474375528620E+03 + 0.473799920080E+03 0.473223789136E+03 0.472647140331E+03 0.472069978197E+03 + 0.471492307253E+03 0.470914132004E+03 0.470335456944E+03 0.469756286552E+03 + 0.469176625294E+03 0.468596477626E+03 0.468015847987E+03 0.467434740805E+03 + 0.466853160498E+03 0.466271111467E+03 0.465688598101E+03 0.465105624780E+03 + 0.464522195866E+03 0.463938315713E+03 0.463353988658E+03 0.462769219031E+03 + 0.462184011144E+03 0.461598369299E+03 0.461012297786E+03 0.460425800881E+03 + 0.459838882849E+03 0.459251547942E+03 0.458663800400E+03 0.458075644450E+03 + 0.457487084306E+03 0.456898124173E+03 0.456308768240E+03 0.455719020685E+03 + 0.455128885676E+03 0.454538367365E+03 0.453947469895E+03 0.453356197396E+03 + 0.452764553984E+03 0.452172543767E+03 0.451580170838E+03 0.450987439278E+03 + 0.450394353157E+03 0.449800916533E+03 0.449207133453E+03 0.448613007949E+03 + 0.448018544045E+03 0.447423745752E+03 0.446828617067E+03 0.446233161978E+03 + 0.445637384460E+03 0.445041288476E+03 0.444444877980E+03 0.443848156910E+03 + 0.443251129196E+03 0.442653798755E+03 0.442056169492E+03 0.441458245302E+03 + 0.440860030067E+03 0.440261527658E+03 0.439662741935E+03 0.439063676747E+03 + 0.438464335930E+03 0.437864723310E+03 0.437264842701E+03 0.436664697905E+03 + 0.436064292716E+03 0.435463630913E+03 0.434862716265E+03 0.434261552531E+03 + 0.433660143458E+03 0.433058492781E+03 0.432456604224E+03 0.431854481503E+03 + 0.431252128318E+03 0.430649548362E+03 0.430046745315E+03 0.429443722847E+03 + 0.428840484616E+03 0.428237034270E+03 0.427633375446E+03 0.427029511770E+03 + 0.426425446856E+03 0.425821184310E+03 0.425216727725E+03 0.424612080683E+03 + 0.424007246756E+03 0.423402229506E+03 0.422797032484E+03 0.422191659229E+03 + 0.421586113270E+03 0.420980398127E+03 0.420374517308E+03 0.419768474309E+03 + 0.419162272619E+03 0.418555915714E+03 0.417949407060E+03 0.417342750112E+03 + 0.416735948316E+03 0.416129005106E+03 0.415521923907E+03 0.414914708133E+03 + 0.414307361188E+03 0.413699886466E+03 0.413092287348E+03 0.412484567209E+03 + 0.411876729411E+03 0.411268777306E+03 0.410660714237E+03 0.410052543536E+03 + 0.409444268524E+03 0.408835892514E+03 0.408227418808E+03 0.407618850697E+03 + 0.407010191464E+03 0.406401444379E+03 0.405792612704E+03 0.405183699692E+03 + 0.404574708583E+03 0.403965642611E+03 0.403356504997E+03 0.402747298952E+03 + 0.402138027680E+03 0.401528694374E+03 0.400919302214E+03 0.400309854375E+03 + 0.399700354020E+03 0.399090804302E+03 0.398481208365E+03 0.397871569342E+03 + 0.397261890359E+03 0.396652174530E+03 0.396042424960E+03 0.395432644745E+03 + 0.394822836970E+03 0.394213004712E+03 0.393603151039E+03 0.392993279007E+03 + 0.392383391665E+03 0.391773492050E+03 0.391163583192E+03 0.390553668111E+03 + 0.389943749817E+03 0.389333831311E+03 0.388723915584E+03 0.388114005619E+03 + 0.387504104389E+03 0.386894214856E+03 0.386284339977E+03 0.385674482695E+03 + 0.385064645947E+03 0.384454832660E+03 0.383845045751E+03 0.383235288129E+03 + 0.382625562693E+03 0.382015872333E+03 0.381406219931E+03 0.380796608359E+03 + 0.380187040480E+03 0.379577519147E+03 0.378968047206E+03 0.378358627494E+03 + 0.377749262837E+03 0.377139956053E+03 0.376530709952E+03 0.375921527334E+03 + 0.375312410991E+03 0.374703363706E+03 0.374094388251E+03 0.373485487394E+03 + 0.372876663889E+03 0.372267920485E+03 0.371659259919E+03 0.371050684923E+03 + 0.370442198218E+03 0.369833802515E+03 0.369225500520E+03 0.368617294928E+03 + 0.368009188426E+03 0.367401183691E+03 0.366793283393E+03 0.366185490193E+03 + 0.365577806745E+03 0.364970235691E+03 0.364362779667E+03 0.363755441301E+03 + 0.363148223210E+03 0.362541128006E+03 0.361934158289E+03 0.361327316652E+03 + 0.360720605682E+03 0.360114027954E+03 0.359507586036E+03 0.358901282489E+03 + 0.358295119864E+03 0.357689100703E+03 0.357083227544E+03 0.356477502911E+03 + 0.355871929324E+03 0.355266509292E+03 0.354661245319E+03 0.354056139898E+03 + 0.353451195515E+03 0.352846414647E+03 0.352241799765E+03 0.351637353330E+03 + 0.351033077794E+03 0.350428975605E+03 0.349825049198E+03 0.349221301003E+03 + 0.348617733442E+03 0.348014348928E+03 0.347411149866E+03 0.346808138654E+03 + 0.346205317681E+03 0.345602689329E+03 0.345000255972E+03 0.344398019975E+03 + 0.343795983697E+03 0.343194149487E+03 0.342592519688E+03 0.341991096635E+03 + 0.341389882654E+03 0.340788880064E+03 0.340188091177E+03 0.339587518295E+03 + 0.338987163716E+03 0.338387029727E+03 0.337787118608E+03 0.337187432633E+03 + 0.336587974066E+03 0.335988745166E+03 0.335389748181E+03 0.334790985355E+03 + 0.334192458922E+03 0.333594171109E+03 0.332996124137E+03 0.332398320217E+03 + 0.331800761554E+03 0.331203450345E+03 0.330606388781E+03 0.330009579042E+03 + 0.329413023305E+03 0.328816723737E+03 0.328220682498E+03 0.327624901740E+03 + 0.327029383608E+03 0.326434130242E+03 0.325839143771E+03 0.325244426319E+03 + 0.324649980001E+03 0.324055806928E+03 0.323461909199E+03 0.322868288910E+03 + 0.322274948147E+03 0.321681888990E+03 0.321089113513E+03 0.320496623779E+03 + 0.319904421848E+03 0.319312509771E+03 0.318720889591E+03 0.318129563347E+03 + 0.317538533066E+03 0.316947800773E+03 0.316357368482E+03 0.315767238202E+03 + 0.315177411936E+03 0.314587891677E+03 0.313998679412E+03 0.313409777123E+03 + 0.312821186784E+03 0.312232910360E+03 0.311644949811E+03 0.311057307090E+03 + 0.310469984143E+03 0.309882982909E+03 0.309296305320E+03 0.308709953301E+03 + 0.308123928770E+03 0.307538233640E+03 0.306952869814E+03 0.306367839191E+03 + 0.305783143662E+03 0.305198785110E+03 0.304614765415E+03 0.304031086446E+03 + 0.303447750067E+03 0.302864758137E+03 0.302282112506E+03 0.301699815018E+03 + 0.301117867509E+03 0.300536271812E+03 0.299955029750E+03 0.299374143141E+03 + 0.298793613795E+03 0.298213443517E+03 0.297633634104E+03 0.297054187348E+03 + 0.296475105033E+03 0.295896388937E+03 0.295318040832E+03 0.294740062483E+03 + 0.294162455648E+03 0.293585222079E+03 0.293008363523E+03 0.292431881718E+03 + 0.291855778397E+03 0.291280055286E+03 0.290704714105E+03 0.290129756568E+03 + 0.289555184382E+03 0.288980999247E+03 0.288407202859E+03 0.287833796904E+03 + 0.287260783066E+03 0.286688163019E+03 0.286115938433E+03 0.285544110970E+03 + 0.284972682287E+03 0.284401654035E+03 0.283831027858E+03 0.283260805393E+03 + 0.282690988273E+03 0.282121578123E+03 0.281552576562E+03 0.280983985204E+03 + 0.280415805655E+03 0.279848039516E+03 0.279280688383E+03 0.278713753843E+03 + 0.278147237480E+03 0.277581140869E+03 0.277015465582E+03 0.276450213182E+03 + 0.275885385228E+03 0.275320983272E+03 0.274757008859E+03 0.274193463532E+03 + 0.273630348823E+03 0.273067666260E+03 0.272505417367E+03 0.271943603659E+03 + 0.271382226647E+03 0.270821287835E+03 0.270260788722E+03 0.269700730800E+03 + 0.269141115555E+03 0.268581944470E+03 0.268023219018E+03 0.267464940669E+03 + 0.266907110886E+03 0.266349731126E+03 0.265792802841E+03 0.265236327478E+03 + 0.264680306475E+03 0.264124741267E+03 0.263569633283E+03 0.263014983946E+03 + 0.262460794671E+03 0.261907066871E+03 0.261353801951E+03 0.260801001311E+03 + 0.260248666344E+03 0.259696798440E+03 0.259145398982E+03 0.258594469345E+03 + 0.258044010902E+03 0.257494025019E+03 0.256944513055E+03 0.256395476366E+03 + 0.255846916300E+03 0.255298834201E+03 0.254751231406E+03 0.254204109248E+03 + 0.253657469054E+03 0.253111312145E+03 0.252565639836E+03 0.252020453437E+03 + 0.251475754254E+03 0.250931543586E+03 0.250387822725E+03 0.249844592960E+03 + 0.249301855575E+03 0.248759611846E+03 0.248217863045E+03 0.247676610438E+03 + 0.247135855287E+03 0.246595598848E+03 0.246055842370E+03 0.245516587098E+03 + 0.244977834272E+03 0.244439585126E+03 0.243901840889E+03 0.243364602785E+03 + 0.242827872030E+03 0.242291649839E+03 0.241755937419E+03 0.241220735971E+03 + 0.240686046694E+03 0.240151870778E+03 0.239618209410E+03 0.239085063772E+03 + 0.238552435039E+03 0.238020324382E+03 0.237488732967E+03 0.236957661953E+03 + 0.236427112497E+03 0.235897085747E+03 0.235367582849E+03 0.234838604943E+03 + 0.234310153162E+03 0.233782228637E+03 0.233254832491E+03 0.232727965844E+03 + 0.232201629809E+03 0.231675825496E+03 0.231150554008E+03 0.230625816444E+03 + 0.230101613898E+03 0.229577947458E+03 0.229054818207E+03 0.228532227226E+03 + 0.228010175586E+03 0.227488664357E+03 0.226967694601E+03 0.226447267378E+03 + 0.225927383742E+03 0.225408044739E+03 0.224889251415E+03 0.224371004808E+03 + 0.223853305951E+03 0.223336155874E+03 0.222819555600E+03 0.222303506148E+03 + 0.221788008532E+03 0.221273063761E+03 0.220758672840E+03 0.220244836768E+03 + 0.219731556540E+03 0.219218833145E+03 0.218706667567E+03 0.218195060788E+03 + 0.217684013782E+03 0.217173527519E+03 0.216663602966E+03 0.216154241082E+03 + 0.215645442825E+03 0.215137209144E+03 0.214629540987E+03 0.214122439295E+03 + 0.213615905005E+03 0.213109939050E+03 0.212604542356E+03 0.212099715847E+03 + 0.211595460441E+03 0.211091777050E+03 0.210588666584E+03 0.210086129947E+03 + 0.209584168038E+03 0.209082781750E+03 0.208581971976E+03 0.208081739599E+03 + 0.207582085501E+03 0.207083010557E+03 0.206584515639E+03 0.206086601615E+03 + 0.205589269345E+03 0.205092519688E+03 0.204596353497E+03 0.204100771620E+03 + 0.203605774902E+03 0.203111364181E+03 0.202617540293E+03 0.202124304067E+03 + 0.201631656331E+03 0.201139597904E+03 0.200648129604E+03 0.200157252242E+03 + 0.199666966627E+03 0.199177273562E+03 0.198688173846E+03 0.198199668273E+03 + 0.197711757632E+03 0.197224442710E+03 0.196737724287E+03 0.196251603140E+03 + 0.195766080041E+03 0.195281155758E+03 0.194796831053E+03 0.194313106686E+03 + 0.193829983412E+03 0.193347461980E+03 0.192865543136E+03 0.192384227622E+03 + 0.191903516174E+03 0.191423409526E+03 0.190943908406E+03 0.190465013537E+03 + 0.189986725639E+03 0.189509045429E+03 0.189031973616E+03 0.188555510907E+03 + 0.188079658006E+03 0.187604415610E+03 0.187129784413E+03 0.186655765105E+03 + 0.186182358372E+03 0.185709564893E+03 0.185237385347E+03 0.184765820406E+03 + 0.184294870738E+03 0.183824537008E+03 0.183354819875E+03 0.182885719996E+03 + 0.182417238022E+03 0.181949374600E+03 0.181482130374E+03 0.181015505983E+03 + 0.180549502061E+03 0.180084119240E+03 0.179619358146E+03 0.179155219402E+03 + 0.178691703625E+03 0.178228811430E+03 0.177766543428E+03 0.177304900223E+03 + 0.176843882419E+03 0.176383490612E+03 0.175923725397E+03 0.175464587363E+03 + 0.175006077096E+03 0.174548195176E+03 0.174090942183E+03 0.173634318688E+03 + 0.173178325261E+03 0.172722962468E+03 0.172268230869E+03 0.171814131023E+03 + 0.171360663481E+03 0.170907828795E+03 0.170455627508E+03 0.170004060161E+03 + 0.169553127293E+03 0.169102829437E+03 0.168653167121E+03 0.168204140871E+03 + 0.167755751208E+03 0.167307998651E+03 0.166860883712E+03 0.166414406900E+03 + 0.165968568723E+03 0.165523369680E+03 0.165078810271E+03 0.164634890988E+03 + 0.164191612323E+03 0.163748974760E+03 0.163306978783E+03 0.162865624869E+03 + 0.162424913493E+03 0.161984845126E+03 0.161545420235E+03 0.161106639281E+03 + 0.160668502725E+03 0.160231011022E+03 0.159794164622E+03 0.159357963974E+03 + 0.158922409521E+03 0.158487501703E+03 0.158053240956E+03 0.157619627713E+03 + 0.157186662402E+03 0.156754345448E+03 0.156322677272E+03 0.155891658290E+03 + 0.155461288917E+03 0.155031569562E+03 0.154602500632E+03 0.154174082527E+03 + 0.153746315647E+03 0.153319200387E+03 0.152892737137E+03 0.152466926285E+03 + 0.152041768214E+03 0.151617263304E+03 0.151193411931E+03 0.150770214468E+03 + 0.150347671284E+03 0.149925782743E+03 0.149504549207E+03 0.149083971034E+03 + 0.148664048577E+03 0.148244782188E+03 0.147826172213E+03 0.147408218995E+03 + 0.146990922874E+03 0.146574284186E+03 0.146158303262E+03 0.145742980432E+03 + 0.145328316020E+03 0.144914310349E+03 0.144500963735E+03 0.144088276493E+03 + 0.143676248933E+03 0.143264881364E+03 0.142854174087E+03 0.142444127404E+03 + 0.142034741609E+03 0.141626016997E+03 0.141217953857E+03 0.140810552473E+03 + 0.140403813129E+03 0.139997736102E+03 0.139592321669E+03 0.139187570100E+03 + 0.138783481663E+03 0.138380056624E+03 0.137977295243E+03 0.137575197777E+03 + 0.137173764481E+03 0.136772995605E+03 0.136372891397E+03 0.135973452100E+03 + 0.135574677953E+03 0.135176569194E+03 0.134779126056E+03 0.134382348769E+03 + 0.133986237558E+03 0.133590792648E+03 0.133196014256E+03 0.132801902600E+03 + 0.132408457891E+03 0.132015680339E+03 0.131623570150E+03 0.131232127525E+03 + 0.130841352665E+03 0.130451245763E+03 0.130061807013E+03 0.129673036604E+03 + 0.129284934719E+03 0.128897501543E+03 0.128510737252E+03 0.128124642022E+03 + 0.127739216026E+03 0.127354459432E+03 0.126970372404E+03 0.126586955105E+03 + 0.126204207693E+03 0.125822130324E+03 0.125440723148E+03 0.125059986316E+03 + 0.124679919971E+03 0.124300524256E+03 0.123921799309E+03 0.123543745266E+03 + 0.123166362258E+03 0.122789650414E+03 0.122413609860E+03 0.122038240718E+03 + 0.121663543106E+03 0.121289517140E+03 0.120916162932E+03 0.120543480592E+03 + 0.120171470224E+03 0.119800131933E+03 0.119429465816E+03 0.119059471970E+03 + 0.118690150488E+03 0.118321501459E+03 0.117953524969E+03 0.117586221102E+03 + 0.117219589938E+03 0.116853631553E+03 0.116488346021E+03 0.116123733412E+03 + 0.115759793793E+03 0.115396527227E+03 0.115033933777E+03 0.114672013498E+03 + 0.114310766446E+03 0.113950192672E+03 0.113590292223E+03 0.113231065145E+03 + 0.112872511478E+03 0.112514631263E+03 0.112157424533E+03 0.111800891322E+03 + 0.111445031658E+03 0.111089845567E+03 0.110735333072E+03 0.110381494192E+03 + 0.110028328945E+03 0.109675837344E+03 0.109324019399E+03 0.108972875117E+03 + 0.108622404502E+03 0.108272607556E+03 0.107923484276E+03 0.107575034657E+03 + 0.107227258692E+03 0.106880156368E+03 0.106533727671E+03 0.106187972583E+03 + 0.105842891085E+03 0.105498483153E+03 0.105154748759E+03 0.104811687875E+03 + 0.104469300467E+03 0.104127586499E+03 0.103786545933E+03 0.103446178728E+03 + 0.103106484837E+03 0.102767464213E+03 0.102429116805E+03 0.102091442559E+03 + 0.101754441418E+03 0.101418113322E+03 0.101082458208E+03 0.100747476010E+03 + 0.100413166659E+03 0.100079530083E+03 0.997465662064E+02 0.994142749520E+02 + 0.990826562384E+02 0.987517099818E+02 0.984214360952E+02 0.980918344888E+02 + 0.977629050697E+02 0.974346477420E+02 0.971070624070E+02 0.967801489631E+02 + 0.964539073054E+02 0.961283373264E+02 0.958034389155E+02 0.954792119592E+02 + 0.951556563412E+02 0.948327719421E+02 0.945105586395E+02 0.941890163083E+02 + 0.938681448204E+02 0.935479440448E+02 0.932284138474E+02 0.929095540916E+02 + 0.925913646376E+02 0.922738453427E+02 0.919569960614E+02 0.916408166453E+02 + 0.913253069431E+02 0.910104668007E+02 0.906962960610E+02 0.903827945640E+02 + 0.900699621470E+02 0.897577986444E+02 0.894463038875E+02 0.891354777051E+02 + 0.888253199229E+02 0.885158303639E+02 0.882070088480E+02 0.878988551926E+02 + 0.875913692120E+02 0.872845507178E+02 0.869783995188E+02 0.866729154208E+02 + 0.863680982269E+02 0.860639477374E+02 0.857604637497E+02 0.854576460585E+02 + 0.851554944556E+02 0.848540087300E+02 0.845531886678E+02 0.842530340527E+02 + 0.839535446651E+02 0.836547202828E+02 0.833565606811E+02 0.830590656320E+02 + 0.827622349052E+02 0.824660682672E+02 0.821705654821E+02 0.818757263109E+02 + 0.815815505122E+02 0.812880378415E+02 0.809951880518E+02 0.807030008931E+02 + 0.804114761128E+02 0.801206134555E+02 0.798304126632E+02 0.795408734749E+02 + 0.792519956271E+02 0.789637788534E+02 0.786762228848E+02 0.783893274494E+02 + 0.781030922728E+02 0.778175170777E+02 0.775326015841E+02 0.772483455094E+02 + 0.769647485683E+02 0.766818104725E+02 0.763995309314E+02 0.761179096514E+02 + 0.758369463363E+02 0.755566406873E+02 0.752769924028E+02 0.749980011785E+02 + 0.747196667075E+02 0.744419886801E+02 0.741649667841E+02 0.738886007044E+02 + 0.736128901234E+02 0.733378347208E+02 0.730634341737E+02 0.727896881562E+02 + 0.725165963402E+02 0.722441583947E+02 0.719723739861E+02 0.717012427781E+02 + 0.714307644318E+02 0.711609386057E+02 0.708917649555E+02 0.706232431345E+02 + 0.703553727932E+02 0.700881535794E+02 0.698215851386E+02 0.695556671133E+02 + 0.692903991435E+02 0.690257808668E+02 0.687618119178E+02 0.684984919289E+02 + 0.682358205295E+02 0.679737973468E+02 0.677124220049E+02 0.674516941258E+02 + 0.671916133286E+02 0.669321792298E+02 0.666733914436E+02 0.664152495812E+02 + 0.661577532515E+02 0.659009020608E+02 0.656446956128E+02 0.653891335084E+02 + 0.651342153463E+02 0.648799407223E+02 0.646263092299E+02 0.643733204598E+02 + 0.641209740003E+02 0.638692694371E+02 0.636182063534E+02 0.633677843297E+02 + 0.631180029440E+02 0.628688617719E+02 0.626203603862E+02 0.623724983575E+02 + 0.621252752535E+02 0.618786906396E+02 0.616327440785E+02 0.613874351306E+02 + 0.611427633535E+02 0.608987283025E+02 0.606553295303E+02 0.604125665871E+02 + 0.601704390204E+02 0.599289463755E+02 0.596880881949E+02 0.594478640188E+02 + 0.592082733848E+02 0.589693158281E+02 0.587309908811E+02 0.584932980741E+02 + 0.582562369347E+02 0.580198069880E+02 0.577840077566E+02 0.575488387607E+02 + 0.573142995179E+02 0.570803895435E+02 0.568471083502E+02 0.566144554481E+02 + 0.563824303451E+02 0.561510325464E+02 0.559202615548E+02 0.556901168708E+02 + 0.554605979921E+02 0.552317044143E+02 0.550034356303E+02 0.547757911306E+02 + 0.545487704033E+02 0.543223729340E+02 0.540965982058E+02 0.538714456995E+02 + 0.536469148934E+02 0.534230052632E+02 0.531997162825E+02 0.529770474221E+02 + 0.527549981506E+02 0.525335679341E+02 0.523127562362E+02 0.520925625183E+02 + 0.518729862391E+02 0.516540268550E+02 0.514356838200E+02 0.512179565858E+02 + 0.510008446014E+02 0.507843473136E+02 0.505684641667E+02 0.503531946027E+02 + 0.501385380611E+02 0.499244939791E+02 0.497110617913E+02 0.494982409301E+02 + 0.492860308254E+02 0.490744309048E+02 0.488634405934E+02 0.486530593140E+02 + 0.484432864870E+02 0.482341215305E+02 0.480255638599E+02 0.478176128886E+02 + 0.476102680274E+02 0.474035286849E+02 0.471973942671E+02 0.469918641778E+02 + 0.467869378185E+02 0.465826145881E+02 0.463788938833E+02 0.461757750984E+02 + 0.459732576254E+02 0.457713408538E+02 0.455700241710E+02 0.453693069617E+02 + 0.451691886086E+02 0.449696684918E+02 0.447707459893E+02 0.445724204764E+02 + 0.443746913264E+02 0.441775579101E+02 0.439810195961E+02 0.437850757504E+02 + 0.435897257369E+02 0.433949689172E+02 0.432008046504E+02 0.430072322934E+02 + 0.428142512007E+02 0.426218607246E+02 0.424300602148E+02 0.422388490191E+02 + 0.420482264827E+02 0.418581919485E+02 0.416687447572E+02 0.414798842472E+02 + 0.412916097544E+02 0.411039206127E+02 0.409168161534E+02 0.407302957056E+02 + 0.405443585963E+02 0.403590041500E+02 0.401742316888E+02 0.399900405329E+02 + 0.398064299997E+02 0.396233994048E+02 0.394409480613E+02 0.392590752798E+02 + 0.390777803691E+02 0.388970626353E+02 0.387169213824E+02 0.385373559122E+02 + 0.383583655240E+02 0.381799495150E+02 0.380021071802E+02 0.378248378121E+02 + 0.376481407012E+02 0.374720151355E+02 0.372964604008E+02 0.371214757808E+02 + 0.369470605568E+02 0.367732140078E+02 0.365999354107E+02 0.364272240401E+02 + 0.362550791681E+02 0.360835000650E+02 0.359124859986E+02 0.357420362344E+02 + 0.355721500357E+02 0.354028266638E+02 0.352340653774E+02 0.350658654331E+02 + 0.348982260854E+02 0.347311465864E+02 0.345646261861E+02 0.343986641322E+02 + 0.342332596700E+02 0.340684120430E+02 0.339041204921E+02 0.337403842561E+02 + 0.335772025717E+02 0.334145746731E+02 0.332524997926E+02 0.330909771600E+02 + 0.329300060032E+02 0.327695855476E+02 0.326097150166E+02 0.324503936313E+02 + 0.322916206105E+02 0.321333951709E+02 0.319757165271E+02 0.318185838914E+02 + 0.316619964739E+02 0.315059534823E+02 0.313504541226E+02 0.311954975982E+02 + 0.310410831103E+02 0.308872098583E+02 0.307338770389E+02 0.305810838470E+02 + 0.304288294751E+02 0.302771131137E+02 0.301259339510E+02 0.299752911730E+02 + 0.298251839636E+02 0.296756115044E+02 0.295265729750E+02 0.293780675527E+02 + 0.292300944127E+02 0.290826527281E+02 0.289357416695E+02 0.287893604058E+02 + 0.286435081034E+02 0.284981839267E+02 0.283533870378E+02 0.282091165968E+02 + 0.280653717616E+02 0.279221516878E+02 0.277794555291E+02 0.276372824368E+02 + 0.274956315602E+02 0.273545020464E+02 0.272138930404E+02 0.270738036850E+02 + 0.269342331209E+02 0.267951804866E+02 0.266566449184E+02 0.265186255508E+02 + 0.263811215157E+02 0.262441319431E+02 0.261076559609E+02 0.259716926948E+02 + 0.258362412684E+02 0.257013008031E+02 0.255668704182E+02 0.254329492310E+02 + 0.252995363565E+02 0.251666309077E+02 0.250342319953E+02 0.249023387281E+02 + 0.247709502127E+02 0.246400655535E+02 0.245096838529E+02 0.243798042112E+02 + 0.242504257264E+02 0.241215474945E+02 0.239931686095E+02 0.238652881631E+02 + 0.237379052451E+02 0.236110189430E+02 0.234846283423E+02 0.233587325264E+02 + 0.232333305765E+02 0.231084215718E+02 0.229840045894E+02 0.228600787043E+02 + 0.227366429893E+02 0.226136965153E+02 0.224912383510E+02 0.223692675628E+02 + 0.222477832155E+02 0.221267843713E+02 0.220062700907E+02 0.218862394319E+02 + 0.217666914510E+02 0.216476252022E+02 0.215290397375E+02 0.214109341068E+02 + 0.212933073579E+02 0.211761585367E+02 0.210594866867E+02 0.209432908498E+02 + 0.208275700653E+02 0.207123233709E+02 0.205975498018E+02 0.204832483915E+02 + 0.203694181713E+02 0.202560581703E+02 0.201431674156E+02 0.200307449325E+02 + 0.199187897438E+02 0.198073008706E+02 0.196962773318E+02 0.195857181442E+02 + 0.194756223226E+02 0.193659888798E+02 0.192568168263E+02 0.191481051710E+02 + 0.190398529202E+02 0.189320590787E+02 0.188247226487E+02 0.187178426309E+02 + 0.186114180235E+02 0.185054478230E+02 0.183999310235E+02 0.182948666175E+02 + 0.181902535950E+02 0.180860909443E+02 0.179823776516E+02 0.178791127009E+02 + 0.177762950742E+02 0.176739237518E+02 0.175719977114E+02 0.174705159292E+02 + 0.173694773791E+02 0.172688810329E+02 0.171687258606E+02 0.170690108300E+02 + 0.169697349070E+02 0.168708970554E+02 0.167724962369E+02 0.166745314113E+02 + 0.165770015364E+02 0.164799055680E+02 0.163832424596E+02 0.162870111631E+02 + 0.161912106280E+02 0.160958398022E+02 0.160008976311E+02 0.159063830585E+02 + 0.158122950259E+02 0.157186324731E+02 0.156253943376E+02 0.155325795550E+02 + 0.154401870589E+02 0.153482157810E+02 0.152566646508E+02 0.151655325958E+02 + 0.150748185418E+02 0.149845214123E+02 0.148946401289E+02 0.148051736112E+02 + 0.147161207768E+02 0.146274805412E+02 0.145392518182E+02 0.144514335192E+02 + 0.143640245541E+02 0.142770238303E+02 0.141904302535E+02 0.141042427275E+02 + 0.140184601538E+02 0.139330814322E+02 0.138481054603E+02 0.137635311340E+02 + 0.136793573468E+02 0.135955829907E+02 0.135122069553E+02 0.134292281284E+02 + 0.133466453959E+02 0.132644576417E+02 0.131826637475E+02 0.131012625933E+02 + 0.130202530570E+02 0.129396340146E+02 0.128594043400E+02 0.127795629052E+02 + 0.127001085803E+02 0.126210402334E+02 0.125423567305E+02 0.124640569357E+02 + 0.123861397114E+02 0.123086039176E+02 0.122314484127E+02 0.121546720529E+02 + 0.120782736925E+02 0.120022521839E+02 0.119266063775E+02 0.118513351218E+02 + 0.117764372633E+02 0.117019116464E+02 0.116277571139E+02 0.115539725063E+02 + 0.114805566623E+02 0.114075084187E+02 0.113348266102E+02 0.112625100697E+02 + 0.111905576281E+02 0.111189681142E+02 0.110477403552E+02 0.109768731760E+02 + 0.109063653997E+02 0.108362158476E+02 0.107664233388E+02 0.106969866907E+02 + 0.106279047186E+02 0.105591762358E+02 0.104908000539E+02 0.104227749824E+02 + 0.103550998289E+02 0.102877733990E+02 0.102207944965E+02 0.101541619233E+02 + 0.100878744790E+02 0.100219309618E+02 0.995633016755E+01 0.989107089040E+01 + 0.982615192248E+01 0.976157205403E+01 0.969733007334E+01 0.963342476680E+01 + 0.956985491886E+01 0.950661931204E+01 0.944371672697E+01 0.938114594233E+01 + 0.931890573489E+01 0.925699487952E+01 0.919541214913E+01 0.913415631476E+01 + 0.907322614550E+01 0.901262040855E+01 0.895233786918E+01 0.889237729076E+01 + 0.883273743473E+01 0.877341706063E+01 0.871441492610E+01 0.865572978687E+01 + 0.859736039673E+01 0.853930550761E+01 0.848156386949E+01 0.842413423049E+01 + 0.836701533679E+01 0.831020593267E+01 0.825370476053E+01 0.819751056086E+01 + 0.814162207223E+01 0.808603803133E+01 0.803075717295E+01 0.797577822998E+01 + 0.792109993340E+01 0.786672101233E+01 0.781264019395E+01 0.775885620358E+01 + 0.770536776463E+01 0.765217359863E+01 0.759927242519E+01 0.754666296208E+01 + 0.749434392513E+01 0.744231402831E+01 0.739057198369E+01 0.733911650147E+01 + 0.728794628995E+01 0.723706005553E+01 0.718645650276E+01 0.713613433429E+01 + 0.708609225088E+01 0.703632895142E+01 0.698684313291E+01 0.693763349049E+01 + 0.688869871739E+01 0.684003750499E+01 0.679164854277E+01 0.674353051836E+01 + 0.669568211750E+01 0.664810202404E+01 0.660078891999E+01 0.655374148545E+01 + 0.650695839869E+01 0.646043833607E+01 0.641417997210E+01 0.636818197941E+01 + 0.632244302879E+01 0.627696178912E+01 0.623173692744E+01 0.618676710891E+01 + 0.614205099685E+01 0.609758725268E+01 0.605337453599E+01 0.600941150449E+01 + 0.596569681402E+01 0.592222911857E+01 0.587900707028E+01 0.583602931942E+01 + 0.579329451440E+01 0.575080130176E+01 0.570854832622E+01 0.566653423060E+01 + 0.562475765591E+01 0.558321724126E+01 0.554191162394E+01 0.550083943937E+01 + 0.545999932113E+01 0.541938990094E+01 0.537900980867E+01 0.533885767235E+01 + 0.529893211815E+01 0.525923177040E+01 0.521975525158E+01 0.518050118232E+01 + 0.514146818140E+01 0.510265486578E+01 0.506405985055E+01 0.502568174898E+01 + 0.498751917247E+01 0.494957073059E+01 0.491183503109E+01 0.487431067985E+01 + 0.483699628092E+01 0.479989043653E+01 0.476299174705E+01 0.472629881102E+01 + 0.468981022515E+01 0.465352458430E+01 0.461744048152E+01 0.458155650801E+01 + 0.454587125313E+01 0.451038330442E+01 0.447509124760E+01 0.443999366653E+01 + 0.440508914326E+01 0.437037625801E+01 0.433585358918E+01 0.430151971331E+01 + 0.426737320514E+01 0.423341263759E+01 0.419963658175E+01 0.416604360686E+01 + 0.413263228036E+01 0.409940116788E+01 0.406634883319E+01 0.403347383827E+01 + 0.400077474328E+01 0.396825010653E+01 0.393589848455E+01 0.390371843202E+01 + 0.387170850181E+01 0.383986724500E+01 0.380819321081E+01 0.377668494667E+01 + 0.374534099820E+01 0.371415990919E+01 0.368314022164E+01 0.365228047571E+01 + 0.362157920976E+01 0.359103496034E+01 0.356064626220E+01 0.353041164827E+01 + 0.350032964966E+01 0.347039879569E+01 0.344061761387E+01 0.341098462989E+01 + 0.338149836766E+01 0.335215734926E+01 0.332296009498E+01 0.329390512330E+01 + 0.326499095089E+01 0.323621609264E+01 0.320757906161E+01 0.317907836909E+01 + 0.315071252455E+01 0.312248003566E+01 0.309437940829E+01 0.306640914654E+01 + 0.303856775267E+01 0.301085372718E+01 0.298326557004E+01 0.295580209651E+01 + 0.292846285132E+01 0.290124748187E+01 0.287415563591E+01 0.284718696148E+01 + 0.282034110700E+01 0.279361772119E+01 0.276701645310E+01 0.274053695213E+01 + 0.271417886798E+01 0.268794185072E+01 0.266182555074E+01 0.263582961875E+01 + 0.260995370581E+01 0.258419746332E+01 0.255856054299E+01 0.253304259691E+01 + 0.250764327746E+01 0.248236223740E+01 0.245719912980E+01 0.243215360809E+01 + 0.240722532602E+01 0.238241393771E+01 0.235771909759E+01 0.233314046044E+01 + 0.230867768142E+01 0.228433041597E+01 0.226009831994E+01 0.223598104947E+01 + 0.221197826109E+01 0.218808961164E+01 0.216431475833E+01 0.214065335872E+01 + 0.211710507071E+01 0.209366955254E+01 0.207034646282E+01 0.204713546050E+01 + 0.202403620488E+01 0.200104835561E+01 0.197817157271E+01 0.195540551653E+01 + 0.193274984779E+01 0.191020422755E+01 0.188776831725E+01 0.186544177867E+01 + 0.184322427393E+01 0.182111546554E+01 0.179911501635E+01 0.177722258957E+01 + 0.175543784877E+01 0.173376045789E+01 0.171219008120E+01 0.169072638338E+01 + 0.166936902942E+01 0.164811768472E+01 0.162697201500E+01 0.160593168638E+01 + 0.158499636532E+01 0.156416571866E+01 0.154343941360E+01 0.152281711769E+01 + 0.150229849889E+01 0.148188322549E+01 0.146157096616E+01 0.144136138993E+01 + 0.142125416622E+01 0.140124896481E+01 0.138134545585E+01 0.136154330986E+01 + 0.134184219773E+01 0.132224179073E+01 0.130274176050E+01 0.128334177905E+01 + 0.126404151879E+01 0.124484065247E+01 0.122573885322E+01 0.120673579459E+01 + 0.118783115044E+01 0.116902459508E+01 0.115031580313E+01 0.113170444964E+01 + 0.111319021002E+01 0.109477276005E+01 0.107645177592E+01 0.105822693418E+01 + 0.104009791176E+01 0.102206438600E+01 0.100412603458E+01 0.986282535607E+00 + 0.968533567548E+00 0.950878809263E+00 0.933317939999E+00 0.915850639389E+00 + 0.898476587452E+00 0.881195464598E+00 0.864006951622E+00 0.846910729712E+00 + 0.829906480444E+00 0.812993885785E+00 0.796172628092E+00 0.779442390117E+00 + 0.762802855002E+00 0.746253706282E+00 0.729794627887E+00 0.713425304139E+00 + 0.697145419758E+00 0.680954659858E+00 0.664852709949E+00 0.648839255938E+00 + 0.632913984129E+00 0.617076581225E+00 0.601326734326E+00 0.585664130934E+00 + 0.570088458947E+00 0.554599406667E+00 0.539196662796E+00 0.523879916435E+00 + 0.508648857092E+00 0.493503174674E+00 0.478442559494E+00 0.463466702267E+00 + 0.448575294114E+00 0.433768026562E+00 0.419044591542E+00 0.404404681392E+00 + 0.389847988860E+00 0.375374207098E+00 0.360983029668E+00 0.346674150540E+00 + 0.332447264096E+00 0.318302065125E+00 0.304238248830E+00 0.290255510821E+00 + 0.276353547125E+00 0.262532054179E+00 0.248790728832E+00 0.235129268349E+00 + 0.221547370409E+00 0.208044733104E+00 0.194621054944E+00 0.181276034855E+00 + 0.168009372178E+00 0.154820766672E+00 0.141709918515E+00 0.128676528303E+00 + 0.115720297051E+00 0.102840926193E+00 0.900381175857E-01 0.773115735038E-01 + 0.646609966453E-01 0.520860901301E-01 0.395865575006E-01 0.271621027226E-01 + 0.148124301858E-01 0.253724470434E-02 -0.966374848236E-02 -0.217908437094E-01 + -0.338443348854E-01 -0.458245154924E-01 -0.577316785846E-01 -0.695661167886E-01 + -0.813281223019E-01 -0.930179868931E-01 -0.104636001901E+00 -0.116182458233E+00 + -0.127657646368E+00 -0.139061856350E+00 -0.150395377794E+00 -0.161658499880E+00 + -0.172851511355E+00 -0.183974700533E+00 -0.195028355293E+00 -0.206012763078E+00 + -0.216928210898E+00 -0.227774985323E+00 -0.238553372489E+00 -0.249263658094E+00 + -0.259906127397E+00 -0.270481065218E+00 -0.280988755941E+00 -0.291429483506E+00 + -0.301803531415E+00 -0.312111182729E+00 -0.322352720067E+00 -0.332528425607E+00 + -0.342638581082E+00 -0.352683467783E+00 -0.362663366558E+00 -0.372578557810E+00 + -0.382429321496E+00 -0.392215937128E+00 -0.401938683772E+00 -0.411597840049E+00 + -0.421193684128E+00 -0.430726493735E+00 -0.440196546145E+00 -0.449604118184E+00 + -0.458949486229E+00 -0.468232926207E+00 -0.477454713593E+00 -0.486615123411E+00 + -0.495714430234E+00 -0.504752908182E+00 -0.513730830920E+00 -0.522648471663E+00 + -0.531506103169E+00 -0.540303997742E+00 -0.549042427230E+00 -0.557721663025E+00 + -0.566341976064E+00 -0.574903636824E+00 -0.583406915328E+00 -0.591852081137E+00 + -0.600239403355E+00 -0.608569150627E+00 -0.616841591137E+00 -0.625056992607E+00 + -0.633215622302E+00 -0.641317747021E+00 -0.649363633103E+00 -0.657353546423E+00 + -0.665287752394E+00 -0.673166515962E+00 -0.680990101612E+00 -0.688758773361E+00 + -0.696472794763E+00 -0.704132428901E+00 -0.711737938397E+00 -0.719289585401E+00 + -0.726787631597E+00 -0.734232338199E+00 -0.741623965954E+00 -0.748962775137E+00 + -0.756249025553E+00 -0.763482976538E+00 -0.770664886954E+00 -0.777795015192E+00 + -0.784873619170E+00 -0.791900956335E+00 -0.798877283656E+00 -0.805802857632E+00 + -0.812677934283E+00 -0.819502769158E+00 -0.826277617326E+00 -0.833002733381E+00 + -0.839678371440E+00 -0.846304785141E+00 -0.852882227646E+00 -0.859410951635E+00 + -0.865891209312E+00 -0.872323252398E+00 -0.878707332134E+00 -0.885043699280E+00 + -0.891332604116E+00 -0.897574296438E+00 -0.903769025558E+00 -0.909917040306E+00 + -0.916018589028E+00 -0.922073919584E+00 -0.928083279352E+00 -0.934046915221E+00 + -0.939965073594E+00 -0.945838000389E+00 -0.951665941036E+00 -0.957449140474E+00 + -0.963187843158E+00 -0.968882293050E+00 -0.974532733626E+00 -0.980139407867E+00 + -0.985702558267E+00 -0.991222426828E+00 -0.996699255058E+00 -0.100213328397E+01 + -0.100752475410E+01 -0.101287390546E+01 -0.101818097760E+01 -0.102344620956E+01 + -0.102866983987E+01 -0.103385210659E+01 -0.103899324728E+01 -0.104409349898E+01 + -0.104915309826E+01 -0.105417228117E+01 -0.105915128328E+01 -0.106409033964E+01 + -0.106898968483E+01 -0.107384955288E+01 -0.107867017738E+01 -0.108345179138E+01 + -0.108819462742E+01 -0.109289891757E+01 -0.109756489337E+01 -0.110219278587E+01 + -0.110678282561E+01 -0.111133524263E+01 -0.111585026645E+01 -0.112032812610E+01 + -0.112476905010E+01 -0.112917326645E+01 -0.113354100266E+01 -0.113787248572E+01 + -0.114216794212E+01 -0.114642759783E+01 -0.115065167831E+01 -0.115484040852E+01 + -0.115899401289E+01 -0.116311271537E+01 -0.116719673937E+01 -0.117124630778E+01 + -0.117526164301E+01 -0.117924296693E+01 -0.118319050091E+01 -0.118710446578E+01 + -0.119098508188E+01 -0.119483256902E+01 -0.119864714650E+01 -0.120242903311E+01 + -0.120617844709E+01 -0.120989560621E+01 -0.121358072766E+01 -0.121723402817E+01 + -0.122085572391E+01 -0.122444603055E+01 -0.122800516323E+01 -0.123153333655E+01 + -0.123503076463E+01 -0.123849766103E+01 -0.124193423880E+01 -0.124534071046E+01 + -0.124871728801E+01 -0.125206418292E+01 -0.125538160615E+01 -0.125866976811E+01 + -0.126192887869E+01 -0.126515914726E+01 -0.126836078266E+01 -0.127153399319E+01 + -0.127467898662E+01 -0.127779597022E+01 -0.128088515069E+01 -0.128394673422E+01 + -0.128698092646E+01 -0.128998793253E+01 -0.129296795703E+01 -0.129592120400E+01 + -0.129884787697E+01 -0.130174817893E+01 -0.130462231231E+01 -0.130747047904E+01 + -0.131029288050E+01 -0.131308971752E+01 -0.131586119040E+01 -0.131860749892E+01 + -0.132132884230E+01 -0.132402541922E+01 -0.132669742784E+01 -0.132934506575E+01 + -0.133196853002E+01 -0.133456801719E+01 -0.133714372322E+01 -0.133969584355E+01 + -0.134222457309E+01 -0.134473010618E+01 -0.134721263664E+01 -0.134967235771E+01 + -0.135210946212E+01 -0.135452414204E+01 -0.135691658908E+01 -0.135928699433E+01 + -0.136163554832E+01 -0.136396244101E+01 -0.136626786185E+01 -0.136855199971E+01 + -0.137081504292E+01 -0.137305717926E+01 -0.137527859596E+01 -0.137747947969E+01 + -0.137966001657E+01 -0.138182039218E+01 -0.138396079154E+01 -0.138608139909E+01 + -0.138818239876E+01 -0.139026397389E+01 -0.139232630727E+01 -0.139436958115E+01 + -0.139639397720E+01 -0.139839967656E+01 -0.140038685978E+01 -0.140235570687E+01 + -0.140430639727E+01 -0.140623910988E+01 -0.140815402303E+01 -0.141005131446E+01 + -0.141193116140E+01 -0.141379374047E+01 -0.141563922775E+01 -0.141746779877E+01 + -0.141927962846E+01 -0.142107489121E+01 -0.142285376085E+01 -0.142461641062E+01 + -0.142636301321E+01 -0.142809374075E+01 -0.142980876478E+01 -0.143150825628E+01 + -0.143319238568E+01 -0.143486132282E+01 -0.143651523697E+01 -0.143815429684E+01 + -0.143977867056E+01 -0.144138852569E+01 -0.144298402923E+01 -0.144456534759E+01 + -0.144613264661E+01 -0.144768609157E+01 -0.144922584715E+01 -0.145075206453E+01 + -0.145226485068E+01 -0.145376430299E+01 -0.145525051849E+01 -0.145672359390E+01 + -0.145818362557E+01 -0.145963070950E+01 -0.146106494135E+01 -0.146248641642E+01 + -0.146389522969E+01 -0.146529147575E+01 -0.146667524885E+01 -0.146804664290E+01 + -0.146940575145E+01 -0.147075266769E+01 -0.147208748444E+01 -0.147341029419E+01 + -0.147472118906E+01 -0.147602026080E+01 -0.147730760081E+01 -0.147858330014E+01 + -0.147984744945E+01 -0.148110013905E+01 -0.148234145890E+01 -0.148357149858E+01 + -0.148479034729E+01 -0.148599809389E+01 -0.148719482685E+01 -0.148838063429E+01 + -0.148955560394E+01 -0.149071982317E+01 -0.149187337898E+01 -0.149301635799E+01 + -0.149414884643E+01 -0.149527093020E+01 -0.149638269477E+01 -0.149748422526E+01 + -0.149857560643E+01 -0.149965692261E+01 -0.150072825780E+01 -0.150178969559E+01 + -0.150284131919E+01 -0.150388321144E+01 -0.150491545478E+01 -0.150593813127E+01 + -0.150695132258E+01 -0.150795511001E+01 -0.150894957445E+01 -0.150993479640E+01 + -0.151091085599E+01 -0.151187783295E+01 -0.151283580660E+01 -0.151378485589E+01 + -0.151472505936E+01 -0.151565649516E+01 -0.151657924105E+01 -0.151749337437E+01 + -0.151839897210E+01 -0.151929611077E+01 -0.152018486656E+01 -0.152106531522E+01 + -0.152193753209E+01 -0.152280159213E+01 -0.152365756988E+01 -0.152450553948E+01 + -0.152534557466E+01 -0.152617774875E+01 -0.152700213466E+01 -0.152781880489E+01 + -0.152862783155E+01 -0.152942928631E+01 -0.153022324045E+01 -0.153100976482E+01 + -0.153178892987E+01 -0.153256080561E+01 -0.153332546167E+01 -0.153408296724E+01 + -0.153483339108E+01 -0.153557680155E+01 -0.153631326658E+01 -0.153704285369E+01 + -0.153776562997E+01 -0.153848166207E+01 -0.153919101625E+01 -0.153989375830E+01 + -0.154058995363E+01 -0.154127966719E+01 -0.154196296351E+01 -0.154263990669E+01 + -0.154331056041E+01 -0.154397498791E+01 -0.154463325198E+01 -0.154528541500E+01 + -0.154593153891E+01 -0.154657168521E+01 -0.154720591497E+01 -0.154783428881E+01 + -0.154845686692E+01 -0.154907370905E+01 -0.154968487451E+01 -0.155029042216E+01 + -0.155089041042E+01 -0.155148489729E+01 -0.155207394028E+01 -0.155265759649E+01 + -0.155323592256E+01 -0.155380897469E+01 -0.155437680861E+01 -0.155493947963E+01 + -0.155549704259E+01 -0.155604955188E+01 -0.155659706144E+01 -0.155713962476E+01 + -0.155767729487E+01 -0.155821012434E+01 -0.155873816529E+01 -0.155926146938E+01 + -0.155978008782E+01 -0.156029407134E+01 -0.156080347023E+01 -0.156130833430E+01 + -0.156180871291E+01 -0.156230465495E+01 -0.156279620885E+01 -0.156328342258E+01 + -0.156376634361E+01 -0.156424501899E+01 -0.156471949527E+01 -0.156518981853E+01 + -0.156565603439E+01 -0.156611818800E+01 -0.156657632402E+01 -0.156703048666E+01 + -0.156748071964E+01 -0.156792706621E+01 -0.156836956913E+01 -0.156880827069E+01 + -0.156924321272E+01 -0.156967443654E+01 -0.157010198300E+01 -0.157052589247E+01 + -0.157094620485E+01 -0.157136295953E+01 -0.157177619543E+01 -0.157218595098E+01 + -0.157259226413E+01 -0.157299517234E+01 -0.157339471257E+01 -0.157379092130E+01 + -0.157418383452E+01 -0.157457348772E+01 -0.157495991591E+01 -0.157534315358E+01 + -0.157572323476E+01 -0.157610019296E+01 -0.157647406121E+01 -0.157684487201E+01 + -0.157721265740E+01 -0.157757744889E+01 -0.157793927752E+01 -0.157829817379E+01 + -0.157865416772E+01 -0.157900728883E+01 -0.157935756612E+01 -0.157970502810E+01 + -0.158004970275E+01 -0.158039161757E+01 -0.158073079952E+01 -0.158106727508E+01 + -0.158140107021E+01 -0.158173221033E+01 -0.158206072040E+01 -0.158238662481E+01 + -0.158270994747E+01 -0.158303071177E+01 -0.158334894058E+01 -0.158366465624E+01 + -0.158397788058E+01 -0.158428863492E+01 -0.158459694004E+01 -0.158490281621E+01 + -0.158520628317E+01 -0.158550736015E+01 -0.158580606584E+01 -0.158610241840E+01 + -0.158639643547E+01 -0.158668813418E+01 -0.158697753110E+01 -0.158726464229E+01 + -0.158754948326E+01 -0.158783206902E+01 -0.158811241401E+01 -0.158839053216E+01 + -0.158866643685E+01 -0.158894014094E+01 -0.158921165674E+01 -0.158948099603E+01 + -0.158974817004E+01 -0.159001318947E+01 -0.159027606448E+01 -0.159053680467E+01 + -0.159079541912E+01 -0.159105191635E+01 -0.159130630434E+01 -0.159155859053E+01 + -0.159180878180E+01 -0.159205688449E+01 -0.159230290439E+01 -0.159254684673E+01 + -0.159278871622E+01 -0.159302851697E+01 -0.159326625257E+01 -0.159350192605E+01 + -0.159373553989E+01 -0.159396709599E+01 -0.159419659572E+01 -0.159442403987E+01 + -0.159464942869E+01 -0.159487276186E+01 -0.159509403850E+01 -0.159531325715E+01 + -0.159553041583E+01 -0.159574551195E+01 -0.159595854239E+01 -0.159616950343E+01 + -0.159637839081E+01 -0.159658519969E+01 -0.159678992466E+01 -0.159699255974E+01 + -0.159719309839E+01 -0.159739153349E+01 -0.159758785733E+01 -0.159778206166E+01 + -0.159797413761E+01 -0.159816407578E+01 -0.159835186617E+01 -0.159853749819E+01 + -0.159872096069E+01 -0.159890224194E+01 -0.159908132961E+01 -0.159925821081E+01 + -0.159943287205E+01 -0.159960529926E+01 -0.159977547779E+01 -0.159994339240E+01 + -0.160010902726E+01 -0.160027236596E+01 -0.160043339148E+01 -0.160059208623E+01 + -0.160074843203E+01 -0.160090241010E+01 -0.160105400105E+01 -0.160120318493E+01 + -0.160134994117E+01 -0.160149424861E+01 -0.160163608548E+01 -0.160177542945E+01 + -0.160191225754E+01 -0.160204654621E+01 -0.160217827130E+01 -0.160230740804E+01 + -0.160243393108E+01 -0.160255781444E+01 -0.160267903156E+01 -0.160279755525E+01 + -0.160291335772E+01 -0.160302641058E+01 -0.160313668482E+01 -0.160324415083E+01 + -0.160334877837E+01 -0.160345053662E+01 -0.160354939411E+01 -0.160364531877E+01 + -0.160373827793E+01 -0.160382823828E+01 -0.160391516590E+01 -0.160399902626E+01 + -0.160407978420E+01 -0.160415740395E+01 -0.160423184909E+01 -0.160430308263E+01 + -0.160437106690E+01 -0.160443576364E+01 -0.160449713396E+01 -0.160455513833E+01 + -0.160460973661E+01 -0.160466088801E+01 -0.160470855113E+01 -0.160475268394E+01 + -0.160479324376E+01 -0.160483018729E+01 -0.160486347059E+01 -0.160489304909E+01 + -0.160491887760E+01 -0.160494091026E+01 -0.160495910059E+01 -0.160497340148E+01 + -0.160498376516E+01 -0.160499014324E+01 -0.160499248668E+01 -0.160499074578E+01 + -0.160498487024E+01 -0.160497480906E+01 -0.160496051064E+01 -0.160494192271E+01 + -0.160491899236E+01 -0.160489166602E+01 -0.160485988949E+01 -0.160482360790E+01 + -0.160478276574E+01 -0.160473730685E+01 -0.160468717440E+01 -0.160463231093E+01 + -0.160457265829E+01 -0.160450815771E+01 -0.160443874974E+01 -0.160436437428E+01 + -0.160428497056E+01 -0.160420047716E+01 -0.160411083199E+01 -0.160401597231E+01 + -0.160391583470E+01 -0.160381035509E+01 -0.160369946873E+01 -0.160358311022E+01 + -0.160346121347E+01 -0.160333371175E+01 -0.160320053763E+01 -0.160306162302E+01 + -0.160291689918E+01 -0.160276629667E+01 -0.160260974538E+01 -0.160244717453E+01 + -0.160227851267E+01 -0.160210368767E+01 -0.160192262671E+01 -0.160173525631E+01 + -0.160154150229E+01 -0.160134128981E+01 -0.160113454334E+01 -0.160092118665E+01 + -0.160070114286E+01 -0.160047433438E+01 -0.160024068293E+01 -0.160000010957E+01 + -0.159975253465E+01 -0.159949787783E+01 -0.159923605810E+01 -0.159896699374E+01 + -0.159869060234E+01 -0.159840680081E+01 -0.159811550535E+01 -0.159781663148E+01 + -0.159751009401E+01 -0.159719580707E+01 -0.159687368407E+01 -0.159654363773E+01 + -0.159620558009E+01 -0.159585942247E+01 -0.159550507548E+01 -0.159514244903E+01 + -0.159477145236E+01 -0.159439199396E+01 -0.159400398163E+01 -0.159360732247E+01 + -0.159320192288E+01 -0.159278768852E+01 -0.159236452437E+01 -0.159193233468E+01 + -0.159149102300E+01 -0.159104049216E+01 -0.159058064429E+01 -0.159011138078E+01 + -0.158963260232E+01 -0.158914420888E+01 -0.158864609972E+01 -0.158813817337E+01 + -0.158762032765E+01 -0.158709245964E+01 -0.158655446571E+01 -0.158600624153E+01 + -0.158544768199E+01 -0.158487868132E+01 -0.158429913297E+01 -0.158370892970E+01 + -0.158310796352E+01 -0.158249612572E+01 -0.158187330686E+01 -0.158123939677E+01 + -0.158059428453E+01 -0.157993785852E+01 -0.157927000636E+01 -0.157859061494E+01 + -0.157789957043E+01 -0.157719675823E+01 -0.157648206304E+01 -0.157575536879E+01 + -0.157501655869E+01 -0.157426551519E+01 -0.157350212003E+01 -0.157272625417E+01 + -0.157193779784E+01 -0.157113663054E+01 -0.157032263100E+01 -0.156949567722E+01 + -0.156865564644E+01 -0.156780241516E+01 -0.156693585913E+01 -0.156605585334E+01 + -0.156516227203E+01 -0.156425498869E+01 -0.156333387606E+01 -0.156239880612E+01 + -0.156144965010E+01 -0.156048627845E+01 -0.155950856090E+01 -0.155851636638E+01 + -0.155750956309E+01 -0.155648801846E+01 -0.155545159915E+01 -0.155440017107E+01 + -0.155333359935E+01 -0.155225174837E+01 -0.155115448173E+01 -0.155004166228E+01 + -0.154891315209E+01 -0.154776881246E+01 -0.154660850392E+01 -0.154543208623E+01 + -0.154423941839E+01 -0.154303035860E+01 -0.154180476431E+01 -0.154056249219E+01 + -0.153930339812E+01 -0.153802733723E+01 -0.153673416383E+01 -0.153542373149E+01 + -0.153409589299E+01 -0.153275050031E+01 -0.153138740466E+01 -0.153000645649E+01 + -0.152860750542E+01 -0.152719040032E+01 -0.152575498925E+01 -0.152430111952E+01 + -0.152282863760E+01 -0.152133738921E+01 -0.151982721926E+01 -0.151829797189E+01 + -0.151674949041E+01 -0.151518161738E+01 -0.151359419454E+01 -0.151198706284E+01 + -0.151036006243E+01 -0.150871303267E+01 -0.150704581211E+01 -0.150535823852E+01 + -0.150365014886E+01 -0.150192137927E+01 -0.150017176512E+01 -0.149840114096E+01 + -0.149660934053E+01 -0.149479619678E+01 -0.149296154184E+01 -0.149110520704E+01 + -0.148922702289E+01 -0.148732681911E+01 -0.148540442460E+01 -0.148345966745E+01 + -0.148149237492E+01 -0.147950237349E+01 -0.147748948880E+01 -0.147545354568E+01 + -0.147339436815E+01 -0.147131177941E+01 -0.146920560184E+01 -0.146707565700E+01 + -0.146492176562E+01 -0.146274374764E+01 -0.146054142213E+01 -0.145832631147E+01 + -0.145611190995E+01 -0.145389823797E+01 -0.145168529796E+01 -0.144947309233E+01 + -0.144726162352E+01 -0.144505089395E+01 -0.144284090605E+01 -0.144063166225E+01 + -0.143842316498E+01 -0.143621541666E+01 -0.143400841972E+01 -0.143180217658E+01 + -0.142959668968E+01 -0.142739196144E+01 -0.142518799429E+01 -0.142298479065E+01 + -0.142078235296E+01 -0.141858068364E+01 -0.141637978511E+01 -0.141417965981E+01 + -0.141198031017E+01 -0.140978173860E+01 -0.140758394753E+01 -0.140538693941E+01 + -0.140319071664E+01 -0.140099528166E+01 -0.139880063689E+01 -0.139660678477E+01 + -0.139441372772E+01 -0.139222146816E+01 -0.139003000853E+01 -0.138783935125E+01 + -0.138564949875E+01 -0.138346045345E+01 -0.138127221779E+01 -0.137908479418E+01 + -0.137689818507E+01 -0.137471239287E+01 -0.137252742001E+01 -0.137034326892E+01 + -0.136815994203E+01 -0.136597744176E+01 -0.136379577054E+01 -0.136161493080E+01 + -0.135943492496E+01 -0.135725575546E+01 -0.135507742471E+01 -0.135289993516E+01 + -0.135072328921E+01 -0.134854748931E+01 -0.134637253788E+01 -0.134419843734E+01 + -0.134202519013E+01 -0.133985279867E+01 -0.133768126538E+01 -0.133551059270E+01 + -0.133334078305E+01 -0.133117183886E+01 -0.132900376255E+01 -0.132683655656E+01 + -0.132467022331E+01 -0.132250476523E+01 -0.132034018475E+01 -0.131817648428E+01 + -0.131601366627E+01 -0.131385173313E+01 -0.131169068730E+01 -0.130953053120E+01 + -0.130737126725E+01 -0.130521289790E+01 -0.130305542555E+01 -0.130089885265E+01 + -0.129874318161E+01 -0.129658841487E+01 -0.129443455485E+01 -0.129228160398E+01 + -0.129012956469E+01 -0.128797843940E+01 -0.128582823054E+01 -0.128367894053E+01 + -0.128153057182E+01 -0.127938312681E+01 -0.127723660795E+01 -0.127509101765E+01 + -0.127294635835E+01 -0.127080263247E+01 -0.126865984243E+01 -0.126651799068E+01 + -0.126437707962E+01 -0.126223711170E+01 -0.126009808933E+01 -0.125796001495E+01 + -0.125582289098E+01 -0.125368671985E+01 -0.125155150398E+01 -0.124941724581E+01 + -0.124728394776E+01 -0.124515161226E+01 -0.124302024173E+01 -0.124088983861E+01 + -0.123876040532E+01 -0.123663194428E+01 -0.123450445793E+01 -0.123237794868E+01 + -0.123025241898E+01 -0.122812787124E+01 -0.122600430790E+01 -0.122388173137E+01 + -0.122176014410E+01 -0.121963954850E+01 -0.121751994700E+01 -0.121540134203E+01 + -0.121328373601E+01 -0.121116713138E+01 -0.120905153056E+01 -0.120693693598E+01 + -0.120482335006E+01 -0.120271077524E+01 -0.120059921393E+01 -0.119848866858E+01 + -0.119637914159E+01 -0.119427063541E+01 -0.119216315246E+01 -0.119005669516E+01 + -0.118795126595E+01 -0.118584686724E+01 -0.118374350148E+01 -0.118164117108E+01 + -0.117953987847E+01 -0.117743962608E+01 -0.117534041633E+01 -0.117324225166E+01 + -0.117114513449E+01 -0.116904906725E+01 -0.116695405237E+01 -0.116486009226E+01 + -0.116276718937E+01 -0.116067534611E+01 -0.115858456492E+01 -0.115649484822E+01 + -0.115440619843E+01 -0.115231861800E+01 -0.115023210933E+01 -0.114814667487E+01 + -0.114606231704E+01 -0.114397903825E+01 -0.114189684095E+01 -0.113981572757E+01 + -0.113773570051E+01 -0.113565676222E+01 -0.113357891512E+01 -0.113150216164E+01 + -0.112942650421E+01 -0.112735194524E+01 -0.112527848718E+01 -0.112320613244E+01 + -0.112113488346E+01 -0.111906474266E+01 -0.111699571247E+01 -0.111492779531E+01 + -0.111286099362E+01 -0.111079530982E+01 -0.110873074633E+01 -0.110666730559E+01 + -0.110460499002E+01 -0.110254380206E+01 -0.110048374411E+01 -0.109842481862E+01 + -0.109636702802E+01 -0.109431037472E+01 -0.109225486115E+01 -0.109020048975E+01 + -0.108814726294E+01 -0.108609518314E+01 -0.108404425279E+01 -0.108199447431E+01 + -0.107994585013E+01 -0.107789838267E+01 -0.107585207437E+01 -0.107380692765E+01 + -0.107176294494E+01 -0.106972012866E+01 -0.106767848124E+01 -0.106563800511E+01 + -0.106359870270E+01 -0.106156057643E+01 -0.105952362873E+01 -0.105748786203E+01 + -0.105545327876E+01 -0.105341988134E+01 -0.105138767220E+01 -0.104935665376E+01 + -0.104732682846E+01 -0.104529819872E+01 -0.104327076697E+01 -0.104124453564E+01 + -0.103921950715E+01 -0.103719568393E+01 -0.103517306841E+01 -0.103315166301E+01 + -0.103113147016E+01 -0.102911249229E+01 -0.102709473183E+01 -0.102507819121E+01 + -0.102306287284E+01 -0.102104877916E+01 -0.101903591260E+01 -0.101702427558E+01 + -0.101501387053E+01 -0.101300469988E+01 -0.101099676605E+01 -0.100899007147E+01 + -0.100698461857E+01 -0.100498040978E+01 -0.100297744752E+01 -0.100097573422E+01 + -0.998975272309E+00 -0.996976064212E+00 -0.994978112357E+00 -0.992981419172E+00 + -0.990985987082E+00 -0.988991818517E+00 -0.986998915902E+00 -0.985007281666E+00 + -0.983016918235E+00 -0.981027828036E+00 -0.979040013498E+00 -0.977053477046E+00 + -0.975068221109E+00 -0.973084248113E+00 -0.971101560486E+00 -0.969120160654E+00 + -0.967140051046E+00 -0.965161234088E+00 -0.963183712208E+00 -0.961207487833E+00 + -0.959232563390E+00 -0.957258941306E+00 -0.955286624008E+00 -0.953315613924E+00 + -0.951345913481E+00 -0.949377525106E+00 -0.947410451227E+00 -0.945444694270E+00 + -0.943480256663E+00 -0.941517140833E+00 -0.939555349208E+00 -0.937594884213E+00 + -0.935635748278E+00 -0.933677943828E+00 -0.931721473292E+00 -0.929766339096E+00 + -0.927812543668E+00 -0.925860089434E+00 -0.923908978823E+00 -0.921959214260E+00 + -0.920010798175E+00 -0.918063732993E+00 -0.916118021142E+00 -0.914173665049E+00 + -0.912230667141E+00 -0.910289029846E+00 -0.908348755591E+00 -0.906409846803E+00 + -0.904472305909E+00 -0.902536135337E+00 -0.900601337514E+00 -0.898667914866E+00 + -0.896735869822E+00 -0.894805204808E+00 -0.892875922251E+00 -0.890948024580E+00 + -0.889021514220E+00 -0.887096393600E+00 -0.885172665146E+00 -0.883250331286E+00 + -0.881329394447E+00 -0.879409857056E+00 -0.877491721541E+00 -0.875574990328E+00 + -0.873659665845E+00 -0.871745750519E+00 -0.869833246777E+00 -0.867922157047E+00 + -0.866012483756E+00 -0.864104229331E+00 -0.862197396198E+00 -0.860291986787E+00 + -0.858388003522E+00 -0.856485448833E+00 -0.854584325146E+00 -0.852684634888E+00 + -0.850786380486E+00 -0.848889564369E+00 -0.846994188962E+00 -0.845100256693E+00 + -0.843207769990E+00 -0.841316731280E+00 -0.839427142989E+00 -0.837539007545E+00 + -0.835652327376E+00 -0.833767104908E+00 -0.831883342569E+00 -0.830001042786E+00 + -0.828120207986E+00 -0.826240840597E+00 -0.824362943045E+00 -0.822486517758E+00 + -0.820611567164E+00 -0.818738093688E+00 -0.816866099759E+00 -0.814995587804E+00 + -0.813126560250E+00 -0.811259019523E+00 -0.809392968053E+00 -0.807528408265E+00 + -0.805665342587E+00 -0.803803773446E+00 -0.801943703269E+00 -0.800085134484E+00 + -0.798228069517E+00 -0.796372510797E+00 -0.794518460750E+00 -0.792665921803E+00 + -0.790814896384E+00 -0.788965386920E+00 -0.787117395837E+00 -0.785270925564E+00 + -0.783425978528E+00 -0.781582557156E+00 -0.779740663874E+00 -0.777900301111E+00 + -0.776061471293E+00 -0.774224176848E+00 -0.772388420202E+00 -0.770554203784E+00 + -0.768721530020E+00 -0.766890401338E+00 -0.765060820164E+00 -0.763232788926E+00 + -0.761406310052E+00 -0.759581385968E+00 -0.757758019102E+00 -0.755936211880E+00 + -0.754115966731E+00 -0.752297286081E+00 -0.750480172358E+00 -0.748664627988E+00 + -0.746850655399E+00 -0.745038257019E+00 -0.743227435274E+00 -0.741418192592E+00 + -0.739610531399E+00 -0.737804454124E+00 -0.735999963193E+00 -0.734197061034E+00 + -0.732395750073E+00 -0.730596032739E+00 -0.728797911457E+00 -0.727001388656E+00 + -0.725206466763E+00 -0.723413148205E+00 -0.721621435409E+00 -0.719831330802E+00 + -0.718042836811E+00 -0.716255955865E+00 -0.714470690389E+00 -0.712687042812E+00 + -0.710905015560E+00 -0.709124611061E+00 -0.707345831742E+00 -0.705568680030E+00 + -0.703793158352E+00 -0.702019269136E+00 -0.700247014809E+00 -0.698476397797E+00 + -0.696707420529E+00 -0.694940085432E+00 -0.693174394932E+00 -0.691410351457E+00 + -0.689647957434E+00 -0.687887215290E+00 -0.686128127453E+00 -0.684370696350E+00 + -0.682614924408E+00 -0.680860814054E+00 -0.679108367716E+00 -0.677357587820E+00 + -0.675608476794E+00 -0.673861037065E+00 -0.672115271061E+00 -0.670371181208E+00 + -0.668628769934E+00 -0.666888039667E+00 -0.665148992832E+00 -0.663411631858E+00 + -0.661675959171E+00 -0.659941977200E+00 -0.658209688370E+00 -0.656479095110E+00 + -0.654750199847E+00 -0.653023005007E+00 -0.651297513019E+00 -0.649573726309E+00 + -0.647851647304E+00 -0.646131278432E+00 -0.644412622119E+00 -0.642695680794E+00 + -0.640980456884E+00 -0.639266952815E+00 -0.637555171014E+00 -0.635845113910E+00 + -0.634136783929E+00 -0.632430183499E+00 -0.630725315046E+00 -0.629022180998E+00 + -0.627320783783E+00 -0.625621125826E+00 -0.623923209557E+00 -0.622227037401E+00 + -0.620532611786E+00 -0.618839935139E+00 -0.617149009888E+00 -0.615459838460E+00 + -0.613772423282E+00 -0.612086766781E+00 -0.610402871384E+00 -0.608720739519E+00 + -0.607040373612E+00 -0.605361776092E+00 -0.603684949385E+00 -0.602009895918E+00 + -0.600336618120E+00 -0.598665118416E+00 -0.596995399234E+00 -0.595327463002E+00 + -0.593661312146E+00 -0.591996949094E+00 -0.590334376273E+00 -0.588673596111E+00 + -0.587014611034E+00 -0.585357423470E+00 -0.583702035845E+00 -0.582048450588E+00 + -0.580396670125E+00 -0.578746696884E+00 -0.577098533292E+00 -0.575452181776E+00 + -0.573807644763E+00 -0.572164924680E+00 -0.570524023956E+00 -0.568884945016E+00 + -0.567247690288E+00 -0.565612262200E+00 -0.563978663179E+00 -0.562346895651E+00 + -0.560716962045E+00 -0.559088864786E+00 -0.557462606304E+00 -0.555838189024E+00 + -0.554215615374E+00 -0.552594887781E+00 -0.550976008672E+00 -0.549358980475E+00 + -0.547743805617E+00 -0.546130486526E+00 -0.544519025627E+00 -0.542909425349E+00 + -0.541301688119E+00 -0.539695816363E+00 -0.538091812510E+00 -0.536489678986E+00 + -0.534889418219E+00 -0.533291032636E+00 -0.531694524664E+00 -0.530099896730E+00 + -0.528507151262E+00 -0.526916290686E+00 -0.525327317431E+00 -0.523740233922E+00 + -0.522155042588E+00 -0.520571745856E+00 -0.518990346152E+00 -0.517410845905E+00 + -0.515833247541E+00 -0.514257553488E+00 -0.512683766172E+00 -0.511111888021E+00 + -0.509541921463E+00 -0.507973868923E+00 -0.506407732831E+00 -0.504843515612E+00 + -0.503281219695E+00 -0.501720847506E+00 -0.500162401472E+00 -0.498605884021E+00 + -0.497051297580E+00 -0.495498644577E+00 -0.493947927437E+00 -0.492399148590E+00 + -0.490852310461E+00 -0.489307415478E+00 -0.487764466069E+00 -0.486223464660E+00 + -0.484684413679E+00 -0.483147315554E+00 -0.481612172710E+00 -0.480078987575E+00 + -0.478547762578E+00 -0.477018500144E+00 -0.475491202701E+00 -0.473965872677E+00 + -0.472442512498E+00 -0.470921124592E+00 -0.469401711386E+00 -0.467884275308E+00 + -0.466368818783E+00 -0.464855344241E+00 -0.463343854107E+00 -0.461834350809E+00 + -0.460326836775E+00 -0.458821314431E+00 -0.457317786205E+00 -0.455816254524E+00 + -0.454316721816E+00 -0.452819190506E+00 -0.451323663024E+00 -0.449830141795E+00 + -0.448338629248E+00 -0.446849127808E+00 -0.445361639905E+00 -0.443876167964E+00 + -0.442392714413E+00 -0.440911281679E+00 -0.439431872190E+00 -0.437954488373E+00 + -0.436479132654E+00 -0.435005807462E+00 -0.433534515223E+00 -0.432065258364E+00 + -0.430598039313E+00 -0.429132860498E+00 -0.427669724344E+00 -0.426208633280E+00 + -0.424749589733E+00 -0.423292596129E+00 -0.421837654897E+00 -0.420384768463E+00 + -0.418933939255E+00 -0.417485169699E+00 -0.416038462224E+00 -0.414593819256E+00 + -0.413151243222E+00 -0.411710736550E+00 -0.410272301666E+00 -0.408835940999E+00 + -0.407401656976E+00 -0.405969452023E+00 -0.404539328567E+00 -0.403111289037E+00 + -0.401685335859E+00 -0.400261471461E+00 -0.398839698269E+00 -0.397420018711E+00 + -0.396002435214E+00 -0.394586950206E+00 -0.393173566113E+00 -0.391762285363E+00 + -0.390353110383E+00 -0.388946043600E+00 -0.387541087442E+00 -0.386138244335E+00 + -0.384737516708E+00 -0.383338906986E+00 -0.381942417598E+00 -0.380548050971E+00 + -0.379155809531E+00 -0.377765695707E+00 -0.376377711924E+00 -0.374991860611E+00 + -0.373608144195E+00 -0.372226565103E+00 -0.370847125762E+00 -0.369469828599E+00 + -0.368094676042E+00 -0.366721670518E+00 -0.365350814454E+00 -0.363982110277E+00 + -0.362615560414E+00 -0.361251167294E+00 -0.359888933342E+00 -0.358528860986E+00 + -0.357170952654E+00 -0.355815210773E+00 -0.354461637769E+00 -0.353110236070E+00 + -0.351761008104E+00 -0.350413956297E+00 -0.349069083076E+00 -0.347726390870E+00 + -0.346385882105E+00 -0.345047559208E+00 -0.343711424607E+00 -0.342377480729E+00 + -0.341045730001E+00 -0.339716174850E+00 -0.338388817703E+00 -0.337063660989E+00 + -0.335740707133E+00 -0.334419958563E+00 -0.333101417707E+00 -0.331785086992E+00 + -0.330470968844E+00 -0.329159065691E+00 -0.327849379961E+00 -0.326541914080E+00 + -0.325236670476E+00 -0.323933651576E+00 -0.322632859807E+00 -0.321334297596E+00 + -0.320037967371E+00 -0.318743871559E+00 -0.317452012587E+00 -0.316162392883E+00 + -0.314875014872E+00 -0.313589880984E+00 -0.312306993644E+00 -0.311026355281E+00 + -0.309747968321E+00 -0.308471835192E+00 -0.307197958321E+00 -0.305926340134E+00 + -0.304656983060E+00 -0.303389889526E+00 -0.302125061958E+00 -0.300862502784E+00 + -0.299602214432E+00 -0.298344199327E+00 -0.297088459899E+00 -0.295834998573E+00 + -0.294583817778E+00 -0.293334919939E+00 -0.292088307486E+00 -0.290843982844E+00 + -0.289601948440E+00 -0.288362206704E+00 -0.287124760060E+00 -0.285889610937E+00 + -0.284656761763E+00 -0.283426214963E+00 -0.282197972965E+00 -0.280972038197E+00 + -0.279748413086E+00 -0.278527100059E+00 -0.277308101543E+00 -0.276091419965E+00 + -0.274877057753E+00 -0.273665017334E+00 -0.272455301135E+00 -0.271247911584E+00 + -0.270042851107E+00 -0.268840122131E+00 -0.267639727085E+00 -0.266441668395E+00 + -0.265245948488E+00 -0.264052569792E+00 -0.262861534734E+00 -0.261672845741E+00 + -0.260486505240E+00 -0.259302515659E+00 -0.258120879424E+00 -0.256941598964E+00 + -0.255764676705E+00 -0.254590115074E+00 -0.253417916499E+00 -0.252248083407E+00 + -0.251080618225E+00 -0.249915523380E+00 -0.248752801300E+00 -0.247592454411E+00 + -0.246434485142E+00 -0.245278895918E+00 -0.244125689169E+00 -0.242974867319E+00 + -0.241826432798E+00 -0.240680388032E+00 -0.239536735448E+00 -0.238395477474E+00 + -0.237256616537E+00 -0.236120155063E+00 -0.234986095481E+00 -0.233854440217E+00 + -0.232725191699E+00 -0.231598352354E+00 -0.230473924609E+00 -0.229351910891E+00 + -0.228232313628E+00 -0.227115135247E+00 -0.226000378174E+00 -0.224888044838E+00 + -0.223778137666E+00 -0.222670659084E+00 -0.221565611520E+00 -0.220462997401E+00 + -0.219362819154E+00 -0.218265079207E+00 -0.217169779987E+00 -0.216076923921E+00 + -0.214986513436E+00 -0.213898550959E+00 -0.212813038918E+00 -0.211729979740E+00 + -0.210649375853E+00 -0.209571229682E+00 -0.208495543656E+00 -0.207422320202E+00 + -0.206351561747E+00 -0.205283270718E+00 -0.204217449543E+00 -0.203154100649E+00 + -0.202093226462E+00 -0.201034829410E+00 -0.199978911921E+00 -0.198925476421E+00 + -0.197874525339E+00 -0.196826061100E+00 -0.195780086132E+00 -0.194736602863E+00 + -0.193695613720E+00 -0.192657121129E+00 -0.191621127519E+00 -0.190587635316E+00 + -0.189556646948E+00 -0.188528164841E+00 -0.187502191424E+00 -0.186478729123E+00 + -0.185457780365E+00 -0.184439347578E+00 -0.183423433189E+00 -0.182410039625E+00 + -0.181399169313E+00 -0.180390824681E+00 -0.179385008156E+00 -0.178381722165E+00 + -0.177380969135E+00 -0.176382751494E+00 -0.175387071668E+00 -0.174393932085E+00 + -0.173403335173E+00 -0.172415283357E+00 -0.171429779067E+00 -0.170446824728E+00 + -0.169466422768E+00 -0.168488575615E+00 -0.167513285695E+00 -0.166540555436E+00 + -0.165570387264E+00 -0.164602783608E+00 -0.163637746894E+00 -0.162675279550E+00 + -0.161715384003E+00 -0.160758062680E+00 -0.159803318008E+00 -0.158851152414E+00 + -0.157901568326E+00 -0.156954568172E+00 -0.156010154377E+00 -0.155068329370E+00 + -0.154129095577E+00 -0.153192455426E+00 -0.152258411344E+00 -0.151326965759E+00 + -0.150398121097E+00 -0.149471879786E+00 -0.148548244252E+00 -0.147627216924E+00 + -0.146708800229E+00 -0.145792996593E+00 -0.144879808443E+00 -0.143969238208E+00 + -0.143061288314E+00 -0.142155961189E+00 -0.141253259259E+00 -0.140353184952E+00 + -0.139455740696E+00 -0.138560928917E+00 -0.137668752042E+00 -0.136779212500E+00 + -0.135892312716E+00 -0.135008055119E+00 -0.134126442135E+00 -0.133247476192E+00 + -0.132371159717E+00 -0.131497495137E+00 -0.130626484880E+00 -0.129758131372E+00 + -0.128892437041E+00 -0.128029404314E+00 -0.127169035618E+00 -0.126311333381E+00 + -0.125456300030E+00 -0.124603937992E+00 -0.123754249693E+00 -0.122907237563E+00 + -0.122062904026E+00 -0.121221251512E+00 -0.120382282447E+00 -0.119545999258E+00 + -0.118712404373E+00 -0.117881500218E+00 -0.117053289222E+00 -0.116227773810E+00 + -0.115404956411E+00 -0.114584839452E+00 -0.113767425359E+00 -0.112952716561E+00 + -0.112140715484E+00 -0.111331424555E+00 -0.110524846203E+00 -0.109720982853E+00 + -0.108919836933E+00 -0.108121410871E+00 -0.107325707093E+00 -0.106532728028E+00 + -0.105742476101E+00 -0.104954953741E+00 -0.104170163374E+00 -0.103388107428E+00 + -0.102608788330E+00 -0.101832208508E+00 -0.101058370387E+00 -0.100287276397E+00 + -0.995189289630E-01 -0.987533305133E-01 -0.979904834750E-01 -0.972303902752E-01 + -0.964730533412E-01 -0.957184751001E-01 -0.949666579793E-01 -0.942176044059E-01 + -0.934713168072E-01 -0.927277976104E-01 -0.919870492426E-01 -0.912490741313E-01 + -0.905138747034E-01 -0.897814533863E-01 -0.890518126073E-01 -0.883249547934E-01 + -0.876008823720E-01 -0.868795977703E-01 -0.861611034155E-01 -0.854454017347E-01 + -0.847324951553E-01 -0.840223861045E-01 -0.833150770094E-01 -0.826105702974E-01 + -0.819088683956E-01 -0.812099737312E-01 -0.805138887315E-01 -0.798206158237E-01 + -0.791301574350E-01 -0.784425159927E-01 -0.777576939239E-01 -0.770756936559E-01 + -0.763965176160E-01 -0.757201682312E-01 -0.750466479289E-01 -0.743759591363E-01 + -0.737081042806E-01 -0.730430857891E-01 -0.723809060888E-01 -0.717215676072E-01 + -0.710650727713E-01 -0.704114240085E-01 -0.697606237459E-01 -0.691126744107E-01 + -0.684675784303E-01 -0.678253382317E-01 -0.671859562423E-01 -0.665494348892E-01 + -0.659157765998E-01 -0.652849838011E-01 -0.646570589204E-01 -0.640320043850E-01 + -0.634098226221E-01 -0.627905160588E-01 -0.621740871225E-01 -0.615605382402E-01 + -0.609498718394E-01 -0.603420903471E-01 -0.597371961907E-01 -0.591351917973E-01 + -0.585360795941E-01 -0.579398620084E-01 -0.573465414674E-01 -0.567561203983E-01 + -0.561686012284E-01 -0.555839863848E-01 -0.550022782948E-01 -0.544234793856E-01 + -0.538475920845E-01 -0.532746188186E-01 -0.527045620152E-01 -0.521374241015E-01 + -0.515732075047E-01 -0.510119146521E-01 -0.504535479709E-01 -0.498981098882E-01 + -0.493456028314E-01 -0.487960292276E-01 -0.482493915041E-01 -0.477056920880E-01 + -0.471649334067E-01 -0.466271178873E-01 -0.460922479570E-01 -0.455603260432E-01 + -0.450313545729E-01 -0.445053359735E-01 -0.439822726721E-01 -0.434621670959E-01 + -0.429450216723E-01 -0.424308388284E-01 -0.419196209914E-01 -0.414113705886E-01 + -0.409060900471E-01 -0.404037817943E-01 -0.399044482573E-01 -0.394080918634E-01 + -0.389147150397E-01 -0.384243202135E-01 -0.379369098121E-01 -0.374524862626E-01 + -0.369710519922E-01 -0.364926094283E-01 -0.360171609980E-01 -0.355447091285E-01 + -0.350752562470E-01 -0.346088047809E-01 -0.341453571572E-01 -0.336849158033E-01 + -0.332274831463E-01 -0.327730616135E-01 -0.323216536321E-01 -0.318732616293E-01 + -0.314278880323E-01 -0.309855352685E-01 -0.305462057649E-01 -0.301099019488E-01 + -0.296766262474E-01 -0.292463810880E-01 -0.288191688978E-01 -0.283949921040E-01 + -0.279738531338E-01 -0.275557544145E-01 -0.271406983732E-01 -0.267286874372E-01 + -0.263197240338E-01 -0.259138105901E-01 -0.255109495333E-01 -0.251111432907E-01 + -0.247143942896E-01 -0.243207049570E-01 -0.239300777204E-01 -0.235425150068E-01 + -0.231580192435E-01 -0.227765928577E-01 -0.223982382766E-01 -0.220229579276E-01 + -0.216507542377E-01 -0.212816296342E-01 -0.209155865444E-01 -0.205526273954E-01 + -0.201927546146E-01 -0.198359706290E-01 -0.194822778659E-01 -0.191316787526E-01 + -0.187841757163E-01 -0.184397711842E-01 -0.180984675835E-01 -0.177602673414E-01 + -0.174251728852E-01 -0.170931866421E-01 -0.167643110393E-01 -0.164385485040E-01 + -0.161159014635E-01 -0.157963723450E-01 -0.154799635757E-01 -0.151666775828E-01 + -0.148565167936E-01 -0.145494836352E-01 -0.142455805349E-01 -0.139448099199E-01 + -0.136471742175E-01 -0.133526758549E-01 -0.130613172592E-01 -0.127731008577E-01 + -0.124880290777E-01 -0.122061043463E-01 -0.119273290908E-01 -0.116517057384E-01 + -0.113792367163E-01 -0.111099244518E-01 -0.108437713720E-01 -0.105807799043E-01 + -0.103209524757E-01 -0.100642915136E-01 -0.981079944516E-02 -0.956047869759E-02 + -0.931333169812E-02 -0.906936087399E-02 -0.882856865241E-02 -0.859095746060E-02 + -0.835652972579E-02 -0.812528787521E-02 -0.789723433606E-02 -0.767237153559E-02 + -0.745070190100E-02 -0.723222785953E-02 -0.701695183839E-02 -0.680487626481E-02 + -0.659600356601E-02 -0.639033616922E-02 -0.618787650165E-02 -0.598862699053E-02 + -0.579259006309E-02 -0.559976814654E-02 -0.541016366811E-02 -0.522377905502E-02 + -0.504061673449E-02 -0.486067913375E-02 -0.468396868003E-02 -0.451048780053E-02 + -0.434023892249E-02 -0.417322447313E-02 -0.400944687968E-02 -0.384890856934E-02 + -0.369161196936E-02 -0.353755950694E-02 -0.338675360932E-02 -0.323919670371E-02 + -0.309489121734E-02 -0.295383957744E-02 -0.281604421122E-02 -0.268150754590E-02 + -0.255023200872E-02 -0.242222002689E-02 -0.229747402764E-02 -0.217599643819E-02 + -0.205778968575E-02 -0.194285619757E-02 -0.183119840085E-02 -0.172281872282E-02 + -0.161771959071E-02 -0.151590343173E-02 -0.141737267311E-02 -0.132212974207E-02 + -0.123017706584E-02 -0.114151707164E-02 -0.105615218669E-02 -0.974084838211E-03 + -0.895317453430E-03 -0.819852459568E-03 -0.747692283849E-03 -0.678839353495E-03 + -0.613296095729E-03 -0.551064937775E-03 -0.492148306854E-03 -0.436548630191E-03 + -0.384268335007E-03 -0.335309848527E-03 -0.289675597971E-03 -0.247368010564E-03 + -0.208389513529E-03 -0.172742534088E-03 -0.140429499464E-03 -0.111452836880E-03 + -0.858149735586E-04 -0.635183367233E-04 -0.445653535967E-04 -0.289584514017E-04 + -0.167000573612E-04 -0.779259869797E-05 -0.223850263500E-05 -0.401963951670E-07 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 + 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 0.000000000000E+00 diff --git a/aiida_lammps/tests/input_files/FeW_MO_737567242631_000.eam.alloy.yaml b/aiida_lammps/tests/input_files/FeW_MO_737567242631_000.eam.alloy.yaml new file mode 100644 index 0000000..a7cad3b --- /dev/null +++ b/aiida_lammps/tests/input_files/FeW_MO_737567242631_000.eam.alloy.yaml @@ -0,0 +1,28 @@ +species: ["Fe", "W"] +atom_style: "atomic" +pair_style: "eam" +content_origin: "NIST IPRP (https://www.ctcms.nist.gov/potentials/Fe.html#Fe-W)" +content_other_locations: Null +data_method: "unknown" +description: "EAM potential for the Fe-W system developed by Bonny et al. (2013)." +developer: ["Ellad Tadmor"] +disclaimer: "According to the developer Giovanni Bonny (as reported by the NIST IPRP), this potential was not stiffened and cannot be used in its present form for collision cascades." +properties: Null +publication_year: 2018 +source_citations: [ + { + "abstract": "Reduced activation steels are considered as structural materials for future fusion reactors. Besides iron and the main alloying element chromium, these steels contain other minor alloying elements, typically tungsten, vanadium and tantalum. In this work we study the impact of chromium and tungsten, being major alloying elements of ferritic Fe–Cr–W-based steels, on the stability and mobility of vacancy defects, typically formed under irradiation in collision cascades. For this purpose, we perform ab initio calculations, develop a many-body interatomic potential (EAM formalism) for large-scale calculations, validate the potential and apply it using an atomistic kinetic Monte Carlo method to characterize the lifetime and diffusivity of vacancy clusters. To distinguish the role of Cr and W we perform atomistic kinetic Monte Carlo simulations in Fe–Cr, Fe–W and Fe–Cr–W alloys. Within the limitation of transferability of the potentials it is found that both Cr and W enhance the diffusivity of vacancy clusters, while only W strongly reduces their lifetime. The cluster lifetime reduction increases with W concentration and saturates at about 1–2 at.%. The obtained results imply that W acts as an efficient ‘breaker’ of small migrating vacancy clusters and therefore the short-term annealing process of cascade debris is modified by the presence of W, even in small concentrations.", + "author": "Bonny, G and Castin, N and Bullens, J and Bakaev, A and Klaver, T C P and Terentyev, D", + "doi": "10.1088/0953-8984/25/31/315401", + "journal": "Journal of Physics: Condensed Matter", + "number": "31", + "pages": "315401", + "recordkey": "MO_737567242631_000a", + "recordprimary": "recordprimary", + "recordtype": "article", + "title": "On the mobility of vacancy clusters in reduced activation steels: an atomistic study in the {Fe}–{Cr}–{W} model alloy", + "volume": "25", + "year": "2013" + } +] +title: "EAM potential (LAMMPS cubic hermite tabulation) for the Fe-W system developed by Bonny et al. (2013) v000" diff --git a/aiida_lammps/tests/input_files/Fe_MO_137964310702_004.tersoff b/aiida_lammps/tests/input_files/Fe_MO_137964310702_004.tersoff new file mode 100644 index 0000000..6c607e6 --- /dev/null +++ b/aiida_lammps/tests/input_files/Fe_MO_137964310702_004.tersoff @@ -0,0 +1,3 @@ +# CITATION: Müller, Erhart, and Albe, J. Phys.: Condens. Mat. 19, 326220 (2007) + +Fe Fe Fe 1 0.0115751 0.0 1.2898716 0.3413219 0.26 1 1 1.3763540363137268 67.8647722798559 3.15 0.2 2.848104409602991 953.9485925552151 diff --git a/aiida_lammps/tests/input_files/Fe_MO_137964310702_004.tersoff.yaml b/aiida_lammps/tests/input_files/Fe_MO_137964310702_004.tersoff.yaml new file mode 100644 index 0000000..8225255 --- /dev/null +++ b/aiida_lammps/tests/input_files/Fe_MO_137964310702_004.tersoff.yaml @@ -0,0 +1,28 @@ +species: ["Fe"] +atom_style: "atomic" +pair_style: "tersoff" +content_origin: Null +content_other_locations: Null +data_method: "unknown" +description: "Tersoff-style three-body potential for bcc and fcc iron by Müller, Erhart, and Albe." +developer: ["Michael Müller", "Paul Erhart", "Karsten Albe"] +disclaimer: Null +properties: Null +publication_year: 2021 +source_citations: [ + { + "author": "Michael M{\\\"u}ller and Paul Erhart and Karsten Albe", + "doi": "10.1088/0953-8984/19/32/326220", + "journal": "Journal of Physics: Condensed Matter", + "number": "32", + "pages": "326220", + "recordkey": "MO_137964310702_004a", + "recordprimary": "recordprimary", + "recordtype": "article", + "title": "Analytic bond-order potential for bcc and fcc iron---comparison with established embedded-atom method potentials", + "volume": "19", + "year": "2007", + } +] +title: "Tersoff-style three-body potential for bcc and fcc Fe developed by Müller, Erhart, and Albe (2007) v004" + diff --git a/aiida_lammps/tests/input_files/Fe_MO_331285495617_004.morse b/aiida_lammps/tests/input_files/Fe_MO_331285495617_004.morse new file mode 100644 index 0000000..2db0c00 --- /dev/null +++ b/aiida_lammps/tests/input_files/Fe_MO_331285495617_004.morse @@ -0,0 +1,53 @@ +Fe +6.65905e+00 +-4.17400e-01 +1.38850e+00 +2.84500e+00 + +# Row 1: `rcut' cutoff value in Angstroms +# Row 2: Morse `epsilon' value in eV +# Row 3: Morse `C' value in 1/Angstroms +# Row 4: Morse `Rzero' value in Angstroms +# (See README for Pair_Morse_Shifted__MD_552566534109_001 for further details.) +# +# Parameters (epsilon, C, Rzero) for Fe taken from: +# L. A. Girifalco, V. G. Weizer, Phys. Rev., Vol 114, no 3, 1959, pp687--690 +# +# The cutoff radius is computed so that +# +# phi(rcut)=tol*|phi(rmin)|, (*) +# +# where phi(r) is the Morse potential, 'rcut' is the cutoff radius, +# `rmin' is the radius at which phi(r) is a minimum, and +# `tol' is a small number. Here, (*) is solved numerically for `rcut'. +# +# `cutoff' in this file is for a "Low" tolerance of tol = 1.00000e-02. +# + +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the Common Development +# and Distribution License Version 1.0 (the "License"). +# +# You can obtain a copy of the license at +# http://www.opensource.org/licenses/CDDL-1.0. See the License for the +# specific language governing permissions and limitations under the License. +# +# When distributing Covered Code, include this CDDL HEADER in each file and +# include the License file in a prominent location with the name LICENSE.CDDL. +# If applicable, add the following below this CDDL HEADER, with the fields +# enclosed by brackets "[]" replaced with your own identifying information: +# +# Portions Copyright (c) [yyyy] [name of copyright owner]. All rights reserved. +# +# CDDL HEADER END +# + +# +# Copyright (c) 2013, Regents of the University of Minnesota. +# All rights reserved. +# +# Contributors: +# Ryan S. Elliott +# diff --git a/aiida_lammps/tests/input_files/Fe_MO_331285495617_004.morse.yaml b/aiida_lammps/tests/input_files/Fe_MO_331285495617_004.morse.yaml new file mode 100644 index 0000000..766ad5e --- /dev/null +++ b/aiida_lammps/tests/input_files/Fe_MO_331285495617_004.morse.yaml @@ -0,0 +1,30 @@ +species: ["Fe"] +atom_style: "atomic" +pair_style: "morse" +content_origin: Null +content_other_locations: Null +data_method: "unknown" +description: "This is a Fe Morse Model Parameterization by Girifalco and Weizer (1959) using a low-accuracy cutoff distance. The Morse parameters were calculated using experimental values for the energy of vaporization, the lattice constant, and the compressibility. The equation of state and the elastic constants which were computed using the Morse parameters, agreed with experiment for both face-centered and body-centered cubic metals. All stability conditions were also satisfied for both the face-centered and the body-centered metals. This shows that the Morse function can be applied validly to problems involving any type of deformation of the cubic metals." +developer: ["Ryan S. Elliott"] +disclaimer: "According to the developer Giovanni Bonny (as reported by the NIST IPRP), this potential was not stiffened and cannot be used in its present form for collision cascades." +properties: Null +publication_year: 2020 +source_citations: [ + { + "author": "Girifalco, L. A. and Weizer, V. G.", + "doi": "10.1103/PhysRev.114.687", + "issue": "3", + "journal": "Physical Review", + "month": "May", + "numpages": "0", + "pages": "687--690", + "publisher": "American Physical Society", + "recordkey": "MO_331285495617_004a", + "recordprimary": "recordprimary", + "recordtype": "article", + "title": "Application of the {M}orse Potential Function to Cubic Metals", + "volume": "114", + "year": "1959", + } +] +title: "Morse potential (shifted) for Fe by Girifalco and Weizer (1959) using a low-accuracy cutoff distance v004" diff --git a/aiida_lammps/tests/input_files/Fe_MO_492310898779_001.meam b/aiida_lammps/tests/input_files/Fe_MO_492310898779_001.meam new file mode 100644 index 0000000..335a8ee --- /dev/null +++ b/aiida_lammps/tests/input_files/Fe_MO_492310898779_001.meam @@ -0,0 +1,11 @@ +# (1) Fe +rc = 4.000000 +delr = 0.25658351 +ialloy = 1 +nn2(1,1) = 1 +emb_lin_neg = 1 +bkgd_dyn = 0 +augt1 = 0 +repuls(1,1) = 0.000000 +Cmin(1,1,1) = 0.160000 +Cmax(1,1,1) = 2.800000 diff --git a/aiida_lammps/tests/input_files/Fe_MO_492310898779_001.meam.yaml b/aiida_lammps/tests/input_files/Fe_MO_492310898779_001.meam.yaml new file mode 100644 index 0000000..4fccdd6 --- /dev/null +++ b/aiida_lammps/tests/input_files/Fe_MO_492310898779_001.meam.yaml @@ -0,0 +1,29 @@ +species: ["Fe"] +atom_style: "atomic" +pair_style: "meam" +content_origin: "NIST IPRP (https://www.ctcms.nist.gov/potentials/Fe.html)" +content_other_locations: Null +data_method: "unknown" +description: "In this paper, molecular dynamics (MD) simulations based on the modified-embedded atom method (MEAM) and a phase-field crystal (PFC) model are utilized to quantitatively investigate the solid-liquid properties of Fe. A set of second nearest-neighbor MEAM parameters for high-temperature applications are developed for Fe, and the solid-liquid coexisting approach is utilized in MD simulations to accurately calculate the melting point, expansion in melting, latent heat, and solid-liquid interface free energy, and surface anisotropy. The required input properties to determine the PFC model parameters, such as liquid structure factor and fluctuations of atoms in the solid, are also calculated from MD simulations. The PFC parameters are calculated utilizing an iterative procedure from the inputs of MD simulations. The solid-liquid interface free energy and surface anisotropy are calculated using the PFC simulations. Very good agreement is observed between the results of our calculations from MEAM-MD and PFC simulations and the available modeling and experimental results in the literature. As an application of the developed model, the grain boundary free energy of Fe is calculated using the PFC model and the results are compared against experiments." +developer: ["Ebrahim Asadi", "Mohsen Asle Zaeem", "Sasan Nouranian", "Michael I. Baskes"] +disclaimer: Null +properties: Null +publication_year: 2021 +source_citations: [ + { + "author": "Asadi, E. and Zaeem, M. A. and Nouranian, S. and Baskes, M. I.", + "doi": "10.1103/PhysRevB.91.024105", + "journal": "Phys. Rev. B", + "month": "Jan", + "note": "", + "number": "", + "pages": "024105", + "recordkey": "MO_492310898779_001a", + "recordprimary": "recordprimary", + "recordtype": "article", + "title": "Quantitative modeling of the equilibration of two-phase solid-liquid {F}e by atomistic simulations on diffusive time scales", + "volume": "91", + "year": "2015", + } +] +title: "MEAM potential for Fe developed by Asadi et al. (2015) v001" diff --git a/aiida_lammps/tests/test_potential_data.py b/aiida_lammps/tests/test_potential_data.py index c3bb520..293b389 100644 --- a/aiida_lammps/tests/test_potential_data.py +++ b/aiida_lammps/tests/test_potential_data.py @@ -2,6 +2,7 @@ import pytest from aiida_lammps.data.potential import EmpiricalPotential +from aiida_lammps.data.lammps_potential import LammpsPotentialData def test_list_potentials(): @@ -67,3 +68,18 @@ def test_input_lines( data=potential.data, ) file_regression.check(node.get_input_lines()) + + +@pytest.mark.parametrize( + 'potential_type', + ['tersoff', 'eam', 'meam', 'morse'], +) +def test_lammps_potentials( + db_test_app, # pylint: disable=unused-argument + get_lammps_potential_data, + potential_type, + file_regression, +): + + potential_file, potential_metadata = get_lammps_potential_data(potential_type) + node = LammpsPotentialData(source=potential_file, filename=potential_file, pair_style=potential_type,**potential_metadata,) diff --git a/conftest.py b/conftest.py index 48486d7..2328e14 100644 --- a/conftest.py +++ b/conftest.py @@ -228,7 +228,7 @@ def _get_structure_data(pkey): @pytest.fixture(scope='function') def get_potential_data(get_structure_data): - """Get the potnetial information for different types of potentials. + """Get the potential information for different types of potentials. :param get_structure_data: Structure to be used in the simulation :type get_structure_data: orm.StructureData @@ -341,3 +341,27 @@ def _get_potential_data(pkey): ) return _get_potential_data + + +@pytest.fixture(scope='function') +def get_lammps_potential_data(get_structure_data): + """Get the potential information for different types of potentials. + + :param get_structure_data: Structure to be used in the simulation + :type get_structure_data: orm.StructureData + """ + def _get_lammps_potential_data(pkey): + """return data to create a potential, + and accompanying structure data and expected output data to test it with + """ + if pkey == 'eam': + pair_style = 'eam' + filename = os.path.join(TEST_DIR, 'input_files', 'FeW_MO_737567242631_000.eam.alloy') + with io.open(filename) as handle: + potential_dict = { + 'type': 'fs', + 'file_contents': handle.readlines(), + 'element_names': ['Fe'], + } + structure = get_structure_data('Fe') + output_dict = {'initial_energy': -8.2441284, 'energy': -8.2448702} From 27261625a1d545b447cd86e8f4d589f609187645 Mon Sep 17 00:00:00 2001 From: Jonathan Chico Date: Tue, 7 Dec 2021 13:04:38 +0100 Subject: [PATCH 41/70] Adding tests for the new potential type in aiida-lammps. --- .../FeW_MO_737567242631_000.eam.alloy.yaml | 52 +++++----- .../Fe_MO_137964310702_004.tersoff.yaml | 50 +++++----- .../Fe_MO_331285495617_004.morse.yaml | 56 +++++------ .../Fe_MO_492310898779_001.meam.yaml | 54 ++++++----- .../test_init_eam.yaml | 4 + .../test_init_meam.yaml | 4 + .../test_init_morse.yaml | 4 + .../test_init_tersoff.yaml | 4 + aiida_lammps/tests/test_potential_data.py | 35 ++++++- aiida_lammps/tests/utils.py | 4 +- conftest.py | 94 +++++++++++++++++-- 11 files changed, 244 insertions(+), 117 deletions(-) create mode 100644 aiida_lammps/tests/test_lammps_potential_data/test_init_eam.yaml create mode 100644 aiida_lammps/tests/test_lammps_potential_data/test_init_meam.yaml create mode 100644 aiida_lammps/tests/test_lammps_potential_data/test_init_morse.yaml create mode 100644 aiida_lammps/tests/test_lammps_potential_data/test_init_tersoff.yaml diff --git a/aiida_lammps/tests/input_files/FeW_MO_737567242631_000.eam.alloy.yaml b/aiida_lammps/tests/input_files/FeW_MO_737567242631_000.eam.alloy.yaml index a7cad3b..1af5cc9 100644 --- a/aiida_lammps/tests/input_files/FeW_MO_737567242631_000.eam.alloy.yaml +++ b/aiida_lammps/tests/input_files/FeW_MO_737567242631_000.eam.alloy.yaml @@ -1,28 +1,30 @@ species: ["Fe", "W"] atom_style: "atomic" pair_style: "eam" -content_origin: "NIST IPRP (https://www.ctcms.nist.gov/potentials/Fe.html#Fe-W)" -content_other_locations: Null -data_method: "unknown" -description: "EAM potential for the Fe-W system developed by Bonny et al. (2013)." -developer: ["Ellad Tadmor"] -disclaimer: "According to the developer Giovanni Bonny (as reported by the NIST IPRP), this potential was not stiffened and cannot be used in its present form for collision cascades." -properties: Null -publication_year: 2018 -source_citations: [ - { - "abstract": "Reduced activation steels are considered as structural materials for future fusion reactors. Besides iron and the main alloying element chromium, these steels contain other minor alloying elements, typically tungsten, vanadium and tantalum. In this work we study the impact of chromium and tungsten, being major alloying elements of ferritic Fe–Cr–W-based steels, on the stability and mobility of vacancy defects, typically formed under irradiation in collision cascades. For this purpose, we perform ab initio calculations, develop a many-body interatomic potential (EAM formalism) for large-scale calculations, validate the potential and apply it using an atomistic kinetic Monte Carlo method to characterize the lifetime and diffusivity of vacancy clusters. To distinguish the role of Cr and W we perform atomistic kinetic Monte Carlo simulations in Fe–Cr, Fe–W and Fe–Cr–W alloys. Within the limitation of transferability of the potentials it is found that both Cr and W enhance the diffusivity of vacancy clusters, while only W strongly reduces their lifetime. The cluster lifetime reduction increases with W concentration and saturates at about 1–2 at.%. The obtained results imply that W acts as an efficient ‘breaker’ of small migrating vacancy clusters and therefore the short-term annealing process of cascade debris is modified by the presence of W, even in small concentrations.", - "author": "Bonny, G and Castin, N and Bullens, J and Bakaev, A and Klaver, T C P and Terentyev, D", - "doi": "10.1088/0953-8984/25/31/315401", - "journal": "Journal of Physics: Condensed Matter", - "number": "31", - "pages": "315401", - "recordkey": "MO_737567242631_000a", - "recordprimary": "recordprimary", - "recordtype": "article", - "title": "On the mobility of vacancy clusters in reduced activation steels: an atomistic study in the {Fe}–{Cr}–{W} model alloy", - "volume": "25", - "year": "2013" - } -] -title: "EAM potential (LAMMPS cubic hermite tabulation) for the Fe-W system developed by Bonny et al. (2013) v000" +units: "metal" +extra_tags: + content_origin: "NIST IPRP (https://www.ctcms.nist.gov/potentials/Fe.html#Fe-W)" + content_other_locations: Null + data_method: "unknown" + description: "EAM potential for the Fe-W system developed by Bonny et al. (2013)." + developer: ["Ellad Tadmor"] + disclaimer: "According to the developer Giovanni Bonny (as reported by the NIST IPRP), this potential was not stiffened and cannot be used in its present form for collision cascades." + properties: Null + publication_year: 2018 + source_citations: [ + { + "abstract": "Reduced activation steels are considered as structural materials for future fusion reactors. Besides iron and the main alloying element chromium, these steels contain other minor alloying elements, typically tungsten, vanadium and tantalum. In this work we study the impact of chromium and tungsten, being major alloying elements of ferritic Fe–Cr–W-based steels, on the stability and mobility of vacancy defects, typically formed under irradiation in collision cascades. For this purpose, we perform ab initio calculations, develop a many-body interatomic potential (EAM formalism) for large-scale calculations, validate the potential and apply it using an atomistic kinetic Monte Carlo method to characterize the lifetime and diffusivity of vacancy clusters. To distinguish the role of Cr and W we perform atomistic kinetic Monte Carlo simulations in Fe–Cr, Fe–W and Fe–Cr–W alloys. Within the limitation of transferability of the potentials it is found that both Cr and W enhance the diffusivity of vacancy clusters, while only W strongly reduces their lifetime. The cluster lifetime reduction increases with W concentration and saturates at about 1–2 at.%. The obtained results imply that W acts as an efficient ‘breaker’ of small migrating vacancy clusters and therefore the short-term annealing process of cascade debris is modified by the presence of W, even in small concentrations.", + "author": "Bonny, G and Castin, N and Bullens, J and Bakaev, A and Klaver, T C P and Terentyev, D", + "doi": "10.1088/0953-8984/25/31/315401", + "journal": "Journal of Physics: Condensed Matter", + "number": "31", + "pages": "315401", + "recordkey": "MO_737567242631_000a", + "recordprimary": "recordprimary", + "recordtype": "article", + "title": "On the mobility of vacancy clusters in reduced activation steels: an atomistic study in the {Fe}–{Cr}–{W} model alloy", + "volume": "25", + "year": "2013" + } + ] + title: "EAM potential (LAMMPS cubic hermite tabulation) for the Fe-W system developed by Bonny et al. (2013) v000" diff --git a/aiida_lammps/tests/input_files/Fe_MO_137964310702_004.tersoff.yaml b/aiida_lammps/tests/input_files/Fe_MO_137964310702_004.tersoff.yaml index 8225255..30fb7dd 100644 --- a/aiida_lammps/tests/input_files/Fe_MO_137964310702_004.tersoff.yaml +++ b/aiida_lammps/tests/input_files/Fe_MO_137964310702_004.tersoff.yaml @@ -1,28 +1,30 @@ species: ["Fe"] atom_style: "atomic" pair_style: "tersoff" -content_origin: Null -content_other_locations: Null -data_method: "unknown" -description: "Tersoff-style three-body potential for bcc and fcc iron by Müller, Erhart, and Albe." -developer: ["Michael Müller", "Paul Erhart", "Karsten Albe"] -disclaimer: Null -properties: Null -publication_year: 2021 -source_citations: [ - { - "author": "Michael M{\\\"u}ller and Paul Erhart and Karsten Albe", - "doi": "10.1088/0953-8984/19/32/326220", - "journal": "Journal of Physics: Condensed Matter", - "number": "32", - "pages": "326220", - "recordkey": "MO_137964310702_004a", - "recordprimary": "recordprimary", - "recordtype": "article", - "title": "Analytic bond-order potential for bcc and fcc iron---comparison with established embedded-atom method potentials", - "volume": "19", - "year": "2007", - } -] -title: "Tersoff-style three-body potential for bcc and fcc Fe developed by Müller, Erhart, and Albe (2007) v004" +units: "metal" +extra_tags: + content_origin: Null + content_other_locations: Null + data_method: "unknown" + description: "Tersoff-style three-body potential for bcc and fcc iron by Müller, Erhart, and Albe." + developer: ["Michael Müller", "Paul Erhart", "Karsten Albe"] + disclaimer: Null + properties: Null + publication_year: 2021 + source_citations: [ + { + "author": "Michael M{\\\"u}ller and Paul Erhart and Karsten Albe", + "doi": "10.1088/0953-8984/19/32/326220", + "journal": "Journal of Physics: Condensed Matter", + "number": "32", + "pages": "326220", + "recordkey": "MO_137964310702_004a", + "recordprimary": "recordprimary", + "recordtype": "article", + "title": "Analytic bond-order potential for bcc and fcc iron---comparison with established embedded-atom method potentials", + "volume": "19", + "year": "2007", + } + ] + title: "Tersoff-style three-body potential for bcc and fcc Fe developed by Müller, Erhart, and Albe (2007) v004" diff --git a/aiida_lammps/tests/input_files/Fe_MO_331285495617_004.morse.yaml b/aiida_lammps/tests/input_files/Fe_MO_331285495617_004.morse.yaml index 766ad5e..6a7e8e1 100644 --- a/aiida_lammps/tests/input_files/Fe_MO_331285495617_004.morse.yaml +++ b/aiida_lammps/tests/input_files/Fe_MO_331285495617_004.morse.yaml @@ -1,30 +1,32 @@ species: ["Fe"] atom_style: "atomic" pair_style: "morse" -content_origin: Null -content_other_locations: Null -data_method: "unknown" -description: "This is a Fe Morse Model Parameterization by Girifalco and Weizer (1959) using a low-accuracy cutoff distance. The Morse parameters were calculated using experimental values for the energy of vaporization, the lattice constant, and the compressibility. The equation of state and the elastic constants which were computed using the Morse parameters, agreed with experiment for both face-centered and body-centered cubic metals. All stability conditions were also satisfied for both the face-centered and the body-centered metals. This shows that the Morse function can be applied validly to problems involving any type of deformation of the cubic metals." -developer: ["Ryan S. Elliott"] -disclaimer: "According to the developer Giovanni Bonny (as reported by the NIST IPRP), this potential was not stiffened and cannot be used in its present form for collision cascades." -properties: Null -publication_year: 2020 -source_citations: [ - { - "author": "Girifalco, L. A. and Weizer, V. G.", - "doi": "10.1103/PhysRev.114.687", - "issue": "3", - "journal": "Physical Review", - "month": "May", - "numpages": "0", - "pages": "687--690", - "publisher": "American Physical Society", - "recordkey": "MO_331285495617_004a", - "recordprimary": "recordprimary", - "recordtype": "article", - "title": "Application of the {M}orse Potential Function to Cubic Metals", - "volume": "114", - "year": "1959", - } -] -title: "Morse potential (shifted) for Fe by Girifalco and Weizer (1959) using a low-accuracy cutoff distance v004" +units: "metal" +extra_tags: + content_origin: Null + content_other_locations: Null + data_method: "unknown" + description: "This is a Fe Morse Model Parameterization by Girifalco and Weizer (1959) using a low-accuracy cutoff distance. The Morse parameters were calculated using experimental values for the energy of vaporization, the lattice constant, and the compressibility. The equation of state and the elastic constants which were computed using the Morse parameters, agreed with experiment for both face-centered and body-centered cubic metals. All stability conditions were also satisfied for both the face-centered and the body-centered metals. This shows that the Morse function can be applied validly to problems involving any type of deformation of the cubic metals." + developer: ["Ryan S. Elliott"] + disclaimer: "According to the developer Giovanni Bonny (as reported by the NIST IPRP), this potential was not stiffened and cannot be used in its present form for collision cascades." + properties: Null + publication_year: 2020 + source_citations: [ + { + "author": "Girifalco, L. A. and Weizer, V. G.", + "doi": "10.1103/PhysRev.114.687", + "issue": "3", + "journal": "Physical Review", + "month": "May", + "numpages": "0", + "pages": "687--690", + "publisher": "American Physical Society", + "recordkey": "MO_331285495617_004a", + "recordprimary": "recordprimary", + "recordtype": "article", + "title": "Application of the {M}orse Potential Function to Cubic Metals", + "volume": "114", + "year": "1959", + } + ] + title: "Morse potential (shifted) for Fe by Girifalco and Weizer (1959) using a low-accuracy cutoff distance v004" diff --git a/aiida_lammps/tests/input_files/Fe_MO_492310898779_001.meam.yaml b/aiida_lammps/tests/input_files/Fe_MO_492310898779_001.meam.yaml index 4fccdd6..23ba559 100644 --- a/aiida_lammps/tests/input_files/Fe_MO_492310898779_001.meam.yaml +++ b/aiida_lammps/tests/input_files/Fe_MO_492310898779_001.meam.yaml @@ -1,29 +1,31 @@ species: ["Fe"] atom_style: "atomic" pair_style: "meam" -content_origin: "NIST IPRP (https://www.ctcms.nist.gov/potentials/Fe.html)" -content_other_locations: Null -data_method: "unknown" -description: "In this paper, molecular dynamics (MD) simulations based on the modified-embedded atom method (MEAM) and a phase-field crystal (PFC) model are utilized to quantitatively investigate the solid-liquid properties of Fe. A set of second nearest-neighbor MEAM parameters for high-temperature applications are developed for Fe, and the solid-liquid coexisting approach is utilized in MD simulations to accurately calculate the melting point, expansion in melting, latent heat, and solid-liquid interface free energy, and surface anisotropy. The required input properties to determine the PFC model parameters, such as liquid structure factor and fluctuations of atoms in the solid, are also calculated from MD simulations. The PFC parameters are calculated utilizing an iterative procedure from the inputs of MD simulations. The solid-liquid interface free energy and surface anisotropy are calculated using the PFC simulations. Very good agreement is observed between the results of our calculations from MEAM-MD and PFC simulations and the available modeling and experimental results in the literature. As an application of the developed model, the grain boundary free energy of Fe is calculated using the PFC model and the results are compared against experiments." -developer: ["Ebrahim Asadi", "Mohsen Asle Zaeem", "Sasan Nouranian", "Michael I. Baskes"] -disclaimer: Null -properties: Null -publication_year: 2021 -source_citations: [ - { - "author": "Asadi, E. and Zaeem, M. A. and Nouranian, S. and Baskes, M. I.", - "doi": "10.1103/PhysRevB.91.024105", - "journal": "Phys. Rev. B", - "month": "Jan", - "note": "", - "number": "", - "pages": "024105", - "recordkey": "MO_492310898779_001a", - "recordprimary": "recordprimary", - "recordtype": "article", - "title": "Quantitative modeling of the equilibration of two-phase solid-liquid {F}e by atomistic simulations on diffusive time scales", - "volume": "91", - "year": "2015", - } -] -title: "MEAM potential for Fe developed by Asadi et al. (2015) v001" +units: "metal" +extra_tags: + content_origin: "NIST IPRP (https://www.ctcms.nist.gov/potentials/Fe.html)" + content_other_locations: Null + data_method: "unknown" + description: "In this paper, molecular dynamics (MD) simulations based on the modified-embedded atom method (MEAM) and a phase-field crystal (PFC) model are utilized to quantitatively investigate the solid-liquid properties of Fe. A set of second nearest-neighbor MEAM parameters for high-temperature applications are developed for Fe, and the solid-liquid coexisting approach is utilized in MD simulations to accurately calculate the melting point, expansion in melting, latent heat, and solid-liquid interface free energy, and surface anisotropy. The required input properties to determine the PFC model parameters, such as liquid structure factor and fluctuations of atoms in the solid, are also calculated from MD simulations. The PFC parameters are calculated utilizing an iterative procedure from the inputs of MD simulations. The solid-liquid interface free energy and surface anisotropy are calculated using the PFC simulations. Very good agreement is observed between the results of our calculations from MEAM-MD and PFC simulations and the available modeling and experimental results in the literature. As an application of the developed model, the grain boundary free energy of Fe is calculated using the PFC model and the results are compared against experiments." + developer: ["Ebrahim Asadi", "Mohsen Asle Zaeem", "Sasan Nouranian", "Michael I. Baskes"] + disclaimer: Null + properties: Null + publication_year: 2021 + source_citations: [ + { + "author": "Asadi, E. and Zaeem, M. A. and Nouranian, S. and Baskes, M. I.", + "doi": "10.1103/PhysRevB.91.024105", + "journal": "Phys. Rev. B", + "month": "Jan", + "note": "", + "number": "", + "pages": "024105", + "recordkey": "MO_492310898779_001a", + "recordprimary": "recordprimary", + "recordtype": "article", + "title": "Quantitative modeling of the equilibration of two-phase solid-liquid {F}e by atomistic simulations on diffusive time scales", + "volume": "91", + "year": "2015", + } + ] + title: "MEAM potential for Fe developed by Asadi et al. (2015) v001" diff --git a/aiida_lammps/tests/test_lammps_potential_data/test_init_eam.yaml b/aiida_lammps/tests/test_lammps_potential_data/test_init_eam.yaml new file mode 100644 index 0000000..88c8c14 --- /dev/null +++ b/aiida_lammps/tests/test_lammps_potential_data/test_init_eam.yaml @@ -0,0 +1,4 @@ +md5: '2d501fdaffce2501d97f6225e1f6b0a6' +species: ['Fe', 'W'] +pair_style: 'eam' +atom_style: 'atomic' diff --git a/aiida_lammps/tests/test_lammps_potential_data/test_init_meam.yaml b/aiida_lammps/tests/test_lammps_potential_data/test_init_meam.yaml new file mode 100644 index 0000000..5e30790 --- /dev/null +++ b/aiida_lammps/tests/test_lammps_potential_data/test_init_meam.yaml @@ -0,0 +1,4 @@ +md5: '518b18551d1d9fb7307455fa1ba089d8' +species: ['Fe'] +pair_style: 'meam' +atom_style: 'atomic' diff --git a/aiida_lammps/tests/test_lammps_potential_data/test_init_morse.yaml b/aiida_lammps/tests/test_lammps_potential_data/test_init_morse.yaml new file mode 100644 index 0000000..5c519b8 --- /dev/null +++ b/aiida_lammps/tests/test_lammps_potential_data/test_init_morse.yaml @@ -0,0 +1,4 @@ +md5: '3777ad3042df4a0629c2df8a478ba9ad' +species: ['Fe'] +pair_style: 'morse' +atom_style: 'atomic' diff --git a/aiida_lammps/tests/test_lammps_potential_data/test_init_tersoff.yaml b/aiida_lammps/tests/test_lammps_potential_data/test_init_tersoff.yaml new file mode 100644 index 0000000..4690077 --- /dev/null +++ b/aiida_lammps/tests/test_lammps_potential_data/test_init_tersoff.yaml @@ -0,0 +1,4 @@ +md5: 'bde68b23ba1012c8b03ce068d0018514' +species: ['Fe'] +pair_style: 'tersoff' +atom_style: 'atomic' diff --git a/aiida_lammps/tests/test_potential_data.py b/aiida_lammps/tests/test_potential_data.py index 293b389..d0a6ea1 100644 --- a/aiida_lammps/tests/test_potential_data.py +++ b/aiida_lammps/tests/test_potential_data.py @@ -1,6 +1,11 @@ """Test the functionality of the lammps potential data object""" +import io +import os + import pytest +import yaml +from aiida_lammps.tests.utils import TEST_DIR from aiida_lammps.data.potential import EmpiricalPotential from aiida_lammps.data.lammps_potential import LammpsPotentialData @@ -78,8 +83,32 @@ def test_lammps_potentials( db_test_app, # pylint: disable=unused-argument get_lammps_potential_data, potential_type, - file_regression, ): + """Test the LAMMPS potential data type.""" + + potential_information = get_lammps_potential_data(potential_type) + node = LammpsPotentialData.get_or_create( + source=potential_information['filename'], + filename=potential_information['filename'], + **potential_information['parameters'], + ) + + reference_file = os.path.join( + TEST_DIR, + 'test_lammps_potential_data', + f'test_init_{potential_type}.yaml', + ) + + with io.open(reference_file, 'r') as handler: + reference_values = yaml.load(handler, yaml.SafeLoader) + + _attributes = ['md5', 'pair_style', 'species', 'atom_style'] + + for _attribute in _attributes: + _msg = f'attribute "{_attribute}" does not match between reference and current value' + assert reference_values[_attribute] == node.get_attribute( + _attribute), _msg - potential_file, potential_metadata = get_lammps_potential_data(potential_type) - node = LammpsPotentialData(source=potential_file, filename=potential_file, pair_style=potential_type,**potential_metadata,) + _msg = 'content of the files differ' + assert node.get_content().split( + '\n') == potential_information['potential_data'].split('\n'), _msg diff --git a/aiida_lammps/tests/utils.py b/aiida_lammps/tests/utils.py index 2b3d5be..5c31ae8 100644 --- a/aiida_lammps/tests/utils.py +++ b/aiida_lammps/tests/utils.py @@ -107,13 +107,13 @@ def get_or_create_code(entry_point, computer, executable, exec_path=None): try: code = Code.objects.get( # pylint: disable=no-member - label='{}-{}-{}'.format(entry_point, executable, computer.label)) + label=f'{entry_point}-{executable}-{computer.label}') except NotExistent: if exec_path is None: exec_path = get_path_to_executable(executable) code = Code(input_plugin_name=entry_point, remote_computer_exec=[computer, exec_path]) - code.label = '{}-{}-{}'.format(entry_point, executable, computer.label) + code.label = f'{entry_point}-{executable}-{computer.label}' code.store() return code diff --git a/conftest.py b/conftest.py index 2328e14..5b27398 100644 --- a/conftest.py +++ b/conftest.py @@ -7,6 +7,7 @@ import os import shutil import tempfile +import yaml import pytest import numpy as np from aiida.plugins import DataFactory @@ -354,14 +355,87 @@ def _get_lammps_potential_data(pkey): """return data to create a potential, and accompanying structure data and expected output data to test it with """ + output_dict = {} if pkey == 'eam': - pair_style = 'eam' - filename = os.path.join(TEST_DIR, 'input_files', 'FeW_MO_737567242631_000.eam.alloy') - with io.open(filename) as handle: - potential_dict = { - 'type': 'fs', - 'file_contents': handle.readlines(), - 'element_names': ['Fe'], - } - structure = get_structure_data('Fe') - output_dict = {'initial_energy': -8.2441284, 'energy': -8.2448702} + output_dict['filename'] = os.path.join( + 'aiida_lammps/tests', + 'input_files', + 'FeW_MO_737567242631_000.eam.alloy', + ) + + filename_parameters = os.path.join( + 'aiida_lammps/tests', + 'input_files', + 'FeW_MO_737567242631_000.eam.alloy.yaml', + ) + + with io.open(filename_parameters) as handle: + output_dict['parameters'] = yaml.load(handle, yaml.SafeLoader) + + with io.open(output_dict['filename']) as handle: + output_dict['potential_data'] = handle.read() + output_dict['structure'] = get_structure_data('Fe') + + if pkey == 'tersoff': + output_dict['filename'] = os.path.join( + 'aiida_lammps/tests', + 'input_files', + 'Fe_MO_137964310702_004.tersoff', + ) + + filename_parameters = os.path.join( + 'aiida_lammps/tests', + 'input_files', + 'Fe_MO_137964310702_004.tersoff.yaml', + ) + + with io.open(filename_parameters) as handle: + output_dict['parameters'] = yaml.load(handle, yaml.SafeLoader) + + with io.open(output_dict['filename']) as handle: + output_dict['potential_data'] = handle.read() + output_dict['structure'] = get_structure_data('Fe') + + if pkey == 'meam': + output_dict['filename'] = os.path.join( + 'aiida_lammps/tests', + 'input_files', + 'Fe_MO_492310898779_001.meam', + ) + + filename_parameters = os.path.join( + 'aiida_lammps/tests', + 'input_files', + 'Fe_MO_492310898779_001.meam.yaml', + ) + + with io.open(filename_parameters) as handle: + output_dict['parameters'] = yaml.load(handle, yaml.SafeLoader) + + with io.open(output_dict['filename']) as handle: + output_dict['potential_data'] = handle.read() + output_dict['structure'] = get_structure_data('Fe') + + if pkey == 'morse': + output_dict['filename'] = os.path.join( + 'aiida_lammps/tests', + 'input_files', + 'Fe_MO_331285495617_004.morse', + ) + + filename_parameters = os.path.join( + 'aiida_lammps/tests', + 'input_files', + 'Fe_MO_331285495617_004.morse.yaml', + ) + + with io.open(filename_parameters) as handle: + output_dict['parameters'] = yaml.load(handle, yaml.SafeLoader) + + with io.open(output_dict['filename']) as handle: + output_dict['potential_data'] = handle.read() + output_dict['structure'] = get_structure_data('Fe') + + return output_dict + + return _get_lammps_potential_data From af90443ad1876daf2d9d63591c26fbc589f153a5 Mon Sep 17 00:00:00 2001 From: Jonathan Chico Date: Tue, 7 Dec 2021 17:18:02 +0100 Subject: [PATCH 42/70] (WIP) Adding tests for the potential block for the new potential style. --- aiida_lammps/common/input_generator.py | 3 +- .../input_files/Fe_MO_331285495617_004.morse | 2 +- .../test_init_eam.yaml | 1 + .../test_init_eam_block.txt | 4 ++ .../test_init_meam.yaml | 1 + .../test_init_meam_block.txt | 4 ++ .../test_init_morse.yaml | 3 +- .../test_init_morse_block.txt | 4 ++ .../test_init_tersoff.yaml | 1 + .../test_init_tersoff_block.txt | 4 ++ aiida_lammps/tests/test_potential_data.py | 63 ++++++++++++++++++- 11 files changed, 85 insertions(+), 5 deletions(-) create mode 100644 aiida_lammps/tests/test_lammps_potential_data/test_init_eam_block.txt create mode 100644 aiida_lammps/tests/test_lammps_potential_data/test_init_meam_block.txt create mode 100644 aiida_lammps/tests/test_lammps_potential_data/test_init_morse_block.txt create mode 100644 aiida_lammps/tests/test_lammps_potential_data/test_init_tersoff_block.txt diff --git a/aiida_lammps/common/input_generator.py b/aiida_lammps/common/input_generator.py index 3ac14da..785dcc5 100644 --- a/aiida_lammps/common/input_generator.py +++ b/aiida_lammps/common/input_generator.py @@ -115,7 +115,8 @@ def write_potential_block( if default_potential[potential.pair_style].get('read_from_file'): potential_block += f'pair_coeff * * {potential_file} {" ".join(kind_symbols)}\n' if not default_potential[potential.pair_style].get('read_from_file'): - potential_block += f'pair_coeff {potential.get_content()}\n' + data = [line for line in potential.get_content().split('\n') if not line.startswith('#') and line] + potential_block += f'pair_coeff * * {" ".join(data)}\n' if 'neighbor' in parameters_potential: potential_block += f'neighbor {join_keywords(parameters_potential["neighbor"])}\n' diff --git a/aiida_lammps/tests/input_files/Fe_MO_331285495617_004.morse b/aiida_lammps/tests/input_files/Fe_MO_331285495617_004.morse index 2db0c00..c71529b 100644 --- a/aiida_lammps/tests/input_files/Fe_MO_331285495617_004.morse +++ b/aiida_lammps/tests/input_files/Fe_MO_331285495617_004.morse @@ -1,4 +1,4 @@ -Fe +# Fe 6.65905e+00 -4.17400e-01 1.38850e+00 diff --git a/aiida_lammps/tests/test_lammps_potential_data/test_init_eam.yaml b/aiida_lammps/tests/test_lammps_potential_data/test_init_eam.yaml index 88c8c14..a5c2854 100644 --- a/aiida_lammps/tests/test_lammps_potential_data/test_init_eam.yaml +++ b/aiida_lammps/tests/test_lammps_potential_data/test_init_eam.yaml @@ -2,3 +2,4 @@ md5: '2d501fdaffce2501d97f6225e1f6b0a6' species: ['Fe', 'W'] pair_style: 'eam' atom_style: 'atomic' +default_units: 'metal' diff --git a/aiida_lammps/tests/test_lammps_potential_data/test_init_eam_block.txt b/aiida_lammps/tests/test_lammps_potential_data/test_init_eam_block.txt new file mode 100644 index 0000000..58ba8b6 --- /dev/null +++ b/aiida_lammps/tests/test_lammps_potential_data/test_init_eam_block.txt @@ -0,0 +1,4 @@ +# ---- Start of Potential information ---- +pair_style eam +pair_coeff * * temp.pot Fe Fe +# ---- End of Potential information ---- diff --git a/aiida_lammps/tests/test_lammps_potential_data/test_init_meam.yaml b/aiida_lammps/tests/test_lammps_potential_data/test_init_meam.yaml index 5e30790..d3d8c5f 100644 --- a/aiida_lammps/tests/test_lammps_potential_data/test_init_meam.yaml +++ b/aiida_lammps/tests/test_lammps_potential_data/test_init_meam.yaml @@ -2,3 +2,4 @@ md5: '518b18551d1d9fb7307455fa1ba089d8' species: ['Fe'] pair_style: 'meam' atom_style: 'atomic' +default_units: 'metal' diff --git a/aiida_lammps/tests/test_lammps_potential_data/test_init_meam_block.txt b/aiida_lammps/tests/test_lammps_potential_data/test_init_meam_block.txt new file mode 100644 index 0000000..48f557b --- /dev/null +++ b/aiida_lammps/tests/test_lammps_potential_data/test_init_meam_block.txt @@ -0,0 +1,4 @@ +# ---- Start of Potential information ---- +pair_style meam +pair_coeff * * temp.pot Fe Fe +# ---- End of Potential information ---- diff --git a/aiida_lammps/tests/test_lammps_potential_data/test_init_morse.yaml b/aiida_lammps/tests/test_lammps_potential_data/test_init_morse.yaml index 5c519b8..d295c6f 100644 --- a/aiida_lammps/tests/test_lammps_potential_data/test_init_morse.yaml +++ b/aiida_lammps/tests/test_lammps_potential_data/test_init_morse.yaml @@ -1,4 +1,5 @@ -md5: '3777ad3042df4a0629c2df8a478ba9ad' +md5: '47f9ce87c408caba2ca537e174eb32e9' species: ['Fe'] pair_style: 'morse' atom_style: 'atomic' +default_units: 'metal' diff --git a/aiida_lammps/tests/test_lammps_potential_data/test_init_morse_block.txt b/aiida_lammps/tests/test_lammps_potential_data/test_init_morse_block.txt new file mode 100644 index 0000000..c90f2a5 --- /dev/null +++ b/aiida_lammps/tests/test_lammps_potential_data/test_init_morse_block.txt @@ -0,0 +1,4 @@ +# ---- Start of Potential information ---- +pair_style morse +pair_coeff * * 6.65905e+00 -4.17400e-01 1.38850e+00 2.84500e+00 +# ---- End of Potential information ---- diff --git a/aiida_lammps/tests/test_lammps_potential_data/test_init_tersoff.yaml b/aiida_lammps/tests/test_lammps_potential_data/test_init_tersoff.yaml index 4690077..907e7cd 100644 --- a/aiida_lammps/tests/test_lammps_potential_data/test_init_tersoff.yaml +++ b/aiida_lammps/tests/test_lammps_potential_data/test_init_tersoff.yaml @@ -2,3 +2,4 @@ md5: 'bde68b23ba1012c8b03ce068d0018514' species: ['Fe'] pair_style: 'tersoff' atom_style: 'atomic' +default_units: 'metal' diff --git a/aiida_lammps/tests/test_lammps_potential_data/test_init_tersoff_block.txt b/aiida_lammps/tests/test_lammps_potential_data/test_init_tersoff_block.txt new file mode 100644 index 0000000..433b3aa --- /dev/null +++ b/aiida_lammps/tests/test_lammps_potential_data/test_init_tersoff_block.txt @@ -0,0 +1,4 @@ +# ---- Start of Potential information ---- +pair_style tersoff +pair_coeff * * temp.pot Fe Fe +# ---- End of Potential information ---- diff --git a/aiida_lammps/tests/test_potential_data.py b/aiida_lammps/tests/test_potential_data.py index d0a6ea1..8c38c56 100644 --- a/aiida_lammps/tests/test_potential_data.py +++ b/aiida_lammps/tests/test_potential_data.py @@ -8,6 +8,7 @@ from aiida_lammps.tests.utils import TEST_DIR from aiida_lammps.data.potential import EmpiricalPotential from aiida_lammps.data.lammps_potential import LammpsPotentialData +import aiida_lammps.common.input_generator as input_generator def test_list_potentials(): @@ -79,7 +80,7 @@ def test_input_lines( 'potential_type', ['tersoff', 'eam', 'meam', 'morse'], ) -def test_lammps_potentials( +def test_lammps_potentials_init( db_test_app, # pylint: disable=unused-argument get_lammps_potential_data, potential_type, @@ -102,13 +103,71 @@ def test_lammps_potentials( with io.open(reference_file, 'r') as handler: reference_values = yaml.load(handler, yaml.SafeLoader) - _attributes = ['md5', 'pair_style', 'species', 'atom_style'] + _attributes = [ + 'md5', 'pair_style', 'species', 'atom_style', 'default_units' + ] for _attribute in _attributes: _msg = f'attribute "{_attribute}" does not match between reference and current value' assert reference_values[_attribute] == node.get_attribute( _attribute), _msg + +@pytest.mark.parametrize( + 'potential_type', + ['tersoff', 'eam', 'meam', 'morse'], +) +def test_lammps_potentials_files( + db_test_app, # pylint: disable=unused-argument + get_lammps_potential_data, + potential_type, +): + """Test the LAMMPS potential data type.""" + + potential_information = get_lammps_potential_data(potential_type) + node = LammpsPotentialData.get_or_create( + source=potential_information['filename'], + filename=potential_information['filename'], + **potential_information['parameters'], + ) + _msg = 'content of the files differ' assert node.get_content().split( '\n') == potential_information['potential_data'].split('\n'), _msg + + +@pytest.mark.parametrize( + 'potential_type', + ['tersoff', 'eam', 'meam', 'morse'], +) +def test_lammps_potentials_input_block( + db_test_app, # pylint: disable=unused-argument + get_lammps_potential_data, + potential_type, +): + """Test the LAMMPS potential data type.""" + + potential_information = get_lammps_potential_data(potential_type) + node = LammpsPotentialData.get_or_create( + source=potential_information['filename'], + filename=potential_information['filename'], + **potential_information['parameters'], + ) + + potential_block = input_generator.write_potential_block( + parameters_potential={}, + potential_file='temp.pot', + potential=node, + structure=potential_information['structure'], + ) + + reference_file = os.path.join( + TEST_DIR, + 'test_lammps_potential_data', + f'test_init_{potential_type}_block.txt', + ) + + with io.open(reference_file, 'r') as handler: + reference_value = handler.read() + + assert potential_block == reference_value, 'content of the potential blocks differ' From ba5bb864dad974df8aa94b6fe934c2be2987469f Mon Sep 17 00:00:00 2001 From: Jonathan Chico Date: Wed, 8 Dec 2021 10:57:49 +0100 Subject: [PATCH 43/70] (WIP) Making the input file more flexible. Fixing issues that could result from the integrator not being properly setup. --- aiida_lammps/common/input_generator.py | 19 +++++++++++++------ aiida_lammps/tests/test_potential_data.py | 2 +- .../validation/schemas/lammps_schema.json | 2 +- 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/aiida_lammps/common/input_generator.py b/aiida_lammps/common/input_generator.py index 785dcc5..7f7e325 100644 --- a/aiida_lammps/common/input_generator.py +++ b/aiida_lammps/common/input_generator.py @@ -115,7 +115,10 @@ def write_potential_block( if default_potential[potential.pair_style].get('read_from_file'): potential_block += f'pair_coeff * * {potential_file} {" ".join(kind_symbols)}\n' if not default_potential[potential.pair_style].get('read_from_file'): - data = [line for line in potential.get_content().split('\n') if not line.startswith('#') and line] + data = [ + line for line in potential.get_content().split('\n') + if not line.startswith('#') and line + ] potential_block += f'pair_coeff * * {" ".join(data)}\n' if 'neighbor' in parameters_potential: @@ -245,9 +248,10 @@ def write_md_block(parameters_md: dict) -> str: ) md_block = '# ---- Start of the MD information ----\n' - md_block += f'fix {parameters_md["integration"].get("style", "nve")}{integration_options}\n' + _key = parameters_md['integration'].get('style', 'nve') + md_block += f'fix {generate_id_tag(_key, "all")} all {_key}{integration_options}\n' if 'velocity' in parameters_md: - md_block += f'{generate_velocity_string(parameters_velocity=parameters_md["velocity"])}\n' + md_block += f'{generate_velocity_string(parameters_velocity=parameters_md["velocity"])}' md_block += 'reset_timestep 0\n' if parameters_md.get('run_style', 'verlet') == 'rspa': md_block += f'run_style {parameters_md.get("run_style", "verlet")} ' @@ -278,7 +282,7 @@ def generate_velocity_string(parameters_velocity: dict) -> str: if 'create' in entry: options += f'velocity {entry.get("group", "all")} create' options += f' {entry["create"].get("temp")}' - options += f' {entry["create"].get("seed", np.random.randint(9e9))} {_options}\n' + options += f' {entry["create"].get("seed", np.random.randint(1e4))} {_options}\n' if 'set' in entry: options += f'velocity {entry.get("group", "all")} set' options += f' {entry["set"].get("vx", "NULL")}' @@ -317,7 +321,8 @@ def generate_velocity_options(options_velocity: dict) -> str: velocity_option = '' for _option in _options: - velocity_option += f' {_option} {options_velocity[_option]} ' + if _option in options_velocity: + velocity_option += f' {_option} {options_velocity[_option]} ' return velocity_option @@ -608,9 +613,11 @@ def write_thermo_block( fixed_thermo = [ key for key, value in computes_printing.items() if value ] + if 'step' not in fixed_thermo: + fixed_thermo = ['step'] + fixed_thermo thermo_block = '# ---- Start of the Thermo information ----\n' - thermo_block += f'thermo_style {" ".join(fixed_thermo)} {" ".join(computes_list)}\n' + thermo_block += f'thermo_style custom {" ".join(fixed_thermo)} {" ".join(computes_list)}\n' thermo_block += f'thermo {parameters_thermo.get("printing_rate", 1000)}\n' thermo_block += '# ---- End of the Thermo information ----\n' diff --git a/aiida_lammps/tests/test_potential_data.py b/aiida_lammps/tests/test_potential_data.py index 8c38c56..46d072b 100644 --- a/aiida_lammps/tests/test_potential_data.py +++ b/aiida_lammps/tests/test_potential_data.py @@ -8,7 +8,7 @@ from aiida_lammps.tests.utils import TEST_DIR from aiida_lammps.data.potential import EmpiricalPotential from aiida_lammps.data.lammps_potential import LammpsPotentialData -import aiida_lammps.common.input_generator as input_generator +from aiida_lammps.common import input_generator def test_list_potentials(): diff --git a/aiida_lammps/validation/schemas/lammps_schema.json b/aiida_lammps/validation/schemas/lammps_schema.json index ba361ad..6e5d1ad 100644 --- a/aiida_lammps/validation/schemas/lammps_schema.json +++ b/aiida_lammps/validation/schemas/lammps_schema.json @@ -456,7 +456,7 @@ "printing_rate":{ "type": "integer" }, - "thermo_print":{ + "thermo_printing":{ "propertyNames":{ "enum":[ "step", From 9ea3f6a94b9355b25033367c962e2945bdba3941 Mon Sep 17 00:00:00 2001 From: Jonathan Chico Date: Wed, 8 Dec 2021 11:06:03 +0100 Subject: [PATCH 44/70] Fixing mislablled potential test from eam -> eam/alloy --- .../FeW_MO_737567242631_000.eam.alloy.yaml | 2 +- ...est_init_eam.yaml => test_init_eam_alloy.yaml} | 2 +- ...am_block.txt => test_init_eam_alloy_block.txt} | 2 +- aiida_lammps/tests/test_potential_data.py | 15 +++++++++------ 4 files changed, 12 insertions(+), 9 deletions(-) rename aiida_lammps/tests/test_lammps_potential_data/{test_init_eam.yaml => test_init_eam_alloy.yaml} (81%) rename aiida_lammps/tests/test_lammps_potential_data/{test_init_eam_block.txt => test_init_eam_alloy_block.txt} (83%) diff --git a/aiida_lammps/tests/input_files/FeW_MO_737567242631_000.eam.alloy.yaml b/aiida_lammps/tests/input_files/FeW_MO_737567242631_000.eam.alloy.yaml index 1af5cc9..91bae34 100644 --- a/aiida_lammps/tests/input_files/FeW_MO_737567242631_000.eam.alloy.yaml +++ b/aiida_lammps/tests/input_files/FeW_MO_737567242631_000.eam.alloy.yaml @@ -1,6 +1,6 @@ species: ["Fe", "W"] atom_style: "atomic" -pair_style: "eam" +pair_style: "eam/alloy" units: "metal" extra_tags: content_origin: "NIST IPRP (https://www.ctcms.nist.gov/potentials/Fe.html#Fe-W)" diff --git a/aiida_lammps/tests/test_lammps_potential_data/test_init_eam.yaml b/aiida_lammps/tests/test_lammps_potential_data/test_init_eam_alloy.yaml similarity index 81% rename from aiida_lammps/tests/test_lammps_potential_data/test_init_eam.yaml rename to aiida_lammps/tests/test_lammps_potential_data/test_init_eam_alloy.yaml index a5c2854..5380269 100644 --- a/aiida_lammps/tests/test_lammps_potential_data/test_init_eam.yaml +++ b/aiida_lammps/tests/test_lammps_potential_data/test_init_eam_alloy.yaml @@ -1,5 +1,5 @@ md5: '2d501fdaffce2501d97f6225e1f6b0a6' species: ['Fe', 'W'] -pair_style: 'eam' +pair_style: 'eam/alloy' atom_style: 'atomic' default_units: 'metal' diff --git a/aiida_lammps/tests/test_lammps_potential_data/test_init_eam_block.txt b/aiida_lammps/tests/test_lammps_potential_data/test_init_eam_alloy_block.txt similarity index 83% rename from aiida_lammps/tests/test_lammps_potential_data/test_init_eam_block.txt rename to aiida_lammps/tests/test_lammps_potential_data/test_init_eam_alloy_block.txt index 58ba8b6..9cc3ebc 100644 --- a/aiida_lammps/tests/test_lammps_potential_data/test_init_eam_block.txt +++ b/aiida_lammps/tests/test_lammps_potential_data/test_init_eam_alloy_block.txt @@ -1,4 +1,4 @@ # ---- Start of Potential information ---- -pair_style eam +pair_style eam/alloy pair_coeff * * temp.pot Fe Fe # ---- End of Potential information ---- diff --git a/aiida_lammps/tests/test_potential_data.py b/aiida_lammps/tests/test_potential_data.py index 46d072b..83289d3 100644 --- a/aiida_lammps/tests/test_potential_data.py +++ b/aiida_lammps/tests/test_potential_data.py @@ -78,7 +78,7 @@ def test_input_lines( @pytest.mark.parametrize( 'potential_type', - ['tersoff', 'eam', 'meam', 'morse'], + ['tersoff', 'eam_alloy', 'meam', 'morse'], ) def test_lammps_potentials_init( db_test_app, # pylint: disable=unused-argument @@ -87,7 +87,8 @@ def test_lammps_potentials_init( ): """Test the LAMMPS potential data type.""" - potential_information = get_lammps_potential_data(potential_type) + potential_information = get_lammps_potential_data( + potential_type.replace('_', '/')) node = LammpsPotentialData.get_or_create( source=potential_information['filename'], filename=potential_information['filename'], @@ -115,7 +116,7 @@ def test_lammps_potentials_init( @pytest.mark.parametrize( 'potential_type', - ['tersoff', 'eam', 'meam', 'morse'], + ['tersoff', 'eam_alloy', 'meam', 'morse'], ) def test_lammps_potentials_files( db_test_app, # pylint: disable=unused-argument @@ -124,7 +125,8 @@ def test_lammps_potentials_files( ): """Test the LAMMPS potential data type.""" - potential_information = get_lammps_potential_data(potential_type) + potential_information = get_lammps_potential_data( + potential_type.replace('_', '/')) node = LammpsPotentialData.get_or_create( source=potential_information['filename'], filename=potential_information['filename'], @@ -138,7 +140,7 @@ def test_lammps_potentials_files( @pytest.mark.parametrize( 'potential_type', - ['tersoff', 'eam', 'meam', 'morse'], + ['tersoff', 'eam_alloy', 'meam', 'morse'], ) def test_lammps_potentials_input_block( db_test_app, # pylint: disable=unused-argument @@ -147,7 +149,8 @@ def test_lammps_potentials_input_block( ): """Test the LAMMPS potential data type.""" - potential_information = get_lammps_potential_data(potential_type) + potential_information = get_lammps_potential_data( + potential_type.replace('_', '/')) node = LammpsPotentialData.get_or_create( source=potential_information['filename'], filename=potential_information['filename'], From 9952cfdbcc6d0ce57a0a206d50c0162b59d58f41 Mon Sep 17 00:00:00 2001 From: Jonathan Chico Date: Wed, 8 Dec 2021 11:11:21 +0100 Subject: [PATCH 45/70] Fixing an issue resulting from the re-labelling of the eam/alloy test potentials. --- aiida_lammps/tests/test_potential_data.py | 9 +++------ conftest.py | 2 +- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/aiida_lammps/tests/test_potential_data.py b/aiida_lammps/tests/test_potential_data.py index 83289d3..1301e78 100644 --- a/aiida_lammps/tests/test_potential_data.py +++ b/aiida_lammps/tests/test_potential_data.py @@ -87,8 +87,7 @@ def test_lammps_potentials_init( ): """Test the LAMMPS potential data type.""" - potential_information = get_lammps_potential_data( - potential_type.replace('_', '/')) + potential_information = get_lammps_potential_data(potential_type) node = LammpsPotentialData.get_or_create( source=potential_information['filename'], filename=potential_information['filename'], @@ -125,8 +124,7 @@ def test_lammps_potentials_files( ): """Test the LAMMPS potential data type.""" - potential_information = get_lammps_potential_data( - potential_type.replace('_', '/')) + potential_information = get_lammps_potential_data(potential_type) node = LammpsPotentialData.get_or_create( source=potential_information['filename'], filename=potential_information['filename'], @@ -149,8 +147,7 @@ def test_lammps_potentials_input_block( ): """Test the LAMMPS potential data type.""" - potential_information = get_lammps_potential_data( - potential_type.replace('_', '/')) + potential_information = get_lammps_potential_data(potential_type) node = LammpsPotentialData.get_or_create( source=potential_information['filename'], filename=potential_information['filename'], diff --git a/conftest.py b/conftest.py index 5b27398..0921596 100644 --- a/conftest.py +++ b/conftest.py @@ -356,7 +356,7 @@ def _get_lammps_potential_data(pkey): and accompanying structure data and expected output data to test it with """ output_dict = {} - if pkey == 'eam': + if pkey == 'eam_alloy': output_dict['filename'] = os.path.join( 'aiida_lammps/tests', 'input_files', From b46609c021393acf4a622185ee6122e630b4b57b Mon Sep 17 00:00:00 2001 From: Jonathan Chico Date: Wed, 8 Dec 2021 16:08:08 +0100 Subject: [PATCH 46/70] (WIP) Improving the input file generation. Adding the capability of generating a block to print the final thermo variables in the calculation. --- aiida_lammps/common/input_generator.py | 141 +++++++++++++++--- aiida_lammps/common/utils.py | 25 +++- .../validation/schemas/lammps_schema.json | 98 ++++++------ 3 files changed, 186 insertions(+), 78 deletions(-) diff --git a/aiida_lammps/common/input_generator.py b/aiida_lammps/common/input_generator.py index 7f7e325..ce07a8c 100644 --- a/aiida_lammps/common/input_generator.py +++ b/aiida_lammps/common/input_generator.py @@ -18,6 +18,7 @@ import numpy as np from aiida import orm from aiida_lammps.data.lammps_potential import LammpsPotentialData +from aiida_lammps.common.utils import flatten def validate_input_parameters(parameters: dict = None): @@ -67,14 +68,16 @@ def write_control_block(parameters_control: dict) -> str: } _time = default_timestep[parameters_control.get('units', 'si')] - control_block = '# ---- Start of the Control information ----\n' + control_block = '#' + 'Start of the Control information'.center( + 80, '-') + '#\n' control_block += 'clear\n' control_block += f'units {parameters_control.get("units", "si")}\n' control_block += f'newton {parameters_control.get("newton", "on")}\n' if 'processors' in parameters_control: control_block += f'processors {join_keywords(parameters_control["processors"])}\n' control_block += f'timestep {parameters_control.get("timestep", _time)}\n' - control_block += '# ---- End of the Control information ----\n' + control_block += '#' + 'End of the Control information'.center(80, + '-') + '#\n' return control_block @@ -108,7 +111,8 @@ def write_potential_block( kind_symbols = [kind.symbol for kind in structure.kinds] - potential_block = '# ---- Start of Potential information ----\n' + potential_block = '#' + 'Start of Potential information'.center( + 80, '-') + '#\n' potential_block += f'pair_style {potential.pair_style}' potential_block += f' {" ".join(parameters_potential.get("potential_style_options", [""]))}\n' @@ -126,7 +130,8 @@ def write_potential_block( if 'neighbor_modify' in parameters_potential: potential_block += 'neigh_modify' potential_block += f' {join_keywords(parameters_potential["neighbor_modify"])}\n' - potential_block += '# ---- End of Potential information ----\n' + potential_block += '#' + 'End of Potential information'.center(80, + '-') + '#\n' return potential_block @@ -165,7 +170,8 @@ def write_structure_block( if site.kind_name not in kind_name_id_map: kind_name_id_map[site.kind_name] = len(kind_name_id_map) + 1 - structure_block = '# ---- Start of the Structure information ----\n' + structure_block = '#' + 'Start of the Structure information'.center( + 80, '-') + '#\n' structure_block += f'box tilt {parameters_structure.get("box_tilt", "small")}\n' structure_block += f'dimension {structure.get_dimensionality()["dim"]}\n' @@ -192,7 +198,8 @@ def write_structure_block( group_names.append(_group['name']) if restart_file is not None: structure_block += f'read_restart {restart_file} {parameters_structure["remap"]}' - structure_block += '# ---- End of the Structure information ----\n' + structure_block += '#' + 'End of the Structure information'.center( + 80, '-') + '#\n' return structure_block, group_names @@ -212,13 +219,15 @@ def write_minimize_block(parameters_minimize: dict) -> str: :rtype: str """ - minimize_block = '# ---- Start of the Minimization information ----\n' + minimize_block = '#' + 'Start of the Minimization information'.center( + 80, '-') + '#\n' minimize_block += f'min_style {parameters_minimize.get("style", "cg")}\n' minimize_block += f'minimize {parameters_minimize.get("energy_tolerance", 1e-4)}' minimize_block += f' {parameters_minimize.get("force_tolerance", 1e-4)}' minimize_block += f' {parameters_minimize.get("max_iterations", 1000)}' minimize_block += f' {parameters_minimize.get("max_evaluations", 1000)}\n' - minimize_block += '# ---- End of the Minimization information ----\n' + minimize_block += '#' + 'End of the Minimization information'.center( + 80, '-') + '#\n' return minimize_block @@ -247,7 +256,7 @@ def write_md_block(parameters_md: dict) -> str: integration_parameters=parameters_md['integration'].get('constraints'), ) - md_block = '# ---- Start of the MD information ----\n' + md_block = '#' + 'Start of the MD information'.center(80, '-') + '#\n' _key = parameters_md['integration'].get('style', 'nve') md_block += f'fix {generate_id_tag(_key, "all")} all {_key}{integration_options}\n' if 'velocity' in parameters_md: @@ -259,11 +268,49 @@ def write_md_block(parameters_md: dict) -> str: else: md_block += f'run_style {parameters_md.get("run_style", "verlet")}\n' md_block += f'run {parameters_md.get("max_number_steps", 100)}\n' - md_block += '# ---- End of the MD information ----\n' + md_block += '#' + 'End of the MD information'.center(80, '-') + '#\n' return md_block +def write_final_variables_block( + fixed_thermo: list, + final_file: str = 'aiida_lammps.yaml', +) -> str: + """ + Generate the block to print the final values of the compute variables. + + This takes all the global computes and other thermo values evaluated in + the simulation and appends them to a final yaml file for recovery. + + :param fixed_thermo: list of thermo values (including computes) + :type fixed_thermo: list + :return: input block with the final variables of the calculation. + :rtype: str + """ + + _variables = [] + + variables_block = '#' + 'Start of the Final Variables information'.center( + 80, '-') + '#\n' + + for _thermo in fixed_thermo: + _variables.append(_thermo.replace('[', '_').replace(']', '')) + variables_block += f'variable final_{_variables[-1]} equal {_thermo}\n' + variables_block += '#' + 'End of the Final Variables information'.center( + 80, '-') + '#\n' + + variables_block += '#' + 'Start of the Printing Final Variables information'.center( + 80, '-') + '#\n' + variables_block += f'print "#Final results" file {final_file}\n' + for variable in _variables: + variables_block += f'print "final_{variable}: ${{final_{variable}}}" append {final_file}\n' + variables_block += '#' + 'End of the Printing Final Variables information'.center( + 80, '-') + '#\n' + + return variables_block + + def generate_velocity_string(parameters_velocity: dict) -> str: """ Generate the velocity string for the MD block. @@ -457,7 +504,7 @@ def write_fix_block( if group_names is None: group_names = [] - fix_block = '# ---- Start of the Fix information ----\n' + fix_block = '#' + 'Start of the Fix information'.center(80, '-') + '#\n' for key, value in parameters_fix.items(): for entry in value: _group = entry.get('group', 'all') @@ -467,7 +514,7 @@ def write_fix_block( ) fix_block += f'fix {generate_id_tag(key, _group)} {_group} {key} ' fix_block += f'{join_keywords(entry["type"])}\n' - fix_block += '# ---- End of the Fix information ----\n' + fix_block += '#' + 'End of the Fix information'.center(80, '-') + '#\n' return fix_block @@ -495,7 +542,8 @@ def write_compute_block( if group_names is None: group_names = [] - compute_block = '# ---- Start of the Compute information ----\n' + compute_block = '#' + 'Start of the Compute information'.center( + 80, '-') + '#\n' for key, value in parameters_compute.items(): for entry in value: _group = entry.get('group', 'all') @@ -504,7 +552,8 @@ def write_compute_block( f'group name "{_group}" is not the defined groups') compute_block += f'compute {generate_id_tag(key, _group)} {_group} {key} ' compute_block += f'{join_keywords(entry["type"])}\n' - compute_block += '# ---- End of the Compute information ----\n' + compute_block += '#' + 'End of the Compute information'.center(80, + '-') + '#\n' return compute_block @@ -554,12 +603,12 @@ def write_dump_block( calculation_type='compute', )) - dump_block = '# ---- Start of the Dump information ----\n' + dump_block = '#' + 'Start of the Dump information'.center(80, '-') + '#\n' dump_block += f'dump aiida all custom {parameters_dump.get("dump_rate", 10)} ' dump_block += f'{trajectory_filename} id type element x y z ' dump_block += f'{"q " if atom_style=="charge" else ""}' dump_block += f'{" ".join(computes_list)}\n' - dump_block += '# ---- End of the Dump information ----\n' + dump_block += '#' + 'End of the Dump information'.center(80, '-') + '#\n' return dump_block @@ -567,7 +616,7 @@ def write_dump_block( def write_thermo_block( parameters_thermo: dict, parameters_compute: dict = None, -) -> str: +) -> Union[str, list]: """Generate the block with the thermo command. This will take all the global computes which were generated during the calculation @@ -578,10 +627,12 @@ def write_thermo_block( :type parameters_thermo: dict :param parameters_compute: computes that will be applied to the calculation :type parameters_compute: dict - :return: block with the thermo options for the calculation. - :rtype: str + :return: block with the thermo options for the calculation, list of thermo printing variables + :rtype: Union[str, list] """ + printing_variables = [] + _file = os.path.join( os.path.dirname(os.path.abspath(__file__)), 'variables_types.json', @@ -615,13 +666,59 @@ def write_thermo_block( ] if 'step' not in fixed_thermo: fixed_thermo = ['step'] + fixed_thermo + if 'etotal' not in fixed_thermo: + fixed_thermo = fixed_thermo + ['etotal'] + + if fixed_thermo.index('step') != 0: + fixed_thermo.remove('step') + fixed_thermo = ['step'] + fixed_thermo - thermo_block = '# ---- Start of the Thermo information ----\n' + thermo_block = '#' + 'Start of the Thermo information'.center(80, + '-') + '#\n' thermo_block += f'thermo_style custom {" ".join(fixed_thermo)} {" ".join(computes_list)}\n' thermo_block += f'thermo {parameters_thermo.get("printing_rate", 1000)}\n' - thermo_block += '# ---- End of the Thermo information ----\n' + thermo_block += '#' + 'End of the Thermo information'.center(80, + '-') + '#\n' + + printing_variables = fixed_thermo + list( + flatten([compute.split() for compute in computes_list])) + + return thermo_block, printing_variables + + +def write_restart_block(restart_filename: str) -> str: + """Generate the block to write the restart file. + + :param restart_filename: Name of the LAMMPS restart file + :type restart_filename: str + :return: string block indicating the printing of a restart file. + :rtype: str + """ + + restart_block = '#' + 'Start of the write restart information'.center( + 80, '-') + '#\n' + restart_block += f'write_restart {restart_filename}\n' + restart_block += '#' + 'End of the write restart information'.center( + 80, '-') + '#\n' + + return restart_block + + +def write_read_restart_block(restart_filename: str) -> str: + """Generate the block to read the restart file. + + :param restart_filename: Name of the LAMMPS restart file + :type restart_filename: str + :return: string block indicating the reading of a restart file. + :rtype: str + """ - return thermo_block + read_restart_block = '#' + 'Start of the read restart information'.center( + 80, '-') + '#\n' + read_restart_block += f'read_restart {restart_filename}\n' + read_restart_block += '#' + 'End of the read restart information'.center( + 80, '-') + '#\n' + return read_restart_block def generate_printing_string( diff --git a/aiida_lammps/common/utils.py b/aiida_lammps/common/utils.py index fdb5c47..9bdadb5 100644 --- a/aiida_lammps/common/utils.py +++ b/aiida_lammps/common/utils.py @@ -1,14 +1,25 @@ -"""[summary] - -:raises KeyError: [description] -:return: [description] -:rtype: [type] -""" +"""Utility functions for the handling of the input files""" +from collections.abc import Iterable from datetime import datetime - from dateutil.parser import parse as get_date +def flatten(full_list: list) -> list: + """Flattens a list of list into a flat list. + + :param full_list: list of lists to be flattened + :type full_list: list + :yield: flattened list + :rtype: list + """ + for element in full_list: + if isinstance(element, + Iterable) and not isinstance(element, (str, bytes)): + yield from flatten(element) + else: + yield element + + def convert_date_string(string): """converts date string e.g. '10 Nov 2017' to datetime object if None, return todays date diff --git a/aiida_lammps/validation/schemas/lammps_schema.json b/aiida_lammps/validation/schemas/lammps_schema.json index 6e5d1ad..48548ad 100644 --- a/aiida_lammps/validation/schemas/lammps_schema.json +++ b/aiida_lammps/validation/schemas/lammps_schema.json @@ -137,7 +137,7 @@ "type": "integer" } }, - "required": ["temp", "seed"] + "required": ["temp"] }, "set": { "type": "object", @@ -197,60 +197,60 @@ "group": { "type": "string" } - } - }, - "oneOf": [ - { - "required": [ - "create" - ], - "not": { - "required": [ - "set", "scale", "ramp", "zero" - ] - } }, - { - "required": [ - "set" - ], - "not": { + "oneOf": [ + { "required": [ - "create", "scale", "ramp", "zero" - ] - } - }, - { - "required": [ - "scale" - ], - "not": { + "create" + ], + "not": { + "required": [ + "set", "scale", "ramp", "zero" + ] + } + }, + { "required": [ - "create", "set", "ramp", "zero" - ] - } - }, - { - "required": [ - "ramp" - ], - "not": { + "set" + ], + "not": { + "required": [ + "create", "scale", "ramp", "zero" + ] + } + }, + { "required": [ - "create", "scale", "set", "zero" - ] - } - }, - { - "required": [ - "zero" - ], - "not": { + "scale" + ], + "not": { + "required": [ + "create", "set", "ramp", "zero" + ] + } + }, + { + "required": [ + "ramp" + ], + "not": { + "required": [ + "create", "scale", "set", "zero" + ] + } + }, + { "required": [ - "create", "scale", "ramp", "set" - ] + "zero" + ], + "not": { + "required": [ + "create", "scale", "ramp", "set" + ] + } } - } - ] + ] + } }, "integration": { "type": "object", From 76630d72ab7ed997bd8fa43310be3df9c2800ece Mon Sep 17 00:00:00 2001 From: Jonathan Chico Date: Wed, 8 Dec 2021 16:18:03 +0100 Subject: [PATCH 47/70] Fix an issue that could lead the tests to fail due to how the block headers are written. --- aiida_lammps/common/input_generator.py | 2 +- .../test_init_eam_alloy_block.txt | 6 +++--- .../test_lammps_potential_data/test_init_meam_block.txt | 6 +++--- .../test_lammps_potential_data/test_init_morse_block.txt | 4 ++-- .../test_lammps_potential_data/test_init_tersoff_block.txt | 6 +++--- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/aiida_lammps/common/input_generator.py b/aiida_lammps/common/input_generator.py index ce07a8c..fb6c96b 100644 --- a/aiida_lammps/common/input_generator.py +++ b/aiida_lammps/common/input_generator.py @@ -109,7 +109,7 @@ def write_potential_block( default_potential = LammpsPotentialData.default_potential_info - kind_symbols = [kind.symbol for kind in structure.kinds] + kind_symbols = np.unique([kind.symbol for kind in structure.kinds]) potential_block = '#' + 'Start of Potential information'.center( 80, '-') + '#\n' diff --git a/aiida_lammps/tests/test_lammps_potential_data/test_init_eam_alloy_block.txt b/aiida_lammps/tests/test_lammps_potential_data/test_init_eam_alloy_block.txt index 9cc3ebc..d9fa212 100644 --- a/aiida_lammps/tests/test_lammps_potential_data/test_init_eam_alloy_block.txt +++ b/aiida_lammps/tests/test_lammps_potential_data/test_init_eam_alloy_block.txt @@ -1,4 +1,4 @@ -# ---- Start of Potential information ---- +#-------------------------Start of Potential information-------------------------# pair_style eam/alloy -pair_coeff * * temp.pot Fe Fe -# ---- End of Potential information ---- +pair_coeff * * temp.pot Fe +#--------------------------End of Potential information--------------------------# diff --git a/aiida_lammps/tests/test_lammps_potential_data/test_init_meam_block.txt b/aiida_lammps/tests/test_lammps_potential_data/test_init_meam_block.txt index 48f557b..a9c3ad5 100644 --- a/aiida_lammps/tests/test_lammps_potential_data/test_init_meam_block.txt +++ b/aiida_lammps/tests/test_lammps_potential_data/test_init_meam_block.txt @@ -1,4 +1,4 @@ -# ---- Start of Potential information ---- +#-------------------------Start of Potential information-------------------------# pair_style meam -pair_coeff * * temp.pot Fe Fe -# ---- End of Potential information ---- +pair_coeff * * temp.pot Fe +#--------------------------End of Potential information--------------------------# diff --git a/aiida_lammps/tests/test_lammps_potential_data/test_init_morse_block.txt b/aiida_lammps/tests/test_lammps_potential_data/test_init_morse_block.txt index c90f2a5..bffdae8 100644 --- a/aiida_lammps/tests/test_lammps_potential_data/test_init_morse_block.txt +++ b/aiida_lammps/tests/test_lammps_potential_data/test_init_morse_block.txt @@ -1,4 +1,4 @@ -# ---- Start of Potential information ---- +#-------------------------Start of Potential information-------------------------# pair_style morse pair_coeff * * 6.65905e+00 -4.17400e-01 1.38850e+00 2.84500e+00 -# ---- End of Potential information ---- +#--------------------------End of Potential information--------------------------# diff --git a/aiida_lammps/tests/test_lammps_potential_data/test_init_tersoff_block.txt b/aiida_lammps/tests/test_lammps_potential_data/test_init_tersoff_block.txt index 433b3aa..0a40b14 100644 --- a/aiida_lammps/tests/test_lammps_potential_data/test_init_tersoff_block.txt +++ b/aiida_lammps/tests/test_lammps_potential_data/test_init_tersoff_block.txt @@ -1,4 +1,4 @@ -# ---- Start of Potential information ---- +#-------------------------Start of Potential information-------------------------# pair_style tersoff -pair_coeff * * temp.pot Fe Fe -# ---- End of Potential information ---- +pair_coeff * * temp.pot Fe +#--------------------------End of Potential information--------------------------# From b943eab2f2e724ea5f9d1c4150f33c744d067217 Mon Sep 17 00:00:00 2001 From: Jonathan Chico Date: Wed, 8 Dec 2021 17:12:20 +0100 Subject: [PATCH 48/70] (WIP) Adding tests for the generation input files. --- aiida_lammps/tests/test_generate_inputs.py | 124 ++++++++++++++++++ .../test_generate_input_eam_alloy.txt | 76 +++++++++++ 2 files changed, 200 insertions(+) create mode 100644 aiida_lammps/tests/test_generate_inputs.py create mode 100644 aiida_lammps/tests/test_generate_inputs/test_generate_input_eam_alloy.txt diff --git a/aiida_lammps/tests/test_generate_inputs.py b/aiida_lammps/tests/test_generate_inputs.py new file mode 100644 index 0000000..961cba7 --- /dev/null +++ b/aiida_lammps/tests/test_generate_inputs.py @@ -0,0 +1,124 @@ +"""Functions to tests the input file generation""" + +import io +import os + +import pytest +from aiida_lammps.tests.utils import TEST_DIR + +from aiida_lammps.data.lammps_potential import LammpsPotentialData +import aiida_lammps.common.input_generator as input_generator + +@pytest.mark.parametrize( + 'potential_type', + ['tersoff', 'eam_alloy', 'meam', 'morse'], + 'structure_type', + ['Fe'], +) +def test_input_generate( + db_test_app, # pylint: disable=unused-argument + get_lammps_potential_data, + potential_type, + get_structure_data, + structure_type, +): + """Test the generation of the input file""" + + # Dictionary with parameters for controlling aiida-lammps + parameters = { + 'control': { + 'units':'metal', + 'timestep': 1e-5, + }, + 'compute':{ + 'pe/atom': [{'type':[{'keyword':" ", 'value':" "}], "group":'all'}], + 'ke/atom': [{'type':[{'keyword':" ", 'value':" "}], "group":'all'}], + 'stress/atom': [{'type':['NULL'], "group":'all'}], + 'pressure': [{'type':['thermo_temp'], 'group':'all'}], + }, + 'md':{ + 'integration':{ + 'style': 'npt', + 'constraints': { + 'temp':[300,300,100], + 'iso': [0.0, 0.0, 1000.0], + } + }, + 'max_number_steps': 5000, + 'velocity': [{'create':{'temp': 300}, 'group':'all'}] + }, + 'fix':{ + 'box/relax': [{"type":['iso', 0.0, 'vmax', 0.001], 'group':'all'}] + }, + 'structure': {'atom_style': 'atomic'}, + 'potential': {}, + 'thermo':{ + 'printing_rate': 100, + 'thermo_printing':{ + 'step':True, + 'pe':True, + 'ke': True, + 'press': True, + 'pxx': True, + 'pyy': True, + 'pzz': True, + } + }, + 'dump': {'dump_rate': 1000} + } + + input_generator.validate_input_parameters(parameters) + # Generating the structure + structure = get_structure_data(structure_type) + # Generate the potential + potential_information = get_lammps_potential_data(potential_type) + potential = LammpsPotentialData.get_or_create( + source=potential_information['filename'], + filename=potential_information['filename'], + **potential_information['parameters'], + ) + # Generate the input blocks + control_block = input_generator.write_control_block(parameters_control=parameters['control']) + compute_block = input_generator.write_compute_block(parameters_compute=parameters['compute']) + thermo_block, fixed_thermo = input_generator.write_thermo_block( + parameters_thermo=parameters['thermo'], + parameters_compute=parameters['compute'], + ) + md_block = input_generator.write_md_block(parameters_md=parameters['md']) + structure_block, group_lists = input_generator.write_structure_block( + parameters_structure=parameters['structure'], + structure=structure, + structure_filename='temp.structure', + ) + fix_block = input_generator.write_fix_block( + parameters_fix=parameters['fix'], + group_names=group_lists, + ) + potential_block = input_generator.write_potential_block( + parameters_potential=parameters['potential'], + potential_file='EAM_WCo.txt', + potential=potential, + structure=structure, + ) + dump_block = input_generator.write_dump_block( + parameters_dump=parameters['dump'], + parameters_compute=parameters['compute'], + trajectory_filename='temp.dump', + atom_style='atom', + ) + restart_block = input_generator.write_restart_block(restart_filename='restart.aiida') + final_block = input_generator.write_final_variables_block(fixed_thermo=fixed_thermo) + # Printing the potential + input_file = control_block+structure_block+potential_block+fix_block+\ + compute_block+thermo_block+dump_block+md_block+final_block+restart_block + + reference_file = os.path.join( + TEST_DIR, + 'test_generate_inputs', + f'test_generate_input_{potential_type}.txt', + ) + + with io.open(reference_file, 'r') as handler: + reference_value = handler.read() + + assert input_file == reference_value, 'the content of the files differ' \ No newline at end of file diff --git a/aiida_lammps/tests/test_generate_inputs/test_generate_input_eam_alloy.txt b/aiida_lammps/tests/test_generate_inputs/test_generate_input_eam_alloy.txt new file mode 100644 index 0000000..d01ad06 --- /dev/null +++ b/aiida_lammps/tests/test_generate_inputs/test_generate_input_eam_alloy.txt @@ -0,0 +1,76 @@ +#------------------------Start of the Control information------------------------# +clear +units metal +newton on +timestep 1e-05 +#-------------------------End of the Control information-------------------------# +#-----------------------Start of the Structure information-----------------------# +box tilt small +dimension 3 +boundary p p p +atom_style atomic +read_data temp.structure +#------------------------End of the Structure information------------------------# +#-------------------------Start of Potential information-------------------------# +pair_style eam/alloy +pair_coeff * * EAM_WCo.txt Co +#--------------------------End of Potential information--------------------------# +#--------------------------Start of the Fix information--------------------------# +fix box_relax_all_aiida all box/relax iso 0.0 vmax 0.001 +#---------------------------End of the Fix information---------------------------# +#------------------------Start of the Compute information------------------------# +compute pe_atom_all_aiida all pe/atom +compute ke_atom_all_aiida all ke/atom +compute stress_atom_all_aiida all stress/atom NULL +compute pressure_all_aiida all pressure thermo_temp +#-------------------------End of the Compute information-------------------------# +#------------------------Start of the Thermo information-------------------------# +thermo_style custom step pe ke press pxx pyy pzz etotal c_pressure_all_aiida c_pressure_all_aiida[1] c_pressure_all_aiida[2] c_pressure_all_aiida[3] c_pressure_all_aiida[4] c_pressure_all_aiida[5] c_pressure_all_aiida[6] +thermo 100 +#-------------------------End of the Thermo information--------------------------# +#-------------------------Start of the Dump information--------------------------# +dump aiida all custom 1000 temp.dump id type element x y z c_pe_atom_all_aiida c_ke_atom_all_aiida c_stress_atom_all_aiida[1] c_stress_atom_all_aiida[2] c_stress_atom_all_aiida[3] c_stress_atom_all_aiida[4] c_stress_atom_all_aiida[5] c_stress_atom_all_aiida[6] +#--------------------------End of the Dump information---------------------------# +#---------------------Start of the Minimization information----------------------# +min_style cg +minimize 0.0001 1e-05 5000 5000 +#----------------------End of the Minimization information-----------------------# +#--------------------Start of the Final Variables information--------------------# +variable final_step equal step +variable final_pe equal pe +variable final_ke equal ke +variable final_press equal press +variable final_pxx equal pxx +variable final_pyy equal pyy +variable final_pzz equal pzz +variable final_etotal equal etotal +variable final_c_pressure_all_aiida equal c_pressure_all_aiida +variable final_c_pressure_all_aiida_1 equal c_pressure_all_aiida[1] +variable final_c_pressure_all_aiida_2 equal c_pressure_all_aiida[2] +variable final_c_pressure_all_aiida_3 equal c_pressure_all_aiida[3] +variable final_c_pressure_all_aiida_4 equal c_pressure_all_aiida[4] +variable final_c_pressure_all_aiida_5 equal c_pressure_all_aiida[5] +variable final_c_pressure_all_aiida_6 equal c_pressure_all_aiida[6] +#---------------------End of the Final Variables information---------------------# +#---------------Start of the Printing Final Variables information----------------# +print "#Final results" file aiida_lammps.yaml +print "final_step: ${final_step}" append aiida_lammps.yaml +print "final_pe: ${final_pe}" append aiida_lammps.yaml +print "final_ke: ${final_ke}" append aiida_lammps.yaml +print "final_press: ${final_press}" append aiida_lammps.yaml +print "final_pxx: ${final_pxx}" append aiida_lammps.yaml +print "final_pyy: ${final_pyy}" append aiida_lammps.yaml +print "final_pzz: ${final_pzz}" append aiida_lammps.yaml +print "final_etotal: ${final_etotal}" append aiida_lammps.yaml +print "final_c_pressure_all_aiida: ${final_c_pressure_all_aiida}" append aiida_lammps.yaml +print "final_c_pressure_all_aiida_1: ${final_c_pressure_all_aiida_1}" append aiida_lammps.yaml +print "final_c_pressure_all_aiida_2: ${final_c_pressure_all_aiida_2}" append aiida_lammps.yaml +print "final_c_pressure_all_aiida_3: ${final_c_pressure_all_aiida_3}" append aiida_lammps.yaml +print "final_c_pressure_all_aiida_4: ${final_c_pressure_all_aiida_4}" append aiida_lammps.yaml +print "final_c_pressure_all_aiida_5: ${final_c_pressure_all_aiida_5}" append aiida_lammps.yaml +print "final_c_pressure_all_aiida_6: ${final_c_pressure_all_aiida_6}" append aiida_lammps.yaml +#----------------End of the Printing Final Variables information-----------------# +#---------------------Start of the write restart information---------------------# +write_restart restart.aiida +#----------------------End of the write restart information----------------------# + From 24e327df009c571d34c33502209e9779c99fa4a0 Mon Sep 17 00:00:00 2001 From: Jonathan Chico Date: Wed, 8 Dec 2021 17:20:08 +0100 Subject: [PATCH 49/70] (WIP) Adding tests for the input file generation --- aiida_lammps/tests/test_generate_inputs.py | 90 +++++++++++++++------- 1 file changed, 63 insertions(+), 27 deletions(-) diff --git a/aiida_lammps/tests/test_generate_inputs.py b/aiida_lammps/tests/test_generate_inputs.py index 961cba7..7a2344e 100644 --- a/aiida_lammps/tests/test_generate_inputs.py +++ b/aiida_lammps/tests/test_generate_inputs.py @@ -7,7 +7,8 @@ from aiida_lammps.tests.utils import TEST_DIR from aiida_lammps.data.lammps_potential import LammpsPotentialData -import aiida_lammps.common.input_generator as input_generator +from aiida_lammps.common import input_generator + @pytest.mark.parametrize( 'potential_type', @@ -23,48 +24,79 @@ def test_input_generate( structure_type, ): """Test the generation of the input file""" + # pylint: disable=too-many-locals # Dictionary with parameters for controlling aiida-lammps parameters = { 'control': { - 'units':'metal', + 'units': 'metal', 'timestep': 1e-5, }, - 'compute':{ - 'pe/atom': [{'type':[{'keyword':" ", 'value':" "}], "group":'all'}], - 'ke/atom': [{'type':[{'keyword':" ", 'value':" "}], "group":'all'}], - 'stress/atom': [{'type':['NULL'], "group":'all'}], - 'pressure': [{'type':['thermo_temp'], 'group':'all'}], + 'compute': { + 'pe/atom': [{ + 'type': [{ + 'keyword': ' ', + 'value': ' ' + }], + 'group': 'all' + }], + 'ke/atom': [{ + 'type': [{ + 'keyword': ' ', + 'value': ' ' + }], + 'group': 'all' + }], + 'stress/atom': [{ + 'type': ['NULL'], + 'group': 'all' + }], + 'pressure': [{ + 'type': ['thermo_temp'], + 'group': 'all' + }], }, - 'md':{ - 'integration':{ + 'md': { + 'integration': { 'style': 'npt', 'constraints': { - 'temp':[300,300,100], + 'temp': [300, 300, 100], 'iso': [0.0, 0.0, 1000.0], } }, 'max_number_steps': 5000, - 'velocity': [{'create':{'temp': 300}, 'group':'all'}] + 'velocity': [{ + 'create': { + 'temp': 300 + }, + 'group': 'all' + }] + }, + 'fix': { + 'box/relax': [{ + 'type': ['iso', 0.0, 'vmax', 0.001], + 'group': 'all' + }] }, - 'fix':{ - 'box/relax': [{"type":['iso', 0.0, 'vmax', 0.001], 'group':'all'}] + 'structure': { + 'atom_style': 'atomic' }, - 'structure': {'atom_style': 'atomic'}, 'potential': {}, - 'thermo':{ + 'thermo': { 'printing_rate': 100, - 'thermo_printing':{ - 'step':True, - 'pe':True, + 'thermo_printing': { + 'step': True, + 'pe': True, 'ke': True, 'press': True, 'pxx': True, 'pyy': True, 'pzz': True, - } - }, - 'dump': {'dump_rate': 1000} + } + }, + 'dump': { + 'dump_rate': 1000 + } } input_generator.validate_input_parameters(parameters) @@ -78,8 +110,10 @@ def test_input_generate( **potential_information['parameters'], ) # Generate the input blocks - control_block = input_generator.write_control_block(parameters_control=parameters['control']) - compute_block = input_generator.write_compute_block(parameters_compute=parameters['compute']) + control_block = input_generator.write_control_block( + parameters_control=parameters['control']) + compute_block = input_generator.write_compute_block( + parameters_compute=parameters['compute']) thermo_block, fixed_thermo = input_generator.write_thermo_block( parameters_thermo=parameters['thermo'], parameters_compute=parameters['compute'], @@ -106,8 +140,10 @@ def test_input_generate( trajectory_filename='temp.dump', atom_style='atom', ) - restart_block = input_generator.write_restart_block(restart_filename='restart.aiida') - final_block = input_generator.write_final_variables_block(fixed_thermo=fixed_thermo) + restart_block = input_generator.write_restart_block( + restart_filename='restart.aiida') + final_block = input_generator.write_final_variables_block( + fixed_thermo=fixed_thermo) # Printing the potential input_file = control_block+structure_block+potential_block+fix_block+\ compute_block+thermo_block+dump_block+md_block+final_block+restart_block @@ -120,5 +156,5 @@ def test_input_generate( with io.open(reference_file, 'r') as handler: reference_value = handler.read() - - assert input_file == reference_value, 'the content of the files differ' \ No newline at end of file + + assert input_file == reference_value, 'the content of the files differ' From 7caadc608c2314f8c480aba1455ff723d6d340a9 Mon Sep 17 00:00:00 2001 From: Jonathan Chico Date: Thu, 9 Dec 2021 09:53:39 +0100 Subject: [PATCH 50/70] Adding tests for the input file generation. --- aiida_lammps/tests/test_generate_inputs.py | 192 ++++++++++-------- .../tests/test_generate_inputs/md.yaml | 11 + .../test_generate_inputs/parameters_md.yaml | 57 ++++++ .../parameters_minimize.yaml | 51 +++++ .../test_generate_input_eam_alloy_md.txt | 75 +++++++ ...est_generate_input_eam_alloy_minimize.txt} | 17 +- conftest.py | 4 +- 7 files changed, 308 insertions(+), 99 deletions(-) create mode 100644 aiida_lammps/tests/test_generate_inputs/md.yaml create mode 100644 aiida_lammps/tests/test_generate_inputs/parameters_md.yaml create mode 100644 aiida_lammps/tests/test_generate_inputs/parameters_minimize.yaml create mode 100644 aiida_lammps/tests/test_generate_inputs/test_generate_input_eam_alloy_md.txt rename aiida_lammps/tests/test_generate_inputs/{test_generate_input_eam_alloy.txt => test_generate_input_eam_alloy_minimize.txt} (94%) diff --git a/aiida_lammps/tests/test_generate_inputs.py b/aiida_lammps/tests/test_generate_inputs.py index 7a2344e..d79ff83 100644 --- a/aiida_lammps/tests/test_generate_inputs.py +++ b/aiida_lammps/tests/test_generate_inputs.py @@ -2,106 +2,35 @@ import io import os - +import yaml import pytest from aiida_lammps.tests.utils import TEST_DIR - from aiida_lammps.data.lammps_potential import LammpsPotentialData from aiida_lammps.common import input_generator @pytest.mark.parametrize( 'potential_type', - ['tersoff', 'eam_alloy', 'meam', 'morse'], - 'structure_type', - ['Fe'], + ['eam_alloy'], ) -def test_input_generate( +def test_input_generate_minimize( db_test_app, # pylint: disable=unused-argument get_lammps_potential_data, potential_type, - get_structure_data, - structure_type, ): - """Test the generation of the input file""" + """Test the generation of the input file for minimize calculations""" # pylint: disable=too-many-locals + parameters_file = os.path.join( + TEST_DIR, + 'test_generate_inputs', + 'parameters_minimize.yaml', + ) # Dictionary with parameters for controlling aiida-lammps - parameters = { - 'control': { - 'units': 'metal', - 'timestep': 1e-5, - }, - 'compute': { - 'pe/atom': [{ - 'type': [{ - 'keyword': ' ', - 'value': ' ' - }], - 'group': 'all' - }], - 'ke/atom': [{ - 'type': [{ - 'keyword': ' ', - 'value': ' ' - }], - 'group': 'all' - }], - 'stress/atom': [{ - 'type': ['NULL'], - 'group': 'all' - }], - 'pressure': [{ - 'type': ['thermo_temp'], - 'group': 'all' - }], - }, - 'md': { - 'integration': { - 'style': 'npt', - 'constraints': { - 'temp': [300, 300, 100], - 'iso': [0.0, 0.0, 1000.0], - } - }, - 'max_number_steps': 5000, - 'velocity': [{ - 'create': { - 'temp': 300 - }, - 'group': 'all' - }] - }, - 'fix': { - 'box/relax': [{ - 'type': ['iso', 0.0, 'vmax', 0.001], - 'group': 'all' - }] - }, - 'structure': { - 'atom_style': 'atomic' - }, - 'potential': {}, - 'thermo': { - 'printing_rate': 100, - 'thermo_printing': { - 'step': True, - 'pe': True, - 'ke': True, - 'press': True, - 'pxx': True, - 'pyy': True, - 'pzz': True, - } - }, - 'dump': { - 'dump_rate': 1000 - } - } + with open(parameters_file) as handler: + parameters = yaml.load(handler, yaml.SafeLoader) input_generator.validate_input_parameters(parameters) - # Generating the structure - structure = get_structure_data(structure_type) # Generate the potential potential_information = get_lammps_potential_data(potential_type) potential = LammpsPotentialData.get_or_create( @@ -109,6 +38,8 @@ def test_input_generate( filename=potential_information['filename'], **potential_information['parameters'], ) + # Generating the structure + structure = potential_information['structure'] # Generate the input blocks control_block = input_generator.write_control_block( parameters_control=parameters['control']) @@ -118,11 +49,12 @@ def test_input_generate( parameters_thermo=parameters['thermo'], parameters_compute=parameters['compute'], ) - md_block = input_generator.write_md_block(parameters_md=parameters['md']) + minimize_block = input_generator.write_minimize_block( + parameters_minimize=parameters['minimize']) structure_block, group_lists = input_generator.write_structure_block( parameters_structure=parameters['structure'], structure=structure, - structure_filename='temp.structure', + structure_filename='structure.dat', ) fix_block = input_generator.write_fix_block( parameters_fix=parameters['fix'], @@ -130,7 +62,7 @@ def test_input_generate( ) potential_block = input_generator.write_potential_block( parameters_potential=parameters['potential'], - potential_file='EAM_WCo.txt', + potential_file='potential.dat', potential=potential, structure=structure, ) @@ -146,14 +78,98 @@ def test_input_generate( fixed_thermo=fixed_thermo) # Printing the potential input_file = control_block+structure_block+potential_block+fix_block+\ - compute_block+thermo_block+dump_block+md_block+final_block+restart_block - + compute_block+thermo_block+dump_block+minimize_block+final_block+\ + restart_block + print(input_file) reference_file = os.path.join( TEST_DIR, 'test_generate_inputs', - f'test_generate_input_{potential_type}.txt', + f'test_generate_input_{potential_type}_minimize.txt', + ) + + with io.open(reference_file, 'r') as handler: + reference_value = handler.read() + + assert input_file == reference_value, 'the content of the files differ' + + +@pytest.mark.parametrize( + 'potential_type', + ['eam_alloy'], +) +def test_input_generate_md( + db_test_app, # pylint: disable=unused-argument + get_lammps_potential_data, + potential_type, +): + """Test the generation of the input file for MD calculations""" + # pylint: disable=too-many-locals + + parameters_file = os.path.join( + TEST_DIR, + 'test_generate_inputs', + 'parameters_md.yaml', ) + # Dictionary with parameters for controlling aiida-lammps + with open(parameters_file) as handler: + parameters = yaml.load(handler, yaml.SafeLoader) + input_generator.validate_input_parameters(parameters) + # Generate the potential + potential_information = get_lammps_potential_data(potential_type) + potential = LammpsPotentialData.get_or_create( + source=potential_information['filename'], + filename=potential_information['filename'], + **potential_information['parameters'], + ) + # Generating the structure + structure = potential_information['structure'] + # Generate the input blocks + control_block = input_generator.write_control_block( + parameters_control=parameters['control']) + compute_block = input_generator.write_compute_block( + parameters_compute=parameters['compute']) + thermo_block, fixed_thermo = input_generator.write_thermo_block( + parameters_thermo=parameters['thermo'], + parameters_compute=parameters['compute'], + ) + md_block = input_generator.write_minimize_block( + parameters_minimize=parameters['md']) + structure_block, group_lists = input_generator.write_structure_block( + parameters_structure=parameters['structure'], + structure=structure, + structure_filename='structure.dat', + ) + fix_block = input_generator.write_fix_block( + parameters_fix=parameters['fix'], + group_names=group_lists, + ) + potential_block = input_generator.write_potential_block( + parameters_potential=parameters['potential'], + potential_file='potential.dat', + potential=potential, + structure=structure, + ) + dump_block = input_generator.write_dump_block( + parameters_dump=parameters['dump'], + parameters_compute=parameters['compute'], + trajectory_filename='temp.dump', + atom_style='atom', + ) + restart_block = input_generator.write_restart_block( + restart_filename='restart.aiida') + final_block = input_generator.write_final_variables_block( + fixed_thermo=fixed_thermo) + # Printing the potential + input_file = control_block+structure_block+potential_block+fix_block+\ + compute_block+thermo_block+dump_block+md_block+final_block+\ + restart_block + reference_file = os.path.join( + TEST_DIR, + 'test_generate_inputs', + f'test_generate_input_{potential_type}_md.txt', + ) + print(input_file) with io.open(reference_file, 'r') as handler: reference_value = handler.read() diff --git a/aiida_lammps/tests/test_generate_inputs/md.yaml b/aiida_lammps/tests/test_generate_inputs/md.yaml new file mode 100644 index 0000000..ff35f85 --- /dev/null +++ b/aiida_lammps/tests/test_generate_inputs/md.yaml @@ -0,0 +1,11 @@ +integration: + constraints: + iso: + - 0.0 + - 0.0 + - 1000.0 + temp: + - 300 + - 300 + - 100 + style: npt diff --git a/aiida_lammps/tests/test_generate_inputs/parameters_md.yaml b/aiida_lammps/tests/test_generate_inputs/parameters_md.yaml new file mode 100644 index 0000000..c4b8de0 --- /dev/null +++ b/aiida_lammps/tests/test_generate_inputs/parameters_md.yaml @@ -0,0 +1,57 @@ +compute: + ke/atom: + - group: all + type: + - keyword: ' ' + value: ' ' + pe/atom: + - group: all + type: + - keyword: ' ' + value: ' ' + pressure: + - group: all + type: + - thermo_temp + stress/atom: + - group: all + type: + - 'NULL' +control: + timestep: 1.0e-05 + units: metal +dump: + dump_rate: 1000 +fix: + box/relax: + - group: all + type: + - iso + - 0.0 + - vmax + - 0.001 +md: + integration: + constraints: + iso: + - 0.0 + - 0.0 + - 1000.0 + temp: + - 300 + - 300 + - 100 + style: npt +potential: {} +structure: + atom_style: atomic +thermo: + printing_rate: 100 + thermo_printing: + ke: true + pe: true + press: true + pxx: true + pyy: true + pzz: true + step: true diff --git a/aiida_lammps/tests/test_generate_inputs/parameters_minimize.yaml b/aiida_lammps/tests/test_generate_inputs/parameters_minimize.yaml new file mode 100644 index 0000000..175bd8b --- /dev/null +++ b/aiida_lammps/tests/test_generate_inputs/parameters_minimize.yaml @@ -0,0 +1,51 @@ +compute: + ke/atom: + - group: all + type: + - keyword: ' ' + value: ' ' + pe/atom: + - group: all + type: + - keyword: ' ' + value: ' ' + pressure: + - group: all + type: + - thermo_temp + stress/atom: + - group: all + type: + - 'NULL' +control: + timestep: 1.0e-05 + units: metal +dump: + dump_rate: 1000 +fix: + box/relax: + - group: all + type: + - iso + - 0.0 + - vmax + - 0.001 +minimize: + energy_tolerance: 0.0001 + force_tolerance: 1.0e-05 + max_evaluations: 5000 + max_iterations: 5000 + style: cg +potential: {} +structure: + atom_style: atomic +thermo: + printing_rate: 100 + thermo_printing: + ke: true + pe: true + press: true + pxx: true + pyy: true + pzz: true + step: true diff --git a/aiida_lammps/tests/test_generate_inputs/test_generate_input_eam_alloy_md.txt b/aiida_lammps/tests/test_generate_inputs/test_generate_input_eam_alloy_md.txt new file mode 100644 index 0000000..cec4f80 --- /dev/null +++ b/aiida_lammps/tests/test_generate_inputs/test_generate_input_eam_alloy_md.txt @@ -0,0 +1,75 @@ +#------------------------Start of the Control information------------------------# +clear +units metal +newton on +timestep 1e-05 +#-------------------------End of the Control information-------------------------# +#-----------------------Start of the Structure information-----------------------# +box tilt small +dimension 3 +boundary p p p +atom_style atomic +read_data structure.dat +#------------------------End of the Structure information------------------------# +#-------------------------Start of Potential information-------------------------# +pair_style eam/alloy +pair_coeff * * potential.dat Fe +#--------------------------End of Potential information--------------------------# +#--------------------------Start of the Fix information--------------------------# +fix box_relax_all_aiida all box/relax iso 0.0 vmax 0.001 +#---------------------------End of the Fix information---------------------------# +#------------------------Start of the Compute information------------------------# +compute ke_atom_all_aiida all ke/atom +compute pe_atom_all_aiida all pe/atom +compute pressure_all_aiida all pressure thermo_temp +compute stress_atom_all_aiida all stress/atom NULL +#-------------------------End of the Compute information-------------------------# +#------------------------Start of the Thermo information-------------------------# +thermo_style custom step ke pe press pxx pyy pzz etotal c_pressure_all_aiida c_pressure_all_aiida[1] c_pressure_all_aiida[2] c_pressure_all_aiida[3] c_pressure_all_aiida[4] c_pressure_all_aiida[5] c_pressure_all_aiida[6] +thermo 100 +#-------------------------End of the Thermo information--------------------------# +#-------------------------Start of the Dump information--------------------------# +dump aiida all custom 1000 temp.dump id type element x y z c_ke_atom_all_aiida c_pe_atom_all_aiida c_stress_atom_all_aiida[1] c_stress_atom_all_aiida[2] c_stress_atom_all_aiida[3] c_stress_atom_all_aiida[4] c_stress_atom_all_aiida[5] c_stress_atom_all_aiida[6] +#--------------------------End of the Dump information---------------------------# +#---------------------Start of the Minimization information----------------------# +min_style cg +minimize 0.0001 0.0001 1000 1000 +#----------------------End of the Minimization information-----------------------# +#--------------------Start of the Final Variables information--------------------# +variable final_step equal step +variable final_ke equal ke +variable final_pe equal pe +variable final_press equal press +variable final_pxx equal pxx +variable final_pyy equal pyy +variable final_pzz equal pzz +variable final_etotal equal etotal +variable final_c_pressure_all_aiida equal c_pressure_all_aiida +variable final_c_pressure_all_aiida_1 equal c_pressure_all_aiida[1] +variable final_c_pressure_all_aiida_2 equal c_pressure_all_aiida[2] +variable final_c_pressure_all_aiida_3 equal c_pressure_all_aiida[3] +variable final_c_pressure_all_aiida_4 equal c_pressure_all_aiida[4] +variable final_c_pressure_all_aiida_5 equal c_pressure_all_aiida[5] +variable final_c_pressure_all_aiida_6 equal c_pressure_all_aiida[6] +#---------------------End of the Final Variables information---------------------# +#---------------Start of the Printing Final Variables information----------------# +print "#Final results" file aiida_lammps.yaml +print "final_step: ${final_step}" append aiida_lammps.yaml +print "final_ke: ${final_ke}" append aiida_lammps.yaml +print "final_pe: ${final_pe}" append aiida_lammps.yaml +print "final_press: ${final_press}" append aiida_lammps.yaml +print "final_pxx: ${final_pxx}" append aiida_lammps.yaml +print "final_pyy: ${final_pyy}" append aiida_lammps.yaml +print "final_pzz: ${final_pzz}" append aiida_lammps.yaml +print "final_etotal: ${final_etotal}" append aiida_lammps.yaml +print "final_c_pressure_all_aiida: ${final_c_pressure_all_aiida}" append aiida_lammps.yaml +print "final_c_pressure_all_aiida_1: ${final_c_pressure_all_aiida_1}" append aiida_lammps.yaml +print "final_c_pressure_all_aiida_2: ${final_c_pressure_all_aiida_2}" append aiida_lammps.yaml +print "final_c_pressure_all_aiida_3: ${final_c_pressure_all_aiida_3}" append aiida_lammps.yaml +print "final_c_pressure_all_aiida_4: ${final_c_pressure_all_aiida_4}" append aiida_lammps.yaml +print "final_c_pressure_all_aiida_5: ${final_c_pressure_all_aiida_5}" append aiida_lammps.yaml +print "final_c_pressure_all_aiida_6: ${final_c_pressure_all_aiida_6}" append aiida_lammps.yaml +#----------------End of the Printing Final Variables information-----------------# +#---------------------Start of the write restart information---------------------# +write_restart restart.aiida +#----------------------End of the write restart information----------------------# diff --git a/aiida_lammps/tests/test_generate_inputs/test_generate_input_eam_alloy.txt b/aiida_lammps/tests/test_generate_inputs/test_generate_input_eam_alloy_minimize.txt similarity index 94% rename from aiida_lammps/tests/test_generate_inputs/test_generate_input_eam_alloy.txt rename to aiida_lammps/tests/test_generate_inputs/test_generate_input_eam_alloy_minimize.txt index d01ad06..fd9666b 100644 --- a/aiida_lammps/tests/test_generate_inputs/test_generate_input_eam_alloy.txt +++ b/aiida_lammps/tests/test_generate_inputs/test_generate_input_eam_alloy_minimize.txt @@ -9,27 +9,27 @@ box tilt small dimension 3 boundary p p p atom_style atomic -read_data temp.structure +read_data structure.dat #------------------------End of the Structure information------------------------# #-------------------------Start of Potential information-------------------------# pair_style eam/alloy -pair_coeff * * EAM_WCo.txt Co +pair_coeff * * potential.dat Fe #--------------------------End of Potential information--------------------------# #--------------------------Start of the Fix information--------------------------# fix box_relax_all_aiida all box/relax iso 0.0 vmax 0.001 #---------------------------End of the Fix information---------------------------# #------------------------Start of the Compute information------------------------# -compute pe_atom_all_aiida all pe/atom compute ke_atom_all_aiida all ke/atom -compute stress_atom_all_aiida all stress/atom NULL +compute pe_atom_all_aiida all pe/atom compute pressure_all_aiida all pressure thermo_temp +compute stress_atom_all_aiida all stress/atom NULL #-------------------------End of the Compute information-------------------------# #------------------------Start of the Thermo information-------------------------# -thermo_style custom step pe ke press pxx pyy pzz etotal c_pressure_all_aiida c_pressure_all_aiida[1] c_pressure_all_aiida[2] c_pressure_all_aiida[3] c_pressure_all_aiida[4] c_pressure_all_aiida[5] c_pressure_all_aiida[6] +thermo_style custom step ke pe press pxx pyy pzz etotal c_pressure_all_aiida c_pressure_all_aiida[1] c_pressure_all_aiida[2] c_pressure_all_aiida[3] c_pressure_all_aiida[4] c_pressure_all_aiida[5] c_pressure_all_aiida[6] thermo 100 #-------------------------End of the Thermo information--------------------------# #-------------------------Start of the Dump information--------------------------# -dump aiida all custom 1000 temp.dump id type element x y z c_pe_atom_all_aiida c_ke_atom_all_aiida c_stress_atom_all_aiida[1] c_stress_atom_all_aiida[2] c_stress_atom_all_aiida[3] c_stress_atom_all_aiida[4] c_stress_atom_all_aiida[5] c_stress_atom_all_aiida[6] +dump aiida all custom 1000 temp.dump id type element x y z c_ke_atom_all_aiida c_pe_atom_all_aiida c_stress_atom_all_aiida[1] c_stress_atom_all_aiida[2] c_stress_atom_all_aiida[3] c_stress_atom_all_aiida[4] c_stress_atom_all_aiida[5] c_stress_atom_all_aiida[6] #--------------------------End of the Dump information---------------------------# #---------------------Start of the Minimization information----------------------# min_style cg @@ -37,8 +37,8 @@ minimize 0.0001 1e-05 5000 5000 #----------------------End of the Minimization information-----------------------# #--------------------Start of the Final Variables information--------------------# variable final_step equal step -variable final_pe equal pe variable final_ke equal ke +variable final_pe equal pe variable final_press equal press variable final_pxx equal pxx variable final_pyy equal pyy @@ -55,8 +55,8 @@ variable final_c_pressure_all_aiida_6 equal c_pressure_all_aiida[6] #---------------Start of the Printing Final Variables information----------------# print "#Final results" file aiida_lammps.yaml print "final_step: ${final_step}" append aiida_lammps.yaml -print "final_pe: ${final_pe}" append aiida_lammps.yaml print "final_ke: ${final_ke}" append aiida_lammps.yaml +print "final_pe: ${final_pe}" append aiida_lammps.yaml print "final_press: ${final_press}" append aiida_lammps.yaml print "final_pxx: ${final_pxx}" append aiida_lammps.yaml print "final_pyy: ${final_pyy}" append aiida_lammps.yaml @@ -73,4 +73,3 @@ print "final_c_pressure_all_aiida_6: ${final_c_pressure_all_aiida_6}" append aii #---------------------Start of the write restart information---------------------# write_restart restart.aiida #----------------------End of the write restart information----------------------# - diff --git a/conftest.py b/conftest.py index 0921596..870f313 100644 --- a/conftest.py +++ b/conftest.py @@ -10,7 +10,7 @@ import yaml import pytest import numpy as np -from aiida.plugins import DataFactory +from aiida import orm from aiida_lammps.tests.utils import TEST_DIR, AiidaTestApp from aiida_lammps.common.reaxff_convert import ( filter_by_species, @@ -210,7 +210,7 @@ def _get_structure_data(pkey): raise ValueError(f'Unknown structure key: {pkey}') # create structure - structure = DataFactory('structure')(cell=cell) + structure = orm.StructureData(cell=cell) for position, symbol, name in zip(positions, symbols, names): if fractional: position = np.dot(position, cell).tolist() From bdb30d49eb555762bf568a0756e86553286ca591 Mon Sep 17 00:00:00 2001 From: Jonathan Chico Date: Thu, 9 Dec 2021 10:58:04 +0100 Subject: [PATCH 51/70] (WIP) Improving the flexibility of the input file. Adding a function to wrap the input file generation. --- aiida_lammps/common/input_generator.py | 114 ++++++++++++++++++ aiida_lammps/tests/test_generate_inputs.py | 87 ++----------- .../test_generate_input_eam_alloy_md.txt | 10 +- conftest.py | 29 +++-- 4 files changed, 153 insertions(+), 87 deletions(-) diff --git a/aiida_lammps/common/input_generator.py b/aiida_lammps/common/input_generator.py index fb6c96b..cd913d1 100644 --- a/aiida_lammps/common/input_generator.py +++ b/aiida_lammps/common/input_generator.py @@ -21,6 +21,120 @@ from aiida_lammps.common.utils import flatten +def generate_input_file( + parameters: dict, + potential: LammpsPotentialData, + structure: orm.StructureData, + trajectory_filename: str = 'aiida_lampps.trajectory.dump', + restart_filename: str = 'restart.aiida', + potential_filename: str = 'potential.dat', + structure_filename: str = 'structure.dat', + read_restart_filename: str = None, +) -> str: + """ + Generate the text for the lammps input file. + + It takes the parameters and other inputs needed to generate the lammps input + file. All the required input blocks are always written, whilst some such as + the compute and fixes block are only written if required. + + .. note:: If the ``read_restart_filename`` is provided the ``read_data`` + command is used to overwrite the structure and set the velocity and + other parameters from a previous calculation. + + :param parameters: calculation paramters used to control the LAMMPS calculation + :type parameters: dict + :param potential: potential used during the LAMMPS calculation + :type potential: LammpsPotentialData + :param structure: structure used during the LAMMPS calculation + :type structure: orm.StructureData + :param trajectory_filename: filename used to write the trajectory information, + defaults to 'aiida_lampps.trajectory.dump' + :type trajectory_filename: str, optional + :param restart_filename: filename used to write the restart information, + defaults to 'restart.aiida' + :type restart_filename: str, optional + :param potential_filename: filename used to read the potential, + defaults to 'potential.dat' + :type potential_filename: str, optional + :param structure_filename: filename used to read the structure, + defaults to 'structure.dat' + :type structure_filename: str, optional + :param read_restart_filename: filename used to read the restart information, + defaults to None + :type read_restart_filename: str, optional + :return: contents of the lammps input file. + :rtype: str + """ + # pylint: disable=too-many-locals, too-many-arguments + + # Validate the inputs + validate_input_parameters(parameters) + + # Generate the control input block + control_block = write_control_block( + parameters_control=parameters.get('control', {})) + # Generate the compute input block + if 'compute' in parameters: + compute_block = write_compute_block( + parameters_compute=parameters.get('compute', {})) + else: + compute_block = '' + # Generate the thermo input block + thermo_block, fixed_thermo = write_thermo_block( + parameters_thermo=parameters.get('thermo', {}), + parameters_compute=parameters.get('compute', {}), + ) + # Generate the minimization input block + if 'minimize' in parameters: + run_block = write_minimize_block( + parameters_minimize=parameters.get('minimize', {})) + # Generate the md input block + if 'md' in parameters: + run_block = write_md_block(parameters_md=parameters.get('md', {})) + # Generate the structure input block + structure_block, group_lists = write_structure_block( + parameters_structure=parameters.get('structure', {}), + structure=structure, + structure_filename=structure_filename, + ) + # Append the read restart to the structure block + if read_restart_filename is not None: + structure_block += write_read_restart_block( + restart_filename=read_restart_filename) + # Generate the fix input block + if 'fix' in parameters: + fix_block = write_fix_block( + parameters_fix=parameters.get('fix', {}), + group_names=group_lists, + ) + else: + fix_block = '' + # Generate the potential input block + potential_block = write_potential_block( + parameters_potential=parameters.get('potential', {}), + potential_file=potential_filename, + potential=potential, + structure=structure, + ) + # Generate the dump input block + dump_block = write_dump_block( + parameters_dump=parameters.get('dump', {}), + parameters_compute=parameters.get('compute', {}), + trajectory_filename=trajectory_filename, + atom_style=potential.atom_style, + ) + # Generate the restart input block + restart_block = write_restart_block(restart_filename=restart_filename) + # Generate the final variables input block + final_block = write_final_variables_block(fixed_thermo=fixed_thermo) + # Printing the potential + input_file = control_block+structure_block+potential_block+fix_block+\ + compute_block+thermo_block+dump_block+run_block+final_block+\ + restart_block + return input_file + + def validate_input_parameters(parameters: dict = None): """ Validate the input parameters and compares them against a schema. diff --git a/aiida_lammps/tests/test_generate_inputs.py b/aiida_lammps/tests/test_generate_inputs.py index d79ff83..71c5388 100644 --- a/aiida_lammps/tests/test_generate_inputs.py +++ b/aiida_lammps/tests/test_generate_inputs.py @@ -40,47 +40,16 @@ def test_input_generate_minimize( ) # Generating the structure structure = potential_information['structure'] - # Generate the input blocks - control_block = input_generator.write_control_block( - parameters_control=parameters['control']) - compute_block = input_generator.write_compute_block( - parameters_compute=parameters['compute']) - thermo_block, fixed_thermo = input_generator.write_thermo_block( - parameters_thermo=parameters['thermo'], - parameters_compute=parameters['compute'], - ) - minimize_block = input_generator.write_minimize_block( - parameters_minimize=parameters['minimize']) - structure_block, group_lists = input_generator.write_structure_block( - parameters_structure=parameters['structure'], - structure=structure, - structure_filename='structure.dat', - ) - fix_block = input_generator.write_fix_block( - parameters_fix=parameters['fix'], - group_names=group_lists, - ) - potential_block = input_generator.write_potential_block( - parameters_potential=parameters['potential'], - potential_file='potential.dat', + # Generating the input file + input_file = input_generator.generate_input_file( + parameters=parameters, potential=potential, structure=structure, - ) - dump_block = input_generator.write_dump_block( - parameters_dump=parameters['dump'], - parameters_compute=parameters['compute'], trajectory_filename='temp.dump', - atom_style='atom', + restart_filename='restart.aiida', + potential_filename='potential.dat', + structure_filename='structure.dat', ) - restart_block = input_generator.write_restart_block( - restart_filename='restart.aiida') - final_block = input_generator.write_final_variables_block( - fixed_thermo=fixed_thermo) - # Printing the potential - input_file = control_block+structure_block+potential_block+fix_block+\ - compute_block+thermo_block+dump_block+minimize_block+final_block+\ - restart_block - print(input_file) reference_file = os.path.join( TEST_DIR, 'test_generate_inputs', @@ -124,52 +93,22 @@ def test_input_generate_md( ) # Generating the structure structure = potential_information['structure'] - # Generate the input blocks - control_block = input_generator.write_control_block( - parameters_control=parameters['control']) - compute_block = input_generator.write_compute_block( - parameters_compute=parameters['compute']) - thermo_block, fixed_thermo = input_generator.write_thermo_block( - parameters_thermo=parameters['thermo'], - parameters_compute=parameters['compute'], - ) - md_block = input_generator.write_minimize_block( - parameters_minimize=parameters['md']) - structure_block, group_lists = input_generator.write_structure_block( - parameters_structure=parameters['structure'], - structure=structure, - structure_filename='structure.dat', - ) - fix_block = input_generator.write_fix_block( - parameters_fix=parameters['fix'], - group_names=group_lists, - ) - potential_block = input_generator.write_potential_block( - parameters_potential=parameters['potential'], - potential_file='potential.dat', + # Generating the input file + input_file = input_generator.generate_input_file( + parameters=parameters, potential=potential, structure=structure, - ) - dump_block = input_generator.write_dump_block( - parameters_dump=parameters['dump'], - parameters_compute=parameters['compute'], trajectory_filename='temp.dump', - atom_style='atom', + restart_filename='restart.aiida', + potential_filename='potential.dat', + structure_filename='structure.dat', ) - restart_block = input_generator.write_restart_block( - restart_filename='restart.aiida') - final_block = input_generator.write_final_variables_block( - fixed_thermo=fixed_thermo) - # Printing the potential - input_file = control_block+structure_block+potential_block+fix_block+\ - compute_block+thermo_block+dump_block+md_block+final_block+\ - restart_block + print(input_file) reference_file = os.path.join( TEST_DIR, 'test_generate_inputs', f'test_generate_input_{potential_type}_md.txt', ) - print(input_file) with io.open(reference_file, 'r') as handler: reference_value = handler.read() diff --git a/aiida_lammps/tests/test_generate_inputs/test_generate_input_eam_alloy_md.txt b/aiida_lammps/tests/test_generate_inputs/test_generate_input_eam_alloy_md.txt index cec4f80..ab5fc04 100644 --- a/aiida_lammps/tests/test_generate_inputs/test_generate_input_eam_alloy_md.txt +++ b/aiida_lammps/tests/test_generate_inputs/test_generate_input_eam_alloy_md.txt @@ -31,10 +31,12 @@ thermo 100 #-------------------------Start of the Dump information--------------------------# dump aiida all custom 1000 temp.dump id type element x y z c_ke_atom_all_aiida c_pe_atom_all_aiida c_stress_atom_all_aiida[1] c_stress_atom_all_aiida[2] c_stress_atom_all_aiida[3] c_stress_atom_all_aiida[4] c_stress_atom_all_aiida[5] c_stress_atom_all_aiida[6] #--------------------------End of the Dump information---------------------------# -#---------------------Start of the Minimization information----------------------# -min_style cg -minimize 0.0001 0.0001 1000 1000 -#----------------------End of the Minimization information-----------------------# +#--------------------------Start of the MD information---------------------------# +fix npt_all_aiida all npt temp 300 300 100 iso 0.0 0.0 1000.0 +reset_timestep 0 +run_style verlet +run 100 +#---------------------------End of the MD information----------------------------# #--------------------Start of the Final Variables information--------------------# variable final_step equal step variable final_ke equal ke diff --git a/conftest.py b/conftest.py index 870f313..7fe750a 100644 --- a/conftest.py +++ b/conftest.py @@ -1,5 +1,5 @@ """ -initialise a text database and profile +initialise a test database and profile """ # pylint: disable=fixme, redefined-outer-name from collections import namedtuple @@ -240,8 +240,12 @@ def _get_potential_data(pkey): """ if pkey == 'eam': pair_style = 'eam' - with io.open(os.path.join(TEST_DIR, 'input_files', - 'Fe_mm.eam.fs')) as handle: + filename = os.path.join( + TEST_DIR, + 'input_files', + 'Fe_mm.eam.fs', + ) + with io.open(filename) as handle: potential_dict = { 'type': 'fs', 'file_contents': handle.readlines(), @@ -305,13 +309,20 @@ def _get_potential_data(pkey): elif pkey == 'reaxff': pair_style = 'reaxff' - with io.open( - os.path.join(TEST_DIR, 'input_files', - 'FeCrOSCH.reaxff')) as handle: + filename = os.path.join( + TEST_DIR, + 'input_files', + 'FeCrOSCH.reaxff', + ) + with io.open(filename) as handle: potential_dict = read_lammps_format( - handle.read().splitlines(), tolerances={'hbonddist': 7.0}) - potential_dict = filter_by_species(potential_dict, - ['Fe core', 'S core']) + handle.read().splitlines(), + tolerances={'hbonddist': 7.0}, + ) + potential_dict = filter_by_species( + potential_dict, + ['Fe core', 'S core'], + ) for name in [ 'anglemin', 'angleprod', 'hbondmin', 'torsionprod' ]: From 0aa1d24091e7274fa7043c36aa78f1ec06008327 Mon Sep 17 00:00:00 2001 From: Jonathan Chico Date: Thu, 9 Dec 2021 13:21:18 +0100 Subject: [PATCH 52/70] (WIP) Improving input file generation. Adding a helper funciton to create the header/footer of the structure blocks. Including dump format and proper element symbol printing for the dump file. --- aiida_lammps/common/input_generator.py | 89 +++++++++---------- aiida_lammps/common/utils.py | 12 +++ aiida_lammps/tests/test_generate_inputs.py | 1 - .../test_generate_input_eam_alloy_md.txt | 3 + ...test_generate_input_eam_alloy_minimize.txt | 3 + 5 files changed, 60 insertions(+), 48 deletions(-) diff --git a/aiida_lammps/common/input_generator.py b/aiida_lammps/common/input_generator.py index cd913d1..40c4f4d 100644 --- a/aiida_lammps/common/input_generator.py +++ b/aiida_lammps/common/input_generator.py @@ -18,7 +18,7 @@ import numpy as np from aiida import orm from aiida_lammps.data.lammps_potential import LammpsPotentialData -from aiida_lammps.common.utils import flatten +from aiida_lammps.common.utils import flatten, generate_header def generate_input_file( @@ -123,6 +123,7 @@ def generate_input_file( parameters_compute=parameters.get('compute', {}), trajectory_filename=trajectory_filename, atom_style=potential.atom_style, + kind_symbols=[kind.symbol for kind in structure.kinds], ) # Generate the restart input block restart_block = write_restart_block(restart_filename=restart_filename) @@ -182,16 +183,14 @@ def write_control_block(parameters_control: dict) -> str: } _time = default_timestep[parameters_control.get('units', 'si')] - control_block = '#' + 'Start of the Control information'.center( - 80, '-') + '#\n' + control_block = generate_header('Start of the Control information') control_block += 'clear\n' control_block += f'units {parameters_control.get("units", "si")}\n' control_block += f'newton {parameters_control.get("newton", "on")}\n' if 'processors' in parameters_control: control_block += f'processors {join_keywords(parameters_control["processors"])}\n' control_block += f'timestep {parameters_control.get("timestep", _time)}\n' - control_block += '#' + 'End of the Control information'.center(80, - '-') + '#\n' + control_block += generate_header('End of the Control information') return control_block @@ -225,8 +224,7 @@ def write_potential_block( kind_symbols = np.unique([kind.symbol for kind in structure.kinds]) - potential_block = '#' + 'Start of Potential information'.center( - 80, '-') + '#\n' + potential_block = generate_header('Start of Potential information') potential_block += f'pair_style {potential.pair_style}' potential_block += f' {" ".join(parameters_potential.get("potential_style_options", [""]))}\n' @@ -244,8 +242,7 @@ def write_potential_block( if 'neighbor_modify' in parameters_potential: potential_block += 'neigh_modify' potential_block += f' {join_keywords(parameters_potential["neighbor_modify"])}\n' - potential_block += '#' + 'End of Potential information'.center(80, - '-') + '#\n' + potential_block += generate_header('End of Potential information') return potential_block @@ -284,8 +281,7 @@ def write_structure_block( if site.kind_name not in kind_name_id_map: kind_name_id_map[site.kind_name] = len(kind_name_id_map) + 1 - structure_block = '#' + 'Start of the Structure information'.center( - 80, '-') + '#\n' + structure_block = generate_header('Start of the Structure information') structure_block += f'box tilt {parameters_structure.get("box_tilt", "small")}\n' structure_block += f'dimension {structure.get_dimensionality()["dim"]}\n' @@ -312,8 +308,7 @@ def write_structure_block( group_names.append(_group['name']) if restart_file is not None: structure_block += f'read_restart {restart_file} {parameters_structure["remap"]}' - structure_block += '#' + 'End of the Structure information'.center( - 80, '-') + '#\n' + structure_block += generate_header('End of the Structure information') return structure_block, group_names @@ -333,15 +328,13 @@ def write_minimize_block(parameters_minimize: dict) -> str: :rtype: str """ - minimize_block = '#' + 'Start of the Minimization information'.center( - 80, '-') + '#\n' + minimize_block = generate_header('Start of the Minimization information') minimize_block += f'min_style {parameters_minimize.get("style", "cg")}\n' minimize_block += f'minimize {parameters_minimize.get("energy_tolerance", 1e-4)}' minimize_block += f' {parameters_minimize.get("force_tolerance", 1e-4)}' minimize_block += f' {parameters_minimize.get("max_iterations", 1000)}' minimize_block += f' {parameters_minimize.get("max_evaluations", 1000)}\n' - minimize_block += '#' + 'End of the Minimization information'.center( - 80, '-') + '#\n' + minimize_block += generate_header('End of the Minimization information') return minimize_block @@ -370,7 +363,7 @@ def write_md_block(parameters_md: dict) -> str: integration_parameters=parameters_md['integration'].get('constraints'), ) - md_block = '#' + 'Start of the MD information'.center(80, '-') + '#\n' + md_block = generate_header('Start of the MD information') _key = parameters_md['integration'].get('style', 'nve') md_block += f'fix {generate_id_tag(_key, "all")} all {_key}{integration_options}\n' if 'velocity' in parameters_md: @@ -382,7 +375,7 @@ def write_md_block(parameters_md: dict) -> str: else: md_block += f'run_style {parameters_md.get("run_style", "verlet")}\n' md_block += f'run {parameters_md.get("max_number_steps", 100)}\n' - md_block += '#' + 'End of the MD information'.center(80, '-') + '#\n' + md_block += generate_header('End of the MD information') return md_block @@ -405,22 +398,22 @@ def write_final_variables_block( _variables = [] - variables_block = '#' + 'Start of the Final Variables information'.center( - 80, '-') + '#\n' + variables_block = generate_header( + 'Start of the Final Variables information') for _thermo in fixed_thermo: _variables.append(_thermo.replace('[', '_').replace(']', '')) variables_block += f'variable final_{_variables[-1]} equal {_thermo}\n' - variables_block += '#' + 'End of the Final Variables information'.center( - 80, '-') + '#\n' + variables_block += generate_header( + 'End of the Final Variables information') - variables_block += '#' + 'Start of the Printing Final Variables information'.center( - 80, '-') + '#\n' + variables_block += generate_header( + 'Start of the Printing Final Variables information') variables_block += f'print "#Final results" file {final_file}\n' for variable in _variables: variables_block += f'print "final_{variable}: ${{final_{variable}}}" append {final_file}\n' - variables_block += '#' + 'End of the Printing Final Variables information'.center( - 80, '-') + '#\n' + variables_block += generate_header( + 'End of the Printing Final Variables information') return variables_block @@ -618,7 +611,7 @@ def write_fix_block( if group_names is None: group_names = [] - fix_block = '#' + 'Start of the Fix information'.center(80, '-') + '#\n' + fix_block = generate_header('Start of the Fix information') for key, value in parameters_fix.items(): for entry in value: _group = entry.get('group', 'all') @@ -628,7 +621,7 @@ def write_fix_block( ) fix_block += f'fix {generate_id_tag(key, _group)} {_group} {key} ' fix_block += f'{join_keywords(entry["type"])}\n' - fix_block += '#' + 'End of the Fix information'.center(80, '-') + '#\n' + fix_block += generate_header('End of the Fix information') return fix_block @@ -656,8 +649,7 @@ def write_compute_block( if group_names is None: group_names = [] - compute_block = '#' + 'Start of the Compute information'.center( - 80, '-') + '#\n' + compute_block = generate_header('Start of the Compute information') for key, value in parameters_compute.items(): for entry in value: _group = entry.get('group', 'all') @@ -666,8 +658,7 @@ def write_compute_block( f'group name "{_group}" is not the defined groups') compute_block += f'compute {generate_id_tag(key, _group)} {_group} {key} ' compute_block += f'{join_keywords(entry["type"])}\n' - compute_block += '#' + 'End of the Compute information'.center(80, - '-') + '#\n' + compute_block += generate_header('End of the Compute information') return compute_block @@ -676,6 +667,7 @@ def write_dump_block( trajectory_filename: str, atom_style: str, parameters_compute: dict = None, + kind_symbols: list = None, ) -> str: """Generate the block with dumps commands. @@ -717,12 +709,19 @@ def write_dump_block( calculation_type='compute', )) - dump_block = '#' + 'Start of the Dump information'.center(80, '-') + '#\n' + num_double = len(list(flatten([compute.split() for compute in computes_list]))) + num_double += 3 + if atom_style == 'charge': + num_double += 1 + dump_block = generate_header('Start of the Dump information') dump_block += f'dump aiida all custom {parameters_dump.get("dump_rate", 10)} ' dump_block += f'{trajectory_filename} id type element x y z ' dump_block += f'{"q " if atom_style=="charge" else ""}' dump_block += f'{" ".join(computes_list)}\n' - dump_block += '#' + 'End of the Dump information'.center(80, '-') + '#\n' + dump_block += 'dump_modify aiida sort id\n' + dump_block += f'dump_modify aiida element {" ".join(kind_symbols)}\n' + dump_block += f'dump_modify aiida format line "%6d %4d %4s {" ".join(["%16.10f"]*num_double)}"\n' + dump_block += generate_header('End of the Dump information') return dump_block @@ -787,12 +786,10 @@ def write_thermo_block( fixed_thermo.remove('step') fixed_thermo = ['step'] + fixed_thermo - thermo_block = '#' + 'Start of the Thermo information'.center(80, - '-') + '#\n' + thermo_block = generate_header('Start of the Thermo information') thermo_block += f'thermo_style custom {" ".join(fixed_thermo)} {" ".join(computes_list)}\n' thermo_block += f'thermo {parameters_thermo.get("printing_rate", 1000)}\n' - thermo_block += '#' + 'End of the Thermo information'.center(80, - '-') + '#\n' + thermo_block += generate_header('End of the Thermo information') printing_variables = fixed_thermo + list( flatten([compute.split() for compute in computes_list])) @@ -809,11 +806,9 @@ def write_restart_block(restart_filename: str) -> str: :rtype: str """ - restart_block = '#' + 'Start of the write restart information'.center( - 80, '-') + '#\n' + restart_block = generate_header('Start of the write restart information') restart_block += f'write_restart {restart_filename}\n' - restart_block += '#' + 'End of the write restart information'.center( - 80, '-') + '#\n' + restart_block += generate_header('End of the write restart information') return restart_block @@ -827,11 +822,11 @@ def write_read_restart_block(restart_filename: str) -> str: :rtype: str """ - read_restart_block = '#' + 'Start of the read restart information'.center( - 80, '-') + '#\n' + read_restart_block = generate_header( + 'Start of the read restart information') read_restart_block += f'read_restart {restart_filename}\n' - read_restart_block += '#' + 'End of the read restart information'.center( - 80, '-') + '#\n' + read_restart_block += generate_header( + 'End of the read restart information') return read_restart_block diff --git a/aiida_lammps/common/utils.py b/aiida_lammps/common/utils.py index 9bdadb5..48d57b5 100644 --- a/aiida_lammps/common/utils.py +++ b/aiida_lammps/common/utils.py @@ -4,6 +4,18 @@ from dateutil.parser import parse as get_date +def generate_header(value: str) -> str: + """ + Generate the header for the blocks. + + :param value: string indicating the input block + :type value: str + :return: header/footer for the input block + :rtype: str + """ + return '#' + value.center(80, '-') + '#\n' + + def flatten(full_list: list) -> list: """Flattens a list of list into a flat list. diff --git a/aiida_lammps/tests/test_generate_inputs.py b/aiida_lammps/tests/test_generate_inputs.py index 71c5388..7c94e1b 100644 --- a/aiida_lammps/tests/test_generate_inputs.py +++ b/aiida_lammps/tests/test_generate_inputs.py @@ -103,7 +103,6 @@ def test_input_generate_md( potential_filename='potential.dat', structure_filename='structure.dat', ) - print(input_file) reference_file = os.path.join( TEST_DIR, 'test_generate_inputs', diff --git a/aiida_lammps/tests/test_generate_inputs/test_generate_input_eam_alloy_md.txt b/aiida_lammps/tests/test_generate_inputs/test_generate_input_eam_alloy_md.txt index ab5fc04..ff65af1 100644 --- a/aiida_lammps/tests/test_generate_inputs/test_generate_input_eam_alloy_md.txt +++ b/aiida_lammps/tests/test_generate_inputs/test_generate_input_eam_alloy_md.txt @@ -30,6 +30,9 @@ thermo 100 #-------------------------End of the Thermo information--------------------------# #-------------------------Start of the Dump information--------------------------# dump aiida all custom 1000 temp.dump id type element x y z c_ke_atom_all_aiida c_pe_atom_all_aiida c_stress_atom_all_aiida[1] c_stress_atom_all_aiida[2] c_stress_atom_all_aiida[3] c_stress_atom_all_aiida[4] c_stress_atom_all_aiida[5] c_stress_atom_all_aiida[6] +dump_modify aiida sort id +dump_modify aiida element Fe Fe +dump_modify aiida format line "%6d %4d %4s %16.10f %16.10f %16.10f %16.10f %16.10f %16.10f %16.10f %16.10f %16.10f %16.10f %16.10f" #--------------------------End of the Dump information---------------------------# #--------------------------Start of the MD information---------------------------# fix npt_all_aiida all npt temp 300 300 100 iso 0.0 0.0 1000.0 diff --git a/aiida_lammps/tests/test_generate_inputs/test_generate_input_eam_alloy_minimize.txt b/aiida_lammps/tests/test_generate_inputs/test_generate_input_eam_alloy_minimize.txt index fd9666b..64c1066 100644 --- a/aiida_lammps/tests/test_generate_inputs/test_generate_input_eam_alloy_minimize.txt +++ b/aiida_lammps/tests/test_generate_inputs/test_generate_input_eam_alloy_minimize.txt @@ -30,6 +30,9 @@ thermo 100 #-------------------------End of the Thermo information--------------------------# #-------------------------Start of the Dump information--------------------------# dump aiida all custom 1000 temp.dump id type element x y z c_ke_atom_all_aiida c_pe_atom_all_aiida c_stress_atom_all_aiida[1] c_stress_atom_all_aiida[2] c_stress_atom_all_aiida[3] c_stress_atom_all_aiida[4] c_stress_atom_all_aiida[5] c_stress_atom_all_aiida[6] +dump_modify aiida sort id +dump_modify aiida element Fe Fe +dump_modify aiida format line "%6d %4d %4s %16.10f %16.10f %16.10f %16.10f %16.10f %16.10f %16.10f %16.10f %16.10f %16.10f %16.10f" #--------------------------End of the Dump information---------------------------# #---------------------Start of the Minimization information----------------------# min_style cg From faec2d18c688519a688465662b3de0905f82291e Mon Sep 17 00:00:00 2001 From: Jonathan Chico Date: Fri, 10 Dec 2021 09:33:07 +0100 Subject: [PATCH 53/70] (WIP) Making the lammps calculations more flexible. Adding a new parser that handles the log.lammps and the yaml file with the final compute variables. --- aiida_lammps/common/input_generator.py | 8 +- aiida_lammps/common/raw_parsers.py | 76 ++++++++++++++++ aiida_lammps/parsers/lammps/lammps_parser.py | 91 ++++++++++++++++++++ 3 files changed, 172 insertions(+), 3 deletions(-) create mode 100644 aiida_lammps/parsers/lammps/lammps_parser.py diff --git a/aiida_lammps/common/input_generator.py b/aiida_lammps/common/input_generator.py index 40c4f4d..79874db 100644 --- a/aiida_lammps/common/input_generator.py +++ b/aiida_lammps/common/input_generator.py @@ -685,7 +685,7 @@ def write_dump_block( :return: block with the dump options for the calculation :rtype: str """ - + # pylint: disable=too-many-locals _file = os.path.join( os.path.dirname(os.path.abspath(__file__)), 'variables_types.json', @@ -709,7 +709,8 @@ def write_dump_block( calculation_type='compute', )) - num_double = len(list(flatten([compute.split() for compute in computes_list]))) + num_double = len( + list(flatten([compute.split() for compute in computes_list]))) num_double += 3 if atom_style == 'charge': num_double += 1 @@ -720,7 +721,8 @@ def write_dump_block( dump_block += f'{" ".join(computes_list)}\n' dump_block += 'dump_modify aiida sort id\n' dump_block += f'dump_modify aiida element {" ".join(kind_symbols)}\n' - dump_block += f'dump_modify aiida format line "%6d %4d %4s {" ".join(["%16.10f"]*num_double)}"\n' + dump_block += 'dump_modify aiida format line ' + dump_block += f'"%6d %4d %4s {" ".join(["%16.10f"]*num_double)}"\n' dump_block += generate_header('End of the Dump information') return dump_block diff --git a/aiida_lammps/common/raw_parsers.py b/aiida_lammps/common/raw_parsers.py index da314e9..84ab1de 100644 --- a/aiida_lammps/common/raw_parsers.py +++ b/aiida_lammps/common/raw_parsers.py @@ -1,11 +1,87 @@ """Set of functions to parse the unformatted files generated by LAMMPS. """ # pylint: disable=fixme +import io +import ast import re +from typing import Union import yaml import numpy as np +def parse_logfile(filename: str = 'log.lammps') -> Union[dict, dict]: + """ + Parse the log.lammps file. + + This will gather the time dependent data stored in the log file and + stores it as a dictionary. It will also gather single quantities and stores + them into a different dictionary. + + :param filename: name of the lammps log file, defaults to 'log.lammps' + :type filename: str, optional + :return: dictionary with the time dependent data, dictionary with the global data + :rtype: Union[dict, dict] + """ + + try: + with io.open(filename, 'r') as handler: + data = handler.read() + data = data.split('\n') + except (IOError, OSError): + return None + + header_line_position = -1 + header_line = '' + _data = [] + end_found = False + parsed_data = {} + global_parsed_data = {} + perf_regex = re.compile( + r'Performance\:\s(.+)\sns\/day,\s(.+)\shours\/ns\,\s(.+)\stimesteps\/s\s*' + ) + for index, line in enumerate(data): + if perf_regex.match(line): + _, _, step_sec = perf_regex.match(line).groups() + global_parsed_data['steps_per_second'] = float(step_sec) + if 'units' in line: + global_parsed_data['units_style'] = line.split()[1] + if 'Total wall time:' in line: + global_parsed_data['total_wall_time'] = line.split()[-1] + if line.startswith('Step'): + header_line_position = index + header_line = line.split() + if header_line_position > 0 and index != header_line_position and not end_found: + if not line.split()[0].replace('.', '', 1).isdigit(): + end_found = True + if header_line_position > 0 and index != header_line_position and not end_found: + _data.append([ast.literal_eval(entry) for entry in line.split()]) + _data = np.asarray(_data) + for index, entry in enumerate(header_line): + parsed_data[entry] = _data[:, index].tolist() + return {'time_dependent': parsed_data, 'global': global_parsed_data} + + +def parse_final_data(filename: str = 'aiida_lammps.yaml') -> dict: + """ + Read the yaml file with the global final data. + + The final iteration for each of computed variables is sotred into a yaml + file which is then read and stored as a dictionary. + + :param filename: name of the yaml file where the variables are stored, + defaults to 'aiida_lammps.yaml' + :type filename: str, optional + :return: dictionary with the final compute variables + :rtype: dict + """ + try: + with io.open(filename, 'r') as handle: + data = yaml.load(handle, Loader=yaml.Loader) + except (IOError, OSError): + data = None + return data + + def read_log_file(logdata_txt, compute_stress=False): """Read the log.lammps file.""" # pylint: disable= too-many-locals, too-many-branches diff --git a/aiida_lammps/parsers/lammps/lammps_parser.py b/aiida_lammps/parsers/lammps/lammps_parser.py new file mode 100644 index 0000000..6e87689 --- /dev/null +++ b/aiida_lammps/parsers/lammps/lammps_parser.py @@ -0,0 +1,91 @@ +""" +Base parser for LAMMPS calculations. + +It takes care of parsing the log.lammps file, the trajectory file and the +yaml file with the final value of the variables printed in the ``thermo_style``. +""" +from aiida import orm +from aiida.common import exceptions +from aiida.parsers.parser import Parser +from aiida_lammps.common.raw_parsers import parse_final_data, parse_logfile +from aiida_lammps.data.lammps_potential import LammpsPotentialData + + +class LAMMPSBaseParser(Parser): + """ + Base parser for LAMMPS calculations. + + It takes care of parsing the log.lammps file, the trajectory file and the + yaml file with the final value of the variables printed in the + ``thermo_style``. + """ + def __init__(self, node): + """Initialize the parser""" + # pylint: disable=useless-super-delegation, super-with-arguments + super(LAMMPSBaseParser, self).__init__(node) + + def parse(self, **kwargs): + """ + Parse the files produced by lammps. + + It takes care of parsing the log.lammps file, the trajectory file and the + yaml file with the final value of the variables printed in the + ``thermo_style``. + """ + # pylint: disable=too-many-return-statements + + try: + out_folder = self.retrieved + except exceptions.NotExistent: + return self.exit_codes.ERROR_NO_RETRIEVED_FOLDER + + list_of_files = out_folder.list_object_names() + + # check log file + if self.node.get_option('output_filename') not in list_of_files: + return self.exit_codes.ERROR_LOG_FILE_MISSING + parsed_data = parse_logfile( + filename=self.node.get_option('output_filename')) + if parsed_data is None: + return self.exit_codes.ERROR_PARSING_LOGFILE + global_data = parsed_data['global'] + arrays = parsed_data['time_dependent'] + + # check final variable file + if self.node.get_option( + 'final_variable_filename') not in list_of_files: + return self.exit_codes.ERROR_FINAL_VARIABLE_FILE_MISSING + + final_variables = parse_final_data( + filename=self.node.get_option('final_variable_filename')) + if final_variables is None: + return self.exit_codes.ERROR_PARSING_FINAL_VARIABLES + + results = orm.Dict(dict={ + **final_variables, 'compute_variables': global_data + }) + + # Expose the results from the log.lammps outputs + self.out('results', results) + + # Get the time-dependent outputs exposed as a dictionary + time_dependent_computes = orm.Dict(dict=arrays) + self.out('time_dependent_computes', time_dependent_computes) + + # check trajectory file + if self.node.get_option('trajectory_filename') not in list_of_files: + return self.exit_codes.ERROR_TRAJECTORY_FILE_MISSING + # Gather the lammps trajectory data + lammps_trajectory = LammpsPotentialData( + self.node.get_option('trajectory_filename')) + self.out('trajectories', lammps_trajectory) + + # check stdout + if self.node.get_option('scheduler_stdout') not in list_of_files: + return self.exit_codes.ERROR_STDOUT_FILE_MISSING + + # check stderr + if self.node.get_option('scheduler_stderr') not in list_of_files: + return self.exit_codes.ERROR_STDERR_FILE_MISSING + + return None From 06f00cf27b2ddc0f8da89fc1f6d5a99d32c47983 Mon Sep 17 00:00:00 2001 From: Jonathan Chico Date: Fri, 10 Dec 2021 13:20:30 +0100 Subject: [PATCH 54/70] Adding tests for the new parser. --- aiida_lammps/common/raw_parsers.py | 20 + .../FeW_MO_737567242631_000.eam.alloy.yaml | 0 .../Fe_MO_137964310702_004.tersoff.yaml | 0 .../Fe_MO_331285495617_004.morse.yaml | 0 .../Fe_MO_492310898779_001.meam.yaml | 0 .../input_files/parsers/aiida_lammps.yaml | 16 + .../tests/input_files/parsers/log.lammps | 193 +++++ .../{ => potentials}/FeCrOSCH.reaxff | 0 .../FeW_MO_737567242631_000.eam.alloy | 0 .../Fe_MO_137964310702_004.tersoff | 0 .../Fe_MO_331285495617_004.morse | 0 .../Fe_MO_492310898779_001.meam | 0 .../input_files/{ => potentials}/Fe_mm.eam.fs | 0 .../input_files/{ => potentials}/cho.reaxff | 0 aiida_lammps/tests/test_parsers.py | 74 +- .../test_raw_parsers/test_parse_log.yaml | 794 ++++++++++++++++++ conftest.py | 17 +- setup.json | 2 + 18 files changed, 1097 insertions(+), 19 deletions(-) rename aiida_lammps/tests/input_files/{ => parameters}/FeW_MO_737567242631_000.eam.alloy.yaml (100%) rename aiida_lammps/tests/input_files/{ => parameters}/Fe_MO_137964310702_004.tersoff.yaml (100%) rename aiida_lammps/tests/input_files/{ => parameters}/Fe_MO_331285495617_004.morse.yaml (100%) rename aiida_lammps/tests/input_files/{ => parameters}/Fe_MO_492310898779_001.meam.yaml (100%) create mode 100644 aiida_lammps/tests/input_files/parsers/aiida_lammps.yaml create mode 100644 aiida_lammps/tests/input_files/parsers/log.lammps rename aiida_lammps/tests/input_files/{ => potentials}/FeCrOSCH.reaxff (100%) rename aiida_lammps/tests/input_files/{ => potentials}/FeW_MO_737567242631_000.eam.alloy (100%) rename aiida_lammps/tests/input_files/{ => potentials}/Fe_MO_137964310702_004.tersoff (100%) rename aiida_lammps/tests/input_files/{ => potentials}/Fe_MO_331285495617_004.morse (100%) rename aiida_lammps/tests/input_files/{ => potentials}/Fe_MO_492310898779_001.meam (100%) rename aiida_lammps/tests/input_files/{ => potentials}/Fe_mm.eam.fs (100%) rename aiida_lammps/tests/input_files/{ => potentials}/cho.reaxff (100%) create mode 100644 aiida_lammps/tests/test_raw_parsers/test_parse_log.yaml diff --git a/aiida_lammps/common/raw_parsers.py b/aiida_lammps/common/raw_parsers.py index 84ab1de..204d99c 100644 --- a/aiida_lammps/common/raw_parsers.py +++ b/aiida_lammps/common/raw_parsers.py @@ -22,6 +22,7 @@ def parse_logfile(filename: str = 'log.lammps') -> Union[dict, dict]: :return: dictionary with the time dependent data, dictionary with the global data :rtype: Union[dict, dict] """ + # pylint: disable=too-many-branches try: with io.open(filename, 'r') as handler: @@ -39,14 +40,33 @@ def parse_logfile(filename: str = 'log.lammps') -> Union[dict, dict]: perf_regex = re.compile( r'Performance\:\s(.+)\sns\/day,\s(.+)\shours\/ns\,\s(.+)\stimesteps\/s\s*' ) + for index, line in enumerate(data): if perf_regex.match(line): _, _, step_sec = perf_regex.match(line).groups() global_parsed_data['steps_per_second'] = float(step_sec) + if 'binsize' in line: + global_parsed_data['binsize'] = ast.literal_eval( + line.split()[2].replace(',', '')) + global_parsed_data['bins'] = [ + ast.literal_eval(entry) for entry in line.split()[5:] + ] + if 'ghost atom cutoff' in line: + global_parsed_data['ghost_atom_cutoff'] = ast.literal_eval( + line.split()[-1]) + if 'master list distance cutoff' in line: + global_parsed_data[ + 'master_list_distance_cutoff'] = ast.literal_eval( + line.split()[-1]) + if 'max neighbors/atom' in line: + global_parsed_data['max_neighbors_atom'] = ast.literal_eval( + line.split()[2].replace(',', '')) if 'units' in line: global_parsed_data['units_style'] = line.split()[1] if 'Total wall time:' in line: global_parsed_data['total_wall_time'] = line.split()[-1] + if 'bin:' in line: + global_parsed_data['bin'] = line.split()[-1] if line.startswith('Step'): header_line_position = index header_line = line.split() diff --git a/aiida_lammps/tests/input_files/FeW_MO_737567242631_000.eam.alloy.yaml b/aiida_lammps/tests/input_files/parameters/FeW_MO_737567242631_000.eam.alloy.yaml similarity index 100% rename from aiida_lammps/tests/input_files/FeW_MO_737567242631_000.eam.alloy.yaml rename to aiida_lammps/tests/input_files/parameters/FeW_MO_737567242631_000.eam.alloy.yaml diff --git a/aiida_lammps/tests/input_files/Fe_MO_137964310702_004.tersoff.yaml b/aiida_lammps/tests/input_files/parameters/Fe_MO_137964310702_004.tersoff.yaml similarity index 100% rename from aiida_lammps/tests/input_files/Fe_MO_137964310702_004.tersoff.yaml rename to aiida_lammps/tests/input_files/parameters/Fe_MO_137964310702_004.tersoff.yaml diff --git a/aiida_lammps/tests/input_files/Fe_MO_331285495617_004.morse.yaml b/aiida_lammps/tests/input_files/parameters/Fe_MO_331285495617_004.morse.yaml similarity index 100% rename from aiida_lammps/tests/input_files/Fe_MO_331285495617_004.morse.yaml rename to aiida_lammps/tests/input_files/parameters/Fe_MO_331285495617_004.morse.yaml diff --git a/aiida_lammps/tests/input_files/Fe_MO_492310898779_001.meam.yaml b/aiida_lammps/tests/input_files/parameters/Fe_MO_492310898779_001.meam.yaml similarity index 100% rename from aiida_lammps/tests/input_files/Fe_MO_492310898779_001.meam.yaml rename to aiida_lammps/tests/input_files/parameters/Fe_MO_492310898779_001.meam.yaml diff --git a/aiida_lammps/tests/input_files/parsers/aiida_lammps.yaml b/aiida_lammps/tests/input_files/parsers/aiida_lammps.yaml new file mode 100644 index 0000000..be4057f --- /dev/null +++ b/aiida_lammps/tests/input_files/parsers/aiida_lammps.yaml @@ -0,0 +1,16 @@ +#Final results +final_step: 5000 +final_pe: -17.5141924945569 +final_ke: 0.0636082860772328 +final_press: -61353.82560727 +final_pxx: -57340.4525179122 +final_pyy: -63702.6536853082 +final_pzz: -63018.3706185898 +final_etotal: -17.4505842084796 +final_c_pressure_all_aiida: -61353.82560727 +final_c_pressure_all_aiida_1: -57340.4525179122 +final_c_pressure_all_aiida_2: -63702.6536853082 +final_c_pressure_all_aiida_3: -63018.3706185898 +final_c_pressure_all_aiida_4: -1602.11196923013 +final_c_pressure_all_aiida_5: -3438.00514080948 +final_c_pressure_all_aiida_6: 873.607919841187 diff --git a/aiida_lammps/tests/input_files/parsers/log.lammps b/aiida_lammps/tests/input_files/parsers/log.lammps new file mode 100644 index 0000000..b35020a --- /dev/null +++ b/aiida_lammps/tests/input_files/parsers/log.lammps @@ -0,0 +1,193 @@ +LAMMPS (19 Jul 2019) +#------------------------Start of the Control information------------------------# +clear +units metal +newton on +timestep 1e-05 +#-------------------------End of the Control information-------------------------# +#-----------------------Start of the Structure information-----------------------# +box tilt small +dimension 3 +boundary p p p +atom_style atomic +read_data temp.structure + triclinic box = (0 0 0) to (3.6 3.6 3.6) with tilt (0 0 0) + 1 by 1 by 1 MPI processor grid + reading atoms ... + 4 atoms + read_data CPU = 0.000927289 secs +#------------------------End of the Structure information------------------------# +#-------------------------Start of Potential information-------------------------# +pair_style eam/alloy +pair_coeff * * EAM_WCo.txt Co +#--------------------------End of Potential information--------------------------# +#--------------------------Start of the Fix information--------------------------# +fix box_relax_all_aiida all box/relax iso 0.0 vmax 0.001 +#---------------------------End of the Fix information---------------------------# +#------------------------Start of the Compute information------------------------# +compute pe_atom_all_aiida all pe/atom +compute ke_atom_all_aiida all ke/atom +compute stress_atom_all_aiida all stress/atom NULL +compute pressure_all_aiida all pressure thermo_temp +#-------------------------End of the Compute information-------------------------# +#------------------------Start of the Thermo information-------------------------# +thermo_style custom step pe ke press pxx pyy pzz etotal c_pressure_all_aiida c_pressure_all_aiida[1] c_pressure_all_aiida[2] c_pressure_all_aiida[3] c_pressure_all_aiida[4] c_pressure_all_aiida[5] c_pressure_all_aiida[6] +thermo 100 +#-------------------------End of the Thermo information--------------------------# +#-------------------------Start of the Dump information--------------------------# +dump aiida all custom 1000 temp.dump id type element x y z c_pe_atom_all_aiida c_ke_atom_all_aiida c_stress_atom_all_aiida[1] c_stress_atom_all_aiida[2] c_stress_atom_all_aiida[3] c_stress_atom_all_aiida[4] c_stress_atom_all_aiida[5] c_stress_atom_all_aiida[6] +#--------------------------End of the Dump information---------------------------# +#--------------------------Start of the MD information---------------------------# +fix npt_all_aiida all npt temp 300 300 100 iso 0.0 0.0 1000.0 +velocity all create 300 4261 +reset_timestep 0 +run_style verlet +run 5000 +Neighbor list info ... + update every 1 steps, delay 10 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 8.1287 + ghost atom cutoff = 8.1287 + binsize = 4.06435, bins = 1 1 1 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair eam/alloy, perpetual + attributes: half, newton on + pair build: half/bin/newton/tri + stencil: half/bin/3d/newton/tri + bin: standard +Per MPI rank memory allocation (min/avg/max) = 6.114 | 6.114 | 6.114 Mbytes +Step PotEng KinEng Press Pxx Pyy Pzz TotEng c_pressure_all_aiida c_pressure_all_aiida[1] c_pressure_all_aiida[2] c_pressure_all_aiida[3] c_pressure_all_aiida[4] c_pressure_all_aiida[5] c_pressure_all_aiida[6] + 0 -17.566918 0.11633413 -65748.203 -65784.86 -66151.806 -65307.943 -17.450584 -65748.203 -65784.86 -66151.806 -65307.943 -968.80346 -1835.8858 -293.61095 + 100 -17.566649 0.1160651 -65722.241 -65754.123 -66129.949 -65282.65 -17.450584 -65722.241 -65754.123 -66129.949 -65282.65 -973.77775 -1846.5829 -291.26981 + 200 -17.565845 0.11526118 -65642.472 -65658.395 -66064.381 -65204.64 -17.450584 -65642.472 -65658.395 -66064.381 -65204.64 -989.84677 -1879.7798 -286.53978 + 300 -17.564514 0.11393034 -65509.278 -65503.521 -65950.108 -65074.203 -17.450584 -65509.278 -65503.521 -65950.108 -65074.203 -1013.207 -1928.6061 -279.42196 + 400 -17.562669 0.11208533 -65326.317 -65286.71 -65799.706 -64892.536 -17.450584 -65326.317 -65286.71 -65799.706 -64892.536 -1046.2195 -2006.3727 -266.3884 + 500 -17.56033 0.10974542 -65103.285 -65015.784 -65618.122 -64675.948 -17.450584 -65103.285 -65015.784 -65618.122 -64675.948 -1090.1711 -2099.9919 -252.56792 + 600 -17.557518 0.10693394 -64826.512 -64691.917 -65387.371 -64400.247 -17.450584 -64826.512 -64691.917 -65387.371 -64400.247 -1142.3624 -2210.0802 -232.78862 + 700 -17.554263 0.10367882 -64503.92 -64308.09 -65112.822 -64090.848 -17.450584 -64503.92 -64308.09 -65112.822 -64090.848 -1202.5624 -2334.5663 -209.76166 + 800 -17.550597 0.10001284 -64142.907 -63875.853 -64817.895 -63734.973 -17.450584 -64142.907 -63875.853 -64817.895 -63734.973 -1269.4545 -2484.8578 -192.78731 + 900 -17.546557 0.095973035 -63750.598 -63403.29 -64494.735 -63353.771 -17.450584 -63750.598 -63403.29 -64494.735 -63353.771 -1340.536 -2643.9747 -159.40609 + 1000 -17.542184 0.091600017 -63327.213 -62897.264 -64147.856 -62936.518 -17.450584 -63327.213 -62897.264 -64147.856 -62936.518 -1420.5687 -2825.0555 -133.43268 + 1100 -17.537523 0.086938814 -62875.8 -62354.227 -63772.241 -62500.93 -17.450584 -62875.8 -62354.227 -63772.241 -62500.93 -1509.9058 -3016.8779 -104.75164 + 1200 -17.53262 0.082035633 -62399.47 -61772.191 -63382.067 -62044.153 -17.450584 -62399.47 -61772.191 -63382.067 -62044.153 -1605.6126 -3214.2974 -63.488505 + 1300 -17.527525 0.076941123 -61903.337 -61164.532 -62983.744 -61561.734 -17.450584 -61903.337 -61164.532 -62983.744 -61561.734 -1702.6985 -3426.0733 -29.939054 + 1400 -17.522291 0.07170639 -61400.828 -60545.49 -62570.113 -61086.882 -17.450584 -61400.828 -60545.49 -62570.113 -61086.882 -1797.4703 -3640.8729 11.959351 + 1500 -17.516969 0.066385324 -60887.133 -59915.081 -62146.795 -60599.524 -17.450584 -60887.133 -59915.081 -62146.795 -60599.524 -1899.5853 -3863.7463 46.12708 + 1600 -17.511616 0.061031577 -60367.33 -59266.038 -61731.744 -60104.208 -17.450584 -60367.33 -59266.038 -61731.744 -60104.208 -2009.7436 -4097.8181 84.02951 + 1700 -17.506284 0.055699954 -59868.782 -58638.395 -61331.629 -59636.322 -17.450584 -59868.782 -58638.395 -61331.629 -59636.322 -2107.7149 -4317.7541 123.82406 + 1800 -17.501029 0.050444596 -59362.151 -57993.969 -60927.564 -59164.919 -17.450584 -59362.151 -57993.969 -60927.564 -59164.919 -2211.7169 -4554.8479 171.60175 + 1900 -17.495902 0.045318363 -58877.72 -57368.606 -60540.936 -58723.618 -17.450584 -58877.72 -57368.606 -60540.936 -58723.618 -2314.4932 -4777.1136 214.5613 + 2000 -17.490958 0.040373412 -58418.833 -56768.255 -60185.526 -58302.719 -17.450584 -58418.833 -56768.255 -60185.526 -58302.719 -2406.5373 -4996.5813 259.87776 + 2100 -17.486244 0.03565954 -57973.735 -56177.276 -59838.529 -57905.4 -17.450584 -57973.735 -56177.276 -59838.529 -57905.4 -2506.9093 -5212.599 301.047 + 2200 -17.481807 0.031223281 -57559.197 -55615.466 -59518.743 -57543.382 -17.450584 -57559.197 -55615.466 -59518.743 -57543.382 -2601.0953 -5421.0642 343.15566 + 2300 -17.477692 0.027107811 -57177.922 -55086.132 -59230.515 -57217.119 -17.450584 -57177.922 -55086.132 -59230.515 -57217.119 -2689.3863 -5614.3659 383.75555 + 2400 -17.473937 0.023353261 -56832.654 -54591.523 -58982.191 -56924.249 -17.450584 -56832.654 -54591.523 -58982.191 -56924.249 -2770.4013 -5792.4258 427.0859 + 2500 -17.470579 0.019995313 -56532.563 -54144.199 -58772.925 -56680.565 -17.450584 -56532.563 -54144.199 -58772.925 -56680.565 -2843.1766 -5952.0682 470.07769 + 2600 -17.467649 0.017064736 -56277.079 -53740.328 -58599.938 -56490.971 -17.450584 -56277.079 -53740.328 -58599.938 -56490.971 -2909.2129 -6106.7562 513.74034 + 2700 -17.465171 0.014587164 -56066.19 -53383.566 -58461.976 -56353.03 -17.450584 -56066.19 -53383.566 -58461.976 -56353.03 -2966.8603 -6245.5532 553.72762 + 2800 -17.463167 0.012582962 -55896.669 -53070.921 -58360.328 -56258.758 -17.450584 -55896.669 -53070.921 -58360.328 -56258.758 -3015.1991 -6361.9889 592.58331 + 2900 -17.461651 0.011066833 -55773.504 -52806.909 -58301.571 -56212.032 -17.450584 -55773.504 -52806.909 -58301.571 -56212.032 -3052.7787 -6456.9952 631.23948 + 3000 -17.460632 0.010047783 -55702.238 -52599.181 -58289.794 -56217.739 -17.450584 -55702.238 -52599.181 -58289.794 -56217.739 -3081.3004 -6532.8565 668.98523 + 3100 -17.460113 0.0095290234 -55683.144 -52449.653 -58323.758 -56276.019 -17.450584 -55683.144 -52449.653 -58323.758 -56276.019 -3100.3668 -6586.8159 704.65606 + 3200 -17.460092 0.0095079893 -55714.062 -52356.719 -58400.186 -56385.281 -17.450584 -55714.062 -52356.719 -58400.186 -56385.281 -3110.3233 -6617.0255 737.47145 + 3300 -17.460561 0.0099764599 -55790.896 -52316.485 -58514.702 -56541.5 -17.450584 -55790.896 -52316.485 -58514.702 -56541.5 -3109.387 -6622.1633 768.94265 + 3400 -17.461505 0.010920514 -55913.553 -52328.42 -58667.601 -56744.637 -17.450584 -55913.553 -52328.42 -58667.601 -56744.637 -3096.6654 -6602.9764 798.69664 + 3500 -17.462905 0.012320813 -56082.386 -52393.097 -58860.233 -56993.828 -17.450584 -56082.386 -52393.097 -58860.233 -56993.828 -3074.4264 -6558.6664 826.33739 + 3600 -17.464737 0.014153044 -56291.02 -52505.511 -59084.583 -57282.966 -17.450584 -56291.02 -52505.511 -59084.583 -57282.966 -3040.143 -6488.8504 852.20247 + 3700 -17.466973 0.016388377 -56534.272 -52661.722 -59333.495 -57607.598 -17.450584 -56534.272 -52661.722 -59333.495 -57607.598 -2992.1027 -6396.3687 874.25483 + 3800 -17.469578 0.018993758 -56816.58 -52868.378 -59615.561 -57965.8 -17.450584 -56816.58 -52868.378 -59615.561 -57965.8 -2938.4127 -6282.6641 893.64441 + 3900 -17.472516 0.021932223 -57127.885 -53112.008 -59918.41 -58353.235 -17.450584 -57127.885 -53112.008 -59918.41 -58353.235 -2868.0842 -6144.7654 910.86491 + 4000 -17.475748 0.025163917 -57465.334 -53391.109 -60239.845 -58765.048 -17.450584 -57465.334 -53391.109 -60239.845 -58765.048 -2787.7635 -5982.3773 923.71121 + 4100 -17.47923 0.028645661 -57835.844 -53716.885 -60594.588 -59196.059 -17.450584 -57835.844 -53716.885 -60594.588 -59196.059 -2706.1349 -5803.4791 930.467 + 4200 -17.482917 0.032332943 -58209.434 -54051.25 -60942.379 -59634.672 -17.450584 -58209.434 -54051.25 -60942.379 -59634.672 -2609.2979 -5602.2594 938.7493 + 4300 -17.486764 0.036179331 -58606.366 -54427.092 -61307.319 -60084.686 -17.450584 -58606.366 -54427.092 -61307.319 -60084.686 -2504.5335 -5376.6296 942.39362 + 4400 -17.490721 0.040137034 -59013.13 -54821.768 -61673.772 -60543.849 -17.450584 -59013.13 -54821.768 -61673.772 -60543.849 -2392.4523 -5143.5767 946.14865 + 4500 -17.494743 0.044158855 -59416.013 -55226.984 -62032.966 -60988.088 -17.450584 -59416.013 -55226.984 -62032.966 -60988.088 -2276.0218 -4886.8546 938.31417 + 4600 -17.498782 0.048197656 -59823.98 -55646.686 -62394.421 -61430.833 -17.450584 -59823.98 -55646.686 -62394.421 -61430.833 -2147.8132 -4616.0028 931.58329 + 4700 -17.50279 0.052206157 -60228.539 -56074.321 -62749.479 -61861.817 -17.450584 -60228.539 -56074.321 -62749.479 -61861.817 -2019.3263 -4334.9878 925.58857 + 4800 -17.506723 0.056139255 -60616.181 -56496.14 -63084.235 -62268.168 -17.450584 -60616.181 -56496.14 -63084.235 -62268.168 -1884.7159 -4043.8155 908.07387 + 4900 -17.510538 0.059953842 -60998.054 -56926.184 -63403.866 -62664.111 -17.450584 -60998.054 -56926.184 -63403.866 -62664.111 -1744.5319 -3741.0193 900.0349 + 5000 -17.514192 0.063608286 -61353.826 -57340.453 -63702.654 -63018.371 -17.450584 -61353.826 -57340.453 -63702.654 -63018.371 -1602.112 -3438.0051 873.60792 +Loop time of 0.110005 on 1 procs for 5000 steps with 4 atoms + +Performance: 39.271 ns/day, 0.611 hours/ns, 45452.422 timesteps/s +99.4% CPU use with 1 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.078086 | 0.078086 | 0.078086 | 0.0 | 70.98 +Neigh | 0 | 0 | 0 | 0.0 | 0.00 +Comm | 0.017121 | 0.017121 | 0.017121 | 0.0 | 15.56 +Output | 0.0019105 | 0.0019105 | 0.0019105 | 0.0 | 1.74 +Modify | 0.0082054 | 0.0082054 | 0.0082054 | 0.0 | 7.46 +Other | | 0.004682 | | | 4.26 + +Nlocal: 4 ave 4 max 4 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 662 ave 662 max 662 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 400 ave 400 max 400 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 400 +Ave neighs/atom = 100 +Neighbor list builds = 0 +Dangerous builds = 0 +#---------------------------End of the MD information----------------------------# +#--------------------Start of the Final Variables information--------------------# +variable final_step equal step +variable final_pe equal pe +variable final_ke equal ke +variable final_press equal press +variable final_pxx equal pxx +variable final_pyy equal pyy +variable final_pzz equal pzz +variable final_etotal equal etotal +variable final_c_pressure_all_aiida equal c_pressure_all_aiida +variable final_c_pressure_all_aiida_1 equal c_pressure_all_aiida[1] +variable final_c_pressure_all_aiida_2 equal c_pressure_all_aiida[2] +variable final_c_pressure_all_aiida_3 equal c_pressure_all_aiida[3] +variable final_c_pressure_all_aiida_4 equal c_pressure_all_aiida[4] +variable final_c_pressure_all_aiida_5 equal c_pressure_all_aiida[5] +variable final_c_pressure_all_aiida_6 equal c_pressure_all_aiida[6] +#---------------------End of the Final Variables information---------------------# +#---------------Start of the Printing Final Variables information----------------# +print "#Final results" file aiida_lammps.yaml +#Final results +print "final_step: ${final_step}" append aiida_lammps.yaml +final_step: 5000 +print "final_pe: ${final_pe}" append aiida_lammps.yaml +final_pe: -17.5141924945569 +print "final_ke: ${final_ke}" append aiida_lammps.yaml +final_ke: 0.0636082860772328 +print "final_press: ${final_press}" append aiida_lammps.yaml +final_press: -61353.82560727 +print "final_pxx: ${final_pxx}" append aiida_lammps.yaml +final_pxx: -57340.4525179122 +print "final_pyy: ${final_pyy}" append aiida_lammps.yaml +final_pyy: -63702.6536853082 +print "final_pzz: ${final_pzz}" append aiida_lammps.yaml +final_pzz: -63018.3706185898 +print "final_etotal: ${final_etotal}" append aiida_lammps.yaml +final_etotal: -17.4505842084796 +print "final_c_pressure_all_aiida: ${final_c_pressure_all_aiida}" append aiida_lammps.yaml +final_c_pressure_all_aiida: -61353.82560727 +print "final_c_pressure_all_aiida_1: ${final_c_pressure_all_aiida_1}" append aiida_lammps.yaml +final_c_pressure_all_aiida_1: -57340.4525179122 +print "final_c_pressure_all_aiida_2: ${final_c_pressure_all_aiida_2}" append aiida_lammps.yaml +final_c_pressure_all_aiida_2: -63702.6536853082 +print "final_c_pressure_all_aiida_3: ${final_c_pressure_all_aiida_3}" append aiida_lammps.yaml +final_c_pressure_all_aiida_3: -63018.3706185898 +print "final_c_pressure_all_aiida_4: ${final_c_pressure_all_aiida_4}" append aiida_lammps.yaml +final_c_pressure_all_aiida_4: -1602.11196923013 +print "final_c_pressure_all_aiida_5: ${final_c_pressure_all_aiida_5}" append aiida_lammps.yaml +final_c_pressure_all_aiida_5: -3438.00514080948 +print "final_c_pressure_all_aiida_6: ${final_c_pressure_all_aiida_6}" append aiida_lammps.yaml +final_c_pressure_all_aiida_6: 873.607919841187 +#----------------End of the Printing Final Variables information-----------------# +#---------------------Start of the write restart information---------------------# +write_restart restart.aiida +#----------------------End of the write restart information----------------------# + +Total wall time: 0:00:00 diff --git a/aiida_lammps/tests/input_files/FeCrOSCH.reaxff b/aiida_lammps/tests/input_files/potentials/FeCrOSCH.reaxff similarity index 100% rename from aiida_lammps/tests/input_files/FeCrOSCH.reaxff rename to aiida_lammps/tests/input_files/potentials/FeCrOSCH.reaxff diff --git a/aiida_lammps/tests/input_files/FeW_MO_737567242631_000.eam.alloy b/aiida_lammps/tests/input_files/potentials/FeW_MO_737567242631_000.eam.alloy similarity index 100% rename from aiida_lammps/tests/input_files/FeW_MO_737567242631_000.eam.alloy rename to aiida_lammps/tests/input_files/potentials/FeW_MO_737567242631_000.eam.alloy diff --git a/aiida_lammps/tests/input_files/Fe_MO_137964310702_004.tersoff b/aiida_lammps/tests/input_files/potentials/Fe_MO_137964310702_004.tersoff similarity index 100% rename from aiida_lammps/tests/input_files/Fe_MO_137964310702_004.tersoff rename to aiida_lammps/tests/input_files/potentials/Fe_MO_137964310702_004.tersoff diff --git a/aiida_lammps/tests/input_files/Fe_MO_331285495617_004.morse b/aiida_lammps/tests/input_files/potentials/Fe_MO_331285495617_004.morse similarity index 100% rename from aiida_lammps/tests/input_files/Fe_MO_331285495617_004.morse rename to aiida_lammps/tests/input_files/potentials/Fe_MO_331285495617_004.morse diff --git a/aiida_lammps/tests/input_files/Fe_MO_492310898779_001.meam b/aiida_lammps/tests/input_files/potentials/Fe_MO_492310898779_001.meam similarity index 100% rename from aiida_lammps/tests/input_files/Fe_MO_492310898779_001.meam rename to aiida_lammps/tests/input_files/potentials/Fe_MO_492310898779_001.meam diff --git a/aiida_lammps/tests/input_files/Fe_mm.eam.fs b/aiida_lammps/tests/input_files/potentials/Fe_mm.eam.fs similarity index 100% rename from aiida_lammps/tests/input_files/Fe_mm.eam.fs rename to aiida_lammps/tests/input_files/potentials/Fe_mm.eam.fs diff --git a/aiida_lammps/tests/input_files/cho.reaxff b/aiida_lammps/tests/input_files/potentials/cho.reaxff similarity index 100% rename from aiida_lammps/tests/input_files/cho.reaxff rename to aiida_lammps/tests/input_files/potentials/cho.reaxff diff --git a/aiida_lammps/tests/test_parsers.py b/aiida_lammps/tests/test_parsers.py index 2e5aced..9d13232 100644 --- a/aiida_lammps/tests/test_parsers.py +++ b/aiida_lammps/tests/test_parsers.py @@ -1,13 +1,16 @@ """ Tests to aiida-lammps parsers. """ -from io import StringIO from textwrap import dedent +import io +import os import pytest - +import yaml from aiida.cmdline.utils.common import get_calcjob_report from aiida.orm import FolderData from aiida.plugins import ParserFactory +from aiida_lammps.tests.utils import TEST_DIR +from aiida_lammps.common.raw_parsers import parse_logfile, parse_final_data def get_log(): @@ -68,9 +71,11 @@ def test_missing_log(db_test_app, plugin_name): def test_missing_traj(db_test_app, plugin_name): """Check if the trajectory file is produced during calculation.""" retrieved = FolderData() - retrieved.put_object_from_filelike(StringIO(get_log()), 'log.lammps') - retrieved.put_object_from_filelike(StringIO(''), '_scheduler-stdout.txt') - retrieved.put_object_from_filelike(StringIO(''), '_scheduler-stderr.txt') + retrieved.put_object_from_filelike(io.StringIO(get_log()), 'log.lammps') + retrieved.put_object_from_filelike(io.StringIO(''), + '_scheduler-stdout.txt') + retrieved.put_object_from_filelike(io.StringIO(''), + '_scheduler-stderr.txt') calc_node = db_test_app.generate_calcjob_node(plugin_name, retrieved) parser = ParserFactory(plugin_name) @@ -98,7 +103,7 @@ def test_empty_log(db_test_app, plugin_name): '_scheduler-stdout.txt', '_scheduler-stderr.txt', ]: - retrieved.put_object_from_filelike(StringIO(''), filename) + retrieved.put_object_from_filelike(io.StringIO(''), filename) calc_node = db_test_app.generate_calcjob_node(plugin_name, retrieved) parser = ParserFactory(plugin_name) @@ -123,13 +128,13 @@ def test_empty_log(db_test_app, plugin_name): def test_empty_traj(db_test_app, plugin_name): """Check if the lammps trajectory file is empty.""" retrieved = FolderData() - retrieved.put_object_from_filelike(StringIO(get_log()), 'log.lammps') + retrieved.put_object_from_filelike(io.StringIO(get_log()), 'log.lammps') for filename in [ 'trajectory.lammpstrj', '_scheduler-stdout.txt', '_scheduler-stderr.txt', ]: - retrieved.put_object_from_filelike(StringIO(''), filename) + retrieved.put_object_from_filelike(io.StringIO(''), filename) calc_node = db_test_app.generate_calcjob_node(plugin_name, retrieved) parser = ParserFactory(plugin_name) @@ -154,19 +159,19 @@ def test_run_error(db_test_app, plugin_name): """Check if the parser runs without producing errors.""" retrieved = FolderData() retrieved.put_object_from_filelike( - StringIO(get_log()), + io.StringIO(get_log()), 'log.lammps', ) retrieved.put_object_from_filelike( - StringIO(get_traj_force()), + io.StringIO(get_traj_force()), 'x-trajectory.lammpstrj', ) retrieved.put_object_from_filelike( - StringIO('ERROR description'), + io.StringIO('ERROR description'), '_scheduler-stdout.txt', ) retrieved.put_object_from_filelike( - StringIO(''), + io.StringIO(''), '_scheduler-stderr.txt', ) @@ -187,3 +192,48 @@ def test_run_error(db_test_app, plugin_name): assert calcfunction.is_failed, calcfunction.exit_status assert (calcfunction.exit_status == calc_node.process_class.exit_codes.ERROR_LAMMPS_RUN.status) + + +def test_parser_log(): + """ + Test the parser for the ``log.lammps`` file. + """ + filename = os.path.join( + TEST_DIR, + 'input_files', + 'parsers', + 'log.lammps', + ) + + parsed_data = parse_logfile(filename=filename) + + reference_filename = os.path.join( + TEST_DIR, + 'test_raw_parsers', + 'test_parse_log.yaml', + ) + + with io.open(reference_filename) as handle: + reference_data = yaml.load(handle, Loader=yaml.Loader) + + assert parsed_data == reference_data, 'content of "log.lammps" differs from reference' + + +def test_parse_final_variables(): + """ + Test the parser for the final variables + """ + filename = os.path.join( + TEST_DIR, + 'input_files', + 'parsers', + 'aiida_lammps.yaml', + ) + + parsed_data = parse_final_data(filename=filename) + + assert isinstance(parsed_data, + dict), 'the parsed data is not of the correct format' + + assert 'final_step' in parsed_data, 'no step information present' + assert 'final_etotal' in parsed_data, 'no total energy information present' diff --git a/aiida_lammps/tests/test_raw_parsers/test_parse_log.yaml b/aiida_lammps/tests/test_raw_parsers/test_parse_log.yaml new file mode 100644 index 0000000..3c1032b --- /dev/null +++ b/aiida_lammps/tests/test_raw_parsers/test_parse_log.yaml @@ -0,0 +1,794 @@ +global: + bin: standard + bins: + - 1 + - 1 + - 1 + binsize: 4.06435 + ghost_atom_cutoff: 8.1287 + master_list_distance_cutoff: 8.1287 + max_neighbors_atom: 2000 + steps_per_second: 45452.422 + total_wall_time: 0:00:00 + units_style: metal +time_dependent: + KinEng: + - 0.11633413 + - 0.1160651 + - 0.11526118 + - 0.11393034 + - 0.11208533 + - 0.10974542 + - 0.10693394 + - 0.10367882 + - 0.10001284 + - 0.095973035 + - 0.091600017 + - 0.086938814 + - 0.082035633 + - 0.076941123 + - 0.07170639 + - 0.066385324 + - 0.061031577 + - 0.055699954 + - 0.050444596 + - 0.045318363 + - 0.040373412 + - 0.03565954 + - 0.031223281 + - 0.027107811 + - 0.023353261 + - 0.019995313 + - 0.017064736 + - 0.014587164 + - 0.012582962 + - 0.011066833 + - 0.010047783 + - 0.0095290234 + - 0.0095079893 + - 0.0099764599 + - 0.010920514 + - 0.012320813 + - 0.014153044 + - 0.016388377 + - 0.018993758 + - 0.021932223 + - 0.025163917 + - 0.028645661 + - 0.032332943 + - 0.036179331 + - 0.040137034 + - 0.044158855 + - 0.048197656 + - 0.052206157 + - 0.056139255 + - 0.059953842 + - 0.063608286 + PotEng: + - -17.566918 + - -17.566649 + - -17.565845 + - -17.564514 + - -17.562669 + - -17.56033 + - -17.557518 + - -17.554263 + - -17.550597 + - -17.546557 + - -17.542184 + - -17.537523 + - -17.53262 + - -17.527525 + - -17.522291 + - -17.516969 + - -17.511616 + - -17.506284 + - -17.501029 + - -17.495902 + - -17.490958 + - -17.486244 + - -17.481807 + - -17.477692 + - -17.473937 + - -17.470579 + - -17.467649 + - -17.465171 + - -17.463167 + - -17.461651 + - -17.460632 + - -17.460113 + - -17.460092 + - -17.460561 + - -17.461505 + - -17.462905 + - -17.464737 + - -17.466973 + - -17.469578 + - -17.472516 + - -17.475748 + - -17.47923 + - -17.482917 + - -17.486764 + - -17.490721 + - -17.494743 + - -17.498782 + - -17.50279 + - -17.506723 + - -17.510538 + - -17.514192 + Press: + - -65748.203 + - -65722.241 + - -65642.472 + - -65509.278 + - -65326.317 + - -65103.285 + - -64826.512 + - -64503.92 + - -64142.907 + - -63750.598 + - -63327.213 + - -62875.8 + - -62399.47 + - -61903.337 + - -61400.828 + - -60887.133 + - -60367.33 + - -59868.782 + - -59362.151 + - -58877.72 + - -58418.833 + - -57973.735 + - -57559.197 + - -57177.922 + - -56832.654 + - -56532.563 + - -56277.079 + - -56066.19 + - -55896.669 + - -55773.504 + - -55702.238 + - -55683.144 + - -55714.062 + - -55790.896 + - -55913.553 + - -56082.386 + - -56291.02 + - -56534.272 + - -56816.58 + - -57127.885 + - -57465.334 + - -57835.844 + - -58209.434 + - -58606.366 + - -59013.13 + - -59416.013 + - -59823.98 + - -60228.539 + - -60616.181 + - -60998.054 + - -61353.826 + Pxx: + - -65784.86 + - -65754.123 + - -65658.395 + - -65503.521 + - -65286.71 + - -65015.784 + - -64691.917 + - -64308.09 + - -63875.853 + - -63403.29 + - -62897.264 + - -62354.227 + - -61772.191 + - -61164.532 + - -60545.49 + - -59915.081 + - -59266.038 + - -58638.395 + - -57993.969 + - -57368.606 + - -56768.255 + - -56177.276 + - -55615.466 + - -55086.132 + - -54591.523 + - -54144.199 + - -53740.328 + - -53383.566 + - -53070.921 + - -52806.909 + - -52599.181 + - -52449.653 + - -52356.719 + - -52316.485 + - -52328.42 + - -52393.097 + - -52505.511 + - -52661.722 + - -52868.378 + - -53112.008 + - -53391.109 + - -53716.885 + - -54051.25 + - -54427.092 + - -54821.768 + - -55226.984 + - -55646.686 + - -56074.321 + - -56496.14 + - -56926.184 + - -57340.453 + Pyy: + - -66151.806 + - -66129.949 + - -66064.381 + - -65950.108 + - -65799.706 + - -65618.122 + - -65387.371 + - -65112.822 + - -64817.895 + - -64494.735 + - -64147.856 + - -63772.241 + - -63382.067 + - -62983.744 + - -62570.113 + - -62146.795 + - -61731.744 + - -61331.629 + - -60927.564 + - -60540.936 + - -60185.526 + - -59838.529 + - -59518.743 + - -59230.515 + - -58982.191 + - -58772.925 + - -58599.938 + - -58461.976 + - -58360.328 + - -58301.571 + - -58289.794 + - -58323.758 + - -58400.186 + - -58514.702 + - -58667.601 + - -58860.233 + - -59084.583 + - -59333.495 + - -59615.561 + - -59918.41 + - -60239.845 + - -60594.588 + - -60942.379 + - -61307.319 + - -61673.772 + - -62032.966 + - -62394.421 + - -62749.479 + - -63084.235 + - -63403.866 + - -63702.654 + Pzz: + - -65307.943 + - -65282.65 + - -65204.64 + - -65074.203 + - -64892.536 + - -64675.948 + - -64400.247 + - -64090.848 + - -63734.973 + - -63353.771 + - -62936.518 + - -62500.93 + - -62044.153 + - -61561.734 + - -61086.882 + - -60599.524 + - -60104.208 + - -59636.322 + - -59164.919 + - -58723.618 + - -58302.719 + - -57905.4 + - -57543.382 + - -57217.119 + - -56924.249 + - -56680.565 + - -56490.971 + - -56353.03 + - -56258.758 + - -56212.032 + - -56217.739 + - -56276.019 + - -56385.281 + - -56541.5 + - -56744.637 + - -56993.828 + - -57282.966 + - -57607.598 + - -57965.8 + - -58353.235 + - -58765.048 + - -59196.059 + - -59634.672 + - -60084.686 + - -60543.849 + - -60988.088 + - -61430.833 + - -61861.817 + - -62268.168 + - -62664.111 + - -63018.371 + Step: + - 0.0 + - 100.0 + - 200.0 + - 300.0 + - 400.0 + - 500.0 + - 600.0 + - 700.0 + - 800.0 + - 900.0 + - 1000.0 + - 1100.0 + - 1200.0 + - 1300.0 + - 1400.0 + - 1500.0 + - 1600.0 + - 1700.0 + - 1800.0 + - 1900.0 + - 2000.0 + - 2100.0 + - 2200.0 + - 2300.0 + - 2400.0 + - 2500.0 + - 2600.0 + - 2700.0 + - 2800.0 + - 2900.0 + - 3000.0 + - 3100.0 + - 3200.0 + - 3300.0 + - 3400.0 + - 3500.0 + - 3600.0 + - 3700.0 + - 3800.0 + - 3900.0 + - 4000.0 + - 4100.0 + - 4200.0 + - 4300.0 + - 4400.0 + - 4500.0 + - 4600.0 + - 4700.0 + - 4800.0 + - 4900.0 + - 5000.0 + TotEng: + - -17.450584 + - -17.450584 + - -17.450584 + - -17.450584 + - -17.450584 + - -17.450584 + - -17.450584 + - -17.450584 + - -17.450584 + - -17.450584 + - -17.450584 + - -17.450584 + - -17.450584 + - -17.450584 + - -17.450584 + - -17.450584 + - -17.450584 + - -17.450584 + - -17.450584 + - -17.450584 + - -17.450584 + - -17.450584 + - -17.450584 + - -17.450584 + - -17.450584 + - -17.450584 + - -17.450584 + - -17.450584 + - -17.450584 + - -17.450584 + - -17.450584 + - -17.450584 + - -17.450584 + - -17.450584 + - -17.450584 + - -17.450584 + - -17.450584 + - -17.450584 + - -17.450584 + - -17.450584 + - -17.450584 + - -17.450584 + - -17.450584 + - -17.450584 + - -17.450584 + - -17.450584 + - -17.450584 + - -17.450584 + - -17.450584 + - -17.450584 + - -17.450584 + c_pressure_all_aiida: + - -65748.203 + - -65722.241 + - -65642.472 + - -65509.278 + - -65326.317 + - -65103.285 + - -64826.512 + - -64503.92 + - -64142.907 + - -63750.598 + - -63327.213 + - -62875.8 + - -62399.47 + - -61903.337 + - -61400.828 + - -60887.133 + - -60367.33 + - -59868.782 + - -59362.151 + - -58877.72 + - -58418.833 + - -57973.735 + - -57559.197 + - -57177.922 + - -56832.654 + - -56532.563 + - -56277.079 + - -56066.19 + - -55896.669 + - -55773.504 + - -55702.238 + - -55683.144 + - -55714.062 + - -55790.896 + - -55913.553 + - -56082.386 + - -56291.02 + - -56534.272 + - -56816.58 + - -57127.885 + - -57465.334 + - -57835.844 + - -58209.434 + - -58606.366 + - -59013.13 + - -59416.013 + - -59823.98 + - -60228.539 + - -60616.181 + - -60998.054 + - -61353.826 + c_pressure_all_aiida[1]: + - -65784.86 + - -65754.123 + - -65658.395 + - -65503.521 + - -65286.71 + - -65015.784 + - -64691.917 + - -64308.09 + - -63875.853 + - -63403.29 + - -62897.264 + - -62354.227 + - -61772.191 + - -61164.532 + - -60545.49 + - -59915.081 + - -59266.038 + - -58638.395 + - -57993.969 + - -57368.606 + - -56768.255 + - -56177.276 + - -55615.466 + - -55086.132 + - -54591.523 + - -54144.199 + - -53740.328 + - -53383.566 + - -53070.921 + - -52806.909 + - -52599.181 + - -52449.653 + - -52356.719 + - -52316.485 + - -52328.42 + - -52393.097 + - -52505.511 + - -52661.722 + - -52868.378 + - -53112.008 + - -53391.109 + - -53716.885 + - -54051.25 + - -54427.092 + - -54821.768 + - -55226.984 + - -55646.686 + - -56074.321 + - -56496.14 + - -56926.184 + - -57340.453 + c_pressure_all_aiida[2]: + - -66151.806 + - -66129.949 + - -66064.381 + - -65950.108 + - -65799.706 + - -65618.122 + - -65387.371 + - -65112.822 + - -64817.895 + - -64494.735 + - -64147.856 + - -63772.241 + - -63382.067 + - -62983.744 + - -62570.113 + - -62146.795 + - -61731.744 + - -61331.629 + - -60927.564 + - -60540.936 + - -60185.526 + - -59838.529 + - -59518.743 + - -59230.515 + - -58982.191 + - -58772.925 + - -58599.938 + - -58461.976 + - -58360.328 + - -58301.571 + - -58289.794 + - -58323.758 + - -58400.186 + - -58514.702 + - -58667.601 + - -58860.233 + - -59084.583 + - -59333.495 + - -59615.561 + - -59918.41 + - -60239.845 + - -60594.588 + - -60942.379 + - -61307.319 + - -61673.772 + - -62032.966 + - -62394.421 + - -62749.479 + - -63084.235 + - -63403.866 + - -63702.654 + c_pressure_all_aiida[3]: + - -65307.943 + - -65282.65 + - -65204.64 + - -65074.203 + - -64892.536 + - -64675.948 + - -64400.247 + - -64090.848 + - -63734.973 + - -63353.771 + - -62936.518 + - -62500.93 + - -62044.153 + - -61561.734 + - -61086.882 + - -60599.524 + - -60104.208 + - -59636.322 + - -59164.919 + - -58723.618 + - -58302.719 + - -57905.4 + - -57543.382 + - -57217.119 + - -56924.249 + - -56680.565 + - -56490.971 + - -56353.03 + - -56258.758 + - -56212.032 + - -56217.739 + - -56276.019 + - -56385.281 + - -56541.5 + - -56744.637 + - -56993.828 + - -57282.966 + - -57607.598 + - -57965.8 + - -58353.235 + - -58765.048 + - -59196.059 + - -59634.672 + - -60084.686 + - -60543.849 + - -60988.088 + - -61430.833 + - -61861.817 + - -62268.168 + - -62664.111 + - -63018.371 + c_pressure_all_aiida[4]: + - -968.80346 + - -973.77775 + - -989.84677 + - -1013.207 + - -1046.2195 + - -1090.1711 + - -1142.3624 + - -1202.5624 + - -1269.4545 + - -1340.536 + - -1420.5687 + - -1509.9058 + - -1605.6126 + - -1702.6985 + - -1797.4703 + - -1899.5853 + - -2009.7436 + - -2107.7149 + - -2211.7169 + - -2314.4932 + - -2406.5373 + - -2506.9093 + - -2601.0953 + - -2689.3863 + - -2770.4013 + - -2843.1766 + - -2909.2129 + - -2966.8603 + - -3015.1991 + - -3052.7787 + - -3081.3004 + - -3100.3668 + - -3110.3233 + - -3109.387 + - -3096.6654 + - -3074.4264 + - -3040.143 + - -2992.1027 + - -2938.4127 + - -2868.0842 + - -2787.7635 + - -2706.1349 + - -2609.2979 + - -2504.5335 + - -2392.4523 + - -2276.0218 + - -2147.8132 + - -2019.3263 + - -1884.7159 + - -1744.5319 + - -1602.112 + c_pressure_all_aiida[5]: + - -1835.8858 + - -1846.5829 + - -1879.7798 + - -1928.6061 + - -2006.3727 + - -2099.9919 + - -2210.0802 + - -2334.5663 + - -2484.8578 + - -2643.9747 + - -2825.0555 + - -3016.8779 + - -3214.2974 + - -3426.0733 + - -3640.8729 + - -3863.7463 + - -4097.8181 + - -4317.7541 + - -4554.8479 + - -4777.1136 + - -4996.5813 + - -5212.599 + - -5421.0642 + - -5614.3659 + - -5792.4258 + - -5952.0682 + - -6106.7562 + - -6245.5532 + - -6361.9889 + - -6456.9952 + - -6532.8565 + - -6586.8159 + - -6617.0255 + - -6622.1633 + - -6602.9764 + - -6558.6664 + - -6488.8504 + - -6396.3687 + - -6282.6641 + - -6144.7654 + - -5982.3773 + - -5803.4791 + - -5602.2594 + - -5376.6296 + - -5143.5767 + - -4886.8546 + - -4616.0028 + - -4334.9878 + - -4043.8155 + - -3741.0193 + - -3438.0051 + c_pressure_all_aiida[6]: + - -293.61095 + - -291.26981 + - -286.53978 + - -279.42196 + - -266.3884 + - -252.56792 + - -232.78862 + - -209.76166 + - -192.78731 + - -159.40609 + - -133.43268 + - -104.75164 + - -63.488505 + - -29.939054 + - 11.959351 + - 46.12708 + - 84.02951 + - 123.82406 + - 171.60175 + - 214.5613 + - 259.87776 + - 301.047 + - 343.15566 + - 383.75555 + - 427.0859 + - 470.07769 + - 513.74034 + - 553.72762 + - 592.58331 + - 631.23948 + - 668.98523 + - 704.65606 + - 737.47145 + - 768.94265 + - 798.69664 + - 826.33739 + - 852.20247 + - 874.25483 + - 893.64441 + - 910.86491 + - 923.71121 + - 930.467 + - 938.7493 + - 942.39362 + - 946.14865 + - 938.31417 + - 931.58329 + - 925.58857 + - 908.07387 + - 900.0349 + - 873.60792 diff --git a/conftest.py b/conftest.py index 7fe750a..47f7b9b 100644 --- a/conftest.py +++ b/conftest.py @@ -243,6 +243,7 @@ def _get_potential_data(pkey): filename = os.path.join( TEST_DIR, 'input_files', + 'potentials', 'Fe_mm.eam.fs', ) with io.open(filename) as handle: @@ -262,8 +263,6 @@ def _get_potential_data(pkey): pair_style = 'lennard_jones' potential_dict = { '1 1': '0.01029 3.4 3.5', - # '2 2': '1.0 1.0 2.5', - # '1 2': '1.0 1.0 2.5' } output_dict = { @@ -312,6 +311,7 @@ def _get_potential_data(pkey): filename = os.path.join( TEST_DIR, 'input_files', + 'potentials', 'FeCrOSCH.reaxff', ) with io.open(filename) as handle: @@ -328,11 +328,6 @@ def _get_potential_data(pkey): ]: potential_dict['global'].pop(name) potential_dict['control'] = {'safezone': 1.6} - # potential_dict = { - # "file_contents": handle.readlines(), - # "control": {"safezone": 1.6}, - # "global": {"hbonddist": 7.0}, - # } structure = get_structure_data('pyrite') @@ -371,12 +366,14 @@ def _get_lammps_potential_data(pkey): output_dict['filename'] = os.path.join( 'aiida_lammps/tests', 'input_files', + 'potentials', 'FeW_MO_737567242631_000.eam.alloy', ) filename_parameters = os.path.join( 'aiida_lammps/tests', 'input_files', + 'parameters', 'FeW_MO_737567242631_000.eam.alloy.yaml', ) @@ -391,12 +388,14 @@ def _get_lammps_potential_data(pkey): output_dict['filename'] = os.path.join( 'aiida_lammps/tests', 'input_files', + 'potentials', 'Fe_MO_137964310702_004.tersoff', ) filename_parameters = os.path.join( 'aiida_lammps/tests', 'input_files', + 'parameters', 'Fe_MO_137964310702_004.tersoff.yaml', ) @@ -411,12 +410,14 @@ def _get_lammps_potential_data(pkey): output_dict['filename'] = os.path.join( 'aiida_lammps/tests', 'input_files', + 'potentials', 'Fe_MO_492310898779_001.meam', ) filename_parameters = os.path.join( 'aiida_lammps/tests', 'input_files', + 'parameters', 'Fe_MO_492310898779_001.meam.yaml', ) @@ -431,12 +432,14 @@ def _get_lammps_potential_data(pkey): output_dict['filename'] = os.path.join( 'aiida_lammps/tests', 'input_files', + 'potentials', 'Fe_MO_331285495617_004.morse', ) filename_parameters = os.path.join( 'aiida_lammps/tests', 'input_files', + 'parameters', 'Fe_MO_331285495617_004.morse.yaml', ) diff --git a/setup.json b/setup.json index e48de32..d6ae675 100644 --- a/setup.json +++ b/setup.json @@ -39,6 +39,7 @@ "dynaphopy = aiida_lammps.calculations.dynaphopy: DynaphopyCalculation" ], "aiida.parsers": [ + "lammps.base = aiida_lammps.parsers.lammps_parser:LAMMPSBaseParser", "lammps.force = aiida_lammps.parsers.lammps.force:ForceParser", "lammps.md = aiida_lammps.parsers.lammps.md:MdParser", "lammps.md.multi = aiida_lammps.parsers.lammps.md_multi:MdMultiParser", @@ -47,6 +48,7 @@ ], "aiida.data": [ "lammps.potential = aiida_lammps.data.potential:EmpiricalPotential", + "lammps.lammps_potential = aiida_lammps.data.lammps_potential:LammpsPotentialData", "lammps.trajectory = aiida_lammps.data.trajectory:LammpsTrajectory" ], "lammps.potentials": [ From 1e9cce4c6eb8ec2340bf2a91a10c1ed2febbeb2d Mon Sep 17 00:00:00 2001 From: Jonathan Chico Date: Fri, 10 Dec 2021 16:41:30 +0100 Subject: [PATCH 55/70] (WIP) Making the calculations more flexible. Adding a new base calculation for the LAMMPS plugin. --- aiida_lammps/calculations/lammps/base.py | 226 +++++++++++++++++++++++ aiida_lammps/common/input_generator.py | 11 +- 2 files changed, 235 insertions(+), 2 deletions(-) create mode 100644 aiida_lammps/calculations/lammps/base.py diff --git a/aiida_lammps/calculations/lammps/base.py b/aiida_lammps/calculations/lammps/base.py new file mode 100644 index 0000000..e7325da --- /dev/null +++ b/aiida_lammps/calculations/lammps/base.py @@ -0,0 +1,226 @@ +""" +Base ``LAMMPS`` calculation for AiiDA. +""" +from aiida import orm +from aiida.engine import CalcJob +from aiida.common import datastructures +from aiida_lammps.data.lammps_potential import LammpsPotentialData +from aiida_lammps.common.generate_structure import generate_lammps_structure +from aiida_lammps.common.input_generator import generate_input_file + + +class BaseLammpsCalculation(CalcJob): + """ + A basic plugin for performing calculations in ``LAMMPS`` using aiida. + """ + + _INPUT_FILENAME = 'input.in' + _STRUCTURE_FILENAME = 'structure.dat' + + _DEFAULT_OUTPUT_FILENAME = 'log.lammps' + _DEFAULT_TRAJECTORY_FILENAME = 'aiida_lampps.trajectory.dump' + _DEFAULT_VARIABLES_FILENAME = 'aiida_lammps.yaml' + _DEFAULT_RESTART_FILENAME = 'lammps.restart' + _DEFAULT_POTENTIAL_FILENAME = 'potential.dat' + _DEFAULT_READ_RESTART_FILENAME = 'aiida_lammps.restart' + + _cmdline_params = ('-in', _INPUT_FILENAME) + _stdout_name = None + + @classmethod + def define(cls, spec): + super(BaseLammpsCalculation, cls).define(spec) + spec.input( + 'structure', + valid_type=orm.StructureData, + required=True, + help='Structure used in the ``LAMMPS`` calculation', + ) + spec.input( + 'potential', + valid_type=LammpsPotentialData, + required=True, + help='Potential used in the ``LAMMPS`` calculation', + ) + spec.input( + 'parameters', + valid_type=orm.Dict, + required=True, + help='Parameters that control the ``LAMMPS`` calculation', + ) + spec.input( + 'input_restartfile', + valid_type=orm.SinglefileData, + required=False, + help= + 'Input restartfile to continue from a previous ``LAMMPS`` calculation' + ) + spec.input( + 'metadata.options.input_filename', + valid_type=str, + default=cls._INPUT_FILENAME, + ) + spec.input( + 'metadata.options.structure_filename', + valid_type=str, + default=cls._STRUCTURE_FILENAME, + ) + spec.input( + 'metadata.options.output_filename', + valid_type=str, + default=cls._DEFAULT_OUTPUT_FILENAME, + ) + spec.input( + 'metadata.options.variables_filename', + valid_type=str, + default=cls._DEFAULT_VARIABLES_FILENAME, + ) + spec.input( + 'metadata.options.trajectory_filename', + valid_type=str, + default=cls._DEFAULT_TRAJECTORY_FILENAME, + ) + spec.input( + 'metadata.options.restart_filename', + valid_type=str, + default=cls._DEFAULT_RESTART_FILENAME, + ) + spec.output( + 'results', + valid_type=orm.Dict, + required=True, + help='The data extracted from the lammps log file', + ) + spec.output( + 'trajectories', + valid_type=LammpsPotentialData, + required=True, + help='The data extracted from the lammps trajectory file', + ) + spec.output( + 'time_dependent_computes', + valid_types=orm.Dict, + required=True, + help= + 'The data with the time dependent computes parsed from the lammps.log', + ) + spec.output( + 'restartfile', + valid_type=orm.SinglefileData, + required=True, + help='The restartfile of a ``LAMMPS`` calculation', + ) + spec.output( + 'structure', + valid_type=orm.StructureData, + required=False, + help='The output structure.', + ) + spec.exit_code( + 350, + 'ERROR_NO_RETRIEVED_FOLDER', + message='the retrieved folder data node could not be accessed.', + invalidates_cache=True, + ) + spec.exit_code( + 351, + 'ERROR_LOG_FILE_MISSING', + mesage='the file with the lammps log was not found', + invalidates_cache=True, + ) + spec.exit_code( + 352, + 'ERROR_FINAL_VARIABLE_FILE_MISSING', + mesage='the file with the final variables was not found', + invalidates_cache=True, + ) + spec.exit_code( + 353, + 'ERROR_TRAJECTORY_FILE_MISSING', + mesage='the file with the trajectories was not found', + invalidates_cache=True, + ) + spec.exit_code( + 354, + 'ERROR_STDOUT_FILE_MISSING', + message='the stdout output file was not found', + ) + spec.exit_code( + 355, + 'ERROR_STDERR_FILE_MISSING', + message='the stderr output file was not found', + ) + spec.exit_code( + 1001, + 'ERROR_PARSING_LOGFILE', + message='error parsing the log file has failed.', + ) + spec.exit_code( + 1002, + 'ERROR_PARSING_FINAL_VARIABLES', + message='error parsing the final variable file has failed.', + ) + + def prepare_for_submission(self, folder): + # pylint: disable=too-many-locals + # Setup structure + structure_filecontent, _ = generate_lammps_structure( + self.inputs.structure, + self.inputs.potential.atom_style, + ) + + _structure_filename = self.inputs.metadata.options.structure_filename + + with folder.open(_structure_filename, 'w') as handle: + handle.write(structure_filecontent) + + _parameters = self.inputs.parameters.get_dict() + + _trajectory_filename = self.inputs.metadata.options.restart_filename + + _variables_filename = self.inputs.metadata.options.variables_filename + + _restart_filename = self.inputs.metadata.options.restart_filename + + _output_filename = self.inputs.metadata.options.output_filename + + if 'input_restartfile' in self.inputs: + _read_restart_filename = self.inputs.input_restartfile + else: + _read_restart_filename = None + + input_filecontent = generate_input_file( + potential=self.inputs.potential, + structure=self.inputs.strutcure, + parameters=_parameters, + restart_filename=_restart_filename, + trajectory_filename=_trajectory_filename, + variables_filename=_variables_filename, + read_restart_filename=_read_restart_filename, + ) + + _input_filename = self.inputs.metadata.options.input_filename + + with folder.open(_input_filename, 'w') as handle: + handle.write(input_filecontent) + + with folder.open(self._DEFAULT_POTENTIAL_FILENAME, 'w') as handle: + handle.write(self.inputs.potential.get_content()) + + codeinfo = datastructures.CodeInfo() + codeinfo.cmdline_params = [] + codeinfo.code_uuid = self.inputs.code.uuid + codeinfo.stdout_name = _output_filename + codeinfo.withmpi = self.inputs.metadata.options.withmpi + + calcinfo = datastructures.CalcInfo() + calcinfo.uuid = str(self.uuid) + # Retrieve by default the output file and the xml file + calcinfo.retrieve_list = [] + calcinfo.retrieve_list.append(_output_filename) + calcinfo.retrieve_list.append(_restart_filename) + calcinfo.retrieve_list.append(_variables_filename) + calcinfo.retrieve_list.append(_trajectory_filename) + calcinfo.codes_info = [codeinfo] + + return calcinfo diff --git a/aiida_lammps/common/input_generator.py b/aiida_lammps/common/input_generator.py index 79874db..379a8db 100644 --- a/aiida_lammps/common/input_generator.py +++ b/aiida_lammps/common/input_generator.py @@ -26,9 +26,10 @@ def generate_input_file( potential: LammpsPotentialData, structure: orm.StructureData, trajectory_filename: str = 'aiida_lampps.trajectory.dump', - restart_filename: str = 'restart.aiida', + restart_filename: str = 'lammps.restart', potential_filename: str = 'potential.dat', structure_filename: str = 'structure.dat', + variables_filename: str = 'aiida_lammps.yaml', read_restart_filename: str = None, ) -> str: """ @@ -60,6 +61,9 @@ def generate_input_file( :param structure_filename: filename used to read the structure, defaults to 'structure.dat' :type structure_filename: str, optional + :param variables_filename: filename used to store the final variables, + defaults to 'aiida_lammps.yaml' + :type variables_filename: str, optional :param read_restart_filename: filename used to read the restart information, defaults to None :type read_restart_filename: str, optional @@ -128,7 +132,10 @@ def generate_input_file( # Generate the restart input block restart_block = write_restart_block(restart_filename=restart_filename) # Generate the final variables input block - final_block = write_final_variables_block(fixed_thermo=fixed_thermo) + final_block = write_final_variables_block( + fixed_thermo=fixed_thermo, + final_file=variables_filename, + ) # Printing the potential input_file = control_block+structure_block+potential_block+fix_block+\ compute_block+thermo_block+dump_block+run_block+final_block+\ From 9d651d240fc6e253f9c4234f4e4ac29acf46526e Mon Sep 17 00:00:00 2001 From: Jonathan Chico Date: Mon, 13 Dec 2021 09:11:54 +0100 Subject: [PATCH 56/70] (WIP) Making the calculation more flexible. Adding proper documentation and explanations to the calculation. --- aiida_lammps/calculations/lammps/base.py | 50 ++++++++++++++++++++---- 1 file changed, 42 insertions(+), 8 deletions(-) diff --git a/aiida_lammps/calculations/lammps/base.py b/aiida_lammps/calculations/lammps/base.py index e7325da..c5f628c 100644 --- a/aiida_lammps/calculations/lammps/base.py +++ b/aiida_lammps/calculations/lammps/base.py @@ -1,5 +1,10 @@ """ -Base ``LAMMPS`` calculation for AiiDA. +A basic plugin for performing calculations in ``LAMMPS`` using aiida. + +The plugin will take the input parameters validate them against a schema +and then use them to generate the ``LAMMPS`` input file. The input file +is generated depending on the parameters provided, the type of potential, +the input structure and whether or not a restart file is provided. """ from aiida import orm from aiida.engine import CalcJob @@ -12,6 +17,11 @@ class BaseLammpsCalculation(CalcJob): """ A basic plugin for performing calculations in ``LAMMPS`` using aiida. + + The plugin will take the input parameters validate them against a schema + and then use them to generate the ``LAMMPS`` input file. The input file + is generated depending on the parameters provided, the type of potential, + the input structure and whether or not a restart file is provided. """ _INPUT_FILENAME = 'input.in' @@ -24,9 +34,6 @@ class BaseLammpsCalculation(CalcJob): _DEFAULT_POTENTIAL_FILENAME = 'potential.dat' _DEFAULT_READ_RESTART_FILENAME = 'aiida_lammps.restart' - _cmdline_params = ('-in', _INPUT_FILENAME) - _stdout_name = None - @classmethod def define(cls, spec): super(BaseLammpsCalculation, cls).define(spec) @@ -162,33 +169,51 @@ def define(cls, spec): ) def prepare_for_submission(self, folder): + """ + Create the input files from the input nodes passed to this instance of the `CalcJob`. + """ # pylint: disable=too-many-locals - # Setup structure + + # Generate the content of the structure file based on the input + # structure structure_filecontent, _ = generate_lammps_structure( self.inputs.structure, self.inputs.potential.atom_style, ) + # Get the name of the structure file and write it to the remote folder _structure_filename = self.inputs.metadata.options.structure_filename with folder.open(_structure_filename, 'w') as handle: handle.write(structure_filecontent) + # Get the parameters dictionary so that they can be used for creating + # the input file _parameters = self.inputs.parameters.get_dict() + # Get the name of the trajectory file _trajectory_filename = self.inputs.metadata.options.restart_filename + # Get the name of the variables file _variables_filename = self.inputs.metadata.options.variables_filename + # Get the name of the restart file _restart_filename = self.inputs.metadata.options.restart_filename + # Get the name of the output file _output_filename = self.inputs.metadata.options.output_filename + # If there is a restartfile set its name to the input variables and + # write it in the remote folder if 'input_restartfile' in self.inputs: - _read_restart_filename = self.inputs.input_restartfile + _read_restart_filename = self._DEFAULT_READ_RESTART_FILENAME + with folder.open(_read_restart_filename, 'wb') as handle: + handle.write(self.inputs.input_restartfile.get_content()) else: _read_restart_filename = None + # Write the input file content. This function will also check the + # sanity of the passed paremters when comparing it to a schema input_filecontent = generate_input_file( potential=self.inputs.potential, structure=self.inputs.strutcure, @@ -199,28 +224,37 @@ def prepare_for_submission(self, folder): read_restart_filename=_read_restart_filename, ) + # Get the name of the input file, and write it to the remote folder _input_filename = self.inputs.metadata.options.input_filename with folder.open(_input_filename, 'w') as handle: handle.write(input_filecontent) + # Write the potential to the remote folder with folder.open(self._DEFAULT_POTENTIAL_FILENAME, 'w') as handle: handle.write(self.inputs.potential.get_content()) codeinfo = datastructures.CodeInfo() - codeinfo.cmdline_params = [] + # Command line variables to ensure that the input file from LAMMPS can + # be read + codeinfo.cmdline_params = ['-in', _input_filename] + # Set the code uuid codeinfo.code_uuid = self.inputs.code.uuid + # Set the name of the stdout codeinfo.stdout_name = _output_filename + # Set whether or not one is running with MPI codeinfo.withmpi = self.inputs.metadata.options.withmpi + # Generate the datastructure for the calculation information calcinfo = datastructures.CalcInfo() calcinfo.uuid = str(self.uuid) - # Retrieve by default the output file and the xml file + # Set the files that must be retrieved calcinfo.retrieve_list = [] calcinfo.retrieve_list.append(_output_filename) calcinfo.retrieve_list.append(_restart_filename) calcinfo.retrieve_list.append(_variables_filename) calcinfo.retrieve_list.append(_trajectory_filename) + # Set the information of the code into the calculation datastructure calcinfo.codes_info = [codeinfo] return calcinfo From 850fb95b814ba70df25b56b36d28f2d19c038845 Mon Sep 17 00:00:00 2001 From: Jonathan Chico Date: Mon, 13 Dec 2021 16:46:20 +0100 Subject: [PATCH 57/70] (WIP) Improving the flexibility of the calculation. Start of adding an example for the base lammps calculation. --- .pre-commit-config.yaml | 1 + .../FeW_MO_737567242631_000.eam.alloy.yaml | 2 +- examples/Fe_2.eam.fs | 6006 +++++++++++++++++ examples/lauch_lammps_base.py | 101 + setup.json | 1 + 5 files changed, 6110 insertions(+), 1 deletion(-) create mode 100644 examples/Fe_2.eam.fs create mode 100644 examples/lauch_lammps_base.py diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 578a95c..17c5972 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -18,6 +18,7 @@ repos: - id: check-yaml - id: check-json - id: check-added-large-files + args: ['--maxkb=1000'] - id: double-quote-string-fixer - id: forbid-new-submodules diff --git a/aiida_lammps/tests/input_files/parameters/FeW_MO_737567242631_000.eam.alloy.yaml b/aiida_lammps/tests/input_files/parameters/FeW_MO_737567242631_000.eam.alloy.yaml index 91bae34..6596b34 100644 --- a/aiida_lammps/tests/input_files/parameters/FeW_MO_737567242631_000.eam.alloy.yaml +++ b/aiida_lammps/tests/input_files/parameters/FeW_MO_737567242631_000.eam.alloy.yaml @@ -22,7 +22,7 @@ extra_tags: "recordkey": "MO_737567242631_000a", "recordprimary": "recordprimary", "recordtype": "article", - "title": "On the mobility of vacancy clusters in reduced activation steels: an atomistic study in the {Fe}–{Cr}–{W} model alloy", + "title": "On the mobility of vacancy clusters in reduced activation steels: an atomistic study in the {Fe}-{Cr}-{W} model alloy", "volume": "25", "year": "2013" } diff --git a/examples/Fe_2.eam.fs b/examples/Fe_2.eam.fs new file mode 100644 index 0000000..aadcf1c --- /dev/null +++ b/examples/Fe_2.eam.fs @@ -0,0 +1,6006 @@ +Sourse: Potential #2 from [M.I. Mendelev, S. Han, D.J. Srolovitz, G.J. Ackland, D.Y. Sun and M. Asta, Phil. Mag. A, 83, 3977-3994 (2003).] +Contact information: mendelev@ameslab.gov +Sunday, Feb 22, 2009 The potential was taken from v9_4_bcc (in C:\SIMULATION.MD\Fe\Results\ab_initio+Interstitials) +1 Fe +10000 3.00000000000000E-0002 10000 5.30000000000000E-0004 5.30000000000000E+0000 +26 5.58500000000000E+0001 2.85531200000000E+0000 bcc + 0.00000000000000E+0000 -1.73205399240757E-0001 -2.44950248213795E-0001 -3.00002866354823E-0001 -3.46415257255683E-0001 +-3.87306296717472E-0001 -4.24275534131220E-0001 -4.58273175205176E-0001 -4.89918331524266E-0001 -5.19641039464070E-0001 +-5.47754405892088E-0001 -5.74494801201978E-0001 -6.00045861677168E-0001 -6.24553623613738E-0001 -6.48136492679153E-0001 +-6.70892052120511E-0001 -6.92901854898071E-0001 -7.14234884692489E-0001 -7.34950111608580E-0001 -7.55098416203863E-0001 +-7.74724062789171E-0001 -7.93865844705703E-0001 -8.12557986656298E-0001 -8.30830864258625E-0001 -8.48711584132527E-0001 +-8.66224456202701E-0001 -8.83391381728377E-0001 -9.00232174740661E-0001 -9.16764830344636E-0001 -9.33005750242895E-0001 +-9.48969933532811E-0001 -9.64671139097615E-0001 -9.80122024595352E-0001 -9.95334266040200E-0001 -1.01031866118903E+0000 +-1.02508521933575E+0000 -1.03964323963583E+0000 -1.05400137970224E+0000 -1.06816771591028E+0000 -1.08214979660428E+0000 +-1.09595468920108E+0000 -1.10958902202510E+0000 -1.12305902157749E+0000 -1.13637054583424E+0000 -1.14952911407841E+0000 +-1.16253993369739E+0000 -1.17540792431434E+0000 -1.18813773957090E+0000 -1.20073378683468E+0000 -1.21320024506821E+0000 +-1.22554108106464E+0000 -1.23776006422914E+0000 -1.24986078006205E+0000 -1.26184664248049E+0000 -1.27372090509843E+0000 +-1.28548667157090E+0000 -1.29714690509544E+0000 -1.30870443715330E+0000 -1.32016197556335E+0000 -1.33152211191376E+0000 +-1.34278732842906E+0000 -1.35396000432423E+0000 -1.36504242169186E+0000 -1.37603677096368E+0000 -1.38694515598342E+0000 +-1.39776959872435E+0000 -1.40851204368135E+0000 -1.41917436196471E+0000 -1.42975835511984E+0000 -1.44026575869517E+0000 +-1.45069824557812E+0000 -1.46105742911738E+0000 -1.47134486604794E+0000 -1.48156205923394E+0000 -1.49171046024298E+0000 +-1.50179147176436E+0000 -1.51180644988276E+0000 -1.52175670621767E+0000 -1.53164350993817E+0000 -1.54146808966186E+0000 +-1.55123163524597E+0000 -1.56093529947794E+0000 -1.57058019967244E+0000 -1.58016741918100E+0000 -1.58969800881997E+0000 +-1.59917298822224E+0000 -1.60859334711765E+0000 -1.61796004654647E+0000 -1.62727402001043E+0000 -1.63653617456491E+0000 +-1.64574739185618E+0000 -1.65490852910684E+0000 -1.66402042005269E+0000 -1.67308387583388E+0000 -1.68209968584309E+0000 +-1.69106861853312E+0000 -1.69999142218644E+0000 -1.70886882564868E+0000 -1.71770153902821E+0000 -1.72649025436363E+0000 +-1.73523564626107E+0000 -1.74393837250283E+0000 -1.75259907462895E+0000 -1.76121837849324E+0000 -1.76979689479505E+0000 +-1.77833521958803E+0000 -1.78683393476725E+0000 -1.79529360853558E+0000 -1.80371479585057E+0000 -1.81209803885271E+0000 +-1.82044386727605E+0000 -1.82875279884212E+0000 -1.83702533963782E+0000 -1.84526198447826E+0000 -1.85346321725507E+0000 +-1.86162951127110E+0000 -1.86976132956198E+0000 -1.87785912520526E+0000 -1.88592334161769E+0000 -1.89395441284113E+0000 +-1.90195276381779E+0000 -1.90991881065501E+0000 -1.91785296088036E+0000 -1.92575561368727E+0000 -1.93362716017171E+0000 +-1.94146798356026E+0000 -1.94927845943008E+0000 -1.95705895592095E+0000 -1.96480983393983E+0000 -1.97253144735828E+0000 +-1.98022414320296E+0000 -1.98788826183957E+0000 -1.99552413715052E+0000 -2.00313209670644E+0000 -2.01071246193204E+0000 +-2.01826554826633E+0000 -2.02579166531750E+0000 -2.03329111701271E+0000 -2.04076420174299E+0000 -2.04821121250340E+0000 +-2.05563243702862E+0000 -2.06302815792426E+0000 -2.07039865279397E+0000 -2.07774419436246E+0000 -2.08506505059479E+0000 +-2.09236148481176E+0000 -2.09963375580191E+0000 -2.10688211792996E+0000 -2.11410682124193E+0000 -2.12130811156714E+0000 +-2.12848623061708E+0000 -2.13564141608135E+0000 -2.14277390172071E+0000 -2.14988391745741E+0000 -2.15697168946287E+0000 +-2.16403744024278E+0000 -2.17108138871972E+0000 -2.17810375031346E+0000 -2.18510473701892E+0000 -2.19208455748189E+0000 +-2.19904341707268E+0000 -2.20598151795763E+0000 -2.21289905916865E+0000 -2.21979623667089E+0000 -2.22667324342841E+0000 +-2.23353026946820E+0000 -2.24036750194235E+0000 -2.24718512518860E+0000 -2.25398332078921E+0000 -2.26076226762831E+0000 +-2.26752214194768E+0000 -2.27426311740107E+0000 -2.28098536510710E+0000 -2.28768905370077E+0000 -2.29437434938366E+0000 +-2.30104141597276E+0000 -2.30769041494815E+0000 -2.31432150549936E+0000 -2.32093484457061E+0000 -2.32753058690495E+0000 +-2.33410888508716E+0000 -2.34066988958570E+0000 -2.34721374879361E+0000 -2.35374060906828E+0000 -2.36025061477044E+0000 +-2.36674390830198E+0000 -2.37322063014306E+0000 -2.37968091888813E+0000 -2.38612491128127E+0000 -2.39255274225052E+0000 +-2.39896454494148E+0000 -2.40536045075016E+0000 -2.41174058935490E+0000 -2.41810508874774E+0000 -2.42445407526490E+0000 +-2.43078767361663E+0000 -2.43710600691636E+0000 -2.44340919670918E+0000 -2.44969736299966E+0000 -2.45597062427908E+0000 +-2.46222909755195E+0000 -2.46847289836207E+0000 -2.47470214081786E+0000 -2.48091693761727E+0000 -2.48711740007203E+0000 +-2.49330363813139E+0000 -2.49947576040540E+0000 -2.50563387418760E+0000 -2.51177808547727E+0000 -2.51790849900115E+0000 +-2.52402521823480E+0000 -2.53012834542334E+0000 -2.53621798160189E+0000 -2.54229422661552E+0000 -2.54835717913876E+0000 +-2.55440693669472E+0000 -2.56044359567387E+0000 -2.56646725135229E+0000 -2.57247799790967E+0000 -2.57847592844689E+0000 +-2.58446113500324E+0000 -2.59043370857329E+0000 -2.59639373912340E+0000 -2.60234131560792E+0000 -2.60827652598509E+0000 +-2.61419945723255E+0000 -2.62011019536256E+0000 -2.62600882543698E+0000 -2.63189543158190E+0000 -2.63777009700196E+0000 +-2.64363290399444E+0000 -2.64948393396305E+0000 -2.65532326743145E+0000 -2.66115098405651E+0000 -2.66696716264133E+0000 +-2.67277188114799E+0000 -2.67856521671006E+0000 -2.68434724564486E+0000 -2.69011804346554E+0000 -2.69587768489286E+0000 +-2.70162624386678E+0000 -2.70736379355788E+0000 -2.71309040637846E+0000 -2.71880615399353E+0000 -2.72451110733158E+0000 +-2.73020533659508E+0000 -2.73588891127090E+0000 -2.74156190014044E+0000 -2.74722437128964E+0000 -2.75287639211876E+0000 +-2.75851802935204E+0000 -2.76414934904714E+0000 -2.76977041660441E+0000 -2.77538129677604E+0000 -2.78098205367501E+0000 +-2.78657275078386E+0000 -2.79215345096336E+0000 -2.79772421646103E+0000 -2.80328510891943E+0000 -2.80883618938437E+0000 +-2.81437751831302E+0000 -2.81990915558174E+0000 -2.82543116049393E+0000 -2.83094359178766E+0000 -2.83644650764317E+0000 +-2.84193996569027E+0000 -2.84742402301559E+0000 -2.85289873616976E+0000 -2.85836416117438E+0000 -2.86382035352894E+0000 +-2.86926736821763E+0000 -2.87470525971599E+0000 -2.88013408199747E+0000 -2.88555388853989E+0000 -2.89096473233180E+0000 +-2.89636666587873E+0000 -2.90175974120929E+0000 -2.90714400988125E+0000 -2.91251952298748E+0000 -2.91788633116179E+0000 +-2.92324448458469E+0000 -2.92859403298903E+0000 -2.93393502566560E+0000 -2.93926751146860E+0000 -2.94459153882104E+0000 +-2.94990715572003E+0000 -2.95521440974203E+0000 -2.96051334804797E+0000 -2.96580401738834E+0000 -2.97108646410816E+0000 +-2.97636073415187E+0000 -2.98162687306820E+0000 -2.98688492601487E+0000 -2.99213493776333E+0000 -2.99737695270334E+0000 +-3.00261101484752E+0000 -3.00783716783579E+0000 -3.01305545493983E+0000 -3.01826591906737E+0000 -3.02346860276647E+0000 +-3.02866354822974E+0000 -3.03385079729849E+0000 -3.03903039146677E+0000 -3.04420237188543E+0000 -3.04936677936608E+0000 +-3.05452365438497E+0000 -3.05967303708685E+0000 -3.06481496728876E+0000 -3.06994948448376E+0000 -3.07507662784460E+0000 +-3.08019643622736E+0000 -3.08530894817502E+0000 -3.09041420192096E+0000 -3.09551223539246E+0000 -3.10060308621411E+0000 +-3.10568679171117E+0000 -3.11076338891290E+0000 -3.11583291455584E+0000 -3.12089540508704E+0000 -3.12595089666724E+0000 +-3.13099942517400E+0000 -3.13604102620481E+0000 -3.14107573508015E+0000 -3.14610358684646E+0000 -3.15112461627915E+0000 +-3.15613885788549E+0000 -3.16114634590753E+0000 -3.16614711432492E+0000 -3.17114119685772E+0000 -3.17612862696917E+0000 +-3.18110943786844E+0000 -3.18608366251329E+0000 -3.19105133361273E+0000 -3.19601248362969E+0000 -3.20096714478352E+0000 +-3.20591534905261E+0000 -3.21085712817690E+0000 -3.21579251366030E+0000 -3.22072153677323E+0000 -3.22564422855495E+0000 +-3.23056061981602E+0000 -3.23547074114059E+0000 -3.24037462288877E+0000 -3.24527229519888E+0000 -3.25016378798974E+0000 +-3.25504913096292E+0000 -3.25992835360487E+0000 -3.26480148518917E+0000 -3.26966855477864E+0000 -3.27452959122747E+0000 +-3.27938462318330E+0000 -3.28423367908928E+0000 -3.28907678718614E+0000 -3.29391397551415E+0000 -3.29874527191516E+0000 +-3.30357070403451E+0000 -3.30839029932302E+0000 -3.31320408503885E+0000 -3.31801208824942E+0000 -3.32281433583325E+0000 +-3.32761085448183E+0000 -3.33240167070140E+0000 -3.33718681081480E+0000 -3.34196630096317E+0000 -3.34674016710775E+0000 +-3.35150843503161E+0000 -3.35627113034133E+0000 -3.36102827846870E+0000 -3.36577990467239E+0000 -3.37052603403960E+0000 +-3.37526669148767E+0000 -3.38000190176568E+0000 -3.38473168945607E+0000 -3.38945607897617E+0000 -3.39417509457977E+0000 +-3.39888876035866E+0000 -3.40359710024409E+0000 -3.40830013800833E+0000 -3.41299789726609E+0000 -3.41769040147601E+0000 +-3.42237767394210E+0000 -3.42705973781514E+0000 -3.43173661609412E+0000 -3.43640833162758E+0000 -3.44107490711504E+0000 +-3.44573636510833E+0000 -3.45039272801292E+0000 -3.45504401808928E+0000 -3.45969025745416E+0000 -3.46433146808189E+0000 +-3.46896767180568E+0000 -3.47359889031887E+0000 -3.47822514517617E+0000 -3.48284645779494E+0000 -3.48746284945635E+0000 +-3.49207434130665E+0000 -3.49668095435832E+0000 -3.50128270949127E+0000 -3.50587962745402E+0000 -3.51047172886483E+0000 +-3.51505903421285E+0000 -3.51964156385927E+0000 -3.52421933803839E+0000 -3.52879237685879E+0000 -3.53336070030435E+0000 +-3.53792432823538E+0000 -3.54248328038967E+0000 -3.54703757638355E+0000 -3.55158723571291E+0000 -3.55613227775428E+0000 +-3.56067272176581E+0000 -3.56520858688829E+0000 -3.56973989214616E+0000 -3.57426665644849E+0000 -3.57878889858994E+0000 +-3.58330663725177E+0000 -3.58781989100276E+0000 -3.59232867830016E+0000 -3.59683301749064E+0000 -3.60133292681119E+0000 +-3.60582842439007E+0000 -3.61031952824768E+0000 -3.61480625629750E+0000 -3.61928862634693E+0000 -3.62376665609818E+0000 +-3.62824036314917E+0000 -3.63270976499435E+0000 -3.63717487902555E+0000 -3.64163572253286E+0000 -3.64609231270542E+0000 +-3.65054466663225E+0000 -3.65499280130310E+0000 -3.65943673360919E+0000 -3.66387648034409E+0000 -3.66831205820443E+0000 +-3.67274348379072E+0000 -3.67717077360815E+0000 -3.68159394406729E+0000 -3.68601301148489E+0000 -3.69042799208464E+0000 +-3.69483890199786E+0000 -3.69924575726429E+0000 -3.70364857383280E+0000 -3.70804736756207E+0000 -3.71244215422136E+0000 +-3.71683294949119E+0000 -3.72121976896402E+0000 -3.72560262814496E+0000 -3.72998154245247E+0000 -3.73435652721901E+0000 +-3.73872759769169E+0000 -3.74309476903299E+0000 -3.74745805632139E+0000 -3.75181747455199E+0000 -3.75617303863720E+0000 +-3.76052476340737E+0000 -3.76487266361138E+0000 -3.76921675391732E+0000 -3.77355704891306E+0000 -3.77789356310690E+0000 +-3.78222631092816E+0000 -3.78655530672778E+0000 -3.79088056477891E+0000 -3.79520209927753E+0000 -3.79951992434298E+0000 +-3.80383405401858E+0000 -3.80814450227218E+0000 -3.81245128299676E+0000 -3.81675441001094E+0000 -3.82105389705957E+0000 +-3.82534975781427E+0000 -3.82964200587399E+0000 -3.83393065476552E+0000 -3.83821571794405E+0000 -3.84249720879369E+0000 +-3.84677514062799E+0000 -3.85104952669048E+0000 -3.85532038015516E+0000 -3.85958771412701E+0000 -3.86385154164253E+0000 +-3.86811187567020E+0000 -3.87236872911098E+0000 -3.87662211479883E+0000 -3.88087204550117E+0000 -3.88511853391938E+0000 +-3.88936159268925E+0000 -3.89360123438149E+0000 -3.89783747150216E+0000 -3.90207031649317E+0000 -3.90629978173271E+0000 +-3.91052587953573E+0000 -3.91474862215437E+0000 -3.91896802177842E+0000 -3.92318409053578E+0000 -3.92739684049285E+0000 +-3.93160628365501E+0000 -3.93581243196705E+0000 -3.94001529731357E+0000 -3.94421489151942E+0000 -3.94841122635011E+0000 +-3.95260431351226E+0000 -3.95679416465395E+0000 -3.96098079136521E+0000 -3.96516420517833E+0000 -3.96934441756834E+0000 +-3.97352143995338E+0000 -3.97769528369508E+0000 -3.98186596009897E+0000 -3.98603348041485E+0000 -3.99019785583721E+0000 +-3.99435909750555E+0000 -3.99851721650481E+0000 -4.00267222386572E+0000 -4.00682413056520E+0000 -4.01097294752665E+0000 +-4.01511868562041E+0000 -4.01926135566407E+0000 -4.02340096842282E+0000 -4.02753753460982E+0000 -4.03167106488657E+0000 +-4.03580156986321E+0000 -4.03992906009893E+0000 -4.04405354610224E+0000 -4.04817503833137E+0000 -4.05229354719458E+0000 +-4.05640908305047E+0000 -4.06052165620838E+0000 -4.06463127692863E+0000 -4.06873795542293E+0000 -4.07284170185463E+0000 +-4.07694252633910E+0000 -4.08104043894398E+0000 -4.08513544968958E+0000 -4.08922756854910E+0000 -4.09331680544902E+0000 +-4.09740317026934E+0000 -4.10148667284393E+0000 -4.10556732296081E+0000 -4.10964513036246E+0000 -4.11372010474610E+0000 +-4.11779225576399E+0000 -4.12186159302373E+0000 -4.12592812608855E+0000 -4.12999186447757E+0000 -4.13405281766613E+0000 +-4.13811099508603E+0000 -4.14216640612581E+0000 -4.14621906013107E+0000 -4.15026896640471E+0000 -4.15431613420719E+0000 +-4.15836057275684E+0000 -4.16240229123009E+0000 -4.16644129876178E+0000 -4.17047760444536E+0000 -4.17451121733323E+0000 +-4.17854214643693E+0000 -4.18257040072742E+0000 -4.18659598913538E+0000 -4.19061892055137E+0000 -4.19463920382619E+0000 +-4.19865684777103E+0000 -4.20267186115779E+0000 -4.20668425271928E+0000 -4.21069403114949E+0000 -4.21470120510383E+0000 +-4.21870578319933E+0000 -4.22270777401494E+0000 -4.22670718609172E+0000 -4.23070402793309E+0000 -4.23469830800505E+0000 +-4.23869003473644E+0000 -4.24267921651913E+0000 -4.24666586170826E+0000 -4.25064997862250E+0000 -4.25463157554420E+0000 +-4.25861066071969E+0000 -4.26258724235943E+0000 -4.26656132863828E+0000 -4.27053292769568E+0000 -4.27450204763591E+0000 +-4.27846869652823E+0000 -4.28243288240718E+0000 -4.28639461327269E+0000 -4.29035389709040E+0000 -4.29431074179175E+0000 +-4.29826515527428E+0000 -4.30221714540178E+0000 -4.30616672000450E+0000 -4.31011388687938E+0000 -4.31405865379019E+0000 +-4.31800102846779E+0000 -4.32194101861027E+0000 -4.32587863188319E+0000 -4.32981387591975E+0000 -4.33374675832097E+0000 +-4.33767728665591E+0000 -4.34160546846182E+0000 -4.34553131124437E+0000 -4.34945482247779E+0000 -4.35337600960510E+0000 +-4.35729488003826E+0000 -4.36121144115833E+0000 -4.36512570031573E+0000 -4.36903766483033E+0000 -4.37294734199168E+0000 +-4.37685473905917E+0000 -4.38075986326221E+0000 -4.38466272180038E+0000 -4.38856332184363E+0000 -4.39246167053245E+0000 +-4.39635777497801E+0000 -4.40025164226237E+0000 -4.40414327943861E+0000 -4.40803269353100E+0000 -4.41191989153521E+0000 +-4.41580488041840E+0000 -4.41968766711944E+0000 -4.42356825854904E+0000 -4.42744666158993E+0000 -4.43132288309701E+0000 +-4.43519692989749E+0000 -4.43906880879107E+0000 -4.44293852655010E+0000 -4.44680608991970E+0000 -4.45067150561794E+0000 +-4.45453478033601E+0000 -4.45839592073830E+0000 -4.46225493346263E+0000 -4.46611182512035E+0000 -4.46996660229651E+0000 +-4.47381927155000E+0000 -4.47766983941367E+0000 -4.48151831239452E+0000 -4.48536469697382E+0000 -4.48920899960724E+0000 +-4.49305122672502E+0000 -4.49689138473207E+0000 -4.50072948000815E+0000 -4.50456551890800E+0000 -4.50839950776145E+0000 +-4.51223145287358E+0000 -4.51606136052486E+0000 -4.51988923697127E+0000 -4.52371508844443E+0000 -4.52753892115174E+0000 +-4.53136074127654E+0000 -4.53518055497817E+0000 -4.53899836839219E+0000 -4.54281418763041E+0000 -4.54662801878111E+0000 +-4.55043986790910E+0000 -4.55424974105591E+0000 -4.55805764423982E+0000 -4.56186358345610E+0000 -4.56566756467705E+0000 +-4.56946959385214E+0000 -4.57326967690815E+0000 -4.57706781974929E+0000 -4.58086402825730E+0000 -4.58465830829160E+0000 +-4.58845066568935E+0000 -4.59224110626566E+0000 -4.59602963581361E+0000 -4.59981626010444E+0000 -4.60360098488762E+0000 +-4.60738381589099E+0000 -4.61116475882087E+0000 -4.61494381936214E+0000 -4.61872100317842E+0000 -4.62249631591211E+0000 +-4.62626976318455E+0000 -4.63004135059611E+0000 -4.63381108372629E+0000 -4.63757896813385E+0000 -4.64134500935692E+0000 +-4.64510921291307E+0000 -4.64887158429947E+0000 -4.65263212899294E+0000 -4.65639085245011E+0000 -4.66014776010747E+0000 +-4.66390285738152E+0000 -4.66765614966885E+0000 -4.67140764234624E+0000 -4.67515734077078E+0000 -4.67890525027994E+0000 +-4.68265137619171E+0000 -4.68639572380466E+0000 -4.69013829839806E+0000 -4.69387910523199E+0000 -4.69761814954741E+0000 +-4.70135543656627E+0000 -4.70509097149161E+0000 -4.70882475950767E+0000 -4.71255680577993E+0000 -4.71628711545527E+0000 +-4.72001569366203E+0000 -4.72374254551011E+0000 -4.72746767609106E+0000 -4.73119109047817E+0000 -4.73491279372657E+0000 +-4.73863279087333E+0000 -4.74235108693750E+0000 -4.74606768692028E+0000 -4.74978259580505E+0000 -4.75349581855745E+0000 +-4.75720736012552E+0000 -4.76091722543976E+0000 -4.76462541941321E+0000 -4.76833194694154E+0000 -4.77203681290314E+0000 +-4.77574002215921E+0000 -4.77944157955384E+0000 -4.78314148991408E+0000 -4.78683975805005E+0000 -4.79053638875501E+0000 +-4.79423138680543E+0000 -4.79792475696111E+0000 -4.80161650396520E+0000 -4.80530663254436E+0000 -4.80899514740876E+0000 +-4.81268205325222E+0000 -4.81636735475226E+0000 -4.82005105657018E+0000 -4.82373316335118E+0000 -4.82741367972435E+0000 +-4.83109261030283E+0000 -4.83476995968388E+0000 -4.83844573244889E+0000 -4.84211993316352E+0000 -4.84579256637778E+0000 +-4.84946363662603E+0000 -4.85313314842716E+0000 -4.85680110628459E+0000 -4.86046751468634E+0000 -4.86413237810517E+0000 +-4.86779570099859E+0000 -4.87145748780894E+0000 -4.87511774296351E+0000 -4.87877647087455E+0000 -4.88243367593937E+0000 +-4.88608936254042E+0000 -4.88974353504535E+0000 -4.89339619780707E+0000 -4.89704735516383E+0000 -4.90069701143929E+0000 +-4.90434517094260E+0000 -4.90799183796843E+0000 -4.91163701679708E+0000 -4.91528071169451E+0000 -4.91892292691246E+0000 +-4.92256366668846E+0000 -4.92620293524592E+0000 -4.92984073679419E+0000 -4.93347707552866E+0000 -4.93711195563076E+0000 +-4.94074538126808E+0000 -4.94437735659442E+0000 -4.94800788574983E+0000 -4.95163697286070E+0000 -4.95526462203982E+0000 +-4.95889083738643E+0000 -4.96251562298630E+0000 -4.96613898291178E+0000 -4.96976092122184E+0000 -4.97338144196219E+0000 +-4.97700054916529E+0000 -4.98061824685043E+0000 -4.98423453902377E+0000 -4.98784942967844E+0000 -4.99146292279456E+0000 +-4.99507502233933E+0000 -4.99868573226705E+0000 -5.00229505651922E+0000 -5.00590299902458E+0000 -5.00950956369916E+0000 +-5.01311475444636E+0000 -5.01671857515697E+0000 -5.02032102970926E+0000 -5.02392212196904E+0000 -5.02752185578967E+0000 +-5.03112023501219E+0000 -5.03471726346529E+0000 -5.03831294496544E+0000 -5.04190728331688E+0000 -5.04550028231175E+0000 +-5.04909194573007E+0000 -5.05268227733984E+0000 -5.05627128089706E+0000 -5.05985896014583E+0000 -5.06344531881836E+0000 +-5.06703036063504E+0000 -5.07061408930448E+0000 -5.07419650852359E+0000 -5.07777762197760E+0000 -5.08135743334015E+0000 +-5.08493594627328E+0000 -5.08851316442754E+0000 -5.09208909144202E+0000 -5.09566373094439E+0000 -5.09923708655097E+0000 +-5.10280916186675E+0000 -5.10637996048547E+0000 -5.10994948598966E+0000 -5.11351774195068E+0000 -5.11708473192877E+0000 +-5.12065045947312E+0000 -5.12421492812189E+0000 -5.12777814140226E+0000 -5.13134010283050E+0000 -5.13490081591200E+0000 +-5.13846028414132E+0000 -5.14201851100224E+0000 -5.14557549996780E+0000 -5.14913125450035E+0000 -5.15268577805161E+0000 +-5.15623907406268E+0000 -5.15979114596412E+0000 -5.16334199717599E+0000 -5.16689163110787E+0000 -5.17044005115894E+0000 +-5.17398726071800E+0000 -5.17753326316351E+0000 -5.18107806186367E+0000 -5.18462166017642E+0000 -5.18816406144951E+0000 +-5.19170526902053E+0000 -5.19524528621697E+0000 -5.19878411635624E+0000 -5.20232176274573E+0000 -5.20585822868286E+0000 +-5.20939351745508E+0000 -5.21292763233996E+0000 -5.21646057660522E+0000 -5.21999235350875E+0000 -5.22352296629866E+0000 +-5.22705241821335E+0000 -5.23058071248150E+0000 -5.23410785232216E+0000 -5.23763384094475E+0000 -5.24115868154913E+0000 +-5.24468237732563E+0000 -5.24820493145508E+0000 -5.25172634710886E+0000 -5.25524662744893E+0000 -5.25876577562789E+0000 +-5.26228379478900E+0000 -5.26580068806620E+0000 -5.26931645858422E+0000 -5.27283110945852E+0000 -5.27634464379540E+0000 +-5.27985706469203E+0000 -5.28336837523644E+0000 -5.28687857850763E+0000 -5.29038767757553E+0000 -5.29389567550109E+0000 +-5.29740257533632E+0000 -5.30090838012429E+0000 -5.30441309289918E+0000 -5.30791671668633E+0000 -5.31141925450227E+0000 +-5.31492070935476E+0000 -5.31842108424279E+0000 -5.32192038215668E+0000 -5.32541860607806E+0000 -5.32891575897992E+0000 +-5.33241184382667E+0000 -5.33590686357414E+0000 -5.33940082116963E+0000 -5.34289371955196E+0000 -5.34638556165146E+0000 +-5.34987635039005E+0000 -5.35336608868127E+0000 -5.35685477943026E+0000 -5.36034242553388E+0000 -5.36382902988065E+0000 +-5.36731459535087E+0000 -5.37079912481660E+0000 -5.37428262114168E+0000 -5.37776508718183E+0000 -5.38124652578462E+0000 +-5.38472693978952E+0000 -5.38820633202795E+0000 -5.39168470532328E+0000 -5.39516206249088E+0000 -5.39863840633818E+0000 +-5.40211373966463E+0000 -5.40558806526182E+0000 -5.40906138591342E+0000 -5.41253370439529E+0000 -5.41600502347546E+0000 +-5.41947534591418E+0000 -5.42294467446396E+0000 -5.42641301186958E+0000 -5.42988036086812E+0000 -5.43334672418903E+0000 +-5.43681210455409E+0000 -5.44027650467750E+0000 -5.44373992726590E+0000 -5.44720237501836E+0000 -5.45066385062647E+0000 +-5.45412435677431E+0000 -5.45758389613853E+0000 -5.46104247138833E+0000 -5.46450008518553E+0000 -5.46795674018458E+0000 +-5.47141243903260E+0000 -5.47486718436937E+0000 -5.47832097882743E+0000 -5.48177382503203E+0000 -5.48522572560121E+0000 +-5.48867668314581E+0000 -5.49212670026949E+0000 -5.49557577956880E+0000 -5.49902392363312E+0000 -5.50247113504480E+0000 +-5.50591741637907E+0000 -5.50936277020418E+0000 -5.51280719908134E+0000 -5.51625070556479E+0000 -5.51969329220180E+0000 +-5.52313496153275E+0000 -5.52657571609107E+0000 -5.53001555840335E+0000 -5.53345449098933E+0000 -5.53689251636190E+0000 +-5.54032963702718E+0000 -5.54376585548452E+0000 -5.54720117422649E+0000 -5.55063559573897E+0000 -5.55406912250115E+0000 +-5.55750175698553E+0000 -5.56093350165797E+0000 -5.56436435897771E+0000 -5.56779433139741E+0000 -5.57122342136314E+0000 +-5.57465163131444E+0000 -5.57807896368431E+0000 -5.58150542089928E+0000 -5.58493100537938E+0000 -5.58835571953820E+0000 +-5.59177956578293E+0000 -5.59520254651432E+0000 -5.59862466412677E+0000 -5.60204592100833E+0000 -5.60546631954069E+0000 +-5.60888586209927E+0000 -5.61230455105320E+0000 -5.61572238876532E+0000 -5.61913937759227E+0000 -5.62255551988447E+0000 +-5.62597081798613E+0000 -5.62938527423532E+0000 -5.63279889096394E+0000 -5.63621167049779E+0000 -5.63962361515655E+0000 +-5.64303472725384E+0000 -5.64644500909722E+0000 -5.64985446298821E+0000 -5.65326309122232E+0000 -5.65667089608909E+0000 +-5.66007787987206E+0000 -5.66348404484885E+0000 -5.66688939329116E+0000 -5.67029392746476E+0000 -5.67369764962958E+0000 +-5.67710056203964E+0000 -5.68050266694317E+0000 -5.68390396658256E+0000 -5.68730446319439E+0000 -5.69070415900951E+0000 +-5.69410305625297E+0000 -5.69750115714410E+0000 -5.70089846389654E+0000 -5.70429497871822E+0000 -5.70769070381138E+0000 +-5.71108564137264E+0000 -5.71447979359298E+0000 -5.71787316265775E+0000 -5.72126575074675E+0000 -5.72465756003417E+0000 +-5.72804859268866E+0000 -5.73143885087335E+0000 -5.73482833674586E+0000 -5.73821705245829E+0000 -5.74160500015731E+0000 +-5.74499218198411E+0000 -5.74837860007444E+0000 -5.75176425655867E+0000 -5.75514915356174E+0000 -5.75853329320324E+0000 +-5.76191667759738E+0000 -5.76529930885305E+0000 -5.76868118907382E+0000 -5.77206232035796E+0000 -5.77544270479844E+0000 +-5.77882234448299E+0000 -5.78220124149409E+0000 -5.78557939790899E+0000 -5.78895681579974E+0000 -5.79233349723319E+0000 +-5.79570944427102E+0000 -5.79908465896977E+0000 -5.80245914338084E+0000 -5.80583289955049E+0000 -5.80920592951992E+0000 +-5.81257823532522E+0000 -5.81594981899743E+0000 -5.81932068256254E+0000 -5.82269082804151E+0000 -5.82606025745028E+0000 +-5.82942897279982E+0000 -5.83279697609611E+0000 -5.83616426934016E+0000 -5.83953085452805E+0000 -5.84289673365094E+0000 +-5.84626190869507E+0000 -5.84962638164181E+0000 -5.85299015446761E+0000 -5.85635322914412E+0000 -5.85971560763812E+0000 +-5.86307729191156E+0000 -5.86643828392158E+0000 -5.86979858562057E+0000 -5.87315819895608E+0000 -5.87651712587097E+0000 +-5.87987536830330E+0000 -5.88323292818644E+0000 -5.88658980744903E+0000 -5.88994600801504E+0000 -5.89330153180374E+0000 +-5.89665638072974E+0000 -5.90001055670301E+0000 -5.90336406162890E+0000 -5.90671689740813E+0000 -5.91006906593682E+0000 +-5.91342056910652E+0000 -5.91677140880421E+0000 -5.92012158691229E+0000 -5.92347110530867E+0000 -5.92681996586670E+0000 +-5.93016817045524E+0000 -5.93351572093865E+0000 -5.93686261917684E+0000 -5.94020886702521E+0000 -5.94355446633476E+0000 +-5.94689941895204E+0000 -5.95024372671918E+0000 -5.95358739147391E+0000 -5.95693041504958E+0000 -5.96027279927515E+0000 +-5.96361454597526E+0000 -5.96695565697016E+0000 -5.97029613407580E+0000 -5.97363597910381E+0000 -5.97697519386152E+0000 +-5.98031378015196E+0000 -5.98365173977392E+0000 -5.98698907452190E+0000 -5.99032578618617E+0000 -5.99366187655278E+0000 +-5.99699734740355E+0000 -6.00033220051610E+0000 -6.00366643766387E+0000 -6.00700006061613E+0000 -6.01033307113798E+0000 +-6.01366547099036E+0000 -6.01699726193011E+0000 -6.02032844570993E+0000 -6.02365902407843E+0000 -6.02698899878009E+0000 +-6.03031837155536E+0000 -6.03364714414060E+0000 -6.03697531826811E+0000 -6.04030289566617E+0000 -6.04362987805902E+0000 +-6.04695626716690E+0000 -6.05028206470603E+0000 -6.05360727238867E+0000 -6.05693189192309E+0000 -6.06025592501359E+0000 +-6.06357937336055E+0000 -6.06690223866038E+0000 -6.07022452260561E+0000 -6.07354622688483E+0000 -6.07686735318273E+0000 +-6.08018790318013E+0000 -6.08350787855397E+0000 -6.08682728097734E+0000 -6.09014611211948E+0000 -6.09346437364579E+0000 +-6.09678206721784E+0000 -6.10009919449341E+0000 -6.10341575712647E+0000 -6.10673175676720E+0000 -6.11004719506202E+0000 +-6.11336207365358E+0000 -6.11667639418078E+0000 -6.11999015827879E+0000 -6.12330336757904E+0000 -6.12661602370925E+0000 +-6.12992812829346E+0000 -6.13323968295198E+0000 -6.13655068930149E+0000 -6.13986114895496E+0000 -6.14317106352173E+0000 +-6.14648043460748E+0000 -6.14978926381428E+0000 -6.15309755274056E+0000 -6.15640530298115E+0000 -6.15971251612727E+0000 +-6.16301919376658E+0000 -6.16632533748313E+0000 -6.16963094885745E+0000 -6.17293602946646E+0000 -6.17624058088360E+0000 +-6.17954460467874E+0000 -6.18284810241824E+0000 -6.18615107566496E+0000 -6.18945352597824E+0000 -6.19275545491397E+0000 +-6.19605686402454E+0000 -6.19935775485888E+0000 -6.20265812896246E+0000 -6.20595798787732E+0000 -6.20925733314207E+0000 +-6.21255616629188E+0000 -6.21585448885852E+0000 -6.21915230237037E+0000 -6.22244960835240E+0000 -6.22574640832622E+0000 +-6.22904270381006E+0000 -6.23233849631879E+0000 -6.23563378736394E+0000 -6.23892857845370E+0000 -6.24222287109293E+0000 +-6.24551666678317E+0000 -6.24880996702268E+0000 -6.25210277330638E+0000 -6.25539508712593E+0000 -6.25868690996972E+0000 +-6.26197824332286E+0000 -6.26526908866720E+0000 -6.26855944748136E+0000 -6.27184932124070E+0000 -6.27513871141739E+0000 +-6.27842761948035E+0000 -6.28171604689531E+0000 -6.28500399512480E+0000 -6.28829146562816E+0000 -6.29157845986155E+0000 +-6.29486497927797E+0000 -6.29815102532726E+0000 -6.30143659945612E+0000 -6.30472170310809E+0000 -6.30800633772359E+0000 +-6.31129050473993E+0000 -6.31457420559131E+0000 -6.31785744170880E+0000 -6.32114021452042E+0000 -6.32442252545108E+0000 +-6.32770437592262E+0000 -6.33098576735383E+0000 -6.33426670116043E+0000 -6.33754717875511E+0000 -6.34082720154750E+0000 +-6.34410677094423E+0000 -6.34738588834889E+0000 -6.35066455516209E+0000 -6.35394277278141E+0000 -6.35722054260145E+0000 +-6.36049786601383E+0000 -6.36377474440720E+0000 -6.36705117916724E+0000 -6.37032717167668E+0000 -6.37360272331530E+0000 +-6.37687783545994E+0000 -6.38015250948451E+0000 -6.38342674676002E+0000 -6.38670054865454E+0000 -6.38997391653325E+0000 +-6.39324685175844E+0000 -6.39651935568952E+0000 -6.39979142968299E+0000 -6.40306307509253E+0000 -6.40633429326891E+0000 +-6.40960508556009E+0000 -6.41287545331117E+0000 -6.41614539786441E+0000 -6.41941492055925E+0000 -6.42268402273231E+0000 +-6.42595270571740E+0000 -6.42922097084553E+0000 -6.43248881944492E+0000 -6.43575625284100E+0000 -6.43902327235641E+0000 +-6.44228987931106E+0000 -6.44555607502206E+0000 -6.44882186080378E+0000 -6.45208723796785E+0000 -6.45535220782316E+0000 +-6.45861677167588E+0000 -6.46188093082944E+0000 -6.46514468658458E+0000 -6.46840804023932E+0000 -6.47167099308898E+0000 +-6.47493354642621E+0000 -6.47819570154096E+0000 -6.48145745972051E+0000 -6.48471882224949E+0000 -6.48797979040984E+0000 +-6.49124036548089E+0000 -6.49450054873930E+0000 -6.49776034145910E+0000 -6.50101974491169E+0000 -6.50427876036586E+0000 +-6.50753738908778E+0000 -6.51079563234102E+0000 -6.51405349138655E+0000 -6.51731096748275E+0000 -6.52056806188541E+0000 +-6.52382477584777E+0000 -6.52708111062047E+0000 -6.53033706745161E+0000 -6.53359264758673E+0000 -6.53684785226883E+0000 +-6.54010268273837E+0000 -6.54335714023328E+0000 -6.54661122598896E+0000 -6.54986494123830E+0000 -6.55311828721167E+0000 +-6.55637126513695E+0000 -6.55962387623952E+0000 -6.56287612174227E+0000 -6.56612800286562E+0000 -6.56937952082750E+0000 +-6.57263067684338E+0000 -6.57588147212627E+0000 -6.57913190788673E+0000 -6.58238198533287E+0000 -6.58563170567037E+0000 +-6.58888107010245E+0000 -6.59213007982994E+0000 -6.59537873605124E+0000 -6.59862703996231E+0000 -6.60187499275676E+0000 +-6.60512259562575E+0000 -6.60836984975808E+0000 -6.61161675634014E+0000 -6.61486331655597E+0000 -6.61810953158723E+0000 +-6.62135540261320E+0000 -6.62460093081081E+0000 -6.62784611735465E+0000 -6.63109096341695E+0000 -6.63433547016761E+0000 +-6.63757963877420E+0000 -6.64082347040196E+0000 -6.64406696621380E+0000 -6.64731012737034E+0000 -6.65055295502987E+0000 +-6.65379545034842E+0000 -6.65703761447967E+0000 -6.66027944857506E+0000 -6.66352095378374E+0000 -6.66676213125256E+0000 +-6.67000298212613E+0000 -6.67324350754679E+0000 -6.67648370865462E+0000 -6.67972358658746E+0000 -6.68296314248090E+0000 +-6.68620237746829E+0000 -6.68944129268077E+0000 -6.69267988924722E+0000 -6.69591816829433E+0000 -6.69915613094658E+0000 +-6.70239377832621E+0000 -6.70563111155331E+0000 -6.70886813174573E+0000 -6.71210484001916E+0000 -6.71534123748710E+0000 +-6.71857732526087E+0000 -6.72181310444962E+0000 -6.72504857616034E+0000 -6.72828374149787E+0000 -6.73151860156488E+0000 +-6.73475315746189E+0000 -6.73798741028732E+0000 -6.74122136113740E+0000 -6.74445501110626E+0000 -6.74768836128592E+0000 +-6.75092141276625E+0000 -6.75415416663504E+0000 -6.75738662397794E+0000 -6.76061878587853E+0000 -6.76385065341828E+0000 +-6.76708222767657E+0000 -6.77031350973070E+0000 -6.77354450065591E+0000 -6.77677520152533E+0000 -6.78000561341006E+0000 +-6.78323573737912E+0000 -6.78646557449947E+0000 -6.78969512583604E+0000 -6.79292439245169E+0000 -6.79615337540726E+0000 +-6.79938207576157E+0000 -6.80261049457136E+0000 -6.80583863289141E+0000 -6.80906649177444E+0000 -6.81229407227118E+0000 +-6.81552137543034E+0000 -6.81874840229863E+0000 -6.82197515392078E+0000 -6.82520163133951E+0000 -6.82842783559558E+0000 +-6.83165376772773E+0000 -6.83487942877277E+0000 -6.83810481976551E+0000 -6.84132994173881E+0000 -6.84455479572357E+0000 +-6.84777938274872E+0000 -6.85100370384128E+0000 -6.85422776002628E+0000 -6.85745155232685E+0000 -6.86067508176417E+0000 +-6.86389834935749E+0000 -6.86712135612413E+0000 -6.87034410307952E+0000 -6.87356659123716E+0000 -6.87678882160863E+0000 +-6.88001079520363E+0000 -6.88323251302995E+0000 -6.88645397609349E+0000 -6.88967518539827E+0000 -6.89289614194641E+0000 +-6.89611684673817E+0000 -6.89933730077193E+0000 -6.90255750504419E+0000 -6.90577746054961E+0000 -6.90899716828098E+0000 +-6.91221662922923E+0000 -6.91543584438345E+0000 -6.91865481473090E+0000 -6.92187354125697E+0000 -6.92509202494524E+0000 +-6.92831026677745E+0000 -6.93152826773353E+0000 -6.93474602879156E+0000 -6.93796355092784E+0000 -6.94118083511683E+0000 +-6.94439788233121E+0000 -6.94761469354185E+0000 -6.95083126971781E+0000 -6.95404761182638E+0000 -6.95726372083304E+0000 +-6.96047959770151E+0000 -6.96369524339372E+0000 -6.96691065886983E+0000 -6.97012584508823E+0000 -6.97334080300555E+0000 +-6.97655553357665E+0000 -6.97977003775465E+0000 -6.98298431649091E+0000 -6.98619837073505E+0000 -6.98941220143494E+0000 +-6.99262580953671E+0000 -6.99583919598477E+0000 -6.99905236172180E+0000 -7.00226530768876E+0000 -7.00547803482487E+0000 +-7.00869054406766E+0000 -7.01190283635293E+0000 -7.01511491261479E+0000 -7.01832677378564E+0000 -7.02153842079618E+0000 +-7.02474985457542E+0000 -7.02796107605068E+0000 -7.03117208614760E+0000 -7.03438288579014E+0000 -7.03759347590058E+0000 +-7.04080385739952E+0000 -7.04401403120590E+0000 -7.04722399823702E+0000 -7.05043375940848E+0000 -7.05364331563425E+0000 +-7.05685266782664E+0000 -7.06006181689632E+0000 -7.06327076375232E+0000 -7.06647950930202E+0000 -7.06968805445117E+0000 +-7.07289640010390E+0000 -7.07610454716271E+0000 -7.07931249652847E+0000 -7.08252024910043E+0000 -7.08572780577625E+0000 +-7.08893516745195E+0000 -7.09214233502197E+0000 -7.09534930937913E+0000 -7.09855609141467E+0000 -7.10176268201821E+0000 +-7.10496908207781E+0000 -7.10817529247992E+0000 -7.11138131410944E+0000 -7.11458714784965E+0000 -7.11779279458229E+0000 +-7.12099825518752E+0000 -7.12420353054393E+0000 -7.12740862152855E+0000 -7.13061352901686E+0000 -7.13381825388277E+0000 +-7.13702279699865E+0000 -7.14022715923533E+0000 -7.14343134146208E+0000 -7.14663534454664E+0000 -7.14983916935523E+0000 +-7.15304281675250E+0000 -7.15624628760162E+0000 -7.15944958276421E+0000 -7.16265270310036E+0000 -7.16585564946867E+0000 +-7.16905842272621E+0000 -7.17226102372854E+0000 -7.17546345332973E+0000 -7.17866571238234E+0000 -7.18186780173744E+0000 +-7.18506972224458E+0000 -7.18827147475184E+0000 -7.19147306010583E+0000 -7.19467447915164E+0000 -7.19787573273291E+0000 +-7.20107682169180E+0000 -7.20427774686897E+0000 -7.20747850910366E+0000 -7.21067910923360E+0000 -7.21387954809508E+0000 +-7.21707982652294E+0000 -7.22027994535054E+0000 -7.22347990540982E+0000 -7.22667970753125E+0000 -7.22987935254387E+0000 +-7.23307884127526E+0000 -7.23627817455159E+0000 -7.23947735319759E+0000 -7.24267637803654E+0000 -7.24587524989031E+0000 +-7.24907396957936E+0000 -7.25227253792271E+0000 -7.25547095573797E+0000 -7.25866922384134E+0000 -7.26186734304761E+0000 +-7.26506531417017E+0000 -7.26826313802099E+0000 -7.27146081541066E+0000 -7.27465834714836E+0000 -7.27785573404191E+0000 +-7.28105297689769E+0000 -7.28425007652074E+0000 -7.28744703371469E+0000 -7.29064384928181E+0000 -7.29384052402298E+0000 +-7.29703705873771E+0000 -7.30023345422415E+0000 -7.30342971127909E+0000 -7.30662583069793E+0000 -7.30982181327474E+0000 +-7.31301765980221E+0000 -7.31621337107171E+0000 -7.31940894787322E+0000 -7.32260439099541E+0000 -7.32579970122558E+0000 +-7.32899487934971E+0000 -7.33218992615244E+0000 -7.33538484241706E+0000 -7.33857962892556E+0000 -7.34177428645856E+0000 +-7.34496881579541E+0000 -7.34816321771409E+0000 -7.35135749299129E+0000 -7.35455164240238E+0000 -7.35774566672142E+0000 +-7.36093956672116E+0000 -7.36413334317304E+0000 -7.36732699684720E+0000 -7.37052052851250E+0000 -7.37371393893646E+0000 +-7.37690722888536E+0000 -7.38010039912416E+0000 -7.38329345041652E+0000 -7.38648638352486E+0000 -7.38967919921028E+0000 +-7.39287189823261E+0000 -7.39606448135043E+0000 -7.39925694932102E+0000 -7.40244930290040E+0000 -7.40564154284333E+0000 +-7.40883366990329E+0000 -7.41202568483253E+0000 -7.41521758838201E+0000 -7.41840938130147E+0000 -7.42160106433937E+0000 +-7.42479263824293E+0000 -7.42798410375814E+0000 -7.43117546162972E+0000 -7.43436671260118E+0000 -7.43755785741477E+0000 +-7.44074889681152E+0000 -7.44393983153123E+0000 -7.44713066231246E+0000 -7.45032138989255E+0000 -7.45351201500763E+0000 +-7.45670253839260E+0000 -7.45989296078114E+0000 -7.46308328290572E+0000 -7.46627350549760E+0000 -7.46946362928684E+0000 +-7.47265365500228E+0000 -7.47584358337156E+0000 -7.47903341512113E+0000 -7.48222315097623E+0000 -7.48541279166092E+0000 +-7.48860233789807E+0000 -7.49179179040933E+0000 -7.49498114991520E+0000 -7.49817041713499E+0000 -7.50135959278681E+0000 +-7.50454867758762E+0000 -7.50773767225317E+0000 -7.51092657749808E+0000 -7.51411539403576E+0000 -7.51730412257848E+0000 +-7.52049276383733E+0000 -7.52368131852225E+0000 -7.52686978734202E+0000 -7.53005817100425E+0000 -7.53324647021541E+0000 +-7.53643468568081E+0000 -7.53962281810462E+0000 -7.54281086818986E+0000 -7.54599883663840E+0000 -7.54918672415099E+0000 +-7.55237453142721E+0000 -7.55556225916553E+0000 -7.55874990806328E+0000 -7.56193747881667E+0000 -7.56512497212075E+0000 +-7.56831238866948E+0000 -7.57149972915567E+0000 -7.57468699427104E+0000 -7.57787418470616E+0000 -7.58106130115051E+0000 +-7.58424834429244E+0000 -7.58743531481921E+0000 -7.59062221341694E+0000 -7.59380904077069E+0000 -7.59699579756437E+0000 +-7.60018248448082E+0000 -7.60336910220178E+0000 -7.60655565140788E+0000 -7.60974213277867E+0000 -7.61292854699261E+0000 +-7.61611489472706E+0000 -7.61930117665832E+0000 -7.62248739346157E+0000 -7.62567354581095E+0000 -7.62885963437949E+0000 +-7.63204565983915E+0000 -7.63523162286083E+0000 -7.63841752411436E+0000 -7.64160336426848E+0000 -7.64478914399089E+0000 +-7.64797486394820E+0000 -7.65116052480598E+0000 -7.65434612722874E+0000 -7.65753167187991E+0000 -7.66071715942190E+0000 +-7.66390259051604E+0000 -7.66708796582262E+0000 -7.67027328600089E+0000 -7.67345855170905E+0000 -7.67664376360425E+0000 +-7.67982892234262E+0000 -7.68301402857921E+0000 -7.68619908296809E+0000 -7.68938408616226E+0000 -7.69256903881369E+0000 +-7.69575394157333E+0000 -7.69893879509112E+0000 -7.70212360001594E+0000 -7.70530835699567E+0000 -7.70849306667716E+0000 +-7.71167772970627E+0000 -7.71486234672780E+0000 -7.71804691838558E+0000 -7.72123144532239E+0000 -7.72441592818003E+0000 +-7.72760036759929E+0000 -7.73078476421994E+0000 -7.73396911868076E+0000 -7.73715343161954E+0000 -7.74033770367305E+0000 +-7.74352193547707E+0000 -7.74670612766641E+0000 -7.74989028087485E+0000 -7.75307439573522E+0000 -7.75625847287933E+0000 +-7.75944251293803E+0000 -7.76262651654118E+0000 -7.76581048431765E+0000 -7.76899441689535E+0000 -7.77217831490119E+0000 +-7.77536217896113E+0000 -7.77854600970014E+0000 -7.78172980774224E+0000 -7.78491357371046E+0000 -7.78809730822688E+0000 +-7.79128101191261E+0000 -7.79446468538780E+0000 -7.79764832927164E+0000 -7.80083194418237E+0000 -7.80401553073726E+0000 +-7.80719908955264E+0000 -7.81038262124389E+0000 -7.81356612642542E+0000 -7.81674960571073E+0000 -7.81993305971234E+0000 +-7.82311648904185E+0000 -7.82629989430990E+0000 -7.82948327612621E+0000 -7.83266663509955E+0000 -7.83584997183776E+0000 +-7.83903328694776E+0000 -7.84221658103551E+0000 -7.84539985470607E+0000 -7.84858310856356E+0000 -7.85176634321117E+0000 +-7.85494955925118E+0000 -7.85813275728494E+0000 -7.86131593791289E+0000 -7.86449910173454E+0000 -7.86768224934851E+0000 +-7.87086538135247E+0000 -7.87404849834320E+0000 -7.87723160091658E+0000 -7.88041468966758E+0000 -7.88359776519023E+0000 +-7.88678082807771E+0000 -7.88996387892227E+0000 -7.89314691831525E+0000 -7.89632994684712E+0000 -7.89951296510743E+0000 +-7.90269597368485E+0000 -7.90587897316717E+0000 -7.90906196414125E+0000 -7.91224494719311E+0000 -7.91542792290784E+0000 +-7.91861089186969E+0000 -7.92179385466198E+0000 -7.92497681186720E+0000 -7.92815976406691E+0000 -7.93134271184184E+0000 +-7.93452565577181E+0000 -7.93770859643579E+0000 -7.94089153441186E+0000 -7.94407447027724E+0000 -7.94725740460829E+0000 +-7.95044033798049E+0000 -7.95362327096847E+0000 -7.95680620414598E+0000 -7.95998913808593E+0000 -7.96317207336035E+0000 +-7.96635501054043E+0000 -7.96953795019651E+0000 -7.97272089289805E+0000 -7.97590383921368E+0000 -7.97908678971118E+0000 +-7.98226974495748E+0000 -7.98545270551866E+0000 -7.98863567195995E+0000 -7.99181864484575E+0000 -7.99500162473962E+0000 +-7.99818461220426E+0000 -8.00136760780157E+0000 -8.00455061209257E+0000 -8.00773362563748E+0000 -8.01091664899569E+0000 +-8.01409968272572E+0000 -8.01728272738530E+0000 -8.02046578353132E+0000 -8.02364885171985E+0000 -8.02683193250613E+0000 +-8.03001502644458E+0000 -8.03319813408880E+0000 -8.03638125599157E+0000 -8.03956439270486E+0000 -8.04274754477982E+0000 +-8.04593071276678E+0000 -8.04911389721528E+0000 -8.05229709867403E+0000 -8.05548031769093E+0000 -8.05866355481309E+0000 +-8.06184681058680E+0000 -8.06503008555756E+0000 -8.06821338027006E+0000 -8.07139669526819E+0000 -8.07458003109504E+0000 +-8.07776338829290E+0000 -8.08094676740329E+0000 -8.08413016896690E+0000 -8.08731359352366E+0000 -8.09049704161269E+0000 +-8.09368051377233E+0000 -8.09686401054012E+0000 -8.10004753245284E+0000 -8.10323108004646E+0000 -8.10641465385618E+0000 +-8.10959825441643E+0000 -8.11278188226085E+0000 -8.11596553792228E+0000 -8.11914922193283E+0000 -8.12233293482381E+0000 +-8.12551667712574E+0000 -8.12870044936842E+0000 -8.13188425208083E+0000 -8.13506808579120E+0000 -8.13825195102701E+0000 +-8.14143584831494E+0000 -8.14461977818094E+0000 -8.14780374115020E+0000 -8.15098773774710E+0000 -8.15417176849533E+0000 +-8.15735583391777E+0000 -8.16053993453658E+0000 -8.16372407087314E+0000 -8.16690824344809E+0000 -8.17009245278131E+0000 +-8.17327669939195E+0000 -8.17646098379840E+0000 -8.17964530651829E+0000 -8.18282966806853E+0000 -8.18601406896526E+0000 +-8.18919850972391E+0000 -8.19238299085915E+0000 -8.19556751288491E+0000 -8.19875207631438E+0000 -8.20193668166003E+0000 +-8.20512132943358E+0000 -8.20830602014602E+0000 -8.21149075430762E+0000 -8.21467553242790E+0000 -8.21786035501568E+0000 +-8.22104522257901E+0000 -8.22423013562526E+0000 -8.22741509466105E+0000 -8.23060010019228E+0000 -8.23378515272413E+0000 +-8.23697025276106E+0000 -8.24015540080681E+0000 -8.24334059736442E+0000 -8.24652584293619E+0000 -8.24971113802371E+0000 +-8.25289648312787E+0000 -8.25608187874884E+0000 -8.25926732538609E+0000 -8.26245282353836E+0000 -8.26563837370369E+0000 +-8.26882397637944E+0000 -8.27200963206223E+0000 -8.27519534124801E+0000 -8.27838110443199E+0000 -8.28156692210871E+0000 +-8.28475279477201E+0000 -8.28793872291501E+0000 -8.29112470703016E+0000 -8.29431074760920E+0000 -8.29749684514318E+0000 +-8.30068300012246E+0000 -8.30386921303671E+0000 -8.30705548437491E+0000 -8.31024181462534E+0000 -8.31342820427562E+0000 +-8.31661465381267E+0000 -8.31980116372271E+0000 -8.32298773449131E+0000 -8.32617436660333E+0000 -8.32936106054297E+0000 +-8.33254781679374E+0000 -8.33573463583848E+0000 -8.33892151815935E+0000 -8.34210846423784E+0000 -8.34529547455476E+0000 +-8.34848254959026E+0000 -8.35166968982380E+0000 -8.35485689573419E+0000 -8.35804416779956E+0000 -8.36123150649737E+0000 +-8.36441891230444E+0000 -8.36760638569691E+0000 -8.37079392715023E+0000 -8.37398153713924E+0000 -8.37716921613809E+0000 +-8.38035696462026E+0000 -8.38354478305861E+0000 -8.38673267192531E+0000 -8.38992063169188E+0000 -8.39310866282920E+0000 +-8.39629676580750E+0000 -8.39948494109634E+0000 -8.40267318916464E+0000 -8.40586151048067E+0000 -8.40904990551205E+0000 +-8.41223837472576E+0000 -8.41542691858814E+0000 -8.41861553756488E+0000 -8.42180423212101E+0000 -8.42499300272095E+0000 +-8.42818184982846E+0000 -8.43137077390666E+0000 -8.43455977541805E+0000 -8.43774885482447E+0000 -8.44093801258716E+0000 +-8.44412724916668E+0000 -8.44731656502299E+0000 -8.45050596061541E+0000 -8.45369543640264E+0000 -8.45688499284272E+0000 +-8.46007463039311E+0000 -8.46326434951059E+0000 -8.46645415065135E+0000 -8.46964403427096E+0000 -8.47283400082434E+0000 +-8.47602405076580E+0000 -8.47921418454904E+0000 -8.48240440262714E+0000 -8.48559470545253E+0000 -8.48878509347708E+0000 +-8.49197556715198E+0000 -8.49516612692786E+0000 -8.49835677325470E+0000 -8.50154750658188E+0000 -8.50473832735818E+0000 +-8.50792923603175E+0000 -8.51112023305015E+0000 -8.51431131886032E+0000 -8.51750249390859E+0000 -8.52069375864071E+0000 +-8.52388511350178E+0000 -8.52707655893635E+0000 -8.53026809538832E+0000 -8.53345972330103E+0000 -8.53665144311719E+0000 +-8.53984325527893E+0000 -8.54303516022778E+0000 -8.54622715840465E+0000 -8.54941925024990E+0000 -8.55261143620325E+0000 +-8.55580371670386E+0000 -8.55899609219028E+0000 -8.56218856310047E+0000 -8.56538112987182E+0000 -8.56857379294111E+0000 +-8.57176655274454E+0000 -8.57495940971772E+0000 -8.57815236429569E+0000 -8.58134541691288E+0000 -8.58453856800316E+0000 +-8.58773181799981E+0000 -8.59092516733552E+0000 -8.59411861644243E+0000 -8.59731216575206E+0000 -8.60050581569538E+0000 +-8.60369956670279E+0000 -8.60689341920408E+0000 -8.61008737362850E+0000 -8.61328143040471E+0000 -8.61647558996081E+0000 +-8.61966985272432E+0000 -8.62286421912218E+0000 -8.62605868958078E+0000 -8.62925326452594E+0000 -8.63244794438290E+0000 +-8.63564272957634E+0000 -8.63883762053039E+0000 -8.64203261766860E+0000 -8.64522772141395E+0000 -8.64842293218888E+0000 +-8.65161825041525E+0000 -8.65481367651438E+0000 -8.65800921090703E+0000 -8.66120485401337E+0000 -8.66440060625305E+0000 +-8.66759646804516E+0000 -8.67079243980822E+0000 -8.67398852196020E+0000 -8.67718471491853E+0000 -8.68038101910008E+0000 +-8.68357743492118E+0000 -8.68677396279759E+0000 -8.68997060314453E+0000 -8.69316735637670E+0000 -8.69636422290820E+0000 +-8.69956120315264E+0000 -8.70275829752306E+0000 -8.70595550643194E+0000 -8.70915283029125E+0000 -8.71235026951241E+0000 +-8.71554782450628E+0000 -8.71874549568321E+0000 -8.72194328345299E+0000 -8.72514118822489E+0000 -8.72833921040762E+0000 +-8.73153735040938E+0000 -8.73473560863781E+0000 -8.73793398550006E+0000 -8.74113248140270E+0000 -8.74433109675178E+0000 +-8.74752983195285E+0000 -8.75072868741090E+0000 -8.75392766353039E+0000 -8.75712676071528E+0000 -8.76032597936897E+0000 +-8.76352531989436E+0000 -8.76672478269382E+0000 -8.76992436816919E+0000 -8.77312407672178E+0000 -8.77632390875240E+0000 +-8.77952386466133E+0000 -8.78272394484831E+0000 -8.78592414971260E+0000 -8.78912447965292E+0000 -8.79232493506746E+0000 +-8.79552551635392E+0000 -8.79872622390947E+0000 -8.80192705813076E+0000 -8.80512801941395E+0000 -8.80832910815467E+0000 +-8.81153032474804E+0000 -8.81473166958867E+0000 -8.81793314307067E+0000 -8.82113474558762E+0000 -8.82433647753262E+0000 +-8.82753833929825E+0000 -8.83074033127657E+0000 -8.83394245385916E+0000 -8.83714470743708E+0000 -8.84034709240089E+0000 +-8.84354960914066E+0000 -8.84675225804593E+0000 -8.84995503950577E+0000 -8.85315795390874E+0000 -8.85636100164290E+0000 +-8.85956418309580E+0000 -8.86276749865451E+0000 -8.86597094870561E+0000 -8.86917453363515E+0000 -8.87237825382874E+0000 +-8.87558210967144E+0000 -8.87878610154787E+0000 -8.88199022984211E+0000 -8.88519449493778E+0000 -8.88839889721801E+0000 +-8.89160343706542E+0000 -8.89480811486217E+0000 -8.89801293098991E+0000 -8.90121788582981E+0000 -8.90442297976256E+0000 +-8.90762821316836E+0000 -8.91083358642694E+0000 -8.91403909991752E+0000 -8.91724475401887E+0000 -8.92045054910924E+0000 +-8.92365648556645E+0000 -8.92686256376779E+0000 -8.93006878409011E+0000 -8.93327514690976E+0000 -8.93648165260262E+0000 +-8.93968830154410E+0000 -8.94289509410912E+0000 -8.94610203067214E+0000 -8.94930911160715E+0000 -8.95251633728764E+0000 +-8.95572370808666E+0000 -8.95893122437677E+0000 -8.96213888653008E+0000 -8.96534669491820E+0000 -8.96855464991229E+0000 +-8.97176275188305E+0000 -8.97497100120069E+0000 -8.97817939823498E+0000 -8.98138794335521E+0000 -8.98459663693021E+0000 +-8.98780547932834E+0000 -8.99101447091750E+0000 -8.99422361206513E+0000 -8.99743290313822E+0000 -9.00064234450327E+0000 +-9.00385193652636E+0000 -9.00706167957308E+0000 -9.01027157400858E+0000 -9.01348162019753E+0000 -9.01669181850417E+0000 +-9.01990216929228E+0000 -9.02311267292517E+0000 -9.02632332976570E+0000 -9.02953414017630E+0000 -9.03274510451891E+0000 +-9.03595622315506E+0000 -9.03916749644579E+0000 -9.04237892475172E+0000 -9.04559050843300E+0000 -9.04880224784934E+0000 +-9.05201414336001E+0000 -9.05522619532383E+0000 -9.05843840409915E+0000 -9.06165077004392E+0000 -9.06486329351561E+0000 +-9.06807597487125E+0000 -9.07128881446743E+0000 -9.07450181266033E+0000 -9.07771496980563E+0000 -9.08092828625861E+0000 +-9.08414176237411E+0000 -9.08735539850650E+0000 -9.09056919500975E+0000 -9.09378315223737E+0000 -9.09699727054244E+0000 +-9.10021155027759E+0000 -9.10342599179504E+0000 -9.10664059544656E+0000 -9.10985536158348E+0000 -9.11307029055671E+0000 +-9.11628538271673E+0000 -9.11950063841358E+0000 -9.12271605799686E+0000 -9.12593164181575E+0000 -9.12914739021902E+0000 +-9.13236330355497E+0000 -9.13557938217151E+0000 -9.13879562641610E+0000 -9.14201203663579E+0000 -9.14522861317718E+0000 +-9.14844535638647E+0000 -9.15166226660943E+0000 -9.15487934419140E+0000 -9.15809658947729E+0000 -9.16131400281162E+0000 +-9.16453158453844E+0000 -9.16774933500143E+0000 -9.17096725454381E+0000 -9.17418534350841E+0000 -9.17740360223762E+0000 +-9.18062203107343E+0000 -9.18384063035739E+0000 -9.18705940043065E+0000 -9.19027834163396E+0000 -9.19349745430761E+0000 +-9.19671673879153E+0000 -9.19993619542520E+0000 -9.20315582454769E+0000 -9.20637562649767E+0000 -9.20959560161339E+0000 +-9.21281575023270E+0000 -9.21603607269303E+0000 -9.21925656933140E+0000 -9.22247724048443E+0000 -9.22569808648832E+0000 +-9.22891910767888E+0000 -9.23214030439150E+0000 -9.23536167696117E+0000 -9.23858322572247E+0000 -9.24180495100957E+0000 +-9.24502685315626E+0000 -9.24824893249590E+0000 -9.25147118936146E+0000 -9.25469362408552E+0000 -9.25791623700023E+0000 +-9.26113902843736E+0000 -9.26436199872829E+0000 -9.26758514820396E+0000 -9.27080847719497E+0000 -9.27403198603147E+0000 +-9.27725567504324E+0000 -9.28047954455966E+0000 -9.28370359490972E+0000 -9.28692782642199E+0000 -9.29015223942468E+0000 +-9.29337683424558E+0000 -9.29660161121209E+0000 -9.29982657065124E+0000 -9.30305171288965E+0000 -9.30627703825354E+0000 +-9.30950254706875E+0000 -9.31272823966075E+0000 -9.31595411635458E+0000 -9.31918017747494E+0000 -9.32240642334609E+0000 +-9.32563285429194E+0000 -9.32885947063601E+0000 -9.33208627270141E+0000 -9.33531326081090E+0000 -9.33854043528682E+0000 +-9.34176779645115E+0000 -9.34499534462549E+0000 -9.34822308013103E+0000 -9.35145100328861E+0000 -9.35467911441866E+0000 +-9.35790741384125E+0000 -9.36113590187606E+0000 -9.36436457884241E+0000 -9.36759344505920E+0000 -9.37082250084499E+0000 +-9.37405174651795E+0000 -9.37728118239587E+0000 -9.38051080879617E+0000 -9.38374062603588E+0000 -9.38697063443167E+0000 +-9.39020083429983E+0000 -9.39343122595628E+0000 -9.39666180971656E+0000 -9.39989258589585E+0000 -9.40312355480893E+0000 +-9.40635471677025E+0000 -9.40958607209385E+0000 -9.41281762109343E+0000 -9.41604936408230E+0000 -9.41928130137341E+0000 +-9.42251343327933E+0000 -9.42574576011229E+0000 -9.42897828218413E+0000 -9.43221099980632E+0000 -9.43544391328998E+0000 +-9.43867702294586E+0000 -9.44191032908433E+0000 -9.44514383201543E+0000 -9.44837753204880E+0000 -9.45161142949373E+0000 +-9.45484552465916E+0000 -9.45807981785366E+0000 -9.46131430938543E+0000 -9.46454899956231E+0000 -9.46778388869181E+0000 +-9.47101897708104E+0000 -9.47425426503677E+0000 -9.47748975286541E+0000 -9.48072544087302E+0000 -9.48396132936530E+0000 +-9.48719741864757E+0000 -9.49043370902483E+0000 -9.49367020080171E+0000 -9.49690689428248E+0000 -9.50014378977105E+0000 +-9.50338088757100E+0000 -9.50661818798554E+0000 -9.50985569131753E+0000 -9.51309339786947E+0000 -9.51633130794353E+0000 +-9.51956942184152E+0000 -9.52280773986489E+0000 -9.52604626231474E+0000 -9.52928498949185E+0000 -9.53252392169661E+0000 +-9.53576305922909E+0000 -9.53900240238901E+0000 -9.54224195147574E+0000 -9.54548170678829E+0000 -9.54872166862534E+0000 +-9.55196183728524E+0000 -9.55520221306595E+0000 -9.55844279626513E+0000 -9.56168358718008E+0000 -9.56492458610776E+0000 +-9.56816579334477E+0000 -9.57140720918740E+0000 -9.57464883393158E+0000 -9.57789066787289E+0000 -9.58113271130659E+0000 +-9.58437496452759E+0000 -9.58761742783047E+0000 -9.59086010150947E+0000 -9.59410298585846E+0000 -9.59734608117103E+0000 +-9.60058938774038E+0000 -9.60383290585942E+0000 -9.60707663582067E+0000 -9.61032057791638E+0000 -9.61356473243841E+0000 +-9.61680909967831E+0000 -9.62005367992730E+0000 -9.62329847347626E+0000 -9.62654348061573E+0000 -9.62978870163593E+0000 +-9.63303413682675E+0000 -9.63627978647775E+0000 -9.63952565087813E+0000 -9.64277173031681E+0000 -9.64601802508233E+0000 +-9.64926453546295E+0000 -9.65251126174656E+0000 -9.65575820422075E+0000 -9.65900536317277E+0000 -9.66225273888954E+0000 +-9.66550033165767E+0000 -9.66874814176342E+0000 -9.67199616949275E+0000 -9.67524441513129E+0000 -9.67849287896432E+0000 +-9.68174156127684E+0000 -9.68499046235349E+0000 -9.68823958247860E+0000 -9.69148892193618E+0000 -9.69473848100992E+0000 +-9.69798825998319E+0000 -9.70123825913904E+0000 -9.70448847876018E+0000 -9.70773891912902E+0000 -9.71098958052766E+0000 +-9.71424046323786E+0000 -9.71749156754107E+0000 -9.72074289371843E+0000 -9.72399444205075E+0000 -9.72724621281854E+0000 +-9.73049820630196E+0000 -9.73375042278091E+0000 -9.73700286253492E+0000 -9.74025552584324E+0000 -9.74350841298480E+0000 +-9.74676152423820E+0000 -9.75001485988174E+0000 -9.75326842019341E+0000 -9.75652220545088E+0000 -9.75977621593152E+0000 +-9.76303045191237E+0000 -9.76628491367019E+0000 -9.76953960148139E+0000 -9.77279451562210E+0000 -9.77604965636813E+0000 +-9.77930502399499E+0000 -9.78256061877787E+0000 -9.78581644099166E+0000 -9.78907249091094E+0000 -9.79232876880998E+0000 +-9.79558527496275E+0000 -9.79884200964291E+0000 -9.80209897312382E+0000 -9.80535616567853E+0000 -9.80861358757979E+0000 +-9.81187123910004E+0000 -9.81512912051143E+0000 -9.81838723208578E+0000 -9.82164557409464E+0000 -9.82490414680924E+0000 +-9.82816295050051E+0000 -9.83142198543907E+0000 -9.83468125189527E+0000 -9.83794075013913E+0000 -9.84120048044038E+0000 +-9.84446044306846E+0000 -9.84772063829248E+0000 -9.85098106638130E+0000 -9.85424172760344E+0000 -9.85750262222715E+0000 +-9.86076375052037E+0000 -9.86402511275074E+0000 -9.86728670918562E+0000 -9.87054854009205E+0000 -9.87381060573681E+0000 +-9.87707290638635E+0000 -9.88033544230685E+0000 -9.88359821376418E+0000 -9.88686122102392E+0000 -9.89012446435138E+0000 +-9.89338794401155E+0000 -9.89665166026913E+0000 -9.89991561338855E+0000 -9.90317980363393E+0000 -9.90644423126910E+0000 +-9.90970889655761E+0000 -9.91297379976271E+0000 -9.91623894114738E+0000 -9.91950432097428E+0000 -9.92276993950580E+0000 +-9.92603579700406E+0000 -9.92930189373086E+0000 -9.93256822994772E+0000 -9.93583480591590E+0000 -9.93910162189635E+0000 +-9.94236867814972E+0000 -9.94563597493642E+0000 -9.94890351251653E+0000 -9.95217129114987E+0000 -9.95543931109598E+0000 +-9.95870757261409E+0000 -9.96197607596318E+0000 -9.96524482140193E+0000 -9.96851380918873E+0000 -9.97178303958171E+0000 +-9.97505251283870E+0000 -9.97832222921726E+0000 -9.98159218897466E+0000 -9.98486239236791E+0000 -9.98813283965370E+0000 +-9.99140353108849E+0000 -9.99467446692844E+0000 -9.99794564742941E+0000 -1.00012170728470E+0001 -1.00044887434365E+0001 +-1.00077606594531E+0001 -1.00110328211514E+0001 -1.00143052287861E+0001 -1.00175778826112E+0001 -1.00208507828807E+0001 +-1.00241239298484E+0001 -1.00273973237675E+0001 -1.00306709648913E+0001 -1.00339448534725E+0001 -1.00372189897637E+0001 +-1.00404933740174E+0001 -1.00437680064853E+0001 -1.00470428874194E+0001 -1.00503180170711E+0001 -1.00535933956916E+0001 +-1.00568690235319E+0001 -1.00601449008426E+0001 -1.00634210278742E+0001 -1.00666974048767E+0001 -1.00699740321001E+0001 +-1.00732509097939E+0001 -1.00765280382074E+0001 -1.00798054175898E+0001 -1.00830830481898E+0001 -1.00863609302559E+0001 +-1.00896390640363E+0001 -1.00929174497792E+0001 -1.00961960877321E+0001 -1.00994749781426E+0001 -1.01027541212579E+0001 +-1.01060335173249E+0001 -1.01093131665901E+0001 -1.01125930693002E+0001 -1.01158732257011E+0001 -1.01191536360388E+0001 +-1.01224343005589E+0001 -1.01257152195066E+0001 -1.01289963931272E+0001 -1.01322778216654E+0001 -1.01355595053658E+0001 +-1.01388414444727E+0001 -1.01421236392302E+0001 -1.01454060898820E+0001 -1.01486887966716E+0001 -1.01519717598423E+0001 +-1.01552549796372E+0001 -1.01585384562989E+0001 -1.01618221900700E+0001 -1.01651061811927E+0001 -1.01683904299089E+0001 +-1.01716749364604E+0001 -1.01749597010886E+0001 -1.01782447240348E+0001 -1.01815300055399E+0001 -1.01848155458445E+0001 +-1.01881013451892E+0001 -1.01913874038140E+0001 -1.01946737219590E+0001 -1.01979602998638E+0001 -1.02012471377678E+0001 +-1.02045342359102E+0001 -1.02078215945299E+0001 -1.02111092138656E+0001 -1.02143970941557E+0001 -1.02176852356383E+0001 +-1.02209736385513E+0001 -1.02242623031325E+0001 -1.02275512296191E+0001 -1.02308404182484E+0001 -1.02341298692573E+0001 +-1.02374195828825E+0001 -1.02407095593602E+0001 -1.02439997989268E+0001 -1.02472903018181E+0001 -1.02505810682697E+0001 +-1.02538720985171E+0001 -1.02571633927955E+0001 -1.02604549513398E+0001 -1.02637467743846E+0001 -1.02670388621643E+0001 +-1.02703312149133E+0001 -1.02736238328653E+0001 -1.02769167162541E+0001 -1.02802098653131E+0001 -1.02835032802756E+0001 +-1.02867969613745E+0001 -1.02900909088425E+0001 -1.02933851229120E+0001 -1.02966796038154E+0001 -1.02999743517846E+0001 +-1.03032693670513E+0001 -1.03065646498470E+0001 -1.03098602004031E+0001 -1.03131560189505E+0001 -1.03164521057199E+0001 +-1.03197484609420E+0001 -1.03230450848471E+0001 -1.03263419776651E+0001 -1.03296391396260E+0001 -1.03329365709593E+0001 +-1.03362342718942E+0001 -1.03395322426601E+0001 -1.03428304834856E+0001 -1.03461289945994E+0001 -1.03494277762300E+0001 +-1.03527268286055E+0001 -1.03560261519537E+0001 -1.03593257465024E+0001 -1.03626256124790E+0001 -1.03659257501107E+0001 +-1.03692261596245E+0001 -1.03725268412471E+0001 -1.03758277952051E+0001 -1.03791290217247E+0001 -1.03824305210319E+0001 +-1.03857322933525E+0001 -1.03890343389122E+0001 -1.03923366579362E+0001 -1.03956392506496E+0001 -1.03989421172774E+0001 +-1.04022452580441E+0001 -1.04055486731741E+0001 -1.04088523628917E+0001 -1.04121563274208E+0001 -1.04154605669850E+0001 +-1.04187650818080E+0001 -1.04220698721129E+0001 -1.04253749381227E+0001 -1.04286802800603E+0001 -1.04319858981482E+0001 +-1.04352917926088E+0001 -1.04385979636641E+0001 -1.04419044115361E+0001 -1.04452111364464E+0001 -1.04485181386164E+0001 +-1.04518254182673E+0001 -1.04551329756202E+0001 -1.04584408108957E+0001 -1.04617489243143E+0001 -1.04650573160965E+0001 +-1.04683659864621E+0001 -1.04716749356312E+0001 -1.04749841638233E+0001 -1.04782936712577E+0001 -1.04816034581537E+0001 +-1.04849135247303E+0001 -1.04882238712061E+0001 -1.04915344977996E+0001 -1.04948454047292E+0001 -1.04981565922128E+0001 +-1.05014680604684E+0001 -1.05047798097135E+0001 -1.05080918401655E+0001 -1.05114041520416E+0001 -1.05147167455587E+0001 +-1.05180296209337E+0001 -1.05213427783828E+0001 -1.05246562181226E+0001 -1.05279699403690E+0001 -1.05312839453379E+0001 +-1.05345982332448E+0001 -1.05379128043054E+0001 -1.05412276587346E+0001 -1.05445427967475E+0001 -1.05478582185589E+0001 +-1.05511739243833E+0001 -1.05544899144350E+0001 -1.05578061889281E+0001 -1.05611227480766E+0001 -1.05644395920940E+0001 +-1.05677567211938E+0001 -1.05710741355894E+0001 -1.05743918354937E+0001 -1.05777098211195E+0001 -1.05810280926794E+0001 +-1.05843466503858E+0001 -1.05876654944510E+0001 -1.05909846250867E+0001 -1.05943040425048E+0001 -1.05976237469168E+0001 +-1.06009437385341E+0001 -1.06042640175676E+0001 -1.06075845842284E+0001 -1.06109054387270E+0001 -1.06142265812741E+0001 +-1.06175480120797E+0001 -1.06208697313540E+0001 -1.06241917393067E+0001 -1.06275140361476E+0001 -1.06308366220860E+0001 +-1.06341594973312E+0001 -1.06374826620921E+0001 -1.06408061165774E+0001 -1.06441298609959E+0001 -1.06474538955558E+0001 +-1.06507782204653E+0001 -1.06541028359324E+0001 -1.06574277421648E+0001 -1.06607529393700E+0001 -1.06640784277554E+0001 +-1.06674042075281E+0001 -1.06707302788950E+0001 -1.06740566420628E+0001 -1.06773832972379E+0001 -1.06807102446268E+0001 +-1.06840374844355E+0001 -1.06873650168699E+0001 -1.06906928421356E+0001 -1.06940209604381E+0001 -1.06973493719828E+0001 +-1.07006780769746E+0001 -1.07040070756184E+0001 -1.07073363681190E+0001 -1.07106659546806E+0001 -1.07139958355077E+0001 +-1.07173260108042E+0001 -1.07206564807741E+0001 -1.07239872456208E+0001 -1.07273183055480E+0001 -1.07306496607588E+0001 +-1.07339813114562E+0001 -1.07373132578432E+0001 -1.07406455001223E+0001 -1.07439780384960E+0001 -1.07473108731666E+0001 +-1.07506440043360E+0001 -1.07539774322061E+0001 -1.07573111569785E+0001 -1.07606451788547E+0001 -1.07639794980360E+0001 +-1.07673141147233E+0001 -1.07706490291176E+0001 -1.07739842414194E+0001 -1.07773197518292E+0001 -1.07806555605473E+0001 +-1.07839916677737E+0001 -1.07873280737082E+0001 -1.07906647785506E+0001 -1.07940017825004E+0001 -1.07973390857567E+0001 +-1.08006766885186E+0001 -1.08040145909850E+0001 -1.08073527933547E+0001 -1.08106912958260E+0001 -1.08140300985974E+0001 +-1.08173692018668E+0001 -1.08207086058322E+0001 -1.08240483106913E+0001 -1.08273883166416E+0001 -1.08307286238805E+0001 +-1.08340692326050E+0001 -1.08374101430121E+0001 -1.08407513552986E+0001 -1.08440928696609E+0001 -1.08474346862956E+0001 +-1.08507768053986E+0001 -1.08541192271661E+0001 -1.08574619517937E+0001 -1.08608049794771E+0001 -1.08641483104118E+0001 +-1.08674919447928E+0001 -1.08708358828152E+0001 -1.08741801246739E+0001 -1.08775246705635E+0001 -1.08808695206784E+0001 +-1.08842146752130E+0001 -1.08875601343612E+0001 -1.08909058983171E+0001 -1.08942519672742E+0001 -1.08975983414261E+0001 +-1.09009450209661E+0001 -1.09042920060873E+0001 -1.09076392969827E+0001 -1.09109868938451E+0001 -1.09143347968670E+0001 +-1.09176830062408E+0001 -1.09210315221587E+0001 -1.09243803448128E+0001 -1.09277294743948E+0001 -1.09310789110964E+0001 +-1.09344286551090E+0001 -1.09377787066240E+0001 -1.09411290658323E+0001 -1.09444797329250E+0001 -1.09478307080927E+0001 +-1.09511819915260E+0001 -1.09545335834151E+0001 -1.09578854839504E+0001 -1.09612376933217E+0001 -1.09645902117189E+0001 +-1.09679430393315E+0001 -1.09712961763491E+0001 -1.09746496229608E+0001 -1.09780033793557E+0001 -1.09813574457228E+0001 +-1.09847118222507E+0001 -1.09880665091279E+0001 -1.09914215065428E+0001 -1.09947768146836E+0001 -1.09981324337382E+0001 +-1.10014883638945E+0001 -1.10048446053400E+0001 -1.10082011582622E+0001 -1.10115580228484E+0001 -1.10149151992856E+0001 +-1.10182726877607E+0001 -1.10216304884606E+0001 -1.10249886015716E+0001 -1.10283470272802E+0001 -1.10317057657726E+0001 +-1.10350648172347E+0001 -1.10384241818524E+0001 -1.10417838598115E+0001 -1.10451438512972E+0001 -1.10485041564950E+0001 +-1.10518647755899E+0001 -1.10552257087670E+0001 -1.10585869562109E+0001 -1.10619485181063E+0001 -1.10653103946376E+0001 +-1.10686725859890E+0001 -1.10720350923447E+0001 -1.10753979138884E+0001 -1.10787610508039E+0001 -1.10821245032748E+0001 +-1.10854882714843E+0001 -1.10888523556158E+0001 -1.10922167558522E+0001 -1.10955814723764E+0001 -1.10989465053711E+0001 +-1.11023118550186E+0001 -1.11056775215015E+0001 -1.11090435050018E+0001 -1.11124098057014E+0001 -1.11157764237823E+0001 +-1.11191433594260E+0001 -1.11225106128140E+0001 -1.11258781841276E+0001 -1.11292460735480E+0001 -1.11326142812560E+0001 +-1.11359828074324E+0001 -1.11393516522579E+0001 -1.11427208159128E+0001 -1.11460902985775E+0001 -1.11494601004321E+0001 +-1.11528302216564E+0001 -1.11562006624303E+0001 -1.11595714229332E+0001 -1.11629425033447E+0001 -1.11663139038440E+0001 +-1.11696856246101E+0001 -1.11730576658219E+0001 -1.11764300276583E+0001 -1.11798027102978E+0001 -1.11831757139187E+0001 +-1.11865490386994E+0001 -1.11899226848178E+0001 -1.11932966524520E+0001 -1.11966709417796E+0001 -1.12000455529782E+0001 +-1.12034204862252E+0001 -1.12067957416978E+0001 -1.12101713195731E+0001 -1.12135472200281E+0001 -1.12169234432394E+0001 +-1.12202999893836E+0001 -1.12236768586372E+0001 -1.12270540511764E+0001 -1.12304315671772E+0001 -1.12338094068155E+0001 +-1.12371875702672E+0001 -1.12405660577078E+0001 -1.12439448693127E+0001 -1.12473240052572E+0001 -1.12507034657163E+0001 +-1.12540832508651E+0001 -1.12574633608782E+0001 -1.12608437959302E+0001 -1.12642245561957E+0001 -1.12676056418489E+0001 +-1.12709870530639E+0001 -1.12743687900146E+0001 -1.12777508528749E+0001 -1.12811332418183E+0001 -1.12845159570184E+0001 +-1.12878989986485E+0001 -1.12912823668816E+0001 -1.12946660618908E+0001 -1.12980500838490E+0001 -1.13014344329287E+0001 +-1.13048191093025E+0001 -1.13082041131427E+0001 -1.13115894446215E+0001 -1.13149751039110E+0001 -1.13183610911829E+0001 +-1.13217474066091E+0001 -1.13251340503610E+0001 -1.13285210226100E+0001 -1.13319083235275E+0001 -1.13352959532843E+0001 +-1.13386839120515E+0001 -1.13420721999998E+0001 -1.13454608172998E+0001 -1.13488497641220E+0001 -1.13522390406366E+0001 +-1.13556286470137E+0001 -1.13590185834234E+0001 -1.13624088500354E+0001 -1.13657994470194E+0001 -1.13691903745449E+0001 +-1.13725816327812E+0001 -1.13759732218976E+0001 -1.13793651420630E+0001 -1.13827573934463E+0001 -1.13861499762163E+0001 +-1.13895428905414E+0001 -1.13929361365903E+0001 -1.13963297145309E+0001 -1.13997236245316E+0001 -1.14031178667602E+0001 +-1.14065124413845E+0001 -1.14099073485722E+0001 -1.14133025884907E+0001 -1.14166981613074E+0001 -1.14200940671895E+0001 +-1.14234903063039E+0001 -1.14268868788176E+0001 -1.14302837848973E+0001 -1.14336810247095E+0001 -1.14370785984207E+0001 +-1.14404765061970E+0001 -1.14438747482047E+0001 -1.14472733246097E+0001 -1.14506722355778E+0001 -1.14540714812747E+0001 +-1.14574710618657E+0001 -1.14608709775164E+0001 -1.14642712283919E+0001 -1.14676718146573E+0001 -1.14710727364774E+0001 +-1.14744739940171E+0001 -1.14778755874408E+0001 -1.14812775169132E+0001 -1.14846797825984E+0001 -1.14880823846606E+0001 +-1.14914853232638E+0001 -1.14948885985720E+0001 -1.14982922107487E+0001 -1.15016961599576E+0001 -1.15051004463620E+0001 +-1.15085050701252E+0001 -1.15119100314103E+0001 -1.15153153303804E+0001 -1.15187209671981E+0001 -1.15221269420262E+0001 +-1.15255332550272E+0001 -1.15289399063635E+0001 -1.15323468961972E+0001 -1.15357542246906E+0001 -1.15391618920054E+0001 +-1.15425698983035E+0001 -1.15459782437466E+0001 -1.15493869284961E+0001 -1.15527959527133E+0001 -1.15562053165596E+0001 +-1.15596150201958E+0001 -1.15630250637831E+0001 -1.15664354474820E+0001 -1.15698461714533E+0001 -1.15732572358574E+0001 +-1.15766686408546E+0001 -1.15800803866052E+0001 -1.15834924732692E+0001 -1.15869049010064E+0001 -1.15903176699767E+0001 +-1.15937307803396E+0001 -1.15971442322546E+0001 -1.16005580258811E+0001 -1.16039721613781E+0001 -1.16073866389049E+0001 +-1.16108014586202E+0001 -1.16142166206828E+0001 -1.16176321252514E+0001 -1.16210479724843E+0001 -1.16244641625400E+0001 +-1.16278806955765E+0001 -1.16312975717520E+0001 -1.16347147912244E+0001 -1.16381323541514E+0001 -1.16415502606905E+0001 +-1.16449685109994E+0001 -1.16483871052354E+0001 -1.16518060435556E+0001 -1.16552253261171E+0001 -1.16586449530767E+0001 +-1.16620649245914E+0001 -1.16654852408177E+0001 -1.16689059019122E+0001 -1.16723269080311E+0001 -1.16757482593306E+0001 +-1.16791699559670E+0001 -1.16825919980961E+0001 -1.16860143858737E+0001 -1.16894371194554E+0001 -1.16928601989969E+0001 +-1.16962836246534E+0001 -1.16997073965802E+0001 -1.17031315149325E+0001 -1.17065559798651E+0001 -1.17099807915330E+0001 +-1.17134059500909E+0001 -1.17168314556932E+0001 -1.17202573084944E+0001 -1.17236835086488E+0001 -1.17271100563105E+0001 +-1.17305369516335E+0001 -1.17339641947718E+0001 -1.17373917858790E+0001 -1.17408197251088E+0001 -1.17442480126146E+0001 +-1.17476766485497E+0001 -1.17511056330674E+0001 -1.17545349663206E+0001 -1.17579646484624E+0001 -1.17613946796454E+0001 +-1.17648250600225E+0001 -1.17682557897459E+0001 -1.17716868689683E+0001 -1.17751182978417E+0001 -1.17785500765183E+0001 +-1.17819822051502E+0001 -1.17854146838890E+0001 -1.17888475128867E+0001 -1.17922806922946E+0001 -1.17957142222643E+0001 +-1.17991481029471E+0001 -1.18025823344941E+0001 -1.18060169170565E+0001 -1.18094518507850E+0001 -1.18128871358306E+0001 +-1.18163227723438E+0001 -1.18197587604751E+0001 -1.18231951003750E+0001 -1.18266317921937E+0001 -1.18300688360812E+0001 +-1.18335062321877E+0001 -1.18369439806629E+0001 -1.18403820816565E+0001 -1.18438205353183E+0001 -1.18472593417975E+0001 +-1.18506985012436E+0001 -1.18541380138057E+0001 -1.18575778796330E+0001 -1.18610180988743E+0001 -1.18644586716785E+0001 +-1.18678995981942E+0001 -1.18713408785700E+0001 -1.18747825129543E+0001 -1.18782245014954E+0001 -1.18816668443415E+0001 +-1.18851095416405E+0001 -1.18885525935404E+0001 -1.18919960001890E+0001 -1.18954397617339E+0001 -1.18988838783226E+0001 +-1.19023283501025E+0001 -1.19057731772209E+0001 -1.19092183598249E+0001 -1.19126638980614E+0001 -1.19161097920774E+0001 +-1.19195560420196E+0001 -1.19230026480346E+0001 -1.19264496102689E+0001 -1.19298969288690E+0001 -1.19333446039809E+0001 +-1.19367926357508E+0001 -1.19402410243248E+0001 -1.19436897698486E+0001 -1.19471388724680E+0001 -1.19505883323285E+0001 +-1.19540381495758E+0001 -1.19574883243550E+0001 -1.19609388568115E+0001 -1.19643897470904E+0001 -1.19678409953365E+0001 +-1.19712926016948E+0001 -1.19747445663100E+0001 -1.19781968893266E+0001 -1.19816495708893E+0001 -1.19851026111422E+0001 +-1.19885560102296E+0001 -1.19920097682956E+0001 -1.19954638854843E+0001 -1.19989183619393E+0001 -1.20023731978046E+0001 +-1.20058283932236E+0001 -1.20092839483399E+0001 -1.20127398632967E+0001 -1.20161961382374E+0001 -1.20196527733050E+0001 +-1.20231097686425E+0001 -1.20265671243929E+0001 -1.20300248406987E+0001 -1.20334829177027E+0001 -1.20369413555473E+0001 +-1.20404001543749E+0001 -1.20438593143277E+0001 -1.20473188355480E+0001 -1.20507787181775E+0001 -1.20542389623584E+0001 +-1.20576995682323E+0001 -1.20611605359408E+0001 -1.20646218656255E+0001 -1.20680835574278E+0001 -1.20715456114889E+0001 +-1.20750080279500E+0001 -1.20784708069521E+0001 -1.20819339486362E+0001 -1.20853974531430E+0001 -1.20888613206133E+0001 +-1.20923255511874E+0001 -1.20957901450060E+0001 -1.20992551022093E+0001 -1.21027204229375E+0001 -1.21061861073306E+0001 +-1.21096521555286E+0001 -1.21131185676714E+0001 -1.21165853438987E+0001 -1.21200524843500E+0001 -1.21235199891648E+0001 +-1.21269878584825E+0001 -1.21304560924423E+0001 -1.21339246911834E+0001 -1.21373936548448E+0001 -1.21408629835652E+0001 +-1.21443326774835E+0001 -1.21478027367384E+0001 -1.21512731614684E+0001 -1.21547439518118E+0001 -1.21582151079070E+0001 +-1.21616866298921E+0001 -1.21651585179052E+0001 -1.21686307720843E+0001 -1.21721033925671E+0001 -1.21755763794914E+0001 +-1.21790497329948E+0001 -1.21825234532148E+0001 -1.21859975402886E+0001 -1.21894719943535E+0001 -1.21929468155468E+0001 +-1.21964220040053E+0001 -1.21998975598659E+0001 -1.22033734832656E+0001 -1.22068497743408E+0001 -1.22103264332281E+0001 +-1.22138034600641E+0001 -1.22172808549850E+0001 -1.22207586181269E+0001 -1.22242367496261E+0001 -1.22277152496184E+0001 +-1.22311941182397E+0001 -1.22346733556257E+0001 -1.22381529619122E+0001 -1.22416329372345E+0001 -1.22451132817282E+0001 +-1.22485939955284E+0001 -1.22520750787703E+0001 -1.22555565315891E+0001 -1.22590383541196E+0001 -1.22625205464967E+0001 +-1.22660031088552E+0001 -1.22694860413295E+0001 -1.22729693440542E+0001 -1.22764530171636E+0001 -1.22799370607921E+0001 +-1.22834214750738E+0001 -1.22869062601427E+0001 -1.22903914161328E+0001 -1.22938769431778E+0001 -1.22973628414116E+0001 +-1.23008491109675E+0001 -1.23043357519793E+0001 -1.23078227645801E+0001 -1.23113101489033E+0001 -1.23147979050820E+0001 +-1.23182860332492E+0001 -1.23217745335379E+0001 -1.23252634060809E+0001 -1.23287526510109E+0001 -1.23322422684604E+0001 +-1.23357322585619E+0001 -1.23392226214479E+0001 -1.23427133572505E+0001 -1.23462044661020E+0001 -1.23496959481343E+0001 +-1.23531878034793E+0001 -1.23566800322690E+0001 -1.23601726346350E+0001 -1.23636656107088E+0001 -1.23671589606220E+0001 +-1.23706526845060E+0001 -1.23741467824920E+0001 -1.23776412547112E+0001 -1.23811361012947E+0001 -1.23846313223733E+0001 +-1.23881269180780E+0001 -1.23916228885393E+0001 -1.23951192338881E+0001 -1.23986159542547E+0001 -1.24021130497695E+0001 +-1.24056105205629E+0001 -1.24091083667651E+0001 -1.24126065885060E+0001 -1.24161051859157E+0001 -1.24196041591241E+0001 +-1.24231035082608E+0001 -1.24266032334556E+0001 -1.24301033348380E+0001 -1.24336038125373E+0001 -1.24371046666830E+0001 +-1.24406058974042E+0001 -1.24441075048301E+0001 -1.24476094890896E+0001 -1.24511118503116E+0001 -1.24546145886250E+0001 +-1.24581177041584E+0001 -1.24616211970404E+0001 -1.24651250673995E+0001 -1.24686293153640E+0001 -1.24721339410622E+0001 +-1.24756389446223E+0001 -1.24791443261722E+0001 -1.24826500858400E+0001 -1.24861562237535E+0001 -1.24896627400403E+0001 +-1.24931696348283E+0001 -1.24966769082447E+0001 -1.25001845604172E+0001 -1.25036925914729E+0001 -1.25072010015392E+0001 +-1.25107097907430E+0001 -1.25142189592114E+0001 -1.25177285070714E+0001 -1.25212384344496E+0001 -1.25247487414728E+0001 +-1.25282594282676E+0001 -1.25317704949604E+0001 -1.25352819416776E+0001 -1.25387937685455E+0001 -1.25423059756902E+0001 +-1.25458185632379E+0001 -1.25493315313144E+0001 -1.25528448800457E+0001 -1.25563586095575E+0001 -1.25598727199755E+0001 +-1.25633872114251E+0001 -1.25669020840320E+0001 -1.25704173379213E+0001 -1.25739329732183E+0001 -1.25774489900483E+0001 +-1.25809653885361E+0001 -1.25844821688069E+0001 -1.25879993309853E+0001 -1.25915168751961E+0001 -1.25950348015641E+0001 +-1.25985531102136E+0001 -1.26020718012691E+0001 -1.26055908748550E+0001 -1.26091103310955E+0001 -1.26126301701146E+0001 +-1.26161503920365E+0001 -1.26196709969851E+0001 -1.26231919850841E+0001 -1.26267133564574E+0001 -1.26302351112284E+0001 +-1.26337572495208E+0001 -1.26372797714580E+0001 -1.26408026771633E+0001 -1.26443259667598E+0001 -1.26478496403708E+0001 +-1.26513736981193E+0001 -1.26548981401281E+0001 -1.26584229665201E+0001 -1.26619481774180E+0001 -1.26654737729445E+0001 +-1.26689997532221E+0001 -1.26725261183731E+0001 -1.26760528685200E+0001 -1.26795800037849E+0001 -1.26831075242900E+0001 +-1.26866354301573E+0001 -1.26901637215087E+0001 -1.26936923984661E+0001 -1.26972214611512E+0001 -1.27007509096856E+0001 +-1.27042807441910E+0001 -1.27078109647886E+0001 -1.27113415715999E+0001 -1.27148725647461E+0001 -1.27184039443484E+0001 +-1.27219357105278E+0001 -1.27254678634052E+0001 -1.27290004031016E+0001 -1.27325333297376E+0001 -1.27360666434339E+0001 +-1.27396003443111E+0001 -1.27431344324897E+0001 -1.27466689080900E+0001 -1.27502037712323E+0001 -1.27537390220368E+0001 +-1.27572746606236E+0001 -1.27608106871126E+0001 -1.27643471016237E+0001 -1.27678839042767E+0001 -1.27714210951913E+0001 +-1.27749586744872E+0001 -1.27784966422837E+0001 -1.27820349987004E+0001 -1.27855737438565E+0001 -1.27891128778713E+0001 +-1.27926524008638E+0001 -1.27961923129532E+0001 -1.27997326142582E+0001 -1.28032733048978E+0001 -1.28068143849908E+0001 +-1.28103558546556E+0001 -1.28138977140110E+0001 -1.28174399631753E+0001 -1.28209826022670E+0001 -1.28245256314042E+0001 +-1.28280690507052E+0001 -1.28316128602880E+0001 -1.28351570602706E+0001 -1.28387016507710E+0001 -1.28422466319068E+0001 +-1.28457920037959E+0001 -1.28493377665558E+0001 -1.28528839203040E+0001 -1.28564304651580E+0001 -1.28599774012351E+0001 +-1.28635247286524E+0001 -1.28670724475273E+0001 -1.28706205579766E+0001 -1.28741690601175E+0001 -1.28777179540666E+0001 +-1.28812672399409E+0001 -1.28848169178569E+0001 -1.28883669879313E+0001 -1.28919174502805E+0001 -1.28954683050210E+0001 +-1.28990195522691E+0001 -1.29025711921410E+0001 -1.29061232247527E+0001 -1.29096756502204E+0001 -1.29132284686600E+0001 +-1.29167816801873E+0001 -1.29203352849180E+0001 -1.29238892829680E+0001 -1.29274436744526E+0001 -1.29309984594875E+0001 +-1.29345536381879E+0001 -1.29381092106692E+0001 -1.29416651770467E+0001 -1.29452215374353E+0001 -1.29487782919502E+0001 +-1.29523354407063E+0001 -1.29558929838184E+0001 -1.29594509214013E+0001 -1.29630092535697E+0001 -1.29665679804381E+0001 +-1.29701271021209E+0001 -1.29736866187327E+0001 -1.29772465303877E+0001 -1.29808068372001E+0001 -1.29843675392841E+0001 +-1.29879286367536E+0001 -1.29914901297227E+0001 -1.29950520183052E+0001 -1.29986143026147E+0001 -1.30021769827652E+0001 +-1.30057400588700E+0001 -1.30093035310427E+0001 -1.30128673993968E+0001 -1.30164316640455E+0001 -1.30199963251020E+0001 +-1.30235613826796E+0001 -1.30271268368912E+0001 -1.30306926878499E+0001 -1.30342589356684E+0001 -1.30378255804597E+0001 +-1.30413926223364E+0001 -1.30449600614110E+0001 -1.30485278977962E+0001 -1.30520961316044E+0001 -1.30556647629479E+0001 +-1.30592337919389E+0001 -1.30628032186897E+0001 -1.30663730433124E+0001 -1.30699432659188E+0001 -1.30735138866210E+0001 +-1.30770849055308E+0001 -1.30806563227599E+0001 -1.30842281384199E+0001 -1.30878003526224E+0001 -1.30913729654790E+0001 +-1.30949459771008E+0001 -1.30985193875994E+0001 -1.31020931970858E+0001 -1.31056674056713E+0001 -1.31092420134668E+0001 +-1.31128170205833E+0001 -1.31163924271317E+0001 -1.31199682332228E+0001 -1.31235444389672E+0001 -1.31271210444756E+0001 +-1.31306980498585E+0001 -1.31342754552263E+0001 -1.31378532606894E+0001 -1.31414314663580E+0001 -1.31450100723424E+0001 +-1.31485890787526E+0001 -1.31521684856986E+0001 -1.31557482932904E+0001 -1.31593285016378E+0001 -1.31629091108506E+0001 +-1.31664901210384E+0001 -1.31700715323108E+0001 -1.31736533447774E+0001 -1.31772355585474E+0001 -1.31808181737304E+0001 +-1.31844011904354E+0001 -1.31879846087717E+0001 -1.31915684288484E+0001 -1.31951526507745E+0001 -1.31987372746587E+0001 +-1.32023223006101E+0001 -1.32059077287373E+0001 -1.32094935591490E+0001 -1.32130797919537E+0001 -1.32166664272600E+0001 +-1.32202534651763E+0001 -1.32238409058108E+0001 -1.32274287492718E+0001 -1.32310169956675E+0001 -1.32346056451060E+0001 +-1.32381946976952E+0001 -1.32417841535431E+0001 -1.32453740127574E+0001 -1.32489642754459E+0001 -1.32525549417163E+0001 +-1.32561460116762E+0001 -1.32597374854330E+0001 -1.32633293630941E+0001 -1.32669216447669E+0001 -1.32705143305587E+0001 +-1.32741074205765E+0001 -1.32777009149275E+0001 -1.32812948137187E+0001 -1.32848891170570E+0001 -1.32884838250492E+0001 +-1.32920789378020E+0001 -1.32956744554222E+0001 -1.32992703780164E+0001 -1.33028667056910E+0001 -1.33064634385525E+0001 +-1.33100605767072E+0001 -1.33136581202613E+0001 -1.33172560693212E+0001 -1.33208544239928E+0001 -1.33244531843822E+0001 +-1.33280523505954E+0001 -1.33316519227381E+0001 -1.33352519009162E+0001 -1.33388522852354E+0001 -1.33424530758012E+0001 +-1.33460542727193E+0001 -1.33496558760951E+0001 -1.33532578860339E+0001 -1.33568603026411E+0001 -1.33604631260218E+0001 +-1.33640663562812E+0001 -1.33676699935244E+0001 -1.33712740378563E+0001 -1.33748784893819E+0001 -1.33784833482059E+0001 +-1.33820886144331E+0001 -1.33856942881681E+0001 -1.33893003695155E+0001 -1.33929068585799E+0001 -1.33965137554655E+0001 +-1.34001210602769E+0001 -1.34037287731182E+0001 -1.34073368940935E+0001 -1.34109454233071E+0001 -1.34145543608630E+0001 +-1.34181637068650E+0001 -1.34217734614171E+0001 -1.34253836246230E+0001 -1.34289941965864E+0001 -1.34326051774110E+0001 +-1.34362165672003E+0001 -1.34398283660579E+0001 -1.34434405740870E+0001 -1.34470531913910E+0001 -1.34506662180732E+0001 +-1.34542796542367E+0001 -1.34578934999846E+0001 -1.34615077554198E+0001 -1.34651224206454E+0001 -1.34687374957642E+0001 +-1.34723529808789E+0001 -1.34759688760922E+0001 -1.34795851815068E+0001 -1.34832018972252E+0001 -1.34868190233499E+0001 +-1.34904365599832E+0001 -1.34940545072274E+0001 -1.34976728651848E+0001 -1.35012916339576E+0001 -1.35049108136478E+0001 +-1.35085304043573E+0001 -1.35121504061883E+0001 -1.35157708192424E+0001 -1.35193916436214E+0001 -1.35230128794272E+0001 +-1.35266345267611E+0001 -1.35302565857249E+0001 -1.35338790564200E+0001 -1.35375019389477E+0001 -1.35411252334094E+0001 +-1.35447489399064E+0001 -1.35483730585397E+0001 -1.35519975894104E+0001 -1.35556225326197E+0001 -1.35592478882683E+0001 +-1.35628736564572E+0001 -1.35664998372872E+0001 -1.35701264308589E+0001 -1.35737534372730E+0001 -1.35773808566300E+0001 +-1.35810086890305E+0001 -1.35846369345748E+0001 -1.35882655933633E+0001 -1.35918946654962E+0001 -1.35955241510737E+0001 +-1.35991540501959E+0001 -1.36027843629629E+0001 -1.36064150894746E+0001 -1.36100462298309E+0001 -1.36136777841315E+0001 +-1.36173097524763E+0001 -1.36209421349649E+0001 -1.36245749316968E+0001 -1.36282081427717E+0001 -1.36318417682889E+0001 +-1.36354758083478E+0001 -1.36391102630476E+0001 -1.36427451324877E+0001 -1.36463804167671E+0001 -1.36500161159849E+0001 +-1.36536522302401E+0001 -1.36572887596316E+0001 -1.36609257042583E+0001 -1.36645630642190E+0001 -1.36682008396123E+0001 +-1.36718390305369E+0001 -1.36754776370913E+0001 -1.36791166593740E+0001 -1.36827560974834E+0001 -1.36863959515180E+0001 +-1.36900362215758E+0001 -1.36936769077551E+0001 -1.36973180101541E+0001 -1.37009595288708E+0001 -1.37046014640031E+0001 +-1.37082438156489E+0001 -1.37118865839061E+0001 -1.37155297688725E+0001 -1.37191733706456E+0001 -1.37228173893232E+0001 +-1.37264618250028E+0001 -1.37301066777817E+0001 -1.37337519477575E+0001 -1.37373976350275E+0001 -1.37410437396888E+0001 +-1.37446902618387E+0001 -1.37483372015743E+0001 -1.37519845589927E+0001 -1.37556323341907E+0001 -1.37592805272652E+0001 +-1.37629291383132E+0001 -1.37665781674313E+0001 -1.37702276147163E+0001 -1.37738774802647E+0001 -1.37775277641730E+0001 +-1.37811784665378E+0001 -1.37848295874555E+0001 -1.37884811270223E+0001 -1.37921330853345E+0001 -1.37957854624883E+0001 +-1.37994382585798E+0001 -1.38030914737050E+0001 -1.38067451079600E+0001 -1.38103991614406E+0001 -1.38140536342426E+0001 +-1.38177085264618E+0001 -1.38213638381940E+0001 -1.38250195695346E+0001 -1.38286757205793E+0001 -1.38323322914236E+0001 +-1.38359892821628E+0001 -1.38396466928924E+0001 -1.38433045237075E+0001 -1.38469627747033E+0001 -1.38506214459751E+0001 +-1.38542805376178E+0001 -1.38579400497264E+0001 -1.38615999823960E+0001 -1.38652603357212E+0001 -1.38689211097970E+0001 +-1.38725823047180E+0001 -1.38762439205788E+0001 -1.38799059574741E+0001 -1.38835684154984E+0001 -1.38872312947460E+0001 +-1.38908945953114E+0001 -1.38945583172889E+0001 -1.38982224607726E+0001 -1.39018870258568E+0001 -1.39055520126356E+0001 +-1.39092174212029E+0001 -1.39128832516528E+0001 -1.39165495040791E+0001 -1.39202161785757E+0001 -1.39238832752362E+0001 +-1.39275507941544E+0001 -1.39312187354239E+0001 -1.39348870991383E+0001 -1.39385558853910E+0001 -1.39422250942755E+0001 +-1.39458947258850E+0001 -1.39495647803129E+0001 -1.39532352576524E+0001 -1.39569061579965E+0001 -1.39605774814385E+0001 +-1.39642492280713E+0001 -1.39679213979878E+0001 -1.39715939912809E+0001 -1.39752670080435E+0001 -1.39789404483682E+0001 +-1.39826143123477E+0001 -1.39862886000747E+0001 -1.39899633116416E+0001 -1.39936384471409E+0001 -1.39973140066651E+0001 +-1.40009899903065E+0001 -1.40046663981573E+0001 -1.40083432303097E+0001 -1.40120204868560E+0001 -1.40156981678881E+0001 +-1.40193762734980E+0001 -1.40230548037778E+0001 -1.40267337588192E+0001 -1.40304131387141E+0001 -1.40340929435542E+0001 +-1.40377731734311E+0001 -1.40414538284366E+0001 -1.40451349086621E+0001 -1.40488164141990E+0001 -1.40524983451389E+0001 +-1.40561807015731E+0001 -1.40598634835927E+0001 -1.40635466912891E+0001 -1.40672303247534E+0001 -1.40709143840767E+0001 +-1.40745988693499E+0001 -1.40782837806641E+0001 -1.40819691181101E+0001 -1.40856548817787E+0001 -1.40893410717607E+0001 +-1.40930276881468E+0001 -1.40967147310276E+0001 -1.41004022004936E+0001 -1.41040900966354E+0001 -1.41077784195434E+0001 +-1.41114671693079E+0001 -1.41151563460192E+0001 -1.41188459497677E+0001 -1.41225359806433E+0001 -1.41262264387364E+0001 +-1.41299173241368E+0001 -1.41336086369346E+0001 -1.41373003772197E+0001 -1.41409925450819E+0001 -1.41446851406110E+0001 +-1.41483781638967E+0001 -1.41520716150288E+0001 -1.41557654940967E+0001 -1.41594598011900E+0001 -1.41631545363982E+0001 +-1.41668496998107E+0001 -1.41705452915168E+0001 -1.41742413116057E+0001 -1.41779377601668E+0001 -1.41816346372891E+0001 +-1.41853319430616E+0001 -1.41890296775736E+0001 -1.41927278409138E+0001 -1.41964264331712E+0001 -1.42001254544346E+0001 +-1.42038249047928E+0001 -1.42075247843344E+0001 -1.42112250931482E+0001 -1.42149258313227E+0001 -1.42186269989463E+0001 +-1.42223285961076E+0001 -1.42260306228950E+0001 -1.42297330793967E+0001 -1.42334359657010E+0001 -1.42371392818962E+0001 +-1.42408430280703E+0001 -1.42445472043115E+0001 -1.42482518107077E+0001 -1.42519568473469E+0001 -1.42556623143170E+0001 +-1.42593682117058E+0001 -1.42630745396011E+0001 -1.42667812980906E+0001 -1.42704884872618E+0001 -1.42741961072025E+0001 +-1.42779041580000E+0001 -1.42816126397419E+0001 -1.42853215525155E+0001 -1.42890308964083E+0001 -1.42927406715073E+0001 +-1.42964508778999E+0001 -1.43001615156732E+0001 -1.43038725849142E+0001 -1.43075840857101E+0001 -1.43112960181477E+0001 +-1.43150083823139E+0001 -1.43187211782957E+0001 -1.43224344061797E+0001 -1.43261480660527E+0001 -1.43298621580013E+0001 +-1.43335766821121E+0001 -1.43372916384717E+0001 -1.43410070271665E+0001 -1.43447228482829E+0001 -1.43484391019074E+0001 +-1.43521557881261E+0001 -1.43558729070253E+0001 -1.43595904586911E+0001 -1.43633084432098E+0001 -1.43670268606672E+0001 +-1.43707457111495E+0001 -1.43744649947425E+0001 -1.43781847115321E+0001 -1.43819048616041E+0001 -1.43856254450442E+0001 +-1.43893464619381E+0001 -1.43930679123715E+0001 -1.43967897964299E+0001 -1.44005121141989E+0001 -1.44042348657638E+0001 +-1.44079580512100E+0001 -1.44116816706229E+0001 -1.44154057240877E+0001 -1.44191302116897E+0001 -1.44228551335140E+0001 +-1.44265804896456E+0001 -1.44303062801697E+0001 -1.44340325051711E+0001 -1.44377591647348E+0001 -1.44414862589456E+0001 +-1.44452137878883E+0001 -1.44489417516476E+0001 -1.44526701503083E+0001 -1.44563989839548E+0001 -1.44601282526719E+0001 +-1.44638579565439E+0001 -1.44675880956553E+0001 -1.44713186700905E+0001 -1.44750496799338E+0001 -1.44787811252695E+0001 +-1.44825130061817E+0001 -1.44862453227546E+0001 -1.44899780750723E+0001 -1.44937112632187E+0001 -1.44974448872780E+0001 +-1.45011789473339E+0001 -1.45049134434703E+0001 -1.45086483757710E+0001 -1.45123837443198E+0001 -1.45161195492003E+0001 +-1.45198557904961E+0001 -1.45235924682909E+0001 -1.45273295826680E+0001 -1.45310671337109E+0001 -1.45348051215031E+0001 +-1.45385435461278E+0001 -1.45422824076683E+0001 -1.45460217062078E+0001 -1.45497614418295E+0001 -1.45535016146165E+0001 +-1.45572422246517E+0001 -1.45609832720183E+0001 -1.45647247567991E+0001 -1.45684666790769E+0001 -1.45722090389346E+0001 +-1.45759518364550E+0001 -1.45796950717207E+0001 -1.45834387448143E+0001 -1.45871828558185E+0001 -1.45909274048158E+0001 +-1.45946723918886E+0001 -1.45984178171193E+0001 -1.46021636805903E+0001 -1.46059099823839E+0001 -1.46096567225823E+0001 +-1.46134039012677E+0001 -1.46171515185223E+0001 -1.46208995744280E+0001 -1.46246480690669E+0001 -1.46283970025210E+0001 +-1.46321463748722E+0001 -1.46358961862023E+0001 -1.46396464365930E+0001 -1.46433971261262E+0001 -1.46471482548834E+0001 +-1.46508998229464E+0001 -1.46546518303966E+0001 -1.46584042773155E+0001 -1.46621571637847E+0001 -1.46659104898856E+0001 +-1.46696642556993E+0001 -1.46734184613073E+0001 -1.46771731067907E+0001 -1.46809281922308E+0001 -1.46846837177086E+0001 +-1.46884396833051E+0001 -1.46921960891015E+0001 -1.46959529351786E+0001 -1.46997102216174E+0001 -1.47034679484986E+0001 +-1.47072261159031E+0001 -1.47109847239115E+0001 -1.47147437726046E+0001 -1.47185032620629E+0001 -1.47222631923671E+0001 +-1.47260235635976E+0001 -1.47297843758348E+0001 -1.47335456291592E+0001 -1.47373073236512E+0001 -1.47410694593909E+0001 +-1.47448320364586E+0001 -1.47485950549345E+0001 -1.47523585148988E+0001 -1.47561224164314E+0001 -1.47598867596124E+0001 +-1.47636515445218E+0001 -1.47674167712394E+0001 -1.47711824398450E+0001 -1.47749485504186E+0001 -1.47787151030398E+0001 +-1.47824820977883E+0001 -1.47862495347438E+0001 -1.47900174139858E+0001 -1.47937857355938E+0001 -1.47975544996473E+0001 +-1.48013237062257E+0001 -1.48050933554084E+0001 -1.48088634472747E+0001 -1.48126339819038E+0001 -1.48164049593749E+0001 +-1.48201763797672E+0001 -1.48239482431598E+0001 -1.48277205496316E+0001 -1.48314932992617E+0001 -1.48352664921291E+0001 +-1.48390401283125E+0001 -1.48428142078909E+0001 -1.48465887309429E+0001 -1.48503636975473E+0001 -1.48541391077827E+0001 +-1.48579149617278E+0001 -1.48616912594611E+0001 -1.48654680010611E+0001 -1.48692451866063E+0001 -1.48730228161751E+0001 +-1.48768008898457E+0001 -1.48805794076966E+0001 -1.48843583698058E+0001 -1.48881377762517E+0001 -1.48919176271123E+0001 +-1.48956979224657E+0001 -1.48994786623900E+0001 -1.49032598469631E+0001 -1.49070414762629E+0001 -1.49108235503674E+0001 +-1.49146060693542E+0001 -1.49183890333012E+0001 -1.49221724422861E+0001 -1.49259562963866E+0001 -1.49297405956802E+0001 +-1.49335253402445E+0001 -1.49373105301570E+0001 -1.49410961654952E+0001 -1.49448822463364E+0001 -1.49486687727580E+0001 +-1.49524557448373E+0001 -1.49562431626515E+0001 -1.49600310262778E+0001 -1.49638193357934E+0001 -1.49676080912753E+0001 +-1.49713972928006E+0001 -1.49751869404462E+0001 -1.49789770342891E+0001 -1.49827675744061E+0001 -1.49865585608741E+0001 +-1.49903499937698E+0001 -1.49941418731701E+0001 -1.49979341991514E+0001 -1.50017269717906E+0001 -1.50055201911640E+0001 +-1.50093138573483E+0001 -1.50131079704199E+0001 -1.50169025304553E+0001 -1.50206975375307E+0001 -1.50244929917225E+0001 +-1.50282888931070E+0001 -1.50320852417604E+0001 -1.50358820377588E+0001 -1.50396792811783E+0001 -1.50434769720950E+0001 +-1.50472751105850E+0001 -1.50510736967241E+0001 -1.50548727305882E+0001 -1.50586722122533E+0001 -1.50624721417951E+0001 +-1.50662725192893E+0001 -1.50700733448117E+0001 -1.50738746184380E+0001 -1.50776763402437E+0001 -1.50814785103043E+0001 +-1.50852811286954E+0001 -1.50890841954925E+0001 -1.50928877107709E+0001 -1.50966916746059E+0001 -1.51004960870729E+0001 +-1.51043009482472E+0001 -1.51081062582039E+0001 -1.51119120170181E+0001 -1.51157182247650E+0001 -1.51195248815196E+0001 +-1.51233319873570E+0001 -1.51271395423520E+0001 -1.51309475465796E+0001 -1.51347560001146E+0001 -1.51385649030318E+0001 +-1.51423742554060E+0001 -1.51461840573118E+0001 -1.51499943088240E+0001 -1.51538050100171E+0001 -1.51576161609656E+0001 +-1.51614277617441E+0001 -1.51652398124271E+0001 -1.51690523130889E+0001 -1.51728652638038E+0001 -1.51766786646463E+0001 +-1.51804925156905E+0001 -1.51843068170106E+0001 -1.51881215686809E+0001 -1.51919367707754E+0001 -1.51957524233681E+0001 +-1.51995685265332E+0001 -1.52033850803445E+0001 -1.52072020848759E+0001 -1.52110195402014E+0001 -1.52148374463947E+0001 +-1.52186558035297E+0001 -1.52224746116799E+0001 -1.52262938709192E+0001 -1.52301135813210E+0001 -1.52339337429591E+0001 +-1.52377543559068E+0001 -1.52415754202378E+0001 -1.52453969360253E+0001 -1.52492189033429E+0001 -1.52530413222637E+0001 +-1.52568641928612E+0001 -1.52606875152084E+0001 -1.52645112893787E+0001 -1.52683355154452E+0001 -1.52721601934809E+0001 +-1.52759853235588E+0001 -1.52798109057521E+0001 -1.52836369401335E+0001 -1.52874634267761E+0001 -1.52912903657526E+0001 +-1.52951177571359E+0001 -1.52989456009987E+0001 -1.53027738974137E+0001 -1.53066026464536E+0001 -1.53104318481910E+0001 +-1.53142615026984E+0001 -1.53180916100484E+0001 -1.53219221703134E+0001 -1.53257531835658E+0001 -1.53295846498781E+0001 +-1.53334165693225E+0001 -1.53372489419713E+0001 -1.53410817678968E+0001 -1.53449150471711E+0001 -1.53487487798664E+0001 +-1.53525829660547E+0001 -1.53564176058081E+0001 -1.53602526991986E+0001 -1.53640882462981E+0001 -1.53679242471785E+0001 +-1.53717607019117E+0001 -1.53755976105696E+0001 -1.53794349732237E+0001 -1.53832727899459E+0001 -1.53871110608079E+0001 +-1.53909497858811E+0001 -1.53947889652373E+0001 -1.53986285989479E+0001 -1.54024686870844E+0001 -1.54063092297183E+0001 +-1.54101502269209E+0001 -1.54139916787636E+0001 -1.54178335853176E+0001 -1.54216759466542E+0001 -1.54255187628446E+0001 +-1.54293620339600E+0001 -1.54332057600714E+0001 -1.54370499412499E+0001 -1.54408945775666E+0001 -1.54447396690923E+0001 +-1.54485852158981E+0001 -1.54524312180548E+0001 -1.54562776756332E+0001 -1.54601245887041E+0001 -1.54639719573382E+0001 +-1.54678197816063E+0001 -1.54716680615789E+0001 -1.54755167973267E+0001 -1.54793659889203E+0001 -1.54832156364301E+0001 +-1.54870657399266E+0001 -1.54909162994802E+0001 -1.54947673151612E+0001 -1.54986187870401E+0001 -1.55024707151871E+0001 +-1.55063230996724E+0001 -1.55101759405662E+0001 -1.55140292379387E+0001 -1.55178829918599E+0001 -1.55217372024000E+0001 +-1.55255918696288E+0001 -1.55294469936164E+0001 -1.55333025744327E+0001 -1.55371586121476E+0001 -1.55410151068308E+0001 +-1.55448720585522E+0001 -1.55487294673815E+0001 -1.55525873333884E+0001 -1.55564456566425E+0001 -1.55603044372135E+0001 +-1.55641636751708E+0001 -1.55680233705841E+0001 -1.55718835235227E+0001 -1.55757441340562E+0001 -1.55796052022538E+0001 +-1.55834667281848E+0001 -1.55873287119187E+0001 -1.55911911535246E+0001 -1.55950540530718E+0001 -1.55989174106293E+0001 +-1.56027812262663E+0001 -1.56066455000519E+0001 -1.56105102320550E+0001 -1.56143754223447E+0001 -1.56182410709898E+0001 +-1.56221071780594E+0001 -1.56259737436221E+0001 -1.56298407677469E+0001 -1.56337082505024E+0001 -1.56375761919574E+0001 +-1.56414445921805E+0001 -1.56453134512404E+0001 -1.56491827692056E+0001 -1.56530525461447E+0001 -1.56569227821261E+0001 +-1.56607934772184E+0001 -1.56646646314899E+0001 -1.56685362450089E+0001 -1.56724083178439E+0001 -1.56762808500629E+0001 +-1.56801538417344E+0001 -1.56840272929264E+0001 -1.56879012037072E+0001 -1.56917755741447E+0001 -1.56956504043071E+0001 +-1.56995256942623E+0001 -1.57034014440784E+0001 -1.57072776538232E+0001 -1.57111543235647E+0001 -1.57150314533706E+0001 +-1.57189090433087E+0001 -1.57227870934469E+0001 -1.57266656038528E+0001 -1.57305445745941E+0001 -1.57344240057383E+0001 +-1.57383038973531E+0001 -1.57421842495060E+0001 -1.57460650622645E+0001 -1.57499463356961E+0001 -1.57538280698680E+0001 +-1.57577102648478E+0001 -1.57615929207027E+0001 -1.57654760375000E+0001 -1.57693596153069E+0001 -1.57732436541907E+0001 +-1.57771281542184E+0001 -1.57810131154571E+0001 -1.57848985379740E+0001 -1.57887844218361E+0001 -1.57926707671102E+0001 +-1.57965575738635E+0001 -1.58004448421626E+0001 -1.58043325720746E+0001 -1.58082207636662E+0001 -1.58121094170041E+0001 +-1.58159985321551E+0001 -1.58198881091859E+0001 -1.58237781481631E+0001 -1.58276686491533E+0001 -1.58315596122230E+0001 +-1.58354510374388E+0001 -1.58393429248672E+0001 -1.58432352745745E+0001 -1.58471280866271E+0001 -1.58510213610914E+0001 +-1.58549150980337E+0001 -1.58588092975202E+0001 -1.58627039596171E+0001 -1.58665990843907E+0001 -1.58704946719071E+0001 +-1.58743907222323E+0001 -1.58782872354324E+0001 -1.58821842115734E+0001 -1.58860816507213E+0001 -1.58899795529419E+0001 +-1.58938779183013E+0001 -1.58977767468651E+0001 -1.59016760386993E+0001 -1.59055757938695E+0001 -1.59094760124415E+0001 +-1.59133766944810E+0001 -1.59172778400536E+0001 -1.59211794492248E+0001 -1.59250815220603E+0001 -1.59289840586256E+0001 +-1.59328870589860E+0001 -1.59367905232071E+0001 -1.59406944513542E+0001 -1.59445988434927E+0001 -1.59485036996878E+0001 +-1.59524090200049E+0001 -1.59563148045091E+0001 -1.59602210532657E+0001 -1.59641277663397E+0001 -1.59680349437963E+0001 +-1.59719425857005E+0001 -1.59758506921174E+0001 -1.59797592631118E+0001 -1.59836682987489E+0001 -1.59875777990933E+0001 +-1.59914877642101E+0001 -1.59953981941640E+0001 -1.59993090890197E+0001 -1.60032204488421E+0001 -1.60071322736958E+0001 +-1.60110445636454E+0001 -1.60149573187556E+0001 -1.60188705390909E+0001 -1.60227842247159E+0001 -1.60266983756950E+0001 +-1.60306129920927E+0001 -1.60345280739735E+0001 -1.60384436214015E+0001 -1.60423596344413E+0001 -1.60462761131571E+0001 +-1.60501930576131E+0001 -1.60541104678735E+0001 -1.60580283440026E+0001 -1.60619466860643E+0001 -1.60658654941229E+0001 +-1.60697847682423E+0001 -1.60737045084867E+0001 -1.60776247149198E+0001 -1.60815453876057E+0001 -1.60854665266082E+0001 +-1.60893881319913E+0001 -1.60933102038186E+0001 -1.60972327421540E+0001 -1.61011557470612E+0001 -1.61050792186038E+0001 +-1.61090031568456E+0001 -1.61129275618502E+0001 -1.61168524336810E+0001 -1.61207777724017E+0001 -1.61247035780757E+0001 +-1.61286298507664E+0001 -1.61325565905374E+0001 -1.61364837974519E+0001 -1.61404114715733E+0001 -1.61443396129649E+0001 +-1.61482682216899E+0001 -1.61521972978115E+0001 -1.61561268413930E+0001 -1.61600568524974E+0001 -1.61639873311879E+0001 +-1.61679182775275E+0001 -1.61718496915792E+0001 -1.61757815734060E+0001 -1.61797139230709E+0001 -1.61836467406367E+0001 +-1.61875800261663E+0001 -1.61915137797226E+0001 -1.61954480013683E+0001 -1.61993826911661E+0001 -1.62033178491788E+0001 +-1.62072534754690E+0001 -1.62111895700994E+0001 -1.62151261331326E+0001 -1.62190631646310E+0001 -1.62230006646573E+0001 +-1.62269386332738E+0001 -1.62308770705431E+0001 -1.62348159765275E+0001 -1.62387553512894E+0001 -1.62426951948911E+0001 +-1.62466355073949E+0001 -1.62505762888630E+0001 -1.62545175393576E+0001 -1.62584592589409E+0001 -1.62624014476750E+0001 +-1.62663441056221E+0001 -1.62702872328441E+0001 -1.62742308294030E+0001 -1.62781748953610E+0001 -1.62821194307798E+0001 +-1.62860644357214E+0001 -1.62900099102476E+0001 -1.62939558544203E+0001 -1.62979022683013E+0001 -1.63018491519522E+0001 +-1.63057965054349E+0001 -1.63097443288109E+0001 -1.63136926221419E+0001 -1.63176413854896E+0001 -1.63215906189153E+0001 +-1.63255403224808E+0001 -1.63294904962474E+0001 -1.63334411402766E+0001 -1.63373922546299E+0001 -1.63413438393684E+0001 +-1.63452958945537E+0001 -1.63492484202470E+0001 -1.63532014165096E+0001 -1.63571548834026E+0001 -1.63611088209872E+0001 +-1.63650632293246E+0001 -1.63690181084760E+0001 -1.63729734585022E+0001 -1.63769292794645E+0001 -1.63808855714238E+0001 +-1.63848423344410E+0001 -1.63887995685770E+0001 -1.63927572738928E+0001 -1.63967154504491E+0001 -1.64006740983069E+0001 +-1.64046332175268E+0001 -1.64085928081696E+0001 -1.64125528702959E+0001 -1.64165134039665E+0001 -1.64204744092420E+0001 +-1.64244358861829E+0001 -1.64283978348498E+0001 -1.64323602553032E+0001 -1.64363231476035E+0001 -1.64402865118113E+0001 +-1.64442503479869E+0001 -1.64482146561906E+0001 -1.64521794364829E+0001 -1.64561446889239E+0001 -1.64601104135739E+0001 +-1.64640766104932E+0001 -1.64680432797419E+0001 -1.64720104213802E+0001 -1.64759780354682E+0001 -1.64799461220659E+0001 +-1.64839146812334E+0001 -1.64878837130307E+0001 -1.64918532175177E+0001 -1.64958231947543E+0001 -1.64997936448005E+0001 +-1.65037645677161E+0001 -1.65077359635608E+0001 -1.65117078323946E+0001 -1.65156801742771E+0001 -1.65196529892680E+0001 +-1.65236262774270E+0001 -1.65276000388137E+0001 -1.65315742734877E+0001 -1.65355489815086E+0001 -1.65395241629360E+0001 +-1.65434998178292E+0001 -1.65474759462477E+0001 -1.65514525482511E+0001 -1.65554296238985E+0001 -1.65594071732495E+0001 +-1.65633851963632E+0001 -1.65673636932990E+0001 -1.65713426641161E+0001 -1.65753221088737E+0001 -1.65793020276310E+0001 +-1.65832824204470E+0001 -1.65872632873810E+0001 -1.65912446284919E+0001 -1.65952264438387E+0001 -1.65992087334805E+0001 +-1.66031914974762E+0001 -1.66071747358847E+0001 -1.66111584487649E+0001 -1.66151426361756E+0001 -1.66191272981757E+0001 +-1.66231124348239E+0001 -1.66270980461789E+0001 -1.66310841322995E+0001 -1.66350706932444E+0001 -1.66390577290720E+0001 +-1.66430452398411E+0001 -1.66470332256103E+0001 -1.66510216864379E+0001 -1.66550106223826E+0001 -1.66590000335028E+0001 +-1.66629899198568E+0001 -1.66669802815032E+0001 -1.66709711185001E+0001 -1.66749624309060E+0001 -1.66789542187791E+0001 +-1.66829464821777E+0001 -1.66869392211600E+0001 -1.66909324357841E+0001 -1.66949261261082E+0001 -1.66989202921904E+0001 +-1.67029149340887E+0001 -1.67069100518613E+0001 -1.67109056455660E+0001 -1.67149017152609E+0001 -1.67188982610039E+0001 +-1.67228952828529E+0001 -1.67268927808657E+0001 -1.67308907551002E+0001 -1.67348892056141E+0001 -1.67388881324653E+0001 +-1.67428875357114E+0001 -1.67468874154102E+0001 -1.67508877716192E+0001 -1.67548886043961E+0001 -1.67588899137985E+0001 +-1.67628916998839E+0001 -1.67668939627099E+0001 -1.67708967023339E+0001 -1.67748999188133E+0001 -1.67789036122057E+0001 +-1.67829077825683E+0001 -1.67869124299586E+0001 -1.67909175544337E+0001 -1.67949231560510E+0001 -1.67989292348678E+0001 +-1.68029357909412E+0001 -1.68069428243284E+0001 -1.68109503350866E+0001 -1.68149583232728E+0001 -1.68189667889441E+0001 +-1.68229757321576E+0001 -1.68269851529703E+0001 -1.68309950514390E+0001 -1.68350054276209E+0001 -1.68390162815727E+0001 +-1.68430276133514E+0001 -1.68470394230137E+0001 -1.68510517106164E+0001 -1.68550644762164E+0001 -1.68590777198704E+0001 +-1.68630914416350E+0001 -1.68671056415669E+0001 -1.68711203197228E+0001 -1.68751354761592E+0001 -1.68791511109327E+0001 +-1.68831672240999E+0001 -1.68871838157172E+0001 -1.68912008858411E+0001 -1.68952184345281E+0001 -1.68992364618344E+0001 +-1.69032549678165E+0001 -1.69072739525308E+0001 -1.69112934160334E+0001 -1.69153133583807E+0001 -1.69193337796289E+0001 +-1.69233546798342E+0001 -1.69273760590528E+0001 -1.69313979173407E+0001 -1.69354202547541E+0001 -1.69394430713491E+0001 +-1.69434663671816E+0001 -1.69474901423076E+0001 -1.69515143967832E+0001 -1.69555391306643E+0001 -1.69595643440067E+0001 +-1.69635900368663E+0001 -1.69676162092989E+0001 -1.69716428613604E+0001 -1.69756699931065E+0001 -1.69796976045929E+0001 +-1.69837256958754E+0001 -1.69877542670095E+0001 -1.69917833180510E+0001 -1.69958128490555E+0001 -1.69998428600784E+0001 +-1.70038733511753E+0001 -1.70079043224018E+0001 -1.70119357738133E+0001 -1.70159677054653E+0001 -1.70200001174130E+0001 +-1.70240330097120E+0001 -1.70280663824176E+0001 -1.70321002355850E+0001 -1.70361345692695E+0001 -1.70401693835264E+0001 +-1.70442046784109E+0001 -1.70482404539782E+0001 -1.70522767102833E+0001 -1.70563134473815E+0001 -1.70603506653277E+0001 +-1.70643883641771E+0001 -1.70684265439846E+0001 -1.70724652048053E+0001 -1.70765043466940E+0001 -1.70805439697057E+0001 +-1.70845840738953E+0001 -1.70886246593177E+0001 -1.70926657260276E+0001 -1.70967072740798E+0001 -1.71007493035291E+0001 +-1.71047918144303E+0001 -1.71088348068379E+0001 -1.71128782808068E+0001 -1.71169222363914E+0001 -1.71209666736464E+0001 +-1.71250115926264E+0001 -1.71290569933859E+0001 -1.71331028759794E+0001 -1.71371492404613E+0001 -1.71411960868861E+0001 +-1.71452434153082E+0001 -1.71492912257820E+0001 -1.71533395183618E+0001 -1.71573882931019E+0001 -1.71614375500566E+0001 +-1.71654872892802E+0001 -1.71695375108268E+0001 -1.71735882147506E+0001 -1.71776394011059E+0001 -1.71816910699466E+0001 +-1.71857432213270E+0001 -1.71897958553010E+0001 -1.71938489719226E+0001 -1.71979025712460E+0001 -1.72019566533249E+0001 +-1.72060112182135E+0001 -1.72100662659654E+0001 -1.72141217966347E+0001 -1.72181778102752E+0001 -1.72222343069406E+0001 +-1.72262912866848E+0001 -1.72303487495614E+0001 -1.72344066956243E+0001 -1.72384651249270E+0001 -1.72425240375232E+0001 +-1.72465834334665E+0001 -1.72506433128106E+0001 -1.72547036756089E+0001 -1.72587645219151E+0001 -1.72628258517825E+0001 +-1.72668876652646E+0001 -1.72709499624150E+0001 -1.72750127432869E+0001 -1.72790760079338E+0001 -1.72831397564089E+0001 +-1.72872039887656E+0001 -1.72912687050572E+0001 -1.72953339053369E+0001 -1.72993995896580E+0001 -1.73034657580735E+0001 +-1.73075324106367E+0001 -1.73115995474006E+0001 -1.73156671684185E+0001 -1.73197352737432E+0001 -1.73238038634279E+0001 +-1.73278729375256E+0001 -1.73319424960891E+0001 -1.73360125391716E+0001 -1.73400830668258E+0001 -1.73441540791046E+0001 +-1.73482255760609E+0001 -1.73522975577475E+0001 -1.73563700242172E+0001 -1.73604429755228E+0001 -1.73645164117169E+0001 +-1.73685903328522E+0001 -1.73726647389814E+0001 -1.73767396301572E+0001 -1.73808150064322E+0001 -1.73848908678588E+0001 +-1.73889672144897E+0001 -1.73930440463774E+0001 -1.73971213635743E+0001 -1.74011991661330E+0001 -1.74052774541057E+0001 +-1.74093562275449E+0001 -1.74134354865030E+0001 -1.74175152310323E+0001 -1.74215954611851E+0001 -1.74256761770137E+0001 +-1.74297573785702E+0001 -1.74338390659070E+0001 -1.74379212390761E+0001 -1.74420038981298E+0001 -1.74460870431201E+0001 +-1.74501706740992E+0001 -1.74542547911191E+0001 -1.74583393942318E+0001 -1.74624244834894E+0001 -1.74665100589437E+0001 +-1.74705961206468E+0001 -1.74746826686505E+0001 -1.74787697030067E+0001 -1.74828572237674E+0001 -1.74869452309842E+0001 +-1.74910337247090E+0001 -1.74951227049936E+0001 -1.74992121718896E+0001 -1.75033021254488E+0001 -1.75073925657229E+0001 +-1.75114834927634E+0001 -1.75155749066221E+0001 -1.75196668073505E+0001 -1.75237591950001E+0001 -1.75278520696225E+0001 +-1.75319454312691E+0001 -1.75360392799914E+0001 -1.75401336158410E+0001 -1.75442284388691E+0001 -1.75483237491271E+0001 +-1.75524195466664E+0001 -1.75565158315384E+0001 -1.75606126037942E+0001 -1.75647098634852E+0001 -1.75688076106626E+0001 +-1.75729058453776E+0001 -1.75770045676813E+0001 -1.75811037776250E+0001 -1.75852034752597E+0001 -1.75893036606364E+0001 +-1.75934043338064E+0001 -1.75975054948205E+0001 -1.76016071437298E+0001 -1.76057092805852E+0001 -1.76098119054377E+0001 +-1.76139150183383E+0001 -1.76180186193377E+0001 -1.76221227084868E+0001 -1.76262272858365E+0001 -1.76303323514375E+0001 +-1.76344379053407E+0001 -1.76385439475967E+0001 -1.76426504782562E+0001 -1.76467574973700E+0001 -1.76508650049887E+0001 +-1.76549730011629E+0001 -1.76590814859432E+0001 -1.76631904593801E+0001 -1.76672999215242E+0001 -1.76714098724261E+0001 +-1.76755203121361E+0001 -1.76796312407047E+0001 -1.76837426581824E+0001 -1.76878545646195E+0001 -1.76919669600665E+0001 +-1.76960798445735E+0001 -1.77001932181911E+0001 -1.77043070809693E+0001 -1.77084214329585E+0001 -1.77125362742089E+0001 +-1.77166516047706E+0001 -1.77207674246940E+0001 -1.77248837340290E+0001 -1.77290005328257E+0001 -1.77331178211344E+0001 +-1.77372355990049E+0001 -1.77413538664874E+0001 -1.77454726236319E+0001 -1.77495918704882E+0001 -1.77537116071064E+0001 +-1.77578318335363E+0001 -1.77619525498278E+0001 -1.77660737560308E+0001 -1.77701954521951E+0001 -1.77743176383705E+0001 +-1.77784403146067E+0001 -1.77825634809536E+0001 -1.77866871374607E+0001 -1.77908112841779E+0001 -1.77949359211547E+0001 +-1.77990610484408E+0001 -1.78031866660858E+0001 -1.78073127741393E+0001 -1.78114393726507E+0001 -1.78155664616696E+0001 +-1.78196940412456E+0001 -1.78238221114280E+0001 -1.78279506722663E+0001 -1.78320797238099E+0001 -1.78362092661082E+0001 +-1.78403392992105E+0001 -1.78444698231662E+0001 -1.78486008380245E+0001 -1.78527323438347E+0001 -1.78568643406460E+0001 +-1.78609968285077E+0001 -1.78651298074690E+0001 -1.78692632775789E+0001 -1.78733972388867E+0001 -1.78775316914413E+0001 +-1.78816666352920E+0001 -1.78858020704877E+0001 -1.78899379970775E+0001 -1.78940744151103E+0001 -1.78982113246351E+0001 +-1.79023487257008E+0001 -1.79064866183565E+0001 -1.79106250026508E+0001 -1.79147638786327E+0001 -1.79189032463510E+0001 +-1.79230431058546E+0001 -1.79271834571921E+0001 -1.79313243004123E+0001 -1.79354656355640E+0001 -1.79396074626958E+0001 +-1.79437497818564E+0001 -1.79478925930944E+0001 -1.79520358964585E+0001 -1.79561796919971E+0001 -1.79603239797589E+0001 +-1.79644687597924E+0001 -1.79686140321461E+0001 -1.79727597968685E+0001 -1.79769060540079E+0001 -1.79810528036129E+0001 +-1.79852000457318E+0001 -1.79893477804130E+0001 -1.79934960077048E+0001 -1.79976447276555E+0001 -1.80017939403134E+0001 +-1.80059436457267E+0001 -1.80100938439438E+0001 -1.80142445350128E+0001 -1.80183957189818E+0001 -1.80225473958990E+0001 +-1.80266995658126E+0001 -1.80308522287706E+0001 -1.80350053848211E+0001 -1.80391590340121E+0001 -1.80433131763917E+0001 +-1.80474678120078E+0001 -1.80516229409085E+0001 -1.80557785631415E+0001 -1.80599346787549E+0001 -1.80640912877966E+0001 +-1.80682483903143E+0001 -1.80724059863559E+0001 -1.80765640759693E+0001 -1.80807226592021E+0001 -1.80848817361022E+0001 +-1.80890413067172E+0001 -1.80932013710949E+0001 -1.80973619292828E+0001 -1.81015229813288E+0001 -1.81056845272803E+0001 +-1.81098465671850E+0001 -1.81140091010904E+0001 -1.81181721290441E+0001 -1.81223356510936E+0001 -1.81264996672863E+0001 +-1.81306641776697E+0001 -1.81348291822913E+0001 -1.81389946811985E+0001 -1.81431606744386E+0001 -1.81473271620590E+0001 +-1.81514941441069E+0001 -1.81556616206298E+0001 -1.81598295916749E+0001 -1.81639980572895E+0001 -1.81681670175207E+0001 +-1.81723364724157E+0001 -1.81765064220218E+0001 -1.81806768663860E+0001 -1.81848478055556E+0001 -1.81890192395775E+0001 +-1.81931911684989E+0001 -1.81973635923667E+0001 -1.82015365112280E+0001 -1.82057099251299E+0001 -1.82098838341192E+0001 +-1.82140582382428E+0001 -1.82182331375478E+0001 -1.82224085320809E+0001 -1.82265844218891E+0001 -1.82307608070192E+0001 +-1.82349376875179E+0001 -1.82391150634321E+0001 -1.82432929348085E+0001 -1.82474713016939E+0001 -1.82516501641349E+0001 +-1.82558295221782E+0001 -1.82600093758705E+0001 -1.82641897252584E+0001 -1.82683705703886E+0001 -1.82725519113075E+0001 +-1.82767337480617E+0001 -1.82809160806979E+0001 -1.82850989092623E+0001 -1.82892822338016E+0001 -1.82934660543622E+0001 +-1.82976503709905E+0001 -1.83018351837329E+0001 -1.83060204926357E+0001 -1.83102062977454E+0001 -1.83143925991082E+0001 +-1.83185793967705E+0001 -1.83227666907784E+0001 -1.83269544811783E+0001 -1.83311427680164E+0001 -1.83353315513388E+0001 +-1.83395208311917E+0001 -1.83437106076214E+0001 -1.83479008806738E+0001 -1.83520916503951E+0001 -1.83562829168314E+0001 +-1.83604746800286E+0001 -1.83646669400329E+0001 -1.83688596968901E+0001 -1.83730529506464E+0001 -1.83772467013475E+0001 +-1.83814409490395E+0001 -1.83856356937682E+0001 -1.83898309355794E+0001 -1.83940266745191E+0001 -1.83982229106331E+0001 +-1.84024196439671E+0001 -1.84066168745669E+0001 -1.84108146024782E+0001 -1.84150128277468E+0001 -1.84192115504183E+0001 +-1.84234107705385E+0001 -1.84276104881529E+0001 -1.84318107033072E+0001 -1.84360114160470E+0001 -1.84402126264178E+0001 +-1.84444143344652E+0001 -1.84486165402347E+0001 -1.84528192437717E+0001 -1.84570224451219E+0001 -1.84612261443305E+0001 +-1.84654303414430E+0001 -1.84696350365049E+0001 -1.84738402295614E+0001 -1.84780459206580E+0001 -1.84822521098399E+0001 +-1.84864587971524E+0001 -1.84906659826409E+0001 -1.84948736663505E+0001 -1.84990818483265E+0001 -1.85032905286140E+0001 +-1.85074997072583E+0001 -1.85117093843045E+0001 -1.85159195597978E+0001 -1.85201302337831E+0001 -1.85243414063056E+0001 +-1.85285530774104E+0001 -1.85327652471425E+0001 -1.85369779155468E+0001 -1.85411910826683E+0001 -1.85454047485520E+0001 +-1.85496189132429E+0001 -1.85538335767858E+0001 -1.85580487392256E+0001 -1.85622644006072E+0001 -1.85664805609753E+0001 +-1.85706972203749E+0001 -1.85749143788506E+0001 -1.85791320364473E+0001 -1.85833501932096E+0001 -1.85875688491823E+0001 +-1.85917880044101E+0001 -1.85960076589377E+0001 -1.86002278128095E+0001 -1.86044484660704E+0001 -1.86086696187648E+0001 +-1.86128912709374E+0001 -1.86171134226326E+0001 -1.86213360738950E+0001 -1.86255592247691E+0001 -1.86297828752994E+0001 +-1.86340070255302E+0001 -1.86382316755061E+0001 -1.86424568252714E+0001 -1.86466824748704E+0001 -1.86509086243476E+0001 +-1.86551352737473E+0001 -1.86593624231137E+0001 -1.86635900724911E+0001 -1.86678182219238E+0001 -1.86720468714561E+0001 +-1.86762760211321E+0001 -1.86805056709959E+0001 -1.86847358210919E+0001 -1.86889664714640E+0001 -1.86931976221565E+0001 +-1.86974292732133E+0001 -1.87016614246787E+0001 -1.87058940765965E+0001 -1.87101272290108E+0001 -1.87143608819656E+0001 +-1.87185950355050E+0001 -1.87228296896727E+0001 -1.87270648445128E+0001 -1.87313005000691E+0001 -1.87355366563855E+0001 +-1.87397733135059E+0001 -1.87440104714741E+0001 -1.87482481303339E+0001 -1.87524862901291E+0001 -1.87567249509034E+0001 +-1.87609641127005E+0001 -1.87652037755643E+0001 -1.87694439395383E+0001 -1.87736846046662E+0001 -1.87779257709917E+0001 +-1.87821674385584E+0001 -1.87864096074098E+0001 -1.87906522775896E+0001 -1.87948954491413E+0001 -1.87991391221084E+0001 +-1.88033832965344E+0001 -1.88076279724628E+0001 -1.88118731499371E+0001 -1.88161188290006E+0001 -1.88203650096968E+0001 +-1.88246116920690E+0001 -1.88288588761607E+0001 -1.88331065620152E+0001 -1.88373547496757E+0001 -1.88416034391856E+0001 +-1.88458526305881E+0001 -1.88501023239265E+0001 -1.88543525192440E+0001 -1.88586032165838E+0001 -1.88628544159891E+0001 +-1.88671061175030E+0001 -1.88713583211686E+0001 -1.88756110270291E+0001 -1.88798642351276E+0001 -1.88841179455071E+0001 +-1.88883721582106E+0001 -1.88926268732812E+0001 -1.88968820907618E+0001 -1.89011378106955E+0001 -1.89053940331251E+0001 +-1.89096507580936E+0001 -1.89139079856439E+0001 -1.89181657158189E+0001 -1.89224239486614E+0001 -1.89266826842142E+0001 +-1.89309419225203E+0001 -1.89352016636222E+0001 -1.89394619075629E+0001 -1.89437226543851E+0001 -1.89479839041314E+0001 +-1.89522456568446E+0001 -1.89565079125673E+0001 -1.89607706713423E+0001 -1.89650339332120E+0001 -1.89692976982192E+0001 +-1.89735619664064E+0001 -1.89778267378162E+0001 -1.89820920124911E+0001 -1.89863577904736E+0001 -1.89906240718062E+0001 +-1.89948908565314E+0001 -1.89991581446917E+0001 -1.90034259363294E+0001 -1.90076942314869E+0001 -1.90119630302067E+0001 +-1.90162323325312E+0001 -1.90205021385025E+0001 -1.90247724481631E+0001 -1.90290432615552E+0001 -1.90333145787211E+0001 +-1.90375863997031E+0001 -1.90418587245434E+0001 -1.90461315532841E+0001 -1.90504048859675E+0001 -1.90546787226357E+0001 +-1.90589530633309E+0001 -1.90632279080951E+0001 -1.90675032569705E+0001 -1.90717791099990E+0001 -1.90760554672229E+0001 +-1.90803323286840E+0001 -1.90846096944244E+0001 -1.90888875644861E+0001 -1.90931659389110E+0001 -1.90974448177410E+0001 +-1.91017242010181E+0001 -1.91060040887842E+0001 -1.91102844810811E+0001 -1.91145653779507E+0001 -1.91188467794348E+0001 +-1.91231286855752E+0001 -1.91274110964136E+0001 -1.91316940119919E+0001 -1.91359774323518E+0001 -1.91402613575350E+0001 +-1.91445457875831E+0001 -1.91488307225379E+0001 -1.91531161624410E+0001 -1.91574021073341E+0001 -1.91616885572586E+0001 +-1.91659755122563E+0001 -1.91702629723687E+0001 -1.91745509376373E+0001 -1.91788394081036E+0001 -1.91831283838091E+0001 +-1.91874178647954E+0001 -1.91917078511038E+0001 -1.91959983427758E+0001 -1.92002893398528E+0001 -1.92045808423762E+0001 +-1.92088728503873E+0001 -1.92131653639276E+0001 -1.92174583830382E+0001 -1.92217519077606E+0001 -1.92260459381359E+0001 +-1.92303404742055E+0001 -1.92346355160106E+0001 -1.92389310635924E+0001 -1.92432271169921E+0001 -1.92475236762508E+0001 +-1.92518207414098E+0001 -1.92561183125101E+0001 -1.92604163895929E+0001 -1.92647149726992E+0001 -1.92690140618701E+0001 +-1.92733136571466E+0001 -1.92776137585698E+0001 -1.92819143661806E+0001 -1.92862154800201E+0001 -1.92905171001292E+0001 +-1.92948192265487E+0001 -1.92991218593198E+0001 -1.93034249984831E+0001 -1.93077286440797E+0001 -1.93120327961503E+0001 +-1.93163374547358E+0001 -1.93206426198770E+0001 -1.93249482916147E+0001 -1.93292544699896E+0001 -1.93335611550425E+0001 +-1.93378683468141E+0001 -1.93421760453451E+0001 -1.93464842506761E+0001 -1.93507929628480E+0001 -1.93551021819011E+0001 +-1.93594119078763E+0001 -1.93637221408141E+0001 -1.93680328807550E+0001 -1.93723441277397E+0001 -1.93766558818086E+0001 +-1.93809681430023E+0001 -1.93852809113612E+0001 -1.93895941869258E+0001 -1.93939079697366E+0001 -1.93982222598339E+0001 +-1.94025370572583E+0001 -1.94068523620501E+0001 -1.94111681742496E+0001 -1.94154844938971E+0001 -1.94198013210331E+0001 +-1.94241186556978E+0001 -1.94284364979315E+0001 -1.94327548477744E+0001 -1.94370737052668E+0001 -1.94413930704489E+0001 +-1.94457129433610E+0001 -1.94500333240430E+0001 -1.94543542125353E+0001 -1.94586756088780E+0001 -1.94629975131112E+0001 +-1.94673199252749E+0001 -1.94716428454092E+0001 -1.94759662735543E+0001 -1.94802902097500E+0001 -1.94846146540365E+0001 +-1.94889396064537E+0001 -1.94932650670416E+0001 -1.94975910358402E+0001 -1.95019175128892E+0001 -1.95062444982288E+0001 +-1.95105719918987E+0001 -1.95148999939388E+0001 -1.95192285043890E+0001 -1.95235575232891E+0001 -1.95278870506789E+0001 +-1.95322170865981E+0001 -1.95365476310865E+0001 -1.95408786841840E+0001 -1.95452102459301E+0001 -1.95495423163646E+0001 +-1.95538748955272E+0001 -1.95582079834576E+0001 -1.95625415801953E+0001 -1.95668756857800E+0001 -1.95712103002513E+0001 +-1.95755454236488E+0001 -1.95798810560120E+0001 -1.95842171973804E+0001 -1.95885538477937E+0001 -1.95928910072912E+0001 +-1.95972286759125E+0001 -1.96015668536970E+0001 -1.96059055406841E+0001 -1.96102447369133E+0001 -1.96145844424240E+0001 +-1.96189246572555E+0001 -1.96232653814471E+0001 -1.96276066150383E+0001 -1.96319483580684E+0001 -1.96362906105765E+0001 +-1.96406333726021E+0001 -1.96449766441843E+0001 -1.96493204253625E+0001 -1.96536647161757E+0001 -1.96580095166632E+0001 +-1.96623548268642E+0001 -1.96667006468178E+0001 -1.96710469765632E+0001 -1.96753938161394E+0001 -1.96797411655856E+0001 +-1.96840890249409E+0001 -1.96884373942442E+0001 -1.96927862735347E+0001 -1.96971356628513E+0001 -1.97014855622330E+0001 +-1.97058359717188E+0001 -1.97101868913477E+0001 -1.97145383211585E+0001 -1.97188902611903E+0001 -1.97232427114819E+0001 +-1.97275956720721E+0001 -1.97319491429998E+0001 -1.97363031243039E+0001 -1.97406576160232E+0001 -1.97450126181964E+0001 +-1.97493681308624E+0001 -1.97537241540599E+0001 -1.97580806878275E+0001 -1.97624377322042E+0001 -1.97667952872284E+0001 +-1.97711533529390E+0001 -1.97755119293745E+0001 -1.97798710165737E+0001 -1.97842306145750E+0001 -1.97885907234172E+0001 +-1.97929513431388E+0001 -1.97973124737783E+0001 -1.98016741153743E+0001 -1.98060362679653E+0001 -1.98103989315898E+0001 +-1.98147621062863E+0001 -1.98191257920932E+0001 -1.98234899890490E+0001 -1.98278546971921E+0001 -1.98322199165610E+0001 +-1.98365856471939E+0001 -1.98409518891292E+0001 -1.98453186424053E+0001 -1.98496859070605E+0001 -1.98540536831332E+0001 +-1.98584219706615E+0001 -1.98627907696838E+0001 -1.98671600802383E+0001 -1.98715299023632E+0001 -1.98759002360967E+0001 +-1.98802710814771E+0001 -1.98846424385424E+0001 -1.98890143073309E+0001 -1.98933866878806E+0001 -1.98977595802298E+0001 +-1.99021329844163E+0001 -1.99065069004784E+0001 -1.99108813284541E+0001 -1.99152562683814E+0001 -1.99196317202983E+0001 +-1.99240076842428E+0001 -1.99283841602530E+0001 -1.99327611483666E+0001 -1.99371386486218E+0001 -1.99415166610563E+0001 +-1.99458951857082E+0001 -1.99502742226152E+0001 -1.99546537718152E+0001 -1.99590338333461E+0001 -1.99634144072457E+0001 +-1.99677954935518E+0001 -1.99721770923022E+0001 -1.99765592035346E+0001 -1.99809418272868E+0001 -1.99853249635964E+0001 +-1.99897086125013E+0001 -1.99940927740391E+0001 -1.99984774482475E+0001 -2.00028626351641E+0001 -2.00072483348265E+0001 +-2.00116345472723E+0001 -2.00160212725393E+0001 -2.00204085106648E+0001 -2.00247962616865E+0001 -2.00291845256419E+0001 +-2.00335733025686E+0001 -2.00379625925039E+0001 -2.00423523954855E+0001 -2.00467427115507E+0001 -2.00511335407370E+0001 +-2.00555248830818E+0001 -2.00599167386226E+0001 -2.00643091073967E+0001 -2.00687019894414E+0001 -2.00730953847941E+0001 +-2.00774892934922E+0001 -2.00818837155730E+0001 -2.00862786510737E+0001 -2.00906741000316E+0001 -2.00950700624840E+0001 +-2.00994665384681E+0001 -2.01038635280211E+0001 -2.01082610311802E+0001 -2.01126590479826E+0001 -2.01170575784654E+0001 +-2.01214566226659E+0001 -2.01258561806210E+0001 -2.01302562523680E+0001 -2.01346568379438E+0001 -2.01390579373857E+0001 +-2.01434595507305E+0001 -2.01478616780154E+0001 -2.01522643192773E+0001 -2.01566674745533E+0001 -2.01610711438803E+0001 +-2.01654753272952E+0001 -2.01698800248351E+0001 -2.01742852365368E+0001 -2.01786909624372E+0001 -2.01830972025732E+0001 +-2.01875039569817E+0001 -2.01919112256995E+0001 -2.01963190087634E+0001 -2.02007273062102E+0001 -2.02051361180768E+0001 +-2.02095454443999E+0001 -2.02139552852163E+0001 -2.02183656405626E+0001 -2.02227765104756E+0001 -2.02271878949920E+0001 +-2.02315997941485E+0001 -2.02360122079817E+0001 -2.02404251365283E+0001 -2.02448385798249E+0001 -2.02492525379080E+0001 +-2.02536670108144E+0001 -2.02580819985805E+0001 -2.02624975012430E+0001 -2.02669135188383E+0001 -2.02713300514029E+0001 +-2.02757470989734E+0001 -2.02801646615862E+0001 -2.02845827392778E+0001 -2.02890013320846E+0001 -2.02934204400430E+0001 +-2.02978400631895E+0001 -2.03022602015605E+0001 -2.03066808551923E+0001 -2.03111020241212E+0001 -2.03155237083836E+0001 +-2.03199459080158E+0001 -2.03243686230541E+0001 -2.03287918535348E+0001 -2.03332155994941E+0001 -2.03376398609684E+0001 +-2.03420646379937E+0001 -2.03464899306063E+0001 -2.03509157388424E+0001 -2.03553420627382E+0001 -2.03597689023299E+0001 +-2.03641962576534E+0001 -2.03686241287451E+0001 -2.03730525156409E+0001 -2.03774814183769E+0001 -2.03819108369893E+0001 +-2.03863407715140E+0001 -2.03907712219871E+0001 -2.03952021884446E+0001 -2.03996336709225E+0001 -2.04040656694568E+0001 +-2.04084981840833E+0001 -2.04129312148381E+0001 -2.04173647617571E+0001 -2.04217988248761E+0001 -2.04262334042311E+0001 +-2.04306684998579E+0001 -2.04351041117924E+0001 -2.04395402400704E+0001 -2.04439768847277E+0001 -2.04484140458001E+0001 +-2.04528517233233E+0001 -2.04572899173333E+0001 -2.04617286278656E+0001 -2.04661678549560E+0001 -2.04706075986402E+0001 +-2.04750478589540E+0001 -2.04794886359329E+0001 -2.04839299296127E+0001 -2.04883717400289E+0001 -2.04928140672172E+0001 +-2.04972569112132E+0001 -2.05017002720525E+0001 -2.05061441497706E+0001 -2.05105885444031E+0001 -2.05150334559856E+0001 +-2.05194788845534E+0001 -2.05239248301422E+0001 -2.05283712927874E+0001 -2.05328182725245E+0001 -2.05372657693889E+0001 +-2.05417137834160E+0001 -2.05461623146412E+0001 -2.05506113631000E+0001 -2.05550609288277E+0001 -2.05595110118597E+0001 +-2.05639616122313E+0001 -2.05684127299778E+0001 -2.05728643651345E+0001 -2.05773165177368E+0001 -2.05817691878198E+0001 +-2.05862223754189E+0001 -2.05906760805693E+0001 -2.05951303033061E+0001 -2.05995850436647E+0001 -2.06040403016801E+0001 +-2.06084960773876E+0001 -2.06129523708222E+0001 -2.06174091820192E+0001 -2.06218665110136E+0001 -2.06263243578406E+0001 +-2.06307827225351E+0001 -2.06352416051323E+0001 -2.06397010056673E+0001 -2.06441609241749E+0001 -2.06486213606904E+0001 +-2.06530823152486E+0001 -2.06575437878845E+0001 -2.06620057786331E+0001 -2.06664682875293E+0001 -2.06709313146081E+0001 +-2.06753948599043E+0001 -2.06798589234529E+0001 -2.06843235052887E+0001 -2.06887886054465E+0001 -2.06932542239613E+0001 +-2.06977203608679E+0001 -2.07021870162010E+0001 -2.07066541899954E+0001 -2.07111218822859E+0001 -2.07155900931073E+0001 +-2.07200588224943E+0001 -2.07245280704816E+0001 -2.07289978371039E+0001 -2.07334681223959E+0001 -2.07379389263923E+0001 +-2.07424102491278E+0001 -2.07468820906369E+0001 -2.07513544509542E+0001 -2.07558273301145E+0001 -2.07603007281522E+0001 +-2.07647746451020E+0001 -2.07692490809984E+0001 -2.07737240358759E+0001 -2.07781995097690E+0001 -2.07826755027123E+0001 +-2.07871520147402E+0001 -2.07916290458872E+0001 -2.07961065961877E+0001 -2.08005846656763E+0001 -2.08050632543872E+0001 +-2.08095423623549E+0001 -2.08140219896138E+0001 -2.08185021361982E+0001 -2.08229828021425E+0001 -2.08274639874810E+0001 +-2.08319456922481E+0001 -2.08364279164781E+0001 -2.08409106602051E+0001 -2.08453939234636E+0001 -2.08498777062877E+0001 +-2.08543620087116E+0001 -2.08588468307697E+0001 -2.08633321724960E+0001 -2.08678180339248E+0001 -2.08723044150903E+0001 +-2.08767913160266E+0001 -2.08812787367677E+0001 -2.08857666773479E+0001 -2.08902551378013E+0001 -2.08947441181619E+0001 +-2.08992336184637E+0001 -2.09037236387409E+0001 -2.09082141790275E+0001 -2.09127052393575E+0001 -2.09171968197649E+0001 +-2.09216889202836E+0001 -2.09261815409478E+0001 -2.09306746817912E+0001 -2.09351683428478E+0001 -2.09396625241516E+0001 +-2.09441572257364E+0001 -2.09486524476362E+0001 -2.09531481898848E+0001 -2.09576444525161E+0001 -2.09621412355639E+0001 +-2.09666385390620E+0001 -2.09711363630442E+0001 -2.09756347075443E+0001 -2.09801335725962E+0001 -2.09846329582334E+0001 +-2.09891328644899E+0001 -2.09936332913992E+0001 -2.09981342389952E+0001 -2.10026357073114E+0001 -2.10071376963817E+0001 +-2.10116402062395E+0001 -2.10161432369187E+0001 -2.10206467884527E+0001 -2.10251508608752E+0001 -2.10296554542199E+0001 +-2.10341605685202E+0001 -2.10386662038097E+0001 -2.10431723601220E+0001 -2.10476790374907E+0001 -2.10521862359491E+0001 +-2.10566939555309E+0001 -2.10612021962694E+0001 -2.10657109581983E+0001 -2.10702202413508E+0001 -2.10747300457604E+0001 +-2.10792403714606E+0001 -2.10837512184848E+0001 -2.10882625868663E+0001 -2.10927744766385E+0001 -2.10972868878347E+0001 +-2.11017998204883E+0001 -2.11063132746326E+0001 -2.11108272503010E+0001 -2.11153417475266E+0001 -2.11198567663428E+0001 +-2.11243723067828E+0001 -2.11288883688798E+0001 -2.11334049526672E+0001 -2.11379220581780E+0001 -2.11424396854455E+0001 +-2.11469578345029E+0001 -2.11514765053832E+0001 -2.11559956981197E+0001 -2.11605154127455E+0001 -2.11650356492937E+0001 +-2.11695564077974E+0001 -2.11740776882897E+0001 -2.11785994908035E+0001 -2.11831218153721E+0001 -2.11876446620284E+0001 +-2.11921680308054E+0001 -2.11966919217361E+0001 -2.12012163348535E+0001 -2.12057412701907E+0001 -2.12102667277804E+0001 +-2.12147927076557E+0001 -2.12193192098496E+0001 -2.12238462343948E+0001 -2.12283737813243E+0001 -2.12329018506710E+0001 +-2.12374304424677E+0001 -2.12419595567472E+0001 -2.12464891935425E+0001 -2.12510193528862E+0001 -2.12555500348113E+0001 +-2.12600812393504E+0001 -2.12646129665364E+0001 -2.12691452164020E+0001 -2.12736779889799E+0001 -2.12782112843028E+0001 +-2.12827451024035E+0001 -2.12872794433146E+0001 -2.12918143070689E+0001 -2.12963496936988E+0001 -2.13008856032372E+0001 +-2.13054220357166E+0001 -2.13099589911697E+0001 -2.13144964696289E+0001 -2.13190344711270E+0001 -2.13235729956964E+0001 +-2.13281120433698E+0001 -2.13326516141796E+0001 -2.13371917081583E+0001 -2.13417323253385E+0001 -2.13462734657526E+0001 +-2.13508151294332E+0001 -2.13553573164126E+0001 -2.13599000267233E+0001 -2.13644432603977E+0001 -2.13689870174683E+0001 +-2.13735312979674E+0001 -2.13780761019273E+0001 -2.13826214293806E+0001 -2.13871672803595E+0001 -2.13917136548963E+0001 +-2.13962605530233E+0001 -2.14008079747729E+0001 -2.14053559201773E+0001 -2.14099043892689E+0001 -2.14144533820798E+0001 +-2.14190028986423E+0001 -2.14235529389886E+0001 -2.14281035031510E+0001 -2.14326545911616E+0001 -2.14372062030526E+0001 +-2.14417583388561E+0001 -2.14463109986044E+0001 -2.14508641823294E+0001 -2.14554178900635E+0001 -2.14599721218386E+0001 +-2.14645268776869E+0001 -2.14690821576403E+0001 -2.14736379617311E+0001 -2.14781942899911E+0001 -2.14827511424525E+0001 +-2.14873085191472E+0001 -2.14918664201073E+0001 -2.14964248453647E+0001 -2.15009837949513E+0001 -2.15055432688993E+0001 +-2.15101032672403E+0001 -2.15146637900065E+0001 -2.15192248372297E+0001 -2.15237864089417E+0001 -2.15283485051745E+0001 +-2.15329111259600E+0001 -2.15374742713298E+0001 -2.15420379413160E+0001 -2.15466021359503E+0001 -2.15511668552645E+0001 +-2.15557320992903E+0001 -2.15602978680597E+0001 -2.15648641616042E+0001 -2.15694309799557E+0001 -2.15739983231458E+0001 +-2.15785661912064E+0001 -2.15831345841690E+0001 -2.15877035020654E+0001 -2.15922729449272E+0001 -2.15968429127860E+0001 +-2.16014134056736E+0001 -2.16059844236215E+0001 -2.16105559666613E+0001 -2.16151280348247E+0001 -2.16197006281431E+0001 +-2.16242737466482E+0001 -2.16288473903715E+0001 -2.16334215593445E+0001 -2.16379962535988E+0001 -2.16425714731658E+0001 +-2.16471472180770E+0001 -2.16517234883640E+0001 -2.16563002840581E+0001 -2.16608776051908E+0001 -2.16654554517936E+0001 +-2.16700338238978E+0001 -2.16746127215348E+0001 -2.16791921447361E+0001 -2.16837720935329E+0001 -2.16883525679567E+0001 +-2.16929335680388E+0001 -2.16975150938104E+0001 -2.17020971453030E+0001 -2.17066797225478E+0001 -2.17112628255761E+0001 +-2.17158464544192E+0001 -2.17204306091082E+0001 -2.17250152896745E+0001 -2.17296004961493E+0001 -2.17341862285637E+0001 +-2.17387724869490E+0001 -2.17433592713363E+0001 -2.17479465817569E+0001 -2.17525344182417E+0001 -2.17571227808221E+0001 +-2.17617116695291E+0001 -2.17663010843937E+0001 -2.17708910254472E+0001 -2.17754814927206E+0001 -2.17800724862448E+0001 +-2.17846640060511E+0001 -2.17892560521704E+0001 -2.17938486246337E+0001 -2.17984417234720E+0001 -2.18030353487163E+0001 +-2.18076295003977E+0001 -2.18122241785470E+0001 -2.18168193831952E+0001 -2.18214151143732E+0001 -2.18260113721120E+0001 +-2.18306081564424E+0001 -2.18352054673954E+0001 -2.18398033050018E+0001 -2.18444016692924E+0001 -2.18490005602982E+0001 +-2.18535999780499E+0001 -2.18581999225783E+0001 -2.18628003939143E+0001 -2.18674013920887E+0001 -2.18720029171321E+0001 +-2.18766049690755E+0001 -2.18812075479495E+0001 -2.18858106537848E+0001 -2.18904142866122E+0001 -2.18950184464623E+0001 +-2.18996231333659E+0001 -2.19042283473536E+0001 -2.19088340884561E+0001 -2.19134403567040E+0001 -2.19180471521280E+0001 +-2.19226544747587E+0001 -2.19272623246266E+0001 -2.19318707017624E+0001 -2.19364796061966E+0001 -2.19410890379598E+0001 +-2.19456989970825E+0001 -2.19503094835953E+0001 -2.19549204975287E+0001 -2.19595320389132E+0001 -2.19641441077792E+0001 +-2.19687567041573E+0001 -2.19733698280778E+0001 -2.19779834795714E+0001 -2.19825976586683E+0001 -2.19872123653990E+0001 +-2.19918275997939E+0001 -2.19964433618833E+0001 -2.20010596516978E+0001 -2.20056764692675E+0001 -2.20102938146230E+0001 +-2.20149116877944E+0001 -2.20195300888122E+0001 -2.20241490177066E+0001 -2.20287684745079E+0001 -2.20333884592464E+0001 +-2.20380089719523E+0001 -2.20426300126559E+0001 -2.20472515813875E+0001 -2.20518736781773E+0001 -2.20564963030554E+0001 +-2.20611194560520E+0001 -2.20657431371974E+0001 -2.20703673465217E+0001 -2.20749920840551E+0001 -2.20796173498276E+0001 +-2.20842431438695E+0001 -2.20888694662107E+0001 -2.20934963168815E+0001 -2.20981236959119E+0001 -2.21027516033319E+0001 +-2.21073800391717E+0001 -2.21120090034612E+0001 -2.21166384962305E+0001 -2.21212685175096E+0001 -2.21258990673285E+0001 +-2.21305301457171E+0001 -2.21351617527055E+0001 -2.21397938883236E+0001 -2.21444265526014E+0001 -2.21490597455687E+0001 +-2.21536934672555E+0001 -2.21583277176917E+0001 -2.21629624969072E+0001 -2.21675978049319E+0001 -2.21722336417955E+0001 +-2.21768700075280E+0001 -2.21815069021592E+0001 -2.21861443257189E+0001 -2.21907822782370E+0001 -2.21954207597431E+0001 +-2.22000597702671E+0001 -2.22046993098388E+0001 -2.22093393784879E+0001 -2.22139799762441E+0001 -2.22186211031372E+0001 +-2.22232627591968E+0001 -2.22279049444527E+0001 -2.22325476589346E+0001 -2.22371909026721E+0001 -2.22418346756948E+0001 +-2.22464789780325E+0001 -2.22511238097147E+0001 -2.22557691707711E+0001 -2.22604150612312E+0001 -2.22650614811246E+0001 +-2.22697084304810E+0001 -2.22743559093299E+0001 -2.22790039177008E+0001 -2.22836524556232E+0001 -2.22883015231267E+0001 +-2.22929511202408E+0001 -2.22976012469950E+0001 -2.23022519034187E+0001 -2.23069030895415E+0001 -2.23115548053927E+0001 +-2.23162070510018E+0001 -2.23208598263983E+0001 -2.23255131316115E+0001 -2.23301669666708E+0001 -2.23348213316057E+0001 +-2.23394762264455E+0001 -2.23441316512195E+0001 -2.23487876059571E+0001 -2.23534440906877E+0001 -2.23581011054405E+0001 +-2.23627586502449E+0001 -2.23674167251301E+0001 -2.23720753301255E+0001 -2.23767344652602E+0001 -2.23813941305635E+0001 +-2.23860543260648E+0001 -2.23907150517931E+0001 -2.23953763077778E+0001 -2.24000380940479E+0001 -2.24047004106328E+0001 +-2.24093632575615E+0001 -2.24140266348632E+0001 -2.24186905425671E+0001 -2.24233549807022E+0001 -2.24280199492978E+0001 +-2.24326854483829E+0001 -2.24373514779866E+0001 -2.24420180381380E+0001 -2.24466851288662E+0001 -2.24513527502001E+0001 +-2.24560209021689E+0001 -2.24606895848015E+0001 -2.24653587981271E+0001 -2.24700285421745E+0001 -2.24746988169727E+0001 +-2.24793696225508E+0001 -2.24840409589377E+0001 -2.24887128261623E+0001 -2.24933852242536E+0001 -2.24980581532404E+0001 +-2.25027316131518E+0001 -2.25074056040166E+0001 -2.25120801258636E+0001 -2.25167551787217E+0001 -2.25214307626199E+0001 +-2.25261068775869E+0001 -2.25307835236515E+0001 -2.25354607008426E+0001 -2.25401384091890E+0001 -2.25448166487194E+0001 +-2.25494954194627E+0001 -2.25541747214476E+0001 -2.25588545547028E+0001 -2.25635349192572E+0001 -2.25682158151393E+0001 +-2.25728972423779E+0001 -2.25775792010018E+0001 -2.25822616910396E+0001 -2.25869447125199E+0001 -2.25916282654715E+0001 +-2.25963123499230E+0001 -2.26009969659030E+0001 -2.26056821134401E+0001 -2.26103677925629E+0001 -2.26150540033001E+0001 +-2.26197407456801E+0001 -2.26244280197317E+0001 -2.26291158254833E+0001 -2.26338041629635E+0001 -2.26384930322007E+0001 +-2.26431824332236E+0001 -2.26478723660607E+0001 -2.26525628307403E+0001 -2.26572538272910E+0001 -2.26619453557413E+0001 +-2.26666374161196E+0001 -2.26713300084543E+0001 -2.26760231327740E+0001 -2.26807167891069E+0001 -2.26854109774815E+0001 +-2.26901056979261E+0001 -2.26948009504693E+0001 -2.26994967351392E+0001 -2.27041930519643E+0001 -2.27088899009729E+0001 +-2.27135872821933E+0001 -2.27182851956539E+0001 -2.27229836413829E+0001 -2.27276826194086E+0001 -2.27323821297593E+0001 +-2.27370821724632E+0001 -2.27417827475487E+0001 -2.27464838550439E+0001 -2.27511854949770E+0001 -2.27558876673763E+0001 +-2.27605903722700E+0001 -2.27652936096862E+0001 -2.27699973796531E+0001 -2.27747016821990E+0001 -2.27794065173518E+0001 +-2.27841118851398E+0001 -2.27888177855910E+0001 -2.27935242187337E+0001 -2.27982311845958E+0001 -2.28029386832055E+0001 +-2.28076467145909E+0001 -2.28123552787799E+0001 -2.28170643758006E+0001 -2.28217740056811E+0001 -2.28264841684495E+0001 +-2.28311948641336E+0001 -2.28359060927615E+0001 -2.28406178543611E+0001 -2.28453301489605E+0001 -2.28500429765877E+0001 +-2.28547563372704E+0001 -2.28594702310367E+0001 -2.28641846579146E+0001 -2.28688996179318E+0001 -2.28736151111163E+0001 +-2.28783311374960E+0001 -2.28830476970988E+0001 -2.28877647899524E+0001 -2.28924824160849E+0001 -2.28972005755239E+0001 +-2.29019192682973E+0001 -2.29066384944329E+0001 -2.29113582539585E+0001 -2.29160785469019E+0001 -2.29207993732908E+0001 +-2.29255207331531E+0001 -2.29302426265165E+0001 -2.29349650534086E+0001 -2.29396880138572E+0001 -2.29444115078901E+0001 +-2.29491355355349E+0001 -2.29538600968193E+0001 -2.29585851917709E+0001 -2.29633108204175E+0001 -2.29680369827867E+0001 +-2.29727636789061E+0001 -2.29774909088033E+0001 -2.29822186725059E+0001 -2.29869469700416E+0001 -2.29916758014379E+0001 +-2.29964051667224E+0001 -2.30011350659227E+0001 -2.30058654990663E+0001 -2.30105964661807E+0001 -2.30153279672935E+0001 +-2.30200600024321E+0001 -2.30247925716241E+0001 -2.30295256748970E+0001 -2.30342593122783E+0001 -2.30389934837953E+0001 +-2.30437281894755E+0001 -2.30484634293465E+0001 -2.30531992034355E+0001 -2.30579355117701E+0001 -2.30626723543776E+0001 +-2.30674097312854E+0001 -2.30721476425209E+0001 -2.30768860881115E+0001 -2.30816250680844E+0001 -2.30863645824672E+0001 +-2.30911046312869E+0001 -2.30958452145711E+0001 -2.31005863323470E+0001 -2.31053279846419E+0001 -2.31100701714830E+0001 +-2.31148128928976E+0001 -2.31195561489131E+0001 -2.31242999395566E+0001 -2.31290442648553E+0001 -2.31337891248365E+0001 +-2.31385345195275E+0001 -2.31432804489553E+0001 -2.31480269131471E+0001 -2.31527739121303E+0001 -2.31575214459318E+0001 +-2.31622695145788E+0001 -2.31670181180986E+0001 -2.31717672565181E+0001 -2.31765169298646E+0001 -2.31812671381650E+0001 +-2.31860178814466E+0001 -2.31907691597363E+0001 -2.31955209730613E+0001 -2.32002733214486E+0001 -2.32050262049252E+0001 +-2.32097796235181E+0001 -2.32145335772544E+0001 -2.32192880661611E+0001 -2.32240430902652E+0001 -2.32287986495936E+0001 +-2.32335547441733E+0001 -2.32383113740313E+0001 -2.32430685391945E+0001 -2.32478262396898E+0001 -2.32525844755442E+0001 +-2.32573432467845E+0001 -2.32621025534378E+0001 -2.32668623955307E+0001 -2.32716227730903E+0001 -2.32763836861434E+0001 +-2.32811451347168E+0001 -2.32859071188374E+0001 -2.32906696385319E+0001 -2.32954326938273E+0001 -2.33001962847503E+0001 +-2.33049604113277E+0001 -2.33097250735862E+0001 -2.33144902715527E+0001 -2.33192560052539E+0001 -2.33240222747165E+0001 +-2.33287890799673E+0001 -2.33335564210330E+0001 -2.33383242979402E+0001 -2.33430927107158E+0001 -2.33478616593863E+0001 +-2.33526311439785E+0001 -2.33574011645189E+0001 -2.33621717210343E+0001 -2.33669428135513E+0001 -2.33717144420966E+0001 +-2.33764866066966E+0001 -2.33812593073781E+0001 -2.33860325441676E+0001 -2.33908063170917E+0001 -2.33955806261769E+0001 +-2.34003554714499E+0001 -2.34051308529371E+0001 -2.34099067706651E+0001 -2.34146832246604E+0001 -2.34194602149496E+0001 +-2.34242377415591E+0001 -2.34290158045153E+0001 -2.34337944038449E+0001 -2.34385735395742E+0001 -2.34433532117296E+0001 +-2.34481334203377E+0001 -2.34529141654249E+0001 -2.34576954470175E+0001 -2.34624772651419E+0001 -2.34672596198247E+0001 +-2.34720425110921E+0001 -2.34768259389705E+0001 -2.34816099034863E+0001 -2.34863944046658E+0001 -2.34911794425353E+0001 +-2.34959650171212E+0001 -2.35007511284498E+0001 -2.35055377765474E+0001 -2.35103249614403E+0001 -2.35151126831547E+0001 +-2.35199009417170E+0001 -2.35246897371533E+0001 -2.35294790694899E+0001 -2.35342689387531E+0001 -2.35390593449691E+0001 +-2.35438502881640E+0001 -2.35486417683641E+0001 -2.35534337855955E+0001 -2.35582263398845E+0001 -2.35630194312571E+0001 +-2.35678130597397E+0001 -2.35726072253581E+0001 -2.35774019281387E+0001 -2.35821971681076E+0001 -2.35869929452907E+0001 +-2.35917892597143E+0001 -2.35965861114044E+0001 -2.36013835003871E+0001 -2.36061814266885E+0001 -2.36109798903345E+0001 +-2.36157788913512E+0001 -2.36205784297647E+0001 -2.36253785056010E+0001 -2.36301791188860E+0001 -2.36349802696458E+0001 +-2.36397819579064E+0001 -2.36445841836936E+0001 -2.36493869470336E+0001 -2.36541902479521E+0001 -2.36589940864752E+0001 +-2.36637984626288E+0001 -2.36686033764388E+0001 -2.36734088279311E+0001 -2.36782148171315E+0001 -2.36830213440660E+0001 +-2.36878284087605E+0001 -2.36926360112407E+0001 -2.36974441515326E+0001 -2.37022528296619E+0001 -2.37070620456545E+0001 +-2.37118717995363E+0001 -2.37166820913329E+0001 -2.37214929210702E+0001 -2.37263042887740E+0001 -2.37311161944700E+0001 +-2.37359286381840E+0001 -2.37407416199418E+0001 -2.37455551397690E+0001 -2.37503691976914E+0001 -2.37551837937348E+0001 +-2.37599989279247E+0001 -2.37648146002869E+0001 -2.37696308108471E+0001 -2.37744475596309E+0001 -2.37792648466641E+0001 +-2.37840826719721E+0001 -2.37889010355808E+0001 -2.37937199375156E+0001 -2.37985393778022E+0001 -2.38033593564663E+0001 +-2.38081798735333E+0001 -2.38130009290289E+0001 -2.38178225229787E+0001 -2.38226446554081E+0001 -2.38274673263428E+0001 +-2.38322905358083E+0001 -2.38371142838300E+0001 -2.38419385704336E+0001 -2.38467633956444E+0001 -2.38515887594881E+0001 +-2.38564146619901E+0001 -2.38612411031758E+0001 -2.38660680830706E+0001 -2.38708956017002E+0001 -2.38757236590898E+0001 +-2.38805522552649E+0001 -2.38853813902510E+0001 -2.38902110640733E+0001 -2.38950412767574E+0001 -2.38998720283286E+0001 +-2.39047033188122E+0001 -2.39095351482337E+0001 -2.39143675166183E+0001 -2.39192004239914E+0001 -2.39240338703783E+0001 +-2.39288678558044E+0001 -2.39337023802949E+0001 -2.39385374438752E+0001 -2.39433730465705E+0001 -2.39482091884061E+0001 +-2.39530458694072E+0001 -2.39578830895991E+0001 -2.39627208490071E+0001 -2.39675591476563E+0001 -2.39723979855720E+0001 +-2.39772373627794E+0001 -2.39820772793036E+0001 -2.39869177351700E+0001 -2.39917587304035E+0001 -2.39966002650295E+0001 +-2.40014423390730E+0001 -2.40062849525592E+0001 -2.40111281055133E+0001 -2.40159717979603E+0001 -2.40208160299253E+0001 +-2.40256608014335E+0001 -2.40305061125099E+0001 -2.40353519631796E+0001 -2.40401983534677E+0001 -2.40450452833992E+0001 +-2.40498927529992E+0001 -2.40547407622927E+0001 -2.40595893113048E+0001 -2.40644384000604E+0001 -2.40692880285845E+0001 +-2.40741381969021E+0001 -2.40789889050383E+0001 -2.40838401530179E+0001 -2.40886919408660E+0001 -2.40935442686075E+0001 +-2.40983971362673E+0001 -2.41032505438703E+0001 -2.41081044914415E+0001 -2.41129589790058E+0001 -2.41178140065880E+0001 +-2.41226695742131E+0001 -2.41275256819059E+0001 -2.41323823296913E+0001 -2.41372395175941E+0001 -2.41420972456392E+0001 +-2.41469555138514E+0001 -2.41518143222555E+0001 -2.41566736708763E+0001 -2.41615335597387E+0001 -2.41663939888674E+0001 +-2.41712549582871E+0001 -2.41761164680228E+0001 -2.41809785180990E+0001 -2.41858411085407E+0001 -2.41907042393724E+0001 +-2.41955679106189E+0001 -2.42004321223050E+0001 -2.42052968744554E+0001 -2.42101621670946E+0001 -2.42150280002475E+0001 +-2.42198943739386E+0001 -2.42247612881927E+0001 -2.42296287430344E+0001 -2.42344967384884E+0001 -2.42393652745792E+0001 +-2.42442343513315E+0001 -2.42491039687699E+0001 -2.42539741269190E+0001 -2.42588448258034E+0001 -2.42637160654476E+0001 +-2.42685878458763E+0001 -2.42734601671139E+0001 -2.42783330291851E+0001 -2.42832064321143E+0001 -2.42880803759261E+0001 +-2.42929548606451E+0001 -2.42978298862956E+0001 -2.43027054529023E+0001 -2.43075815604895E+0001 -2.43124582090818E+0001 +-2.43173353987036E+0001 -2.43222131293793E+0001 -2.43270914011335E+0001 -2.43319702139906E+0001 -2.43368495679749E+0001 +-2.43417294631109E+0001 -2.43466098994229E+0001 -2.43514908769355E+0001 -2.43563723956729E+0001 -2.43612544556595E+0001 +-2.43661370569196E+0001 -2.43710201994777E+0001 -2.43759038833581E+0001 -2.43807881085851E+0001 -2.43856728751829E+0001 +-2.43905581831760E+0001 -2.43954440325886E+0001 -2.44003304234450E+0001 -2.44052173557695E+0001 -2.44101048295863E+0001 +-2.44149928449197E+0001 -2.44198814017940E+0001 -2.44247705002333E+0001 -2.44296601402620E+0001 -2.44345503219042E+0001 +-2.44394410451841E+0001 -2.44443323101259E+0001 -2.44492241167538E+0001 -2.44541164650920E+0001 -2.44590093551646E+0001 +-2.44639027869958E+0001 -2.44687967606098E+0001 -2.44736912760306E+0001 -2.44785863332825E+0001 -2.44834819323894E+0001 +-2.44883780733756E+0001 -2.44932747562650E+0001 -2.44981719810818E+0001 -2.45030697478501E+0001 -2.45079680565939E+0001 +-2.45128669073373E+0001 -2.45177663001043E+0001 -2.45226662349189E+0001 -2.45275667118052E+0001 -2.45324677307872E+0001 +-2.45373692918888E+0001 -2.45422713951341E+0001 -2.45471740405471E+0001 -2.45520772281517E+0001 -2.45569809579718E+0001 +-2.45618852300315E+0001 -2.45667900443547E+0001 -2.45716954009652E+0001 -2.45766012998871E+0001 -2.45815077411442E+0001 +-2.45864147247604E+0001 -2.45913222507597E+0001 -2.45962303191658E+0001 -2.46011389300028E+0001 -2.46060480832943E+0001 +-2.46109577790644E+0001 -2.46158680173367E+0001 -2.46207787981352E+0001 -2.46256901214837E+0001 -2.46306019874060E+0001 +-2.46355143959258E+0001 -2.46404273470670E+0001 -2.46453408408534E+0001 -2.46502548773087E+0001 -2.46551694564566E+0001 +-2.46600845783210E+0001 -2.46650002429255E+0001 -2.46699164502940E+0001 -2.46748332004501E+0001 -2.46797504934175E+0001 +-2.46846683292199E+0001 -2.46895867078810E+0001 -2.46945056294246E+0001 -2.46994250938742E+0001 -2.47043451012535E+0001 +-2.47092656515862E+0001 -2.47141867448960E+0001 -2.47191083812064E+0001 -2.47240305605410E+0001 -2.47289532829236E+0001 +-2.47338765483776E+0001 -2.47388003569267E+0001 -2.47437247085945E+0001 -2.47486496034044E+0001 -2.47535750413802E+0001 +-2.47585010225453E+0001 -2.47634275469233E+0001 -2.47683546145377E+0001 -2.47732822254121E+0001 -2.47782103795699E+0001 +-2.47831390770346E+0001 -2.47880683178298E+0001 -2.47929981019789E+0001 -2.47979284295054E+0001 -2.48028593004328E+0001 +-2.48077907147845E+0001 -2.48127226725839E+0001 -2.48176551738545E+0001 -2.48225882186198E+0001 -2.48275218069031E+0001 +-2.48324559387278E+0001 -2.48373906141173E+0001 -2.48423258330951E+0001 -2.48472615956844E+0001 -2.48521979019087E+0001 +-2.48571347517913E+0001 -2.48620721453556E+0001 -2.48670100826248E+0001 -2.48719485636224E+0001 -2.48768875883716E+0001 +-2.48818271568957E+0001 -2.48867672692181E+0001 -2.48917079253620E+0001 -2.48966491253507E+0001 -2.49015908692075E+0001 +-2.49065331569556E+0001 -2.49114759886183E+0001 -2.49164193642189E+0001 -2.49213632837804E+0001 -2.49263077473262E+0001 +-2.49312527548796E+0001 -2.49361983064635E+0001 -2.49411444021014E+0001 -2.49460910418163E+0001 -2.49510382256314E+0001 +-2.49559859535699E+0001 -2.49609342256550E+0001 -2.49658830419097E+0001 -2.49708324023572E+0001 -2.49757823070207E+0001 +-2.49807327559232E+0001 -2.49856837490879E+0001 -2.49906352865378E+0001 -2.49955873682960E+0001 -2.50005399943857E+0001 +-2.50054931648298E+0001 -2.50104468796515E+0001 -2.50154011388737E+0001 -2.50203559425196E+0001 -2.50253112906121E+0001 +-2.50302671831742E+0001 -2.50352236202290E+0001 -2.50401806017995E+0001 -2.50451381279086E+0001 -2.50500961985794E+0001 +-2.50550548138348E+0001 -2.50600139736977E+0001 -2.50649736781912E+0001 -2.50699339273381E+0001 -2.50748947211615E+0001 +-2.50798560596841E+0001 -2.50848179429290E+0001 -2.50897803709190E+0001 -2.50947433436770E+0001 -2.50997068612260E+0001 +-2.51046709235887E+0001 -2.51096355307881E+0001 -2.51146006828470E+0001 -2.51195663797882E+0001 -2.51245326216347E+0001 +-2.51294994084091E+0001 -2.51344667401345E+0001 -2.51394346168334E+0001 -2.51444030385288E+0001 -2.51493720052435E+0001 +-2.51543415170002E+0001 -2.51593115738217E+0001 -2.51642821757307E+0001 -2.51692533227501E+0001 -2.51742250149025E+0001 +-2.51791972522107E+0001 -2.51841700346974E+0001 -2.51891433623853E+0001 -2.51941172352972E+0001 -2.51990916534557E+0001 +-2.52040666168835E+0001 -2.52090421256033E+0001 -2.52140181796378E+0001 -2.52189947790096E+0001 -2.52239719237414E+0001 +-2.52289496138558E+0001 -2.52339278493754E+0001 -2.52389066303229E+0001 -2.52438859567209E+0001 -2.52488658285920E+0001 +-2.52538462459588E+0001 -2.52588272088438E+0001 -2.52638087172697E+0001 -2.52687907712589E+0001 -2.52737733708342E+0001 +-2.52787565160179E+0001 -2.52837402068327E+0001 -2.52887244433010E+0001 -2.52937092254455E+0001 -2.52986945532886E+0001 +-2.53036804268527E+0001 -2.53086668461605E+0001 -2.53136538112344E+0001 -2.53186413220968E+0001 -2.53236293787702E+0001 +-2.53286179812772E+0001 -2.53336071296400E+0001 -2.53385968238812E+0001 -2.53435870640232E+0001 -2.53485778500884E+0001 +-2.53535691820992E+0001 -2.53585610600780E+0001 -2.53635534840472E+0001 -2.53685464540292E+0001 -2.53735399700464E+0001 +-2.53785340321211E+0001 -2.53835286402757E+0001 -2.53885237945325E+0001 -2.53935194949138E+0001 -2.53985157414421E+0001 +-2.54035125341395E+0001 -2.54085098730284E+0001 -2.54135077581312E+0001 -2.54185061894700E+0001 -2.54235051670673E+0001 +-2.54285046909452E+0001 -2.54335047611259E+0001 -2.54385053776319E+0001 -2.54435065404853E+0001 -2.54485082497083E+0001 +-2.54535105053232E+0001 -2.54585133073522E+0001 -2.54635166558175E+0001 -2.54685205507413E+0001 -2.54735249921457E+0001 +-2.54785299800531E+0001 -2.54835355144855E+0001 -2.54885415954651E+0001 -2.54935482230140E+0001 -2.54985553971545E+0001 +-2.55035631179085E+0001 -2.55085713852984E+0001 -2.55135801993461E+0001 -2.55185895600739E+0001 -2.55235994675037E+0001 +-2.55286099216577E+0001 -2.55336209225579E+0001 -2.55386324702265E+0001 -2.55436445646855E+0001 -2.55486572059570E+0001 +-2.55536703940629E+0001 -2.55586841290254E+0001 -2.55636984108664E+0001 -2.55687132396080E+0001 -2.55737286152723E+0001 +-2.55787445378811E+0001 -2.55837610074564E+0001 -2.55887780240204E+0001 -2.55937955875949E+0001 -2.55988136982019E+0001 +-2.56038323558634E+0001 -2.56088515606012E+0001 -2.56138713124374E+0001 -2.56188916113939E+0001 -2.56239124574926E+0001 +-2.56289338507554E+0001 -2.56339557912042E+0001 -2.56389782788609E+0001 -2.56440013137474E+0001 -2.56490248958856E+0001 +-2.56540490252972E+0001 -2.56590737020043E+0001 -2.56640989260286E+0001 -2.56691246973920E+0001 -2.56741510161163E+0001 +-2.56791778822233E+0001 -2.56842052957349E+0001 -2.56892332566728E+0001 -2.56942617650589E+0001 -2.56992908209149E+0001 +-2.57043204242626E+0001 -2.57093505751238E+0001 -2.57143812735202E+0001 -2.57194125194736E+0001 -2.57244443130058E+0001 +-2.57294766541384E+0001 -2.57345095428932E+0001 -2.57395429792920E+0001 -2.57445769633563E+0001 -2.57496114951080E+0001 +-2.57546465745687E+0001 -2.57596822017601E+0001 -2.57647183767038E+0001 -2.57697550994216E+0001 -2.57747923699350E+0001 +-2.57798301882658E+0001 -2.57848685544355E+0001 -2.57899074684659E+0001 -2.57949469303784E+0001 -2.57999869401948E+0001 +-2.58050274979366E+0001 -2.58100686036254E+0001 -2.58151102572828E+0001 -2.58201524589304E+0001 -2.58251952085898E+0001 +-2.58302385062825E+0001 -2.58352823520300E+0001 -2.58403267458540E+0001 -2.58453716877758E+0001 -2.58504171778172E+0001 +-2.58554632159995E+0001 -2.58605098023443E+0001 -2.58655569368730E+0001 -2.58706046196073E+0001 -2.58756528505685E+0001 +-2.58807016297781E+0001 -2.58857509572576E+0001 -2.58908008330284E+0001 -2.58958512571121E+0001 -2.59009022295299E+0001 +-2.59059537503034E+0001 -2.59110058194540E+0001 -2.59160584370031E+0001 -2.59211116029720E+0001 -2.59261653173822E+0001 +-2.59312195802552E+0001 -2.59362743916121E+0001 -2.59413297514745E+0001 -2.59463856598636E+0001 -2.59514421168009E+0001 +-2.59564991223076E+0001 -2.59615566764051E+0001 -2.59666147791148E+0001 -2.59716734304579E+0001 -2.59767326304558E+0001 +-2.59817923791297E+0001 -2.59868526765009E+0001 -2.59919135225908E+0001 -2.59969749174206E+0001 -2.60020368610116E+0001 +-2.60070993533850E+0001 -2.60121623945620E+0001 -2.60172259845640E+0001 -2.60222901234121E+0001 -2.60273548111276E+0001 +-2.60324200477316E+0001 -2.60374858332455E+0001 -2.60425521676903E+0001 -2.60476190510873E+0001 -2.60526864834577E+0001 +-2.60577544648226E+0001 -2.60628229952032E+0001 -2.60678920746206E+0001 -2.60729617030961E+0001 -2.60780318806506E+0001 +-2.60831026073054E+0001 -2.60881738830816E+0001 -2.60932457080003E+0001 -2.60983180820826E+0001 -2.61033910053496E+0001 +-2.61084644778224E+0001 -2.61135384995220E+0001 -2.61186130704696E+0001 -2.61236881906861E+0001 -2.61287638601927E+0001 +-2.61338400790104E+0001 -2.61389168471603E+0001 -2.61439941646632E+0001 -2.61490720315404E+0001 -2.61541504478127E+0001 +-2.61592294135013E+0001 -2.61643089286270E+0001 -2.61693889932109E+0001 -2.61744696072739E+0001 -2.61795507708371E+0001 +-2.61846324839214E+0001 -2.61897147465476E+0001 -2.61947975587369E+0001 -2.61998809205101E+0001 -2.62049648318881E+0001 +-2.62100492928919E+0001 -2.62151343035423E+0001 -2.62202198638603E+0001 -2.62253059738668E+0001 -2.62303926335827E+0001 +-2.62354798430288E+0001 -2.62405676022260E+0001 -2.62456559111951E+0001 -2.62507447699571E+0001 -2.62558341785327E+0001 +-2.62609241369428E+0001 -2.62660146452083E+0001 -2.62711057033499E+0001 -2.62761973113885E+0001 -2.62812894693448E+0001 +-2.62863821772396E+0001 -2.62914754350938E+0001 -2.62965692429282E+0001 -2.63016636007634E+0001 -2.63067585086203E+0001 +-2.63118539665195E+0001 -2.63169499744819E+0001 -2.63220465325282E+0001 -2.63271436406792E+0001 -2.63322412989554E+0001 +-2.63373395073777E+0001 -2.63424382659667E+0001 -2.63475375747432E+0001 -2.63526374337278E+0001 -2.63577378429413E+0001 +-2.63628388024042E+0001 -2.63679403121373E+0001 -2.63730423721611E+0001 -2.63781449824964E+0001 -2.63832481431638E+0001 +-2.63883518541840E+0001 -2.63934561155774E+0001 -2.63985609273648E+0001 -2.64036662895668E+0001 -2.64087722022039E+0001 +-2.64138786652967E+0001 -2.64189856788659E+0001 -2.64240932429320E+0001 -2.64292013575155E+0001 -2.64343100226370E+0001 +-2.64394192383172E+0001 -2.64445290045764E+0001 -2.64496393214352E+0001 -2.64547501889142E+0001 -2.64598616070339E+0001 +-2.64649735758148E+0001 -2.64700860952774E+0001 -2.64751991654421E+0001 -2.64803127863295E+0001 -2.64854269579601E+0001 +-2.64905416803542E+0001 -2.64956569535324E+0001 -2.65007727775151E+0001 -2.65058891523228E+0001 -2.65110060779758E+0001 +-2.65161235544947E+0001 -2.65212415818998E+0001 -2.65263601602116E+0001 -2.65314792894504E+0001 -2.65365989696366E+0001 +-2.65417192007907E+0001 -2.65468399829330E+0001 -2.65519613160838E+0001 -2.65570832002636E+0001 -2.65622056354927E+0001 +-2.65673286217914E+0001 -2.65724521591801E+0001 -2.65775762476791E+0001 -2.65827008873088E+0001 -2.65878260780894E+0001 +-2.65929518200412E+0001 -2.65980781131846E+0001 -2.66032049575398E+0001 -2.66083323531271E+0001 -2.66134602999669E+0001 +-2.66185887980793E+0001 -2.66237178474846E+0001 -2.66288474482031E+0001 -2.66339776002550E+0001 -2.66391083036605E+0001 +-2.66442395584399E+0001 -2.66493713646134E+0001 -2.66545037222013E+0001 -2.66596366312236E+0001 -2.66647700917006E+0001 +-2.66699041036524E+0001 -2.66750386670994E+0001 -2.66801737820616E+0001 -2.66853094485591E+0001 -2.66904456666123E+0001 +-2.66955824362411E+0001 -2.67007197574657E+0001 -2.67058576303063E+0001 -2.67109960547830E+0001 -2.67161350309160E+0001 +-2.67212745587252E+0001 -2.67264146382308E+0001 -2.67315552694529E+0001 -2.67366964524116E+0001 -2.67418381871270E+0001 +-2.67469804736191E+0001 -2.67521233119080E+0001 -2.67572667020138E+0001 -2.67624106439564E+0001 -2.67675551377559E+0001 +-2.67727001834324E+0001 -2.67778457810059E+0001 -2.67829919304963E+0001 -2.67881386319238E+0001 -2.67932858853082E+0001 +-2.67984336906696E+0001 -2.68035820480279E+0001 -2.68087309574032E+0001 -2.68138804188154E+0001 -2.68190304322844E+0001 +-2.68241809978302E+0001 -2.68293321154728E+0001 -2.68344837852320E+0001 -2.68396360071279E+0001 -2.68447887811802E+0001 +-2.68499421074091E+0001 -2.68550959858342E+0001 -2.68602504164756E+0001 -2.68654053993531E+0001 -2.68705609344866E+0001 +-2.68757170218960E+0001 -2.68808736616011E+0001 -2.68860308536219E+0001 -2.68911885979780E+0001 -2.68963468946895E+0001 +-2.69015057437760E+0001 -2.69066651452576E+0001 -2.69118250991538E+0001 -2.69169856054847E+0001 -2.69221466642699E+0001 +-2.69273082755293E+0001 -2.69324704392827E+0001 -2.69376331555497E+0001 -2.69427964243503E+0001 -2.69479602457042E+0001 +-2.69531246196311E+0001 -2.69582895461508E+0001 -2.69634550252829E+0001 -2.69686210570474E+0001 -2.69737876414638E+0001 +-2.69789547785519E+0001 -2.69841224683314E+0001 -2.69892907108220E+0001 -2.69944595060434E+0001 -2.69996288540153E+0001 +-2.70047987547573E+0001 -2.70099692082892E+0001 -2.70151402146306E+0001 -2.70203117738012E+0001 -2.70254838858205E+0001 +-2.70306565507083E+0001 -2.70358297684842E+0001 -2.70410035391678E+0001 -2.70461778627787E+0001 -2.70513527393365E+0001 +-2.70565281688609E+0001 -2.70617041513714E+0001 -2.70668806868876E+0001 -2.70720577754292E+0001 -2.70772354170156E+0001 +-2.70824136116664E+0001 -2.70875923594012E+0001 -2.70927716602396E+0001 -2.70979515142010E+0001 -2.71031319213051E+0001 +-2.71083128815713E+0001 -2.71134943950192E+0001 -2.71186764616683E+0001 -2.71238590815380E+0001 -2.71290422546479E+0001 +-2.71342259810175E+0001 -2.71394102606663E+0001 -2.71445950936136E+0001 -2.71497804798791E+0001 -2.71549664194820E+0001 +-2.71601529124420E+0001 -2.71653399587784E+0001 -2.71705275585107E+0001 -2.71757157116584E+0001 -2.71809044182407E+0001 +-2.71860936782772E+0001 -2.71912834917872E+0001 -2.71964738587901E+0001 -2.72016647793054E+0001 -2.72068562533525E+0001 +-2.72120482809506E+0001 -2.72172408621191E+0001 -2.72224339968775E+0001 -2.72276276852451E+0001 -2.72328219272412E+0001 +-2.72380167228852E+0001 -2.72432120721963E+0001 -2.72484079751940E+0001 -2.72536044318975E+0001 -2.72588014423262E+0001 +-2.72639990064992E+0001 -2.72691971244361E+0001 -2.72743957961559E+0001 -2.72795950216781E+0001 -2.72847948010218E+0001 +-2.72899951342063E+0001 -2.72951960212510E+0001 -2.73003974621750E+0001 -2.73055994569975E+0001 -2.73108020057379E+0001 +-2.73160051084154E+0001 -2.73212087650491E+0001 -2.73264129756582E+0001 -2.73316177402621E+0001 -2.73368230588798E+0001 +-2.73420289315306E+0001 -2.73472353582337E+0001 -2.73524423390081E+0001 -2.73576498738732E+0001 -2.73628579628480E+0001 +-2.73680666059517E+0001 -2.73732758032035E+0001 -2.73784855546224E+0001 -2.73836958602277E+0001 -2.73889067200384E+0001 +-2.73941181340737E+0001 -2.73993301023526E+0001 -2.74045426248943E+0001 -2.74097557017179E+0001 -2.74149693328424E+0001 +-2.74201835182869E+0001 -2.74253982580706E+0001 -2.74306135522124E+0001 -2.74358294007314E+0001 -2.74410458036467E+0001 +-2.74462627609773E+0001 -2.74514802727423E+0001 -2.74566983389606E+0001 -2.74619169596513E+0001 -2.74671361348334E+0001 +-2.74723558645260E+0001 -2.74775761487479E+0001 -2.74827969875183E+0001 -2.74880183808561E+0001 -2.74932403287802E+0001 +-2.74984628313096E+0001 -2.75036858884634E+0001 -2.75089095002604E+0001 -2.75141336667196E+0001 -2.75193583878600E+0001 +-2.75245836637004E+0001 -2.75298094942598E+0001 -2.75350358795572E+0001 -2.75402628196113E+0001 -2.75454903144412E+0001 +-2.75507183640658E+0001 -2.75559469685038E+0001 -2.75611761277743E+0001 -2.75664058418960E+0001 -2.75716361108879E+0001 +-2.75768669347688E+0001 -2.75820983135576E+0001 -2.75873302472730E+0001 -2.75925627359340E+0001 -2.75977957795594E+0001 +-2.76030293781680E+0001 -2.76082635317786E+0001 -2.76134982404100E+0001 -2.76187335040811E+0001 -2.76239693228106E+0001 +-2.76292056966173E+0001 -2.76344426255200E+0001 -2.76396801095375E+0001 -2.76449181486886E+0001 -2.76501567429919E+0001 +-2.76553958924663E+0001 -2.76606355971304E+0001 -2.76658758570032E+0001 -2.76711166721031E+0001 -2.76763580424491E+0001 +-2.76815999680598E+0001 -2.76868424489539E+0001 -2.76920854851502E+0001 -2.76973290766672E+0001 -2.77025732235238E+0001 +-2.77078179257385E+0001 -2.77130631833301E+0001 -2.77183089963173E+0001 -2.77235553647186E+0001 -2.77288022885528E+0001 +-2.77340497678384E+0001 -2.77392978025942E+0001 -2.77445463928388E+0001 -2.77497955385907E+0001 -2.77550452398686E+0001 +-2.77602954966912E+0001 -2.77655463090769E+0001 -2.77707976770445E+0001 -2.77760496006125E+0001 -2.77813020797994E+0001 +-2.77865551146239E+0001 -2.77918087051045E+0001 -2.77970628512598E+0001 -2.78023175531084E+0001 -2.78075728106687E+0001 +-2.78128286239594E+0001 -2.78180849929989E+0001 -2.78233419178058E+0001 -2.78285993983986E+0001 -2.78338574347958E+0001 +-2.78391160270159E+0001 -2.78443751750775E+0001 -2.78496348789989E+0001 -2.78548951387987E+0001 -2.78601559544954E+0001 +-2.78654173261075E+0001 -2.78706792536533E+0001 -2.78759417371514E+0001 -2.78812047766202E+0001 -2.78864683720781E+0001 +-2.78917325235436E+0001 -2.78969972310351E+0001 -2.79022624945710E+0001 -2.79075283141697E+0001 -2.79127946898497E+0001 +-2.79180616216294E+0001 -2.79233291095270E+0001 -2.79285971535611E+0001 -2.79338657537500E+0001 -2.79391349101121E+0001 +-2.79444046226657E+0001 -2.79496748914291E+0001 -2.79549457164209E+0001 -2.79602170976592E+0001 -2.79654890351624E+0001 +-2.79707615289489E+0001 -2.79760345790369E+0001 -2.79813081854449E+0001 -2.79865823481910E+0001 -2.79918570672936E+0001 +-2.79971323427711E+0001 -2.80024081746416E+0001 -2.80076845629235E+0001 -2.80129615076350E+0001 -2.80182390087944E+0001 +-2.80235170664200E+0001 -2.80287956805301E+0001 -2.80340748511428E+0001 -2.80393545782764E+0001 -2.80446348619491E+0001 +-2.80499157021792E+0001 -2.80551970989849E+0001 -2.80604790523844E+0001 -2.80657615623959E+0001 -2.80710446290376E+0001 +-2.80763282523277E+0001 -2.80816124322844E+0001 -2.80868971689258E+0001 -2.80921824622702E+0001 -2.80974683123356E+0001 +-2.81027547191403E+0001 -2.81080416827024E+0001 -2.81133292030401E+0001 -2.81186172801714E+0001 -2.81239059141145E+0001 +-2.81291951048876E+0001 -2.81344848525087E+0001 -2.81397751569960E+0001 -2.81450660183676E+0001 -2.81503574366415E+0001 +-2.81556494118358E+0001 -2.81609419439687E+0001 -2.81662350330582E+0001 -2.81715286791224E+0001 -2.81768228821793E+0001 +-2.81821176422469E+0001 -2.81874129593435E+0001 -2.81927088334869E+0001 -2.81980052646952E+0001 -2.82033022529865E+0001 +-2.82085997983787E+0001 -2.82138979008899E+0001 -2.82191965605381E+0001 -2.82244957773413E+0001 -2.82297955513175E+0001 +-2.82350958824847E+0001 -2.82403967708607E+0001 -2.82456982164638E+0001 -2.82510002193117E+0001 -2.82563027794224E+0001 +-2.82616058968140E+0001 -2.82669095715043E+0001 -2.82722138035113E+0001 -2.82775185928529E+0001 -2.82828239395471E+0001 +-2.82881298436118E+0001 -2.82934363050648E+0001 -2.82987433239241E+0001 -2.83040509002076E+0001 -2.83093590339333E+0001 +-2.83146677251188E+0001 -2.83199769737822E+0001 -2.83252867799414E+0001 -2.83305971436141E+0001 -2.83359080648183E+0001 +-2.83412195435718E+0001 -2.83465315798924E+0001 -2.83518441737980E+0001 -2.83571573253065E+0001 -2.83624710344356E+0001 +-2.83677853012031E+0001 -2.83731001256270E+0001 -2.83784155077249E+0001 -2.83837314475147E+0001 -2.83890479450141E+0001 +-2.83943650002411E+0001 -2.83996826132133E+0001 -2.84050007839485E+0001 -2.84103195124644E+0001 -2.84156387987789E+0001 +-2.84209586429098E+0001 -2.84262790448746E+0001 -2.84316000046912E+0001 -2.84369215223774E+0001 -2.84422435979508E+0001 +-2.84475662314291E+0001 -2.84528894228301E+0001 -2.84582131721715E+0001 -2.84635374794710E+0001 -2.84688623447462E+0001 +-2.84741877680149E+0001 -2.84795137492948E+0001 -2.84848402886034E+0001 -2.84901673859586E+0001 -2.84954950413779E+0001 +-2.85008232548789E+0001 -2.85061520264794E+0001 -2.85114813561970E+0001 -2.85168112440493E+0001 -2.85221416900540E+0001 +-2.85274726942286E+0001 -2.85328042565908E+0001 -2.85381363771582E+0001 -2.85434690559483E+0001 -2.85488022929789E+0001 +-2.85541360882674E+0001 -2.85594704418315E+0001 -2.85648053536887E+0001 -2.85701408238566E+0001 -2.85754768523527E+0001 +-2.85808134391947E+0001 -2.85861505844000E+0001 -2.85914882879862E+0001 -2.85968265499709E+0001 -2.86021653703715E+0001 +-2.86075047492057E+0001 -2.86128446864908E+0001 -2.86181851822444E+0001 -2.86235262364841E+0001 -2.86288678492273E+0001 +-2.86342100204915E+0001 -2.86395527502942E+0001 -2.86448960386529E+0001 -2.86502398855850E+0001 -2.86555842911080E+0001 +-2.86609292552394E+0001 -2.86662747779965E+0001 -2.86716208593970E+0001 -2.86769674994581E+0001 -2.86823146981974E+0001 +-2.86876624556322E+0001 -2.86930107717800E+0001 -2.86983596466582E+0001 -2.87037090802841E+0001 -2.87090590726753E+0001 +-2.87144096238490E+0001 -2.87197607338228E+0001 -2.87251124026138E+0001 -2.87304646302396E+0001 -2.87358174167175E+0001 +-2.87411707620648E+0001 -2.87465246662990E+0001 -2.87518791294373E+0001 -2.87572341514971E+0001 -2.87625897324957E+0001 +-2.87679458724505E+0001 -2.87733025713788E+0001 -2.87786598292979E+0001 -2.87840176462251E+0001 -2.87893760221777E+0001 +-2.87947349571730E+0001 -2.88000944512283E+0001 -2.88054545043609E+0001 -2.88108151165881E+0001 -2.88161762879271E+0001 +-2.88215380183951E+0001 -2.88269003080096E+0001 -2.88322631567877E+0001 -2.88376265647466E+0001 -2.88429905319036E+0001 +-2.88483550582759E+0001 -2.88537201438808E+0001 -2.88590857887355E+0001 -2.88644519928571E+0001 -2.88698187562629E+0001 +-2.88751860789702E+0001 -2.88805539609960E+0001 -2.88859224023576E+0001 -2.88912914030722E+0001 -2.88966609631569E+0001 +-2.89020310826289E+0001 -2.89074017615054E+0001 -2.89127729998035E+0001 -2.89181447975404E+0001 -2.89235171547332E+0001 +-2.89288900713991E+0001 -2.89342635475552E+0001 -2.89396375832186E+0001 -2.89450121784064E+0001 -2.89503873331358E+0001 +-2.89557630474238E+0001 -2.89611393212876E+0001 -2.89665161547442E+0001 -2.89718935478108E+0001 -2.89772715005043E+0001 +-2.89826500128420E+0001 -2.89880290848409E+0001 -2.89934087165179E+0001 -2.89987889078902E+0001 -2.90041696589749E+0001 +-2.90095509697890E+0001 -2.90149328403494E+0001 -2.90203152706733E+0001 -2.90256982607776E+0001 -2.90310818106795E+0001 +-2.90364659203958E+0001 -2.90418505899437E+0001 -2.90472358193400E+0001 -2.90526216086018E+0001 -2.90580079577461E+0001 +-2.90633948667899E+0001 -2.90687823357501E+0001 -2.90741703646438E+0001 -2.90795589534878E+0001 -2.90849481022991E+0001 +-2.90903378110947E+0001 -2.90957280798915E+0001 -2.91011189087065E+0001 -2.91065102975565E+0001 -2.91119022464586E+0001 +-2.91172947554296E+0001 -2.91226878244864E+0001 -2.91280814536460E+0001 -2.91334756429253E+0001 -2.91388703923411E+0001 +-2.91442657019103E+0001 -2.91496615716498E+0001 -2.91550580015765E+0001 -2.91604549917073E+0001 -2.91658525420590E+0001 +-2.91712506526485E+0001 -2.91766493234926E+0001 -2.91820485546082E+0001 -2.91874483460121E+0001 -2.91928486977212E+0001 +-2.91982496097522E+0001 -2.92036510821220E+0001 -2.92090531148474E+0001 -2.92144557079452E+0001 -2.92198588614323E+0001 +-2.92252625753253E+0001 -2.92306668496412E+0001 -2.92360716843966E+0001 -2.92414770796084E+0001 -2.92468830352933E+0001 +-2.92522895514681E+0001 -2.92576966281496E+0001 -2.92631042653544E+0001 -2.92685124630995E+0001 -2.92739212214014E+0001 +-2.92793305402769E+0001 -2.92847404197428E+0001 -2.92901508598158E+0001 -2.92955618605125E+0001 -2.93009734218498E+0001 +-2.93063855438443E+0001 -2.93117982265126E+0001 -2.93172114698716E+0001 -2.93226252739378E+0001 -2.93280396387280E+0001 +-2.93334545642589E+0001 -2.93388700505470E+0001 -2.93442860976091E+0001 -2.93497027054618E+0001 -2.93551198741218E+0001 +-2.93605376036057E+0001 -2.93659558939301E+0001 -2.93713747451117E+0001 -2.93767941571671E+0001 -2.93822141301129E+0001 +-2.93876346639657E+0001 -2.93930557587422E+0001 -2.93984774144589E+0001 -2.94038996311325E+0001 -2.94093224087795E+0001 +-2.94147457474164E+0001 -2.94201696470600E+0001 -2.94255941077267E+0001 -2.94310191294331E+0001 -2.94364447121958E+0001 +-2.94418708560313E+0001 -2.94472975609562E+0001 -2.94527248269870E+0001 -2.94581526541402E+0001 -2.94635810424324E+0001 +-2.94690099918801E+0001 -2.94744395024998E+0001 -2.94798695743081E+0001 -2.94853002073213E+0001 -2.94907314015561E+0001 +-2.94961631570289E+0001 -2.95015954737562E+0001 -2.95070283517545E+0001 -2.95124617910403E+0001 -2.95178957916300E+0001 +-2.95233303535400E+0001 -2.95287654767869E+0001 -2.95342011613871E+0001 -2.95396374073571E+0001 -2.95450742147132E+0001 +-2.95505115834719E+0001 -2.95559495136497E+0001 -2.95613880052629E+0001 -2.95668270583280E+0001 -2.95722666728614E+0001 +-2.95777068488795E+0001 -2.95831475863986E+0001 -2.95885888854352E+0001 -2.95940307460057E+0001 -2.95994731681264E+0001 +-2.96049161518137E+0001 -2.96103596970840E+0001 -2.96158038039537E+0001 -2.96212484724390E+0001 -2.96266937025564E+0001 +-2.96321394943221E+0001 -2.96375858477526E+0001 -2.96430327628641E+0001 -2.96484802396731E+0001 -2.96539282781957E+0001 +-2.96593768784483E+0001 -2.96648260404473E+0001 -2.96702757642088E+0001 -2.96757260497494E+0001 -2.96811768970851E+0001 +-2.96866283062323E+0001 -2.96920802772073E+0001 -2.96975328100263E+0001 -2.97029859047057E+0001 -2.97084395612616E+0001 +-2.97138937797104E+0001 -2.97193485600682E+0001 -2.97248039023514E+0001 -2.97302598065762E+0001 -2.97357162727587E+0001 +-2.97411733009152E+0001 -2.97466308910620E+0001 -2.97520890432153E+0001 -2.97575477573912E+0001 -2.97630070336060E+0001 +-2.97684668718758E+0001 -2.97739272722169E+0001 -2.97793882346455E+0001 -2.97848497591776E+0001 -2.97903118458296E+0001 +-2.97957744946175E+0001 -2.98012377055575E+0001 -2.98067014786658E+0001 -2.98121658139585E+0001 -2.98176307114518E+0001 +-2.98230961711618E+0001 -2.98285621931047E+0001 -2.98340287772965E+0001 -2.98394959237534E+0001 -2.98449636324916E+0001 +-2.98504319035270E+0001 -2.98559007368759E+0001 -2.98613701325542E+0001 -2.98668400905782E+0001 -2.98723106109639E+0001 +-2.98777816937274E+0001 -2.98832533388847E+0001 -2.98887255464519E+0001 -2.98941983164451E+0001 -2.98996716488804E+0001 +-2.99051455437737E+0001 -2.99106200011412E+0001 -2.99160950209989E+0001 -2.99215706033627E+0001 -2.99270467482489E+0001 +-2.99325234556733E+0001 -2.99380007256519E+0001 -2.99434785582009E+0001 -2.99489569533362E+0001 -2.99544359110737E+0001 +-2.99599154314296E+0001 -2.99653955144198E+0001 -2.99708761600602E+0001 -2.99763573683668E+0001 -2.99818391393557E+0001 +-2.99873214730427E+0001 -2.99928043694439E+0001 -2.99982878285752E+0001 -3.00037718504525E+0001 -3.00092564350919E+0001 +-3.00147415825091E+0001 -3.00202272927202E+0001 -3.00257135657411E+0001 -3.00312004015876E+0001 -3.00366878002758E+0001 +-3.00421757618215E+0001 -3.00476642862406E+0001 -3.00531533735491E+0001 -3.00586430237628E+0001 -3.00641332368975E+0001 +-3.00696240129693E+0001 -3.00751153519939E+0001 -3.00806072539872E+0001 -3.00860997189651E+0001 -3.00915927469435E+0001 +-3.00970863379381E+0001 -3.01025804919649E+0001 -3.01080752090397E+0001 -3.01135704891783E+0001 -3.01190663323965E+0001 +-3.01245627387103E+0001 -3.01300597081353E+0001 -3.01355572406874E+0001 -3.01410553363824E+0001 -3.01465539952361E+0001 +-3.01520532172643E+0001 -3.01575530024828E+0001 -3.01630533509074E+0001 -3.01685542625539E+0001 -3.01740557374379E+0001 +-3.01795577755754E+0001 -3.01850603769821E+0001 -3.01905635416736E+0001 -3.01960672696658E+0001 -3.02015715609744E+0001 +-3.02070764156152E+0001 -3.02125818336038E+0001 -3.02180878149561E+0001 -3.02235943596877E+0001 -3.02291014678143E+0001 +-3.02346091393517E+0001 -3.02401173743156E+0001 -3.02456261727216E+0001 -3.02511355345855E+0001 -3.02566454599229E+0001 +-3.02621559487496E+0001 -3.02676670010811E+0001 -3.02731786169333E+0001 -3.02786907963217E+0001 -3.02842035392620E+0001 +-3.02897168457699E+0001 -3.02952307158610E+0001 -3.03007451495509E+0001 -3.03062601468553E+0001 -3.03117757077899E+0001 +-3.03172918323702E+0001 -3.03228085206119E+0001 -3.03283257725307E+0001 -3.03338435881420E+0001 -3.03393619674615E+0001 +-3.03448809105048E+0001 -3.03504004172876E+0001 -3.03559204878253E+0001 -3.03614411221336E+0001 -3.03669623202281E+0001 +-3.03724840821243E+0001 -3.03780064078378E+0001 -3.03835292973841E+0001 -3.03890527507789E+0001 -3.03945767680376E+0001 +-3.04001013491758E+0001 -3.04056264942091E+0001 -3.04111522031530E+0001 -3.04166784760229E+0001 -3.04222053128345E+0001 +-3.04277327136033E+0001 -3.04332606783447E+0001 -3.04387892070742E+0001 -3.04443182998074E+0001 -3.04498479565598E+0001 +-3.04553781773469E+0001 -3.04609089621840E+0001 -3.04664403110868E+0001 -3.04719722240707E+0001 -3.04775047011511E+0001 +-3.04830377423436E+0001 -3.04885713476635E+0001 -3.04941055171263E+0001 -3.04996402507476E+0001 -3.05051755485426E+0001 +-3.05107114105268E+0001 -3.05162478367158E+0001 -3.05217848271248E+0001 -3.05273223817694E+0001 -3.05328605006649E+0001 +-3.05383991838267E+0001 -3.05439384312703E+0001 -3.05494782430110E+0001 -3.05550186190642E+0001 -3.05605595594454E+0001 +-3.05661010641699E+0001 -3.05716431332530E+0001 -3.05771857667102E+0001 -3.05827289645567E+0001 -3.05882727268081E+0001 +-3.05938170534795E+0001 -3.05993619445864E+0001 -3.06049074001442E+0001 -3.06104534201680E+0001 -3.06160000046734E+0001 +-3.06215471536755E+0001 -3.06270948671898E+0001 -3.06326431452315E+0001 -3.06381919878160E+0001 -3.06437413949585E+0001 +-3.06492913666744E+0001 -3.06548419029789E+0001 -3.06603930038874E+0001 -3.06659446694151E+0001 -3.06714968995773E+0001 +-3.06770496943892E+0001 -3.06826030538662E+0001 -3.06881569780235E+0001 -3.06937114668764E+0001 -3.06992665204400E+0001 +-3.07048221387298E+0001 -3.07103783217608E+0001 -3.07159350695483E+0001 -3.07214923821076E+0001 -3.07270502594539E+0001 +-3.07326087016024E+0001 -3.07381677085682E+0001 -3.07437272803668E+0001 -3.07492874170131E+0001 -3.07548481185225E+0001 +-3.07604093849101E+0001 -3.07659712161910E+0001 -3.07715336123806E+0001 -3.07770965734939E+0001 -3.07826600995462E+0001 +-3.07882241905526E+0001 -3.07937888465282E+0001 -3.07993540674882E+0001 -3.08049198534478E+0001 -3.08104862044221E+0001 +-3.08160531204262E+0001 -3.08216206014754E+0001 -3.08271886475846E+0001 -3.08327572587690E+0001 -3.08383264350438E+0001 +-3.08438961764241E+0001 -3.08494664829249E+0001 -3.08550373545614E+0001 -3.08606087913487E+0001 -3.08661807933018E+0001 +-3.08717533604359E+0001 -3.08773264927660E+0001 -3.08829001903072E+0001 -3.08884744530745E+0001 -3.08940492810831E+0001 +-3.08996246743480E+0001 -3.09052006328843E+0001 -3.09107771567069E+0001 -3.09163542458310E+0001 -3.09219319002715E+0001 +-3.09275101200436E+0001 -3.09330889051622E+0001 -3.09386682556424E+0001 -3.09442481714991E+0001 -3.09498286527475E+0001 +-3.09554096994024E+0001 -3.09609913114790E+0001 -3.09665734889921E+0001 -3.09721562319569E+0001 -3.09777395403882E+0001 +-3.09833234143011E+0001 -3.09889078537105E+0001 -3.09944928586314E+0001 -3.10000784290788E+0001 -3.10056645650676E+0001 +-3.10112512666128E+0001 -3.10168385337293E+0001 -3.10224263664321E+0001 -3.10280147647362E+0001 -3.10336037286563E+0001 +-3.10391932582076E+0001 -3.10447833534048E+0001 -3.10503740142630E+0001 -3.10559652407970E+0001 -3.10615570330218E+0001 +-3.10671493909522E+0001 -3.10727423146031E+0001 -3.10783358039895E+0001 -3.10839298591262E+0001 -3.10895244800281E+0001 +-3.10951196667101E+0001 -3.11007154191870E+0001 -3.11063117374737E+0001 -3.11119086215852E+0001 -3.11175060715361E+0001 +-3.11231040873415E+0001 -3.11287026690160E+0001 -3.11343018165747E+0001 -3.11399015300322E+0001 -3.11455018094035E+0001 +-3.11511026547034E+0001 -3.11567040659466E+0001 -3.11623060431481E+0001 -3.11679085863225E+0001 -3.11735116954848E+0001 +-3.11791153706496E+0001 -3.11847196118319E+0001 -3.11903244190464E+0001 -3.11959297923078E+0001 -3.12015357316310E+0001 +-3.12071422370307E+0001 -3.12127493085218E+0001 -3.12183569461189E+0001 -3.12239651498368E+0001 -3.12295739196903E+0001 +-3.12351832556941E+0001 -3.12407931578629E+0001 -3.12464036262116E+0001 -3.12520146607548E+0001 -3.12576262615073E+0001 +-3.12632384284837E+0001 -3.12688511616989E+0001 -3.12744644611675E+0001 -3.12800783269041E+0001 -3.12856927589237E+0001 +-3.12913077572407E+0001 -3.12969233218699E+0001 -3.13025394528261E+0001 -3.13081561501238E+0001 -3.13137734137778E+0001 +-3.13193912438027E+0001 -3.13250096402132E+0001 -3.13306286030240E+0001 -3.13362481322497E+0001 -3.13418682279049E+0001 +-3.13474888900044E+0001 -3.13531101185627E+0001 -3.13587319135945E+0001 -3.13643542751144E+0001 -3.13699772031370E+0001 +-3.13756006976770E+0001 -3.13812247587490E+0001 -3.13868493863676E+0001 -3.13924745805474E+0001 -3.13981003413030E+0001 +-3.14037266686490E+0001 -3.14093535625999E+0001 -3.14149810231704E+0001 -3.14206090503751E+0001 -3.14262376442285E+0001 +-3.14318668047452E+0001 -3.14374965319398E+0001 -3.14431268258267E+0001 -3.14487576864207E+0001 -3.14543891137362E+0001 +-3.14600211077877E+0001 -3.14656536685899E+0001 -3.14712867961572E+0001 -3.14769204905042E+0001 -3.14825547516454E+0001 +-3.14881895795953E+0001 -3.14938249743684E+0001 -3.14994609359793E+0001 -3.15050974644425E+0001 -3.15107345597724E+0001 +-3.15163722219835E+0001 -3.15220104510904E+0001 -3.15276492471075E+0001 -3.15332886100494E+0001 -3.15389285399304E+0001 +-3.15445690367650E+0001 -3.15502101005678E+0001 -3.15558517313531E+0001 -3.15614939291355E+0001 -3.15671366939293E+0001 +-3.15727800257491E+0001 -3.15784239246092E+0001 -3.15840683905241E+0001 -3.15897134235083E+0001 -3.15953590235761E+0001 +-3.16010051907421E+0001 -3.16066519250204E+0001 -3.16122992264257E+0001 -3.16179470949724E+0001 -3.16235955306747E+0001 +-3.16292445335471E+0001 -3.16348941036040E+0001 -3.16405442408598E+0001 -3.16461949453289E+0001 -3.16518462170256E+0001 +-3.16574980559643E+0001 -3.16631504621594E+0001 -3.16688034356252E+0001 -3.16744569763762E+0001 -3.16801110844265E+0001 +-3.16857657597907E+0001 -3.16914210024830E+0001 -3.16970768125177E+0001 -3.17027331899093E+0001 -3.17083901346720E+0001 +-3.17140476468201E+0001 -3.17197057263680E+0001 -3.17253643733300E+0001 -3.17310235877204E+0001 -3.17366833695534E+0001 +-3.17423437188435E+0001 -3.17480046356048E+0001 -3.17536661198517E+0001 -3.17593281715984E+0001 -3.17649907908592E+0001 +-3.17706539776485E+0001 -3.17763177319804E+0001 -3.17819820538692E+0001 -3.17876469433293E+0001 -3.17933124003747E+0001 +-3.17989784250199E+0001 -3.18046450172790E+0001 -3.18103121771662E+0001 -3.18159799046959E+0001 -3.18216481998822E+0001 +-3.18273170627393E+0001 -3.18329864932815E+0001 -3.18386564915230E+0001 -3.18443270574780E+0001 -3.18499981911608E+0001 +-3.18556698925854E+0001 -3.18613421617661E+0001 -3.18670149987171E+0001 -3.18726884034526E+0001 -3.18783623759867E+0001 +-3.18840369163336E+0001 -3.18897120245076E+0001 -3.18953877005227E+0001 -3.19010639443932E+0001 -3.19067407561331E+0001 +-3.19124181357567E+0001 -3.19180960832780E+0001 -3.19237745987113E+0001 -3.19294536820706E+0001 -3.19351333333701E+0001 +-3.19408135526239E+0001 -3.19464943398462E+0001 -3.19521756950510E+0001 -3.19578576182525E+0001 -3.19635401094648E+0001 +-3.19692231687020E+0001 -3.19749067959781E+0001 -3.19805909913073E+0001 -3.19862757547037E+0001 -3.19919610861813E+0001 +-3.19976469857542E+0001 -3.20033334534366E+0001 -3.20090204892424E+0001 -3.20147080931857E+0001 -3.20203962652807E+0001 +-3.20260850055412E+0001 -3.20317743139815E+0001 -3.20374641906155E+0001 -3.20431546354573E+0001 -3.20488456485210E+0001 +-3.20545372298204E+0001 -3.20602293793698E+0001 -3.20659220971830E+0001 -3.20716153832742E+0001 -3.20773092376573E+0001 +-3.20830036603463E+0001 -3.20886986513553E+0001 -3.20943942106982E+0001 -3.21000903383891E+0001 -3.21057870344418E+0001 +-3.21114842988705E+0001 -3.21171821316890E+0001 -3.21228805329114E+0001 -3.21285795025516E+0001 -3.21342790406236E+0001 +-3.21399791471414E+0001 -3.21456798221188E+0001 -3.21513810655699E+0001 -3.21570828775086E+0001 -3.21627852579489E+0001 +-3.21684882069046E+0001 -3.21741917243898E+0001 -3.21798958104182E+0001 -3.21856004650039E+0001 -3.21913056881608E+0001 +-3.21970114799028E+0001 -3.22027178402438E+0001 -3.22084247691977E+0001 -3.22141322667784E+0001 -3.22198403329997E+0001 +-3.22255489678757E+0001 -3.22312581714201E+0001 -3.22369679436468E+0001 -3.22426782845698E+0001 -3.22483891942028E+0001 +-3.22541006725598E+0001 -3.22598127196547E+0001 -3.22655253355011E+0001 -3.22712385201132E+0001 -3.22769522735045E+0001 +-3.22826665956891E+0001 -3.22883814866808E+0001 -3.22940969464933E+0001 -3.22998129751405E+0001 -3.23055295726363E+0001 +-3.23112467389944E+0001 -3.23169644742287E+0001 -3.23226827783529E+0001 -3.23284016513810E+0001 -3.23341210933266E+0001 +-3.23398411042035E+0001 -3.23455616840257E+0001 -3.23512828328068E+0001 -3.23570045505606E+0001 -3.23627268373010E+0001 +-3.23684496930416E+0001 -3.23741731177963E+0001 -3.23798971115787E+0001 -3.23856216744028E+0001 -3.23913468062822E+0001 +-3.23970725072306E+0001 -3.24027987772619E+0001 -3.24085256163897E+0001 -3.24142530246278E+0001 -3.24199810019899E+0001 +-3.24257095484898E+0001 -3.24314386641411E+0001 -3.24371683489577E+0001 -3.24428986029531E+0001 -3.24486294261411E+0001 +-3.24543608185354E+0001 -3.24600927801498E+0001 -3.24658253109978E+0001 -3.24715584110932E+0001 -3.24772920804497E+0001 +-3.24830263190809E+0001 -3.24887611270006E+0001 -3.24944965042223E+0001 -3.25002324507599E+0001 -3.25059689666268E+0001 +-3.25117060518368E+0001 -3.25174437064035E+0001 -3.25231819303407E+0001 -3.25289207236618E+0001 -3.25346600863806E+0001 +-3.25404000185107E+0001 -3.25461405200657E+0001 -3.25518815910592E+0001 -3.25576232315049E+0001 -3.25633654414164E+0001 +-3.25691082208073E+0001 -3.25748515696912E+0001 -3.25805954880816E+0001 -3.25863399759923E+0001 -3.25920850334368E+0001 +-3.25978306604286E+0001 -3.26035768569814E+0001 -3.26093236231087E+0001 -3.26150709588242E+0001 -3.26208188641413E+0001 +-3.26265673390736E+0001 -3.26323163836348E+0001 -3.26380659978383E+0001 -3.26438161816978E+0001 -3.26495669352267E+0001 +-3.26553182584386E+0001 -3.26610701513470E+0001 -3.26668226139655E+0001 -3.26725756463077E+0001 -3.26783292483869E+0001 +-3.26840834202168E+0001 -3.26898381618108E+0001 -3.26955934731826E+0001 -3.27013493543454E+0001 -3.27071058053130E+0001 +-3.27128628260988E+0001 -3.27186204167162E+0001 -3.27243785771788E+0001 -3.27301373075000E+0001 -3.27358966076933E+0001 +-3.27416564777722E+0001 -3.27474169177502E+0001 -3.27531779276407E+0001 -3.27589395074572E+0001 -3.27647016572132E+0001 +-3.27704643769220E+0001 -3.27762276665972E+0001 -3.27819915262521E+0001 -3.27877559559003E+0001 -3.27935209555552E+0001 +-3.27992865252301E+0001 -3.28050526649386E+0001 -3.28108193746940E+0001 -3.28165866545097E+0001 -3.28223545043992E+0001 +-3.28281229243759E+0001 -3.28338919144531E+0001 -3.28396614746443E+0001 -3.28454316049629E+0001 -3.28512023054222E+0001 +-3.28569735760357E+0001 -3.28627454168166E+0001 -3.28685178277785E+0001 -3.28742908089346E+0001 -3.28800643602984E+0001 +-3.28858384818831E+0001 -3.28916131737022E+0001 -3.28973884357690E+0001 -3.29031642680968E+0001 -3.29089406706991E+0001 +-3.29147176435891E+0001 -3.29204951867801E+0001 -3.29262733002856E+0001 -3.29320519841187E+0001 -3.29378312382930E+0001 +-3.29436110628216E+0001 -3.29493914577179E+0001 -3.29551724229951E+0001 -3.29609539586667E+0001 -3.29667360647459E+0001 +-3.29725187412459E+0001 -3.29783019881802E+0001 -3.29840858055619E+0001 -3.29898701934043E+0001 -3.29956551517208E+0001 +-3.30014406805246E+0001 -3.30072267798290E+0001 -3.30130134496472E+0001 -3.30188006899925E+0001 -3.30245885008782E+0001 +-3.30303768823174E+0001 -3.30361658343235E+0001 -3.30419553569097E+0001 -3.30477454500893E+0001 -3.30535361138754E+0001 +-3.30593273482813E+0001 -3.30651191533202E+0001 -3.30709115290054E+0001 -3.30767044753500E+0001 -3.30824979923673E+0001 +-3.30882920800705E+0001 -3.30940867384727E+0001 -3.30998819675873E+0001 -3.31056777674273E+0001 -3.31114741380060E+0001 +-3.31172710793365E+0001 -3.31230685914320E+0001 -3.31288666743058E+0001 -3.31346653279709E+0001 -3.31404645524406E+0001 +-3.31462643477280E+0001 -3.31520647138463E+0001 -3.31578656508086E+0001 -3.31636671586280E+0001 -3.31694692373178E+0001 +-3.31752718868911E+0001 -3.31810751073610E+0001 -3.31868788987406E+0001 -3.31926832610430E+0001 -3.31984881942815E+0001 +-3.32042936984690E+0001 -3.32100997736188E+0001 -3.32159064197440E+0001 -3.32217136368575E+0001 -3.32275214249726E+0001 +-3.32333297841024E+0001 -3.32391387142599E+0001 -3.32449482154582E+0001 -3.32507582877105E+0001 -3.32565689310297E+0001 +-3.32623801454290E+0001 -3.32681919309215E+0001 -3.32740042875202E+0001 -3.32798172152381E+0001 -3.32856307140884E+0001 +-3.32914447840841E+0001 -3.32972594252382E+0001 -3.33030746375638E+0001 -3.33088904210740E+0001 -3.33147067757817E+0001 +-3.33205237017000E+0001 -3.33263411988420E+0001 -3.33321592672206E+0001 -3.33379779068489E+0001 -3.33437971177398E+0001 +-3.33496168999065E+0001 -3.33554372533619E+0001 -3.33612581781191E+0001 -3.33670796741909E+0001 -3.33729017415905E+0001 +-3.33787243803307E+0001 -3.33845475904247E+0001 -3.33903713718853E+0001 -3.33961957247256E+0001 -3.34020206489585E+0001 +-3.34078461445970E+0001 -3.34136722116541E+0001 -3.34194988501426E+0001 -3.34253260600757E+0001 -3.34311538414662E+0001 +-3.34369821943270E+0001 -3.34428111186712E+0001 -3.34486406145116E+0001 -3.34544706818613E+0001 -3.34603013207330E+0001 +-3.34661325311398E+0001 -3.34719643130946E+0001 -3.34777966666103E+0001 -3.34836295916998E+0001 -3.34894630883760E+0001 +-3.34952971566518E+0001 -3.35011317965401E+0001 -3.35069670080539E+0001 -3.35128027912060E+0001 -3.35186391460093E+0001 +-3.35244760724766E+0001 -3.35303135706209E+0001 -3.35361516404551E+0001 -3.35419902819920E+0001 -3.35478294952445E+0001 +-3.35536692802254E+0001 -3.35595096369476E+0001 -3.35653505654239E+0001 -3.35711920656673E+0001 -3.35770341376905E+0001 +-3.35828767815065E+0001 -3.35887199971279E+0001 -3.35945637845677E+0001 -3.36004081438387E+0001 -3.36062530749538E+0001 +-3.36120985779257E+0001 -3.36179446527672E+0001 -3.36237912994912E+0001 -3.36296385181105E+0001 -3.36354863086378E+0001 +-3.36413346710861E+0001 -3.36471836054680E+0001 -3.36530331117964E+0001 -3.36588831900841E+0001 -3.36647338403438E+0001 +-3.36705850625883E+0001 -3.36764368568304E+0001 -3.36822892230829E+0001 -3.36881421613585E+0001 -3.36939956716700E+0001 +-3.36998497540301E+0001 -3.37057044084517E+0001 -3.37115596349474E+0001 -3.37174154335300E+0001 -3.37232718042122E+0001 +-3.37291287470069E+0001 -3.37349862619266E+0001 -3.37408443489842E+0001 -3.37467030081923E+0001 -3.37525622395638E+0001 +-3.37584220431112E+0001 -3.37642824188473E+0001 -3.37701433667849E+0001 -3.37760048869366E+0001 -3.37818669793151E+0001 +-3.37877296439332E+0001 -3.37935928808034E+0001 -3.37994566899386E+0001 -3.38053210713513E+0001 -3.38111860250543E+0001 +-3.38170515510602E+0001 -3.38229176493818E+0001 -3.38287843200316E+0001 -3.38346515630224E+0001 -3.38405193783667E+0001 +-3.38463877660773E+0001 -3.38522567261668E+0001 -3.38581262586478E+0001 -3.38639963635330E+0001 -3.38698670408351E+0001 +-3.38757382905666E+0001 -3.38816101127402E+0001 -3.38874825073685E+0001 -3.38933554744641E+0001 -3.38992290140397E+0001 +-3.39051031261079E+0001 -3.39109778106812E+0001 -3.39168530677723E+0001 -3.39227288973938E+0001 -3.39286052995582E+0001 +-3.39344822742782E+0001 -3.39403598215664E+0001 -3.39462379414353E+0001 -3.39521166338975E+0001 -3.39579958989657E+0001 +-3.39638757366523E+0001 -3.39697561469699E+0001 -3.39756371299311E+0001 -3.39815186855485E+0001 -3.39874008138346E+0001 +-3.39932835148019E+0001 -3.39991667884631E+0001 -3.40050506348306E+0001 -3.40109350539170E+0001 -3.40168200457349E+0001 +-3.40227056102967E+0001 -3.40285917476150E+0001 -3.40344784577023E+0001 -3.40403657405711E+0001 -3.40462535962340E+0001 +-3.40521420247035E+0001 -3.40580310259920E+0001 -3.40639206001120E+0001 -3.40698107470762E+0001 -3.40757014668968E+0001 +-3.40815927595866E+0001 -3.40874846251578E+0001 -3.40933770636231E+0001 -3.40992700749949E+0001 -3.41051636592856E+0001 +-3.41110578165078E+0001 -3.41169525466739E+0001 -3.41228478497964E+0001 -3.41287437258877E+0001 -3.41346401749602E+0001 +-3.41405371970265E+0001 -3.41464347920990E+0001 -3.41523329601901E+0001 -3.41582317013122E+0001 -3.41641310154778E+0001 +-3.41700309026994E+0001 -3.41759313629892E+0001 -3.41818323963599E+0001 -3.41877340028237E+0001 -3.41936361823932E+0001 +-3.41995389350806E+0001 -3.42054422608985E+0001 -3.42113461598591E+0001 -3.42172506319750E+0001 -3.42231556772585E+0001 +-3.42290612957220E+0001 -3.42349674873778E+0001 -3.42408742522384E+0001 -3.42467815903162E+0001 -3.42526895016235E+0001 +-3.42585979861726E+0001 -3.42645070439760E+0001 -3.42704166750460E+0001 -3.42763268793950E+0001 -3.42822376570353E+0001 +-3.42881490079793E+0001 -3.42940609322393E+0001 -3.42999734298276E+0001 -3.43058865007566E+0001 -3.43118001450387E+0001 +-3.43177143626861E+0001 -3.43236291537113E+0001 -3.43295445181264E+0001 -3.43354604559438E+0001 -3.43413769671759E+0001 +-3.43472940518349E+0001 -3.43532117099332E+0001 -3.43591299414830E+0001 -3.43650487464967E+0001 -3.43709681249865E+0001 +-3.43768880769648E+0001 -3.43828086024438E+0001 -3.43887297014358E+0001 -3.43946513739530E+0001 -3.44005736200078E+0001 +-3.44064964396125E+0001 -3.44124198327792E+0001 -3.44183437995203E+0001 -3.44242683398480E+0001 -3.44301934537746E+0001 +-3.44361191413123E+0001 -3.44420454024734E+0001 -3.44479722372700E+0001 -3.44538996457145E+0001 -3.44598276278191E+0001 +-3.44657561835960E+0001 -3.44716853130574E+0001 -3.44776150162156E+0001 -3.44835452930828E+0001 -3.44894761436712E+0001 +-3.44954075679929E+0001 -3.45013395660603E+0001 -3.45072721378855E+0001 -3.45132052834807E+0001 -3.45191390028581E+0001 +-3.45250732960299E+0001 -3.45310081630083E+0001 -3.45369436038055E+0001 -3.45428796184336E+0001 -3.45488162069048E+0001 +-3.45547533692313E+0001 -3.45606911054253E+0001 -3.45666294154990E+0001 -3.45725682994644E+0001 -3.45785077573337E+0001 +-3.45844477891192E+0001 -3.45903883948329E+0001 -3.45963295744870E+0001 -3.46022713280936E+0001 -3.46082136556649E+0001 +-3.46141565572130E+0001 -3.46201000327500E+0001 -3.46260440822881E+0001 -3.46319887058393E+0001 -3.46379339034159E+0001 +-3.46438796750298E+0001 -3.46498260206933E+0001 -3.46557729404183E+0001 -3.46617204342171E+0001 -3.46676685021017E+0001 +-3.46736171440843E+0001 -3.46795663601768E+0001 -3.46855161503914E+0001 -3.46914665147402E+0001 -3.46974174532352E+0001 +-3.47033689658886E+0001 -3.47093210527124E+0001 -3.47152737137186E+0001 -3.47212269489193E+0001 -3.47271807583266E+0001 +-3.47331351419526E+0001 -3.47390900998093E+0001 -3.47450456319086E+0001 -3.47510017382628E+0001 -3.47569584188838E+0001 +-3.47629156737836E+0001 -3.47688735029744E+0001 -3.47748319064680E+0001 -3.47807908842766E+0001 -3.47867504364122E+0001 +-3.47927105628867E+0001 -3.47986712637122E+0001 -3.48046325389007E+0001 -3.48105943884642E+0001 -3.48165568124148E+0001 +-3.48225198107643E+0001 -3.48284833835248E+0001 -3.48344475307083E+0001 -3.48404122523268E+0001 -3.48463775483923E+0001 +-3.48523434189166E+0001 -3.48583098639119E+0001 -3.48642768833901E+0001 -3.48702444773631E+0001 -3.48762126458429E+0001 +-3.48821813888415E+0001 -3.48881507063708E+0001 -3.48941205984428E+0001 -3.49000910650694E+0001 -3.49060621062625E+0001 +-3.49120337220342E+0001 -3.49180059123963E+0001 -3.49239786773608E+0001 -3.49299520169396E+0001 -3.49359259311446E+0001 +-3.49419004199878E+0001 -3.49478754834810E+0001 -3.49538511216363E+0001 -3.49598273344654E+0001 -3.49658041219803E+0001 +-3.49717814841929E+0001 -3.49777594211151E+0001 -3.49837379327588E+0001 -3.49897170191359E+0001 -3.49956966802582E+0001 +-3.50016769161377E+0001 -3.50076577267862E+0001 -3.50136391122157E+0001 -3.50196210724379E+0001 -3.50256036074647E+0001 +-3.50315867173081E+0001 -3.50375704019799E+0001 -3.50435546614918E+0001 -3.50495394958559E+0001 -3.50555249050839E+0001 +-3.50615108891876E+0001 -3.50674974481790E+0001 -3.50734845820699E+0001 -3.50794722908720E+0001 -3.50854605745972E+0001 +-3.50914494332575E+0001 -3.50974388668644E+0001 -3.51034288754300E+0001 -3.51094194589659E+0001 -3.51154106174841E+0001 +-3.51214023509963E+0001 -3.51273946595144E+0001 -3.51333875430500E+0001 -3.51393810016151E+0001 -3.51453750352214E+0001 +-3.51513696438807E+0001 -3.51573648276049E+0001 -3.51633605864055E+0001 -3.51693569202946E+0001 -3.51753538292837E+0001 +-3.51813513133848E+0001 -3.51873493726095E+0001 -3.51933480069697E+0001 -3.51993472164770E+0001 -3.52053470011433E+0001 +-3.52113473609803E+0001 -3.52173482959997E+0001 -3.52233498062133E+0001 -3.52293518916328E+0001 -3.52353545522700E+0001 +-3.52413577881366E+0001 -3.52473615992443E+0001 -3.52533659856049E+0001 -3.52593709472301E+0001 -3.52653764841315E+0001 +-3.52713825963210E+0001 -3.52773892838101E+0001 -3.52833965466107E+0001 -3.52894043847345E+0001 -3.52954127981930E+0001 +-3.53014217869981E+0001 -3.53074313511614E+0001 -3.53134414906946E+0001 -3.53194522056094E+0001 -3.53254634959175E+0001 +-3.53314753616305E+0001 -3.53374878027601E+0001 -3.53435008193181E+0001 -3.53495144113160E+0001 -3.53555285787655E+0001 +-3.53615433216783E+0001 -3.53675586400661E+0001 -3.53735745339404E+0001 -3.53795910033130E+0001 -3.53856080481955E+0001 +-3.53916256685995E+0001 -3.53976438645366E+0001 -3.54036626360186E+0001 -3.54096819830570E+0001 -3.54157019056634E+0001 +-3.54217224038495E+0001 -3.54277434776269E+0001 -3.54337651270072E+0001 -3.54397873520020E+0001 -3.54458101526230E+0001 +-3.54518335288817E+0001 -3.54578574807897E+0001 -3.54638820083586E+0001 -3.54699071116001E+0001 -3.54759327905257E+0001 +-3.54819590451470E+0001 -3.54879858754755E+0001 -3.54940132815229E+0001 -3.55000412633008E+0001 -3.55060698208207E+0001 +-3.55120989540941E+0001 -3.55181286631327E+0001 -3.55241589479479E+0001 -3.55301898085514E+0001 -3.55362212449548E+0001 +-3.55422532571694E+0001 -3.55482858452070E+0001 -3.55543190090790E+0001 -3.55603527487971E+0001 -3.55663870643726E+0001 +-3.55724219558172E+0001 -3.55784574231423E+0001 -3.55844934663596E+0001 -3.55905300854805E+0001 -3.55965672805165E+0001 +-3.56026050514791E+0001 -3.56086433983800E+0001 -3.56146823212305E+0001 -3.56207218200421E+0001 -3.56267618948265E+0001 +-3.56328025455950E+0001 -3.56388437723591E+0001 -3.56448855751304E+0001 -3.56509279539203E+0001 -3.56569709087403E+0001 +-3.56630144396020E+0001 -3.56690585465166E+0001 -3.56751032294958E+0001 -3.56811484885510E+0001 -3.56871943236937E+0001 +-3.56932407349352E+0001 -3.56992877222872E+0001 -3.57053352857609E+0001 -3.57113834253680E+0001 -3.57174321411197E+0001 +-3.57234814330276E+0001 -3.57295313011032E+0001 -3.57355817453577E+0001 -3.57416327658027E+0001 -3.57476843624496E+0001 +-3.57537365353097E+0001 -3.57597892843947E+0001 -3.57658426097157E+0001 -3.57718965112844E+0001 -3.57779509891120E+0001 +-3.57840060432099E+0001 -3.57900616735897E+0001 -3.57961178802626E+0001 -3.58021746632400E+0001 -3.58082320225335E+0001 +-3.58142899581542E+0001 -3.58203484701138E+0001 -3.58264075584234E+0001 -3.58324672230945E+0001 -3.58385274641385E+0001 +-3.58445882815667E+0001 -3.58506496753904E+0001 -3.58567116456212E+0001 -3.58627741922703E+0001 -3.58688373153490E+0001 +-3.58749010148688E+0001 -3.58809652908409E+0001 -3.58870301432768E+0001 -3.58930955721877E+0001 -3.58991615775850E+0001 +-3.59052281594800E+0001 -3.59112953178842E+0001 -3.59173630528087E+0001 -3.59234313642649E+0001 -3.59295002522641E+0001 +-3.59355697168177E+0001 -3.59416397579370E+0001 -3.59477103756332E+0001 -3.59537815699177E+0001 -3.59598533408018E+0001 +-3.59659256882967E+0001 -3.59719986124139E+0001 -3.59780721131645E+0001 -3.59841461905598E+0001 -3.59902208446113E+0001 +-3.59962960753300E+0001 -3.60023718827273E+0001 -3.60084482668145E+0001 -3.60145252276028E+0001 -3.60206027651036E+0001 +-3.60266808793280E+0001 -3.60327595702874E+0001 -3.60388388379929E+0001 -3.60449186824559E+0001 -3.60509991036876E+0001 +-3.60570801016992E+0001 -3.60631616765021E+0001 -3.60692438281073E+0001 -3.60753265565262E+0001 -3.60814098617700E+0001 +-3.60874937438499E+0001 -3.60935782027772E+0001 -3.60996632385630E+0001 -3.61057488512186E+0001 -3.61118350407552E+0001 +-3.61179218071840E+0001 -3.61240091505162E+0001 -3.61300970707631E+0001 -3.61361855679357E+0001 -3.61422746420455E+0001 +-3.61483642931034E+0001 -3.61544545211207E+0001 -3.61605453261086E+0001 -3.61666367080783E+0001 -3.61727286670409E+0001 +-3.61788212030077E+0001 -3.61849143159898E+0001 -3.61910080059983E+0001 -3.61971022730445E+0001 -3.62031971171395E+0001 +-3.62092925382945E+0001 -3.62153885365205E+0001 -3.62214851118289E+0001 -3.62275822642306E+0001 -3.62336799937370E+0001 +-3.62397783003590E+0001 -3.62458771841079E+0001 -3.62519766449947E+0001 -3.62580766830307E+0001 -3.62641772982269E+0001 +-3.62702784905945E+0001 -3.62763802601445E+0001 -3.62824826068882E+0001 -3.62885855308366E+0001 -3.62946890320008E+0001 +-3.63007931103919E+0001 -3.63068977660211E+0001 -3.63130029988994E+0001 -3.63191088090379E+0001 -3.63252151964478E+0001 +-3.63313221611401E+0001 -3.63374297031259E+0001 -3.63435378224163E+0001 -3.63496465190223E+0001 -3.63557557929551E+0001 +-3.63618656442257E+0001 -3.63679760728453E+0001 -3.63740870788247E+0001 -3.63801986621752E+0001 -3.63863108229078E+0001 +-3.63924235610334E+0001 -3.63985368765633E+0001 -3.64046507695084E+0001 -3.64107652398798E+0001 -3.64168802876885E+0001 +-3.64229959129456E+0001 -3.64291121156620E+0001 -3.64352288958489E+0001 -3.64413462535173E+0001 -3.64474641886781E+0001 +-3.64535827013424E+0001 -3.64597017915213E+0001 -3.64658214592257E+0001 -3.64719417044666E+0001 -3.64780625272551E+0001 +-3.64841839276022E+0001 -3.64903059055188E+0001 -3.64964284610160E+0001 -3.65025515941047E+0001 -3.65086753047960E+0001 +-3.65147995931008E+0001 -3.65209244590301E+0001 -3.65270499025950E+0001 -3.65331759238063E+0001 -3.65393025226750E+0001 +-3.65454296992122E+0001 -3.65515574534288E+0001 -3.65576857853357E+0001 -3.65638146949439E+0001 -3.65699441822644E+0001 +-3.65760742473082E+0001 -3.65822048900861E+0001 -3.65883361106091E+0001 -3.65944679088882E+0001 -3.66006002849343E+0001 +-3.66067332387584E+0001 -3.66128667703713E+0001 -3.66190008797840E+0001 -3.66251355670075E+0001 -3.66312708320527E+0001 +-3.66374066749304E+0001 -3.66435430956516E+0001 -3.66496800942272E+0001 -3.66558176706681E+0001 -3.66619558249853E+0001 +-3.66680945571896E+0001 -3.66742338672920E+0001 -3.66803737553032E+0001 -3.66865142212343E+0001 -3.66926552650961E+0001 +-3.66987968868995E+0001 -3.67049390866554E+0001 -3.67110818643746E+0001 -3.67172252200681E+0001 -3.67233691537466E+0001 +-3.67295136654212E+0001 -3.67356587551026E+0001 -3.67418044228017E+0001 -3.67479506685295E+0001 -3.67540974922966E+0001 +-3.67602448941140E+0001 -3.67663928739925E+0001 -3.67725414319430E+0001 -3.67786905679764E+0001 -3.67848402821034E+0001 +-3.67909905743349E+0001 -3.67971414446817E+0001 -3.68032928931547E+0001 -3.68094449197647E+0001 -3.68155975245225E+0001 +-3.68217507074389E+0001 -3.68279044685248E+0001 -3.68340588077910E+0001 -3.68402137252482E+0001 -3.68463692209073E+0001 +-3.68525252947790E+0001 -3.68586819468743E+0001 -3.68648391772038E+0001 -3.68709969857785E+0001 -3.68771553726089E+0001 +-3.68833143377061E+0001 -3.68894738810806E+0001 -3.68956340027434E+0001 -3.69017947027052E+0001 -3.69079559809767E+0001 +-3.69141178375688E+0001 -3.69202802724922E+0001 -3.69264432857576E+0001 -3.69326068773759E+0001 -3.69387710473578E+0001 +-3.69449357957140E+0001 -3.69511011224553E+0001 -3.69572670275924E+0001 -3.69634335111361E+0001 -3.69696005730972E+0001 +-3.69757682134863E+0001 -3.69819364323142E+0001 -3.69881052295916E+0001 -3.69942746053293E+0001 -3.70004445595379E+0001 +-3.70066150922283E+0001 -3.70127862034110E+0001 -3.70189578930969E+0001 -3.70251301612967E+0001 -3.70313030080210E+0001 +-3.70374764332805E+0001 -3.70436504370861E+0001 -3.70498250194482E+0001 -3.70560001803777E+0001 -3.70621759198853E+0001 +-3.70683522379816E+0001 -3.70745291346773E+0001 -3.70807066099831E+0001 -3.70868846639097E+0001 -3.70930632964678E+0001 +-3.70992425076680E+0001 -3.71054222975209E+0001 -3.71116026660373E+0001 -3.71177836132279E+0001 -3.71239651391032E+0001 +-3.71301472436740E+0001 -3.71363299269509E+0001 -3.71425131889445E+0001 -3.71486970296655E+0001 -3.71548814491245E+0001 +-3.71610664473322E+0001 -3.71672520242992E+0001 -3.71734381800361E+0001 -3.71796249145536E+0001 -3.71858122278623E+0001 +-3.71920001199728E+0001 -3.71981885908958E+0001 -3.72043776406418E+0001 -3.72105672692215E+0001 -3.72167574766455E+0001 +-3.72229482629243E+0001 -3.72291396280687E+0001 -3.72353315720892E+0001 -3.72415240949963E+0001 -3.72477171968007E+0001 +-3.72539108775130E+0001 -3.72601051371438E+0001 -3.72662999757036E+0001 -3.72724953932031E+0001 -3.72786913896528E+0001 +-3.72848879650632E+0001 -3.72910851194451E+0001 -3.72972828528088E+0001 -3.73034811651650E+0001 -3.73096800565243E+0001 +-3.73158795268972E+0001 -3.73220795762943E+0001 -3.73282802047261E+0001 -3.73344814122032E+0001 -3.73406831987361E+0001 +-3.73468855643353E+0001 -3.73530885090115E+0001 -3.73592920327751E+0001 -3.73654961356366E+0001 -3.73717008176067E+0001 +-3.73779060786958E+0001 -3.73841119189145E+0001 -3.73903183382732E+0001 -3.73965253367825E+0001 -3.74027329144530E+0001 +-3.74089410712950E+0001 -3.74151498073192E+0001 -3.74213591225360E+0001 -3.74275690169560E+0001 -3.74337794905895E+0001 +-3.74399905434473E+0001 -3.74462021755396E+0001 -3.74524143868770E+0001 -3.74586271774700E+0001 -3.74648405473291E+0001 +-3.74710544964648E+0001 -3.74772690248875E+0001 -3.74834841326077E+0001 -3.74896998196358E+0001 -3.74959160859825E+0001 +-3.75021329316580E+0001 -3.75083503566729E+0001 -3.75145683610376E+0001 -3.75207869447626E+0001 -3.75270061078583E+0001 +-3.75332258503352E+0001 -3.75394461722037E+0001 -3.75456670734743E+0001 -3.75518885541573E+0001 -3.75581106142634E+0001 +-3.75643332538027E+0001 -3.75705564727859E+0001 -3.75767802712233E+0001 -3.75830046491254E+0001 -3.75892296065025E+0001 +-3.75954551433651E+0001 -3.76016812597236E+0001 -3.76079079555884E+0001 -3.76141352309699E+0001 -3.76203630858785E+0001 +-3.76265915203246E+0001 -3.76328205343187E+0001 -3.76390501278710E+0001 -3.76452803009921E+0001 -3.76515110536922E+0001 +-3.76577423859818E+0001 -3.76639742978713E+0001 -3.76702067893710E+0001 -3.76764398604913E+0001 -3.76826735112426E+0001 +-3.76889077416352E+0001 -3.76951425516795E+0001 -3.77013779413860E+0001 -3.77076139107648E+0001 -3.77138504598265E+0001 +-3.77200875885813E+0001 -3.77263252970396E+0001 -3.77325635852117E+0001 -3.77388024531081E+0001 -3.77450419007389E+0001 +-3.77512819281147E+0001 -3.77575225352456E+0001 -3.77637637221421E+0001 -3.77700054888144E+0001 -3.77762478352730E+0001 +-3.77824907615280E+0001 -3.77887342675899E+0001 -3.77949783534689E+0001 -3.78012230191754E+0001 -3.78074682647197E+0001 +-3.78137140901121E+0001 -3.78199604953628E+0001 -3.78262074804822E+0001 -3.78324550454806E+0001 -3.78387031903683E+0001 +-3.78449519151555E+0001 -3.78512012198526E+0001 -3.78574511044698E+0001 -3.78637015690175E+0001 -3.78699526135058E+0001 +-3.78762042379452E+0001 -3.78824564423458E+0001 -3.78887092267179E+0001 -3.78949625910718E+0001 -3.79012165354178E+0001 +-3.79074710597660E+0001 -3.79137261641269E+0001 -3.79199818485105E+0001 -3.79262381129273E+0001 -3.79324949573873E+0001 +-3.79387523819010E+0001 -3.79450103864784E+0001 -3.79512689711299E+0001 -3.79575281358657E+0001 -3.79637878806960E+0001 +-3.79700482056311E+0001 -3.79763091106811E+0001 -3.79825705958563E+0001 -3.79888326611670E+0001 -3.79950953066233E+0001 +-3.80013585322354E+0001 -3.80076223380137E+0001 -3.80138867239682E+0001 -3.80201516901091E+0001 -3.80264172364468E+0001 +-3.80326833629913E+0001 -3.80389500697529E+0001 -3.80452173567418E+0001 -3.80514852239681E+0001 -3.80577536714421E+0001 +-3.80640226991740E+0001 -3.80702923071738E+0001 -3.80765624954518E+0001 -3.80828332640182E+0001 -3.80891046128831E+0001 +-3.80953765420568E+0001 -3.81016490515493E+0001 -3.81079221413708E+0001 -3.81141958115316E+0001 -3.81204700620416E+0001 +-3.81267448929112E+0001 -3.81330203041505E+0001 -3.81392962957695E+0001 -3.81455728677785E+0001 -3.81518500201876E+0001 +-3.81581277530070E+0001 -3.81644060662466E+0001 -3.81706849599168E+0001 -3.81769644340276E+0001 -3.81832444885892E+0001 +-3.81895251236116E+0001 -3.81958063391050E+0001 -3.82020881350796E+0001 -3.82083705115453E+0001 -3.82146534685124E+0001 +-3.82209370059910E+0001 -3.82272211239911E+0001 -3.82335058225228E+0001 -3.82397911015963E+0001 -3.82460769612217E+0001 +-3.82523634014090E+0001 -3.82586504221683E+0001 -3.82649380235097E+0001 -3.82712262054434E+0001 -3.82775149679793E+0001 +-3.82838043111276E+0001 -3.82900942348984E+0001 -3.82963847393016E+0001 -3.83026758243474E+0001 -3.83089674900459E+0001 +-3.83152597364071E+0001 -3.83215525634411E+0001 -3.83278459711578E+0001 -3.83341399595675E+0001 -3.83404345286801E+0001 +-3.83467296785057E+0001 -3.83530254090543E+0001 -3.83593217203359E+0001 -3.83656186123607E+0001 -3.83719160851386E+0001 +-3.83782141386797E+0001 -3.83845127729940E+0001 -3.83908119880915E+0001 -3.83971117839823E+0001 -3.84034121606763E+0001 +-3.84097131181837E+0001 -3.84160146565144E+0001 -3.84223167756784E+0001 -3.84286194756857E+0001 -3.84349227565464E+0001 +-3.84412266182704E+0001 -3.84475310608678E+0001 -3.84538360843485E+0001 -3.84601416887225E+0001 -3.84664478739999E+0001 +-3.84727546401906E+0001 -3.84790619873046E+0001 -3.84853699153518E+0001 -3.84916784243424E+0001 -3.84979875142862E+0001 +-3.85042971851932E+0001 -3.85106074370733E+0001 -3.85169182699367E+0001 -3.85232296837931E+0001 -3.85295416786527E+0001 +-3.85358542545253E+0001 -3.85421674114208E+0001 -3.85484811493494E+0001 -3.85547954683208E+0001 -3.85611103683451E+0001 +-3.85674258494321E+0001 -3.85737419115919E+0001 -3.85800585548344E+0001 -3.85863757791694E+0001 -3.85926935846071E+0001 +-3.85990119711571E+0001 -3.86053309388296E+0001 -3.86116504876344E+0001 -3.86179706175814E+0001 -3.86242913286806E+0001 +-3.86306126209419E+0001 -3.86369344943751E+0001 -3.86432569489903E+0001 -3.86495799847972E+0001 -3.86559036018058E+0001 +-3.86622278000261E+0001 -3.86685525794678E+0001 -3.86748779401410E+0001 -3.86812038820554E+0001 -3.86875304052210E+0001 +-3.86938575096476E+0001 -3.87001851953452E+0001 -3.87065134623236E+0001 -3.87128423105927E+0001 -3.87191717401624E+0001 +-3.87255017510425E+0001 -3.87318323432430E+0001 -3.87381635167736E+0001 -3.87444952716442E+0001 -3.87508276078648E+0001 +-3.87571605254451E+0001 -3.87634940243950E+0001 -3.87698281047243E+0001 -3.87761627664430E+0001 -3.87824980095608E+0001 +-3.87888338340876E+0001 -3.87951702400333E+0001 -3.88015072274076E+0001 -3.88078447962204E+0001 -3.88141829464815E+0001 +-3.88205216782008E+0001 -3.88268609913881E+0001 -3.88332008860532E+0001 -3.88395413622059E+0001 -3.88458824198561E+0001 +-3.88522240590134E+0001 -3.88585662796879E+0001 -3.88649090818892E+0001 -3.88712524656272E+0001 -3.88775964309117E+0001 +-3.88839409777524E+0001 -3.88902861061592E+0001 -3.88966318161419E+0001 -3.89029781077102E+0001 -3.89093249808740E+0001 +-3.89156724356429E+0001 -3.89220204720269E+0001 -3.89283690900356E+0001 -3.89347182896789E+0001 -3.89410680709666E+0001 +-3.89474184339083E+0001 -3.89537693785139E+0001 -3.89601209047931E+0001 -3.89664730127557E+0001 -3.89728257024115E+0001 +-3.89791789737701E+0001 -3.89855328268414E+0001 -3.89918872616352E+0001 -3.89982422781610E+0001 -3.90045978764288E+0001 +-3.90109540564482E+0001 -3.90173108182289E+0001 -3.90236681617808E+0001 -3.90300260871135E+0001 -3.90363845942368E+0001 +-3.90427436831604E+0001 -3.90491033538940E+0001 -3.90554636064473E+0001 -3.90618244408301E+0001 -3.90681858570520E+0001 +-3.90745478551229E+0001 -3.90809104350523E+0001 -3.90872735968501E+0001 -3.90936373405258E+0001 -3.91000016660893E+0001 +-3.91063665735502E+0001 -3.91127320629181E+0001 -3.91190981342029E+0001 -3.91254647874141E+0001 -3.91318320225615E+0001 +-3.91381998396548E+0001 -3.91445682387036E+0001 -3.91509372197176E+0001 -3.91573067827065E+0001 -3.91636769276799E+0001 +-3.91700476546476E+0001 -3.91764189636192E+0001 -3.91827908546043E+0001 -3.91891633276127E+0001 -3.91955363826539E+0001 +-3.92019100197377E+0001 -3.92082842388736E+0001 -3.92146590400714E+0001 -3.92210344233407E+0001 -3.92274103886911E+0001 +-3.92337869361322E+0001 -3.92401640656738E+0001 -3.92465417773254E+0001 -3.92529200710967E+0001 -3.92592989469973E+0001 +-3.92656784050369E+0001 -3.92720584452250E+0001 -3.92784390675712E+0001 -3.92848202720853E+0001 -3.92912020587768E+0001 +-3.92975844276553E+0001 -3.93039673787304E+0001 -3.93103509120119E+0001 -3.93167350275091E+0001 -3.93231197252318E+0001 +-3.93295050051896E+0001 -3.93358908673920E+0001 -3.93422773118486E+0001 -3.93486643385691E+0001 -3.93550519475630E+0001 +-3.93614401388399E+0001 -3.93678289124094E+0001 -3.93742182682810E+0001 -3.93806082064644E+0001 -3.93869987269691E+0001 +-3.93933898298047E+0001 -3.93997815149808E+0001 -3.94061737825069E+0001 -3.94125666323926E+0001 -3.94189600646474E+0001 +-3.94253540792809E+0001 -3.94317486763027E+0001 -3.94381438557222E+0001 -3.94445396175492E+0001 -3.94509359617930E+0001 +-3.94573328884633E+0001 -3.94637303975696E+0001 -3.94701284891214E+0001 -3.94765271631283E+0001 -3.94829264195997E+0001 +-3.94893262585453E+0001 -3.94957266799745E+0001 -3.95021276838969E+0001 -3.95085292703220E+0001 -3.95149314392593E+0001 +-3.95213341907183E+0001 -3.95277375247086E+0001 -3.95341414412396E+0001 -3.95405459403209E+0001 -3.95469510219619E+0001 +-3.95533566861722E+0001 -3.95597629329613E+0001 -3.95661697623386E+0001 -3.95725771743136E+0001 -3.95789851688959E+0001 +-3.95853937460950E+0001 -3.95918029059202E+0001 -3.95982126483812E+0001 -3.96046229734873E+0001 -3.96110338812481E+0001 +-3.96174453716730E+0001 -3.96238574447714E+0001 -3.96302701005530E+0001 -3.96366833390271E+0001 -3.96430971602032E+0001 +-3.96495115640907E+0001 -3.96559265506992E+0001 -3.96623421200380E+0001 -3.96687582721167E+0001 -3.96751750069446E+0001 +-3.96815923245312E+0001 -3.96880102248860E+0001 -3.96944287080184E+0001 -3.97008477739379E+0001 -3.97072674226538E+0001 +-3.97136876541756E+0001 -3.97201084685127E+0001 -3.97265298656747E+0001 -3.97329518456708E+0001 -3.97393744085105E+0001 +-3.97457975542032E+0001 -3.97522212827584E+0001 -3.97586455941855E+0001 -3.97650704884938E+0001 -3.97714959656929E+0001 +-3.97779220257919E+0001 -3.97843486688005E+0001 -3.97907758947280E+0001 -3.97972037035838E+0001 -3.98036320953772E+0001 +-3.98100610701177E+0001 -3.98164906278147E+0001 -3.98229207684775E+0001 -3.98293514921156E+0001 -3.98357827987382E+0001 +-3.98422146883549E+0001 -3.98486471609749E+0001 -3.98550802166077E+0001 -3.98615138552625E+0001 -3.98679480769489E+0001 +-3.98743828816761E+0001 -3.98808182694535E+0001 -3.98872542402905E+0001 -3.98936907941963E+0001 -3.99001279311805E+0001 +-3.99065656512523E+0001 -3.99130039544210E+0001 -3.99194428406961E+0001 -3.99258823100868E+0001 -3.99323223626026E+0001 +-3.99387629982526E+0001 -3.99452042170464E+0001 -3.99516460189932E+0001 -3.99580884041023E+0001 -3.99645313723830E+0001 +-3.99709749238448E+0001 -3.99774190584968E+0001 -3.99838637763485E+0001 -3.99903090774092E+0001 -3.99967549616881E+0001 +-4.00032014291945E+0001 -4.00096484799379E+0001 -4.00160961139274E+0001 -4.00225443311724E+0001 -4.00289931316822E+0001 +-4.00354425154661E+0001 -4.00418924825334E+0001 -4.00483430328933E+0001 -4.00547941665552E+0001 -4.00612458835283E+0001 +-4.00676981838220E+0001 -4.00741510674454E+0001 -4.00806045344080E+0001 -4.00870585847189E+0001 -4.00935132183875E+0001 +-4.00999684354230E+0001 -4.01064242358346E+0001 -4.01128806196317E+0001 -4.01193375868235E+0001 -4.01257951374192E+0001 +-4.01322532714282E+0001 -4.01387119888597E+0001 -4.01451712897229E+0001 -4.01516311740270E+0001 -4.01580916417814E+0001 +-4.01645526929953E+0001 -4.01710143276778E+0001 -4.01774765458384E+0001 -4.01839393474860E+0001 -4.01904027326302E+0001 +-4.01968667012799E+0001 -4.02033312534446E+0001 -4.02097963891333E+0001 -4.02162621083554E+0001 -4.02227284111199E+0001 +-4.02291952974363E+0001 -4.02356627673136E+0001 -4.02421308207612E+0001 -4.02485994577881E+0001 -4.02550686784036E+0001 +-4.02615384826169E+0001 -4.02680088704373E+0001 -4.02744798418738E+0001 -4.02809513969358E+0001 -4.02874235356323E+0001 +-4.02938962579727E+0001 -4.03003695639660E+0001 -4.03068434536215E+0001 -4.03133179269483E+0001 -4.03197929839556E+0001 +-4.03262686246527E+0001 -4.03327448490486E+0001 -4.03392216571526E+0001 -4.03456990489738E+0001 -4.03521770245214E+0001 +-4.03586555838045E+0001 -4.03651347268324E+0001 -4.03716144536141E+0001 -4.03780947641588E+0001 -4.03845756584758E+0001 +-4.03910571365740E+0001 -4.03975391984628E+0001 -4.04040218441512E+0001 -4.04105050736483E+0001 -4.04169888869634E+0001 +-4.04234732841056E+0001 -4.04299582650839E+0001 -4.04364438299075E+0001 -4.04429299785856E+0001 -4.04494167111273E+0001 +-4.04559040275416E+0001 -4.04623919278379E+0001 -4.04688804120250E+0001 -4.04753694801122E+0001 -4.04818591321086E+0001 +-4.04883493680233E+0001 -4.04948401878654E+0001 -4.05013315916440E+0001 -4.05078235793682E+0001 -4.05143161510471E+0001 +-4.05208093066899E+0001 -4.05273030463055E+0001 -4.05337973699032E+0001 -4.05402922774919E+0001 -4.05467877690809E+0001 +-4.05532838446791E+0001 -4.05597805042956E+0001 -4.05662777479396E+0001 -4.05727755756201E+0001 -4.05792739873462E+0001 +-4.05857729831270E+0001 -4.05922725629715E+0001 -4.05987727268888E+0001 -4.06052734748879E+0001 -4.06117748069780E+0001 +-4.06182767231681E+0001 -4.06247792234672E+0001 -4.06312823078844E+0001 -4.06377859764288E+0001 -4.06442902291094E+0001 +-4.06507950659352E+0001 -4.06573004869153E+0001 -4.06638064920588E+0001 -4.06703130813746E+0001 -4.06768202548719E+0001 +-4.06833280125596E+0001 -4.06898363544468E+0001 -4.06963452805425E+0001 -4.07028547908557E+0001 -4.07093648853955E+0001 +-4.07158755641709E+0001 -4.07223868271908E+0001 -4.07288986744644E+0001 -4.07354111060006E+0001 -4.07419241218085E+0001 +-4.07484377218970E+0001 -4.07549519062752E+0001 -4.07614666749520E+0001 -4.07679820279365E+0001 -4.07744979652377E+0001 +-4.07810144868645E+0001 -4.07875315928259E+0001 -4.07940492831310E+0001 -4.08005675577887E+0001 -4.08070864168081E+0001 +-4.08136058601980E+0001 -4.08201258879675E+0001 -4.08266465001256E+0001 -4.08331676966812E+0001 -4.08396894776433E+0001 +-4.08462118430209E+0001 -4.08527347928229E+0001 -4.08592583270583E+0001 -4.08657824457361E+0001 -4.08723071488652E+0001 +-4.08788324364546E+0001 -4.08853583085132E+0001 -4.08918847650501E+0001 -4.08984118060741E+0001 -4.09049394315941E+0001 +-4.09114676416192E+0001 -4.09179964361583E+0001 -4.09245258152203E+0001 -4.09310557788142E+0001 -4.09375863269488E+0001 +-4.09441174596332E+0001 -4.09506491768762E+0001 -4.09571814786868E+0001 -4.09637143650739E+0001 -4.09702478360464E+0001 +-4.09767818916133E+0001 -4.09833165317834E+0001 -4.09898517565657E+0001 -4.09963875659691E+0001 -4.10029239600025E+0001 +-4.10094609386748E+0001 -4.10159985019949E+0001 -4.10225366499717E+0001 -4.10290753826141E+0001 -4.10356146999310E+0001 +-4.10421546019314E+0001 -4.10486950886240E+0001 -4.10552361600178E+0001 -4.10617778161216E+0001 -4.10683200569444E+0001 +-4.10748628824951E+0001 -4.10814062927824E+0001 -4.10879502878154E+0001 -4.10944948676028E+0001 -4.11010400321535E+0001 +-4.11075857814764E+0001 -4.11141321155804E+0001 -4.11206790344744E+0001 -4.11272265381671E+0001 -4.11337746266675E+0001 +-4.11403232999844E+0001 -4.11468725581267E+0001 -4.11534224011031E+0001 -4.11599728289227E+0001 -4.11665238415941E+0001 +-4.11730754391263E+0001 -4.11796276215281E+0001 -4.11861803888084E+0001 -4.11927337409759E+0001 -4.11992876780395E+0001 +-4.12058422000080E+0001 -4.12123973068903E+0001 -4.12189529986952E+0001 -4.12255092754315E+0001 -4.12320661371081E+0001 +-4.12386235837337E+0001 -4.12451816153172E+0001 -4.12517402318674E+0001 -4.12582994333930E+0001 -4.12648592199030E+0001 +-4.12714195914061E+0001 -4.12779805479111E+0001 -4.12845420894269E+0001 -4.12911042159621E+0001 -4.12976669275257E+0001 +-4.13042302241264E+0001 -4.13107941057729E+0001 -4.13173585724742E+0001 -4.13239236242389E+0001 -4.13304892610759E+0001 +-4.13370554829940E+0001 -4.13436222900018E+0001 -4.13501896821083E+0001 -4.13567576593221E+0001 -4.13633262216521E+0001 +-4.13698953691070E+0001 -4.13764651016956E+0001 -4.13830354194266E+0001 -4.13896063223088E+0001 -4.13961778103510E+0001 +-4.14027498835620E+0001 -4.14093225419503E+0001 -4.14158957855250E+0001 -4.14224696142946E+0001 -4.14290440282679E+0001 +-4.14356190274537E+0001 -4.14421946118607E+0001 -4.14487707814977E+0001 -4.14553475363734E+0001 -4.14619248764964E+0001 +-4.14685028018757E+0001 -4.14750813125198E+0001 -4.14816604084376E+0001 -4.14882400896376E+0001 -4.14948203561288E+0001 +-4.15014012079197E+0001 -4.15079826450192E+0001 -4.15145646674358E+0001 -4.15211472751784E+0001 -4.15277304682556E+0001 +-4.15343142466762E+0001 -4.15408986104488E+0001 -4.15474835595822E+0001 -4.15540690940850E+0001 -4.15606552139660E+0001 +-4.15672419192338E+0001 -4.15738292098971E+0001 -4.15804170859647E+0001 -4.15870055474453E+0001 -4.15935945943474E+0001 +-4.16001842266798E+0001 -4.16067744444512E+0001 -4.16133652476702E+0001 -4.16199566363456E+0001 -4.16265486104860E+0001 +-4.16331411701000E+0001 -4.16397343151964E+0001 -4.16463280457838E+0001 -4.16529223618708E+0001 -4.16595172634662E+0001 +-4.16661127505786E+0001 -4.16727088232166E+0001 -4.16793054813889E+0001 -4.16859027251042E+0001 -4.16925005543711E+0001 +-4.16990989691982E+0001 -4.17056979695942E+0001 -4.17122975555678E+0001 -4.17188977271275E+0001 -4.17254984842820E+0001 +-4.17320998270400E+0001 -4.17387017554101E+0001 -4.17453042694009E+0001 -4.17519073690210E+0001 -4.17585110542791E+0001 +-4.17651153251838E+0001 -4.17717201817436E+0001 -4.17783256239673E+0001 -4.17849316518635E+0001 -4.17915382654407E+0001 +-4.17981454647075E+0001 -4.18047532496726E+0001 -4.18113616203446E+0001 -4.18179705767321E+0001 -4.18245801188437E+0001 +-4.18311902466879E+0001 -4.18378009602735E+0001 -4.18444122596089E+0001 -4.18510241447027E+0001 -4.18576366155636E+0001 +-4.18642496722002E+0001 -4.18708633146209E+0001 -4.18774775428345E+0001 -4.18840923568494E+0001 -4.18907077566744E+0001 +-4.18973237423178E+0001 -4.19039403137884E+0001 -4.19105574710946E+0001 -4.19171752142451E+0001 -4.19237935432484E+0001 +-4.19304124581130E+0001 -4.19370319588476E+0001 -4.19436520454607E+0001 -4.19502727179608E+0001 -4.19568939763565E+0001 +-4.19635158206564E+0001 -4.19701382508690E+0001 -4.19767612670028E+0001 -4.19833848690664E+0001 -4.19900090570683E+0001 +-4.19966338310171E+0001 -4.20032591909214E+0001 -4.20098851367895E+0001 -4.20165116686301E+0001 -4.20231387864517E+0001 +-4.20297664902629E+0001 -4.20363947800721E+0001 -4.20430236558878E+0001 -4.20496531177187E+0001 -4.20562831655731E+0001 +-4.20629137994597E+0001 -4.20695450193870E+0001 -4.20761768253633E+0001 -4.20828092173974E+0001 -4.20894421954976E+0001 +-4.20960757596724E+0001 -4.21027099099305E+0001 -4.21093446462801E+0001 -4.21159799687300E+0001 -4.21226158772885E+0001 +-4.21292523719641E+0001 -4.21358894527654E+0001 -4.21425271197008E+0001 -4.21491653727788E+0001 -4.21558042120079E+0001 +-4.21624436373966E+0001 -4.21690836489533E+0001 -4.21757242466865E+0001 -4.21823654306047E+0001 -4.21890072007164E+0001 +-4.21956495570300E+0001 -4.22022924995540E+0001 -4.22089360282969E+0001 -4.22155801432671E+0001 -4.22222248444730E+0001 +-4.22288701319232E+0001 -4.22355160056261E+0001 -4.22421624655901E+0001 -4.22488095118237E+0001 -4.22554571443354E+0001 +-4.22621053631335E+0001 -4.22687541682265E+0001 -4.22754035596229E+0001 -4.22820535373311E+0001 -4.22887041013595E+0001 +-4.22953552517166E+0001 -4.23020069884108E+0001 -4.23086593114505E+0001 -4.23153122208441E+0001 -4.23219657166001E+0001 +-4.23286197987269E+0001 -4.23352744672330E+0001 -4.23419297221266E+0001 -4.23485855634163E+0001 -4.23552419911104E+0001 +-4.23618990052175E+0001 -4.23685566057457E+0001 -4.23752147927037E+0001 -4.23818735660997E+0001 -4.23885329259422E+0001 +-4.23951928722395E+0001 -4.24018534050002E+0001 -4.24085145242325E+0001 -4.24151762299448E+0001 -4.24218385221456E+0001 +-4.24285014008432E+0001 -4.24351648660461E+0001 -4.24418289177625E+0001 -4.24484935560009E+0001 -4.24551587807696E+0001 +-4.24618245920771E+0001 -4.24684909899316E+0001 -4.24751579743416E+0001 -4.24818255453154E+0001 -4.24884937028615E+0001 +-4.24951624469880E+0001 -4.25018317777036E+0001 -4.25085016950163E+0001 -4.25151721989348E+0001 -4.25218432894672E+0001 +-4.25285149666219E+0001 -4.25351872304073E+0001 -4.25418600808318E+0001 -4.25485335179036E+0001 -4.25552075416312E+0001 +-4.25618821520228E+0001 -4.25685573490868E+0001 -4.25752331328315E+0001 -4.25819095032653E+0001 -4.25885864603965E+0001 +-4.25952640042335E+0001 -4.26019421347844E+0001 -4.26086208520578E+0001 -4.26153001560618E+0001 -4.26219800468049E+0001 +-4.26286605242952E+0001 -4.26353415885413E+0001 -4.26420232395512E+0001 -4.26487054773335E+0001 -4.26553883018963E+0001 +-4.26620717132480E+0001 -4.26687557113969E+0001 -4.26754402963512E+0001 -4.26821254681194E+0001 -4.26888112267096E+0001 +-4.26954975721302E+0001 -4.27021845043894E+0001 -4.27088720234956E+0001 -4.27155601294570E+0001 -4.27222488222820E+0001 +-4.27289381019787E+0001 -4.27356279685556E+0001 -4.27423184220208E+0001 -4.27490094623826E+0001 -4.27557010896494E+0001 +-4.27623933038293E+0001 -4.27690861049307E+0001 -4.27757794929618E+0001 -4.27824734679309E+0001 -4.27891680298462E+0001 +-4.27958631787161E+0001 -4.28025589145487E+0001 -4.28092552373523E+0001 -4.28159521471352E+0001 -4.28226496439056E+0001 +-4.28293477276717E+0001 -4.28360463984419E+0001 -4.28427456562244E+0001 -4.28494455010273E+0001 -4.28561459328590E+0001 +-4.28628469517276E+0001 -4.28695485576415E+0001 -4.28762507506088E+0001 -4.28829535306377E+0001 -4.28896568977366E+0001 +-4.28963608519136E+0001 -4.29030653931769E+0001 -4.29097705215348E+0001 -4.29164762369955E+0001 -4.29231825395672E+0001 +-4.29298894292582E+0001 -4.29365969060765E+0001 -4.29433049700305E+0001 -4.29500136211283E+0001 -4.29567228593782E+0001 +-4.29634326847884E+0001 -4.29701430973670E+0001 -4.29768540971223E+0001 -4.29835656840624E+0001 -4.29902778581956E+0001 +-4.29969906195299E+0001 -4.30037039680738E+0001 -4.30104179038352E+0001 -4.30171324268225E+0001 -4.30238475370437E+0001 +-4.30305632345071E+0001 -4.30372795192208E+0001 -4.30439963911931E+0001 -4.30507138504320E+0001 -4.30574318969458E+0001 +-4.30641505307427E+0001 -4.30708697518307E+0001 -4.30775895602181E+0001 -4.30843099559130E+0001 -4.30910309389236E+0001 +-4.30977525092581E+0001 -4.31044746669246E+0001 -4.31111974119312E+0001 -4.31179207442861E+0001 -4.31246446639975E+0001 +-4.31313691710735E+0001 -4.31380942655222E+0001 -4.31448199473518E+0001 -4.31515462165705E+0001 -4.31582730731863E+0001 +-4.31650005172075E+0001 -4.31717285486420E+0001 -4.31784571674982E+0001 -4.31851863737840E+0001 -4.31919161675077E+0001 +-4.31986465486773E+0001 -4.32053775173010E+0001 -4.32121090733869E+0001 -4.32188412169430E+0001 -4.32255739479777E+0001 +-4.32323072664988E+0001 -4.32390411725147E+0001 -4.32457756660332E+0001 -4.32525107470627E+0001 -4.32592464156111E+0001 +-4.32659826716866E+0001 -4.32727195152973E+0001 -4.32794569464512E+0001 -4.32861949651566E+0001 -4.32929335714214E+0001 +-4.32996727652537E+0001 -4.33064125466617E+0001 -4.33131529156534E+0001 -4.33198938722369E+0001 -4.33266354164204E+0001 +-4.33333775482118E+0001 -4.33401202676193E+0001 -4.33468635746509E+0001 -4.33536074693147E+0001 -4.33603519516188E+0001 +-4.33670970215713E+0001 -4.33738426791802E+0001 -4.33805889244535E+0001 -4.33873357573994E+0001 -4.33940831780260E+0001 +-4.34008311863411E+0001 -4.34075797823530E+0001 -4.34143289660697E+0001 -4.34210787374992E+0001 -4.34278290966496E+0001 +-4.34345800435289E+0001 -4.34413315781452E+0001 -4.34480837005064E+0001 -4.34548364106208E+0001 -4.34615897084962E+0001 +-4.34683435941408E+0001 -4.34750980675625E+0001 -4.34818531287694E+0001 -4.34886087777695E+0001 -4.34953650145710E+0001 +-4.35021218391816E+0001 -4.35088792516096E+0001 -4.35156372518629E+0001 -4.35223958399496E+0001 -4.35291550158776E+0001 +-4.35359147796550E+0001 -4.35426751312897E+0001 -4.35494360707899E+0001 -4.35561975981635E+0001 -4.35629597134185E+0001 +-4.35697224165629E+0001 -4.35764857076047E+0001 -4.35832495865519E+0001 -4.35900140534126E+0001 -4.35967791081946E+0001 +-4.36035447509061E+0001 -4.36103109815550E+0001 -4.36170778001492E+0001 -4.36238452066968E+0001 -4.36306132012058E+0001 +-4.36373817836841E+0001 -4.36441509541397E+0001 -4.36509207125806E+0001 -4.36576910590148E+0001 -4.36644619934502E+0001 +-4.36712335158948E+0001 -4.36780056263566E+0001 -4.36847783248436E+0001 -4.36915516113637E+0001 -4.36983254859248E+0001 +-4.37050999485350E+0001 -4.37118749992022E+0001 -4.37186506379344E+0001 -4.37254268647394E+0001 -4.37322036796253E+0001 +-4.37389810826000E+0001 -4.37457590736715E+0001 -4.37525376528476E+0001 -4.37593168201364E+0001 -4.37660965755458E+0001 +-4.37728769190838E+0001 -4.37796578507582E+0001 -4.37864393705769E+0001 -4.37932214785480E+0001 -4.38000041746794E+0001 +-4.38067874589790E+0001 -4.38135713314546E+0001 -4.38203557921143E+0001 -4.38271408409660E+0001 -4.38339264780175E+0001 +-4.38407127032768E+0001 -4.38474995167519E+0001 -4.38542869184506E+0001 -4.38610749083808E+0001 -4.38678634865504E+0001 +-4.38746526529674E+0001 -4.38814424076397E+0001 -4.38882327505751E+0001 -4.38950236817815E+0001 -4.39018152012670E+0001 +-4.39086073090393E+0001 -4.39154000051063E+0001 -4.39221932894760E+0001 -4.39289871621561E+0001 -4.39357816231548E+0001 +-4.39425766724797E+0001 -4.39493723101388E+0001 -4.39561685361399E+0001 -4.39629653504911E+0001 -4.39697627532000E+0001 +-4.39765607442746E+0001 -4.39833593237228E+0001 -4.39901584915524E+0001 -4.39969582477714E+0001 -4.40037585923875E+0001 +-4.40105595254087E+0001 -4.40173610468428E+0001 -4.40241631566976E+0001 -4.40309658549810E+0001 -4.40377691417009E+0001 +-4.40445730168652E+0001 -4.40513774804816E+0001 -4.40581825325581E+0001 -4.40649881731024E+0001 -4.40717944021225E+0001 +-4.40786012196261E+0001 -4.40854086256211E+0001 -4.40922166201154E+0001 -4.40990252031167E+0001 -4.41058343746330E+0001 +-4.41126441346720E+0001 -4.41194544832416E+0001 -4.41262654203496E+0001 -4.41330769460038E+0001 -4.41398890602121E+0001 +-4.41467017629823E+0001 -4.41535150543221E+0001 -4.41603289342395E+0001 -4.41671434027422E+0001 -4.41739584598381E+0001 +-4.41807741055349E+0001 -4.41875903398405E+0001 -4.41944071627626E+0001 -4.42012245743091E+0001 -4.42080425744878E+0001 +-4.42148611633065E+0001 -4.42216803407730E+0001 -4.42285001068951E+0001 -4.42353204616805E+0001 -4.42421414051371E+0001 +-4.42489629372726E+0001 -4.42557850580949E+0001 -4.42626077676117E+0001 -4.42694310658308E+0001 -4.42762549527600E+0001 +-4.42830794284071E+0001 -4.42899044927799E+0001 -4.42967301458861E+0001 -4.43035563877335E+0001 -4.43103832183298E+0001 +-4.43172106376829E+0001 -4.43240386458005E+0001 -4.43308672426904E+0001 -4.43376964283603E+0001 -4.43445262028181E+0001 +-4.43513565660713E+0001 -4.43581875181280E+0001 -4.43650190589956E+0001 -4.43718511886821E+0001 -4.43786839071952E+0001 +-4.43855172145426E+0001 -4.43923511107321E+0001 -4.43991855957714E+0001 -4.44060206696682E+0001 -4.44128563324304E+0001 +-4.44196925840655E+0001 -4.44265294245815E+0001 -4.44333668539859E+0001 -4.44402048722866E+0001 -4.44470434794913E+0001 +-4.44538826756076E+0001 -4.44607224606434E+0001 -4.44675628346064E+0001 -4.44744037975042E+0001 -4.44812453493445E+0001 +-4.44880874901352E+0001 -4.44949302198839E+0001 -4.45017735385984E+0001 -4.45086174462863E+0001 -4.45154619429553E+0001 +-4.45223070286132E+0001 -4.45291527032677E+0001 -4.45359989669264E+0001 -4.45428458195972E+0001 -4.45496932612875E+0001 +-4.45565412920053E+0001 -4.45633899117581E+0001 -4.45702391205537E+0001 -4.45770889183997E+0001 -4.45839393053039E+0001 +-4.45907902812738E+0001 -4.45976418463173E+0001 -4.46044940004419E+0001 -4.46113467436555E+0001 -4.46182000759656E+0001 +-4.46250539973799E+0001 -4.46319085079061E+0001 -4.46387636075518E+0001 -4.46456192963248E+0001 -4.46524755742328E+0001 +-4.46593324412833E+0001 -4.46661898974840E+0001 -4.46730479428426E+0001 -4.46799065773668E+0001 -4.46867658010642E+0001 +-4.46936256139425E+0001 -4.47004860160093E+0001 -4.47073470072723E+0001 -4.47142085877392E+0001 -4.47210707574175E+0001 +-4.47279335163149E+0001 -4.47347968644391E+0001 -4.47416608017977E+0001 -4.47485253283983E+0001 -4.47553904442487E+0001 +-4.47622561493563E+0001 -4.47691224437289E+0001 -4.47759893273741E+0001 -4.47828568002995E+0001 -4.47897248625128E+0001 +-4.47965935140215E+0001 -4.48034627548333E+0001 -4.48103325849559E+0001 -4.48172030043967E+0001 -4.48240740131635E+0001 +-4.48309456112639E+0001 -4.48378177987055E+0001 -4.48446905754958E+0001 -4.48515639416426E+0001 -4.48584378971533E+0001 +-4.48653124420357E+0001 -4.48721875762972E+0001 -4.48790632999456E+0001 -4.48859396129884E+0001 -4.48928165154332E+0001 +-4.48996940072876E+0001 -4.49065720885592E+0001 -4.49134507592556E+0001 -4.49203300193844E+0001 -4.49272098689531E+0001 +-4.49340903079694E+0001 -4.49409713364408E+0001 -4.49478529543750E+0001 -4.49547351617794E+0001 -4.49616179586617E+0001 +-4.49685013450294E+0001 -4.49753853208901E+0001 -4.49822698862515E+0001 -4.49891550411210E+0001 -4.49960407855062E+0001 +-4.50029271194147E+0001 -4.50098140428540E+0001 -4.50167015558318E+0001 -4.50235896583555E+0001 -4.50304783504327E+0001 +-4.50373676320711E+0001 -4.50442575032780E+0001 -4.50511479640612E+0001 -4.50580390144281E+0001 -4.50649306543862E+0001 +-4.50718228839432E+0001 -4.50787157031065E+0001 -4.50856091118838E+0001 -4.50925031102825E+0001 -4.50993976983101E+0001 +-4.51062928759743E+0001 -4.51131886432826E+0001 -4.51200850002424E+0001 -4.51269819468613E+0001 -4.51338794831469E+0001 +-4.51407776091066E+0001 -4.51476763247480E+0001 -4.51545756300786E+0001 -4.51614755251059E+0001 -4.51683760098375E+0001 +-4.51752770842808E+0001 -4.51821787484434E+0001 -4.51890810023328E+0001 -4.51959838459564E+0001 -4.52028872793218E+0001 +-4.52097913024365E+0001 -4.52166959153081E+0001 -4.52236011179439E+0001 -4.52305069103515E+0001 -4.52374132925384E+0001 +-4.52443202645122E+0001 -4.52512278262801E+0001 -4.52581359778499E+0001 -4.52650447192289E+0001 -4.52719540504247E+0001 +-4.52788639714447E+0001 -4.52857744822964E+0001 -4.52926855829874E+0001 -4.52995972735250E+0001 -4.53065095539167E+0001 +-4.53134224241701E+0001 -4.53203358842926E+0001 -4.53272499342916E+0001 -4.53341645741747E+0001 -4.53410798039493E+0001 +-4.53479956236229E+0001 -4.53549120332030E+0001 -4.53618290326969E+0001 -4.53687466221121E+0001 -4.53756648014562E+0001 +-4.53825835707366E+0001 -4.53895029299607E+0001 -4.53964228791359E+0001 -4.54033434182698E+0001 -4.54102645473698E+0001 +-4.54171862664432E+0001 -4.54241085754976E+0001 -4.54310314745405E+0001 -4.54379549635791E+0001 -4.54448790426211E+0001 +-4.54518037116738E+0001 -4.54587289707446E+0001 -4.54656548198410E+0001 -4.54725812589704E+0001 -4.54795082881402E+0001 +-4.54864359073579E+0001 -4.54933641166309E+0001 -4.55002929159666E+0001 -4.55072223053724E+0001 -4.55141522848558E+0001 +-4.55210828544241E+0001 -4.55280140140848E+0001 -4.55349457638453E+0001 -4.55418781037130E+0001 -4.55488110336953E+0001 +-4.55557445537996E+0001 -4.55626786640333E+0001 -4.55696133644039E+0001 -4.55765486549187E+0001 -4.55834845355851E+0001 +-4.55904210064105E+0001 -4.55973580674023E+0001 -4.56042957185679E+0001 -4.56112339599147E+0001 -4.56181727914501E+0001 +-4.56251122131815E+0001 -4.56320522251162E+0001 -4.56389928272616E+0001 -4.56459340196252E+0001 -4.56528758022143E+0001 +-4.56598181750362E+0001 -4.56667611380984E+0001 -4.56737046914082E+0001 -4.56806488349730E+0001 -4.56875935688001E+0001 +-4.56945388928970E+0001 -4.57014848072710E+0001 -4.57084313119295E+0001 -4.57153784068797E+0001 -4.57223260921292E+0001 +-4.57292743676851E+0001 -4.57362232335550E+0001 -4.57431726897461E+0001 -4.57501227362658E+0001 -4.57570733731215E+0001 +-4.57640246003205E+0001 -4.57709764178701E+0001 -4.57779288257777E+0001 -4.57848818240506E+0001 -4.57918354126962E+0001 +-4.57987895917218E+0001 -4.58057443611347E+0001 -4.58126997209423E+0001 -4.58196556711519E+0001 -4.58266122117709E+0001 +-4.58335693428065E+0001 -4.58405270642662E+0001 -4.58474853761572E+0001 -4.58544442784868E+0001 -4.58614037712623E+0001 +-4.58683638544912E+0001 -4.58753245281807E+0001 -4.58822857923380E+0001 -4.58892476469706E+0001 -4.58962100920858E+0001 +-4.59031731276908E+0001 -4.59101367537930E+0001 -4.59171009703996E+0001 -4.59240657775180E+0001 -4.59310311751555E+0001 +-4.59379971633194E+0001 -4.59449637420169E+0001 -4.59519309112554E+0001 -4.59588986710421E+0001 -4.59658670213844E+0001 +-4.59728359622895E+0001 -4.59798054937648E+0001 -4.59867756158175E+0001 -4.59937463284549E+0001 -4.60007176316843E+0001 +-4.60076895255129E+0001 -4.60146620099481E+0001 -4.60216350849971E+0001 -4.60286087506672E+0001 -4.60355830069657E+0001 +-4.60425578538998E+0001 -4.60495332914769E+0001 -4.60565093197041E+0001 -4.60634859385887E+0001 -4.60704631481381E+0001 +-4.60774409483595E+0001 -4.60844193392600E+0001 -4.60913983208471E+0001 -4.60983778931279E+0001 -4.61053580561097E+0001 +-4.61123388097998E+0001 -4.61193201542053E+0001 -4.61263020893337E+0001 -4.61332846151920E+0001 -4.61402677317875E+0001 +-4.61472514391276E+0001 -4.61542357372193E+0001 -4.61612206260701E+0001 -4.61682061056870E+0001 -4.61751921760774E+0001 +-4.61821788372484E+0001 -4.61891660892074E+0001 -4.61961539319615E+0001 -4.62031423655179E+0001 -4.62101313898840E+0001 +-4.62171210050668E+0001 -4.62241112110737E+0001 -4.62311020079118E+0001 -4.62380933955884E+0001 -4.62450853741107E+0001 +-4.62520779434859E+0001 -4.62590711037212E+0001 -4.62660648548239E+0001 -4.62730591968010E+0001 -4.62800541296600E+0001 +-4.62870496534078E+0001 -4.62940457680518E+0001 -4.63010424735992E+0001 -4.63080397700571E+0001 -4.63150376574328E+0001 +-4.63220361357334E+0001 -4.63290352049662E+0001 -4.63360348651383E+0001 -4.63430351162569E+0001 -4.63500359583293E+0001 +-4.63570373913625E+0001 -4.63640394153638E+0001 -4.63710420303404E+0001 -4.63780452362994E+0001 -4.63850490332480E+0001 +-4.63920534211935E+0001 -4.63990584001429E+0001 -4.64060639701035E+0001 -4.64130701310824E+0001 -4.64200768830868E+0001 +-4.64270842261239E+0001 -4.64340921602007E+0001 -4.64411006853246E+0001 -4.64481098015026E+0001 -4.64551195087420E+0001 +-4.64621298070498E+0001 -4.64691406964332E+0001 -4.64761521768994E+0001 -4.64831642484556E+0001 -4.64901769111088E+0001 +-4.64971901648663E+0001 -4.65042040097351E+0001 -4.65112184457225E+0001 -4.65182334728356E+0001 -4.65252490910815E+0001 +-4.65322653004673E+0001 -4.65392821010002E+0001 -4.65462994926874E+0001 -4.65533174755359E+0001 -4.65603360495529E+0001 +-4.65673552147456E+0001 -4.65743749711209E+0001 -4.65813953186862E+0001 -4.65884162574485E+0001 -4.65954377874149E+0001 +-4.66024599085926E+0001 -4.66094826209886E+0001 -4.66165059246101E+0001 -4.66235298194643E+0001 -4.66305543055581E+0001 +-4.66375793828988E+0001 -4.66446050514934E+0001 -4.66516313113491E+0001 -4.66586581624729E+0001 -4.66656856048720E+0001 +-4.66727136385535E+0001 -4.66797422635244E+0001 -4.66867714797919E+0001 -4.66938012873631E+0001 -4.67008316862450E+0001 +-4.67078626764447E+0001 -4.67148942579695E+0001 -4.67219264308262E+0001 -4.67289591950221E+0001 -4.67359925505641E+0001 +-4.67430264974595E+0001 -4.67500610357153E+0001 -4.67570961653385E+0001 -4.67641318863362E+0001 -4.67711681987156E+0001 +-4.67782051024836E+0001 -4.67852425976475E+0001 -4.67922806842141E+0001 -4.67993193621907E+0001 -4.68063586315842E+0001 +-4.68133984924017E+0001 -4.68204389446504E+0001 -4.68274799883373E+0001 -4.68345216234693E+0001 -4.68415638500537E+0001 +-4.68486066680974E+0001 -4.68556500776075E+0001 -4.68626940785910E+0001 -4.68697386710551E+0001 -4.68767838550067E+0001 +-4.68838296304529E+0001 -4.68908759974007E+0001 -4.68979229558573E+0001 -4.69049705058296E+0001 -4.69120186473246E+0001 +-4.69190673803495E+0001 -4.69261167049113E+0001 -4.69331666210169E+0001 -4.69402171286734E+0001 -4.69472682278879E+0001 +-4.69543199186674E+0001 -4.69613722010189E+0001 -4.69684250749495E+0001 -4.69754785404661E+0001 -4.69825325975757E+0001 +-4.69895872462855E+0001 -4.69966424866024E+0001 -4.70036983185335E+0001 -4.70107547420857E+0001 -4.70178117572661E+0001 +-4.70248693640817E+0001 -4.70319275625394E+0001 -4.70389863526464E+0001 -4.70460457344095E+0001 -4.70531057078359E+0001 +-4.70601662729325E+0001 -4.70672274297063E+0001 -4.70742891781644E+0001 -4.70813515183136E+0001 -4.70884144501611E+0001 +-4.70954779737137E+0001 -4.71025420889786E+0001 -4.71096067959626E+0001 -4.71166720946728E+0001 -4.71237379851162E+0001 +-4.71308044672997E+0001 -4.71378715412303E+0001 -4.71449392069151E+0001 -4.71520074643609E+0001 -4.71590763135748E+0001 +-4.71661457545637E+0001 -4.71732157873347E+0001 -4.71802864118946E+0001 -4.71873576282505E+0001 -4.71944294364093E+0001 +-4.72015018363780E+0001 -4.72085748281636E+0001 -4.72156484117730E+0001 -4.72227225872132E+0001 -4.72297973544911E+0001 +-4.72368727136137E+0001 -4.72439486645880E+0001 -4.72510252074209E+0001 -4.72581023421194E+0001 -4.72651800686903E+0001 +-4.72722583871408E+0001 -4.72793372974776E+0001 -4.72864167997078E+0001 -4.72934968938383E+0001 -4.73005775798760E+0001 +-4.73076588578279E+0001 -4.73147407277010E+0001 -4.73218231895021E+0001 -4.73289062432381E+0001 -4.73359898889161E+0001 +-4.73430741265430E+0001 -4.73501589561256E+0001 -4.73572443776710E+0001 -4.73643303911860E+0001 -4.73714169966775E+0001 +-4.73785041941526E+0001 -4.73855919836180E+0001 -4.73926803650808E+0001 -4.73997693385478E+0001 -4.74068589040259E+0001 +-4.74139490615222E+0001 -4.74210398110434E+0001 -4.74281311525965E+0001 -4.74352230861884E+0001 -4.74423156118259E+0001 +-4.74494087295162E+0001 -4.74565024392659E+0001 -4.74635967410820E+0001 -4.74706916349714E+0001 -4.74777871209411E+0001 +-4.74848831989978E+0001 -4.74919798691486E+0001 -4.74990771314002E+0001 -4.75061749857597E+0001 -4.75132734322337E+0001 +-4.75203724708294E+0001 -4.75274721015535E+0001 -4.75345723244129E+0001 -4.75416731394145E+0001 -4.75487745465652E+0001 +-4.75558765458719E+0001 -4.75629791373414E+0001 -4.75700823209807E+0001 -4.75771860967965E+0001 -4.75842904647958E+0001 +-4.75913954249854E+0001 -4.75985009773722E+0001 -4.76056071219630E+0001 -4.76127138587648E+0001 -4.76198211877844E+0001 +-4.76269291090286E+0001 -4.76340376225044E+0001 -4.76411467282185E+0001 -4.76482564261778E+0001 -4.76553667163892E+0001 +-4.76624775988595E+0001 -4.76695890735956E+0001 -4.76767011406043E+0001 -4.76838137998925E+0001 -4.76909270514670E+0001 +-4.76980408953346E+0001 -4.77051553315023E+0001 -4.77122703599768E+0001 -4.77193859807650E+0001 -4.77265021938737E+0001 +-4.77336189993097E+0001 -4.77407363970799E+0001 -4.77478543871911E+0001 -4.77549729696502E+0001 -4.77620921444639E+0001 +-4.77692119116391E+0001 -4.77763322711826E+0001 -4.77834532231013E+0001 -4.77905747674019E+0001 -4.77976969040913E+0001 +-4.78048196331763E+0001 -4.78119429546637E+0001 -4.78190668685603E+0001 -4.78261913748730E+0001 -4.78333164736085E+0001 +-4.78404421647736E+0001 -4.78475684483753E+0001 -4.78546953244201E+0001 -4.78618227929151E+0001 -4.78689508538669E+0001 +-4.78760795072824E+0001 -4.78832087531683E+0001 -4.78903385915315E+0001 -4.78974690223787E+0001 -4.79046000457168E+0001 +-4.79117316615526E+0001 -4.79188638698927E+0001 -4.79259966707441E+0001 -4.79331300641135E+0001 -4.79402640500077E+0001 +-4.79473986284334E+0001 -4.79545337993975E+0001 -4.79616695629067E+0001 -4.79688059189678E+0001 -4.79759428675876E+0001 +-4.79830804087728E+0001 -4.79902185425303E+0001 -4.79973572688668E+0001 -4.80044965877890E+0001 -4.80116364993037E+0001 +-4.80187770034178E+0001 -4.80259181001379E+0001 -4.80330597894708E+0001 -4.80402020714233E+0001 -4.80473449460022E+0001 +-4.80544884132141E+0001 -4.80616324730659E+0001 -4.80687771255643E+0001 -4.80759223707160E+0001 -4.80830682085278E+0001 +-4.80902146390065E+0001 -4.80973616621588E+0001 -4.81045092779915E+0001 -4.81116574865112E+0001 -4.81188062877247E+0001 +-4.81259556816388E+0001 -4.81331056682602E+0001 -4.81402562475956E+0001 -4.81474074196519E+0001 -4.81545591844356E+0001 +-4.81617115419535E+0001 -4.81688644922125E+0001 -4.81760180352191E+0001 -4.81831721709801E+0001 -4.81903268995023E+0001 +-4.81974822207923E+0001 -4.82046381348569E+0001 -4.82117946417028E+0001 -4.82189517413368E+0001 -4.82261094337654E+0001 +-4.82332677189955E+0001 -4.82404265970338E+0001 -4.82475860678870E+0001 -4.82547461315617E+0001 -4.82619067880647E+0001 +-4.82690680374028E+0001 -4.82762298795825E+0001 -4.82833923146106E+0001 -4.82905553424938E+0001 -4.82977189632388E+0001 +-4.83048831768523E+0001 -4.83120479833409E+0001 -4.83192133827115E+0001 -4.83263793749706E+0001 -4.83335459601250E+0001 +-4.83407131381814E+0001 -4.83478809091464E+0001 -4.83550492730267E+0001 -4.83622182298290E+0001 -4.83693877795600E+0001 +-4.83765579222264E+0001 -4.83837286578348E+0001 -4.83908999863919E+0001 -4.83980719079045E+0001 -4.84052444223791E+0001 +-4.84124175298224E+0001 -4.84195912302412E+0001 -4.84267655236420E+0001 -4.84339404100316E+0001 -4.84411158894166E+0001 +-4.84482919618037E+0001 -4.84554686271994E+0001 -4.84626458856106E+0001 -4.84698237370439E+0001 -4.84770021815058E+0001 +-4.84841812190032E+0001 -4.84913608495425E+0001 -4.84985410731305E+0001 -4.85057218897738E+0001 -4.85129032994791E+0001 +-4.85200853022530E+0001 -4.85272678981021E+0001 -4.85344510870332E+0001 -4.85416348690527E+0001 -4.85488192441675E+0001 +-4.85560042123841E+0001 -4.85631897737091E+0001 -4.85703759281492E+0001 -4.85775626757110E+0001 -4.85847500164012E+0001 +-4.85919379502264E+0001 -4.85991264771932E+0001 -4.86063155973082E+0001 -4.86135053105780E+0001 -4.86206956170094E+0001 +-4.86278865166088E+0001 -4.86350780093830E+0001 -4.86422700953385E+0001 -4.86494627744819E+0001 -4.86566560468200E+0001 +-4.86638499123592E+0001 -4.86710443711062E+0001 -4.86782394230676E+0001 -4.86854350682500E+0001 -4.86926313066601E+0001 +-4.86998281383043E+0001 -4.87070255631894E+0001 -4.87142235813219E+0001 -4.87214221927085E+0001 -4.87286213973556E+0001 +-4.87358211952700E+0001 -4.87430215864582E+0001 -4.87502225709268E+0001 -4.87574241486824E+0001 -4.87646263197316E+0001 +-4.87718290840809E+0001 -4.87790324417370E+0001 -4.87862363927065E+0001 -4.87934409369959E+0001 -4.88006460746118E+0001 +-4.88078518055608E+0001 -4.88150581298494E+0001 -4.88222650474843E+0001 -4.88294725584720E+0001 -4.88366806628192E+0001 +-4.88438893605322E+0001 -4.88510986516178E+0001 -4.88583085360825E+0001 -4.88655190139329E+0001 -4.88727300851755E+0001 +-4.88799417498169E+0001 -4.88871540078636E+0001 -4.88943668593223E+0001 -4.89015803041994E+0001 -4.89087943425016E+0001 +-4.89160089742353E+0001 -4.89232241994072E+0001 -4.89304400180238E+0001 -4.89376564300916E+0001 -4.89448734356172E+0001 +-4.89520910346072E+0001 -4.89593092270680E+0001 -4.89665280130062E+0001 -4.89737473924284E+0001 -4.89809673653411E+0001 +-4.89881879317509E+0001 -4.89954090916642E+0001 -4.90026308450877E+0001 -4.90098531920277E+0001 -4.90170761324910E+0001 +-4.90242996664840E+0001 -4.90315237940132E+0001 -4.90387485150852E+0001 -4.90459738297065E+0001 -4.90531997378836E+0001 +-4.90604262396230E+0001 -4.90676533349313E+0001 -4.90748810238150E+0001 -4.90821093062805E+0001 -4.90893381823345E+0001 +-4.90965676519834E+0001 -4.91037977152337E+0001 -4.91110283720920E+0001 -4.91182596225647E+0001 -4.91254914666584E+0001 +-4.91327239043795E+0001 -4.91399569357346E+0001 -4.91471905607302E+0001 -4.91544247793728E+0001 -4.91616595916689E+0001 + 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 + 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 + 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 + 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 + 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 + 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 + 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 + 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 + 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 + 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 + 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 + 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 + 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 + 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 + 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 + 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 + 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 + 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 + 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 + 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 + 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 + 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 + 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 + 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 + 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 + 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 + 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 + 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 + 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 + 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 + 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 + 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 + 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 + 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 + 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 + 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 + 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 + 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.74246520221261E+0002 + 1.74135871610210E+0002 1.74025271472287E+0002 1.73914719796643E+0002 1.73804216572430E+0002 1.73693761788801E+0002 + 1.73583355434907E+0002 1.73472997499902E+0002 1.73362687972937E+0002 1.73252426843164E+0002 1.73142214099735E+0002 + 1.73032049731803E+0002 1.72921933728520E+0002 1.72811866079038E+0002 1.72701846772508E+0002 1.72591875798084E+0002 + 1.72481953144917E+0002 1.72372078802160E+0002 1.72262252758964E+0002 1.72152475004482E+0002 1.72042745527865E+0002 + 1.71933064318267E+0002 1.71823431364840E+0002 1.71713846656734E+0002 1.71604310183103E+0002 1.71494821933099E+0002 + 1.71385381895873E+0002 1.71275990060579E+0002 1.71166646416368E+0002 1.71057350952392E+0002 1.70948103657803E+0002 + 1.70838904521754E+0002 1.70729753533397E+0002 1.70620650681883E+0002 1.70511595956366E+0002 1.70402589345997E+0002 + 1.70293630839928E+0002 1.70184720427312E+0002 1.70075858097300E+0002 1.69967043839045E+0002 1.69858277641699E+0002 + 1.69749559494414E+0002 1.69640889386343E+0002 1.69532267306636E+0002 1.69423693244448E+0002 1.69315167188929E+0002 + 1.69206689129232E+0002 1.69098259054509E+0002 1.68989876953912E+0002 1.68881542816593E+0002 1.68773256631705E+0002 + 1.68665018388399E+0002 1.68556828075829E+0002 1.68448685683145E+0002 1.68340591199500E+0002 1.68232544614047E+0002 + 1.68124545915936E+0002 1.68016595094322E+0002 1.67908692138355E+0002 1.67800837037187E+0002 1.67693029779972E+0002 + 1.67585270355861E+0002 1.67477558754006E+0002 1.67369894963560E+0002 1.67262278973674E+0002 1.67154710773501E+0002 + 1.67047190352193E+0002 1.66939717698902E+0002 1.66832292802780E+0002 1.66724915652979E+0002 1.66617586238652E+0002 + 1.66510304548950E+0002 1.66403070573027E+0002 1.66295884300033E+0002 1.66188745719121E+0002 1.66081654819444E+0002 + 1.65974611590153E+0002 1.65867616020400E+0002 1.65760668099338E+0002 1.65653767816119E+0002 1.65546915159895E+0002 + 1.65440110119818E+0002 1.65333352685041E+0002 1.65226642844715E+0002 1.65119980587992E+0002 1.65013365904026E+0002 + 1.64906798781967E+0002 1.64800279210968E+0002 1.64693807180182E+0002 1.64587382678759E+0002 1.64481005695854E+0002 + 1.64374676220617E+0002 1.64268394242201E+0002 1.64162159749757E+0002 1.64055972732439E+0002 1.63949833179398E+0002 + 1.63843741079787E+0002 1.63737696422757E+0002 1.63631699197461E+0002 1.63525749393051E+0002 1.63419846998679E+0002 + 1.63313992003497E+0002 1.63208184396657E+0002 1.63102424167312E+0002 1.62996711304613E+0002 1.62891045797713E+0002 + 1.62785427635764E+0002 1.62679856807918E+0002 1.62574333303328E+0002 1.62468857111145E+0002 1.62363428220521E+0002 + 1.62258046620609E+0002 1.62152712300561E+0002 1.62047425249529E+0002 1.61942185456665E+0002 1.61836992911121E+0002 + 1.61731847602050E+0002 1.61626749518603E+0002 1.61521698649933E+0002 1.61416694985192E+0002 1.61311738513533E+0002 + 1.61206829224106E+0002 1.61101967106064E+0002 1.60997152148560E+0002 1.60892384340746E+0002 1.60787663671774E+0002 + 1.60682990130795E+0002 1.60578363706963E+0002 1.60473784389429E+0002 1.60369252167345E+0002 1.60264767029864E+0002 + 1.60160328966138E+0002 1.60055937965318E+0002 1.59951594016558E+0002 1.59847297109008E+0002 1.59743047231822E+0002 + 1.59638844374152E+0002 1.59534688525149E+0002 1.59430579673966E+0002 1.59326517809755E+0002 1.59222502921667E+0002 + 1.59118534998857E+0002 1.59014614030474E+0002 1.58910740005672E+0002 1.58806912913603E+0002 1.58703132743418E+0002 + 1.58599399484271E+0002 1.58495713125312E+0002 1.58392073655695E+0002 1.58288481064572E+0002 1.58184935341093E+0002 + 1.58081436474413E+0002 1.57977984453683E+0002 1.57874579268054E+0002 1.57771220906680E+0002 1.57667909358712E+0002 + 1.57564644613303E+0002 1.57461426659604E+0002 1.57358255486768E+0002 1.57255131083948E+0002 1.57152053440294E+0002 + 1.57049022544959E+0002 1.56946038387096E+0002 1.56843100955856E+0002 1.56740210240392E+0002 1.56637366229856E+0002 + 1.56534568913400E+0002 1.56431818280176E+0002 1.56329114319337E+0002 1.56226457020034E+0002 1.56123846371419E+0002 + 1.56021282362646E+0002 1.55918764982865E+0002 1.55816294221229E+0002 1.55713870066890E+0002 1.55611492509001E+0002 + 1.55509161536714E+0002 1.55406877139180E+0002 1.55304639305552E+0002 1.55202448024982E+0002 1.55100303286622E+0002 + 1.54998205079624E+0002 1.54896153393141E+0002 1.54794148216324E+0002 1.54692189538326E+0002 1.54590277348299E+0002 + 1.54488411635395E+0002 1.54386592388766E+0002 1.54284819597564E+0002 1.54183093250942E+0002 1.54081413338052E+0002 + 1.53979779848045E+0002 1.53878192770075E+0002 1.53776652093292E+0002 1.53675157806850E+0002 1.53573709899900E+0002 + 1.53472308361594E+0002 1.53370953181086E+0002 1.53269644347526E+0002 1.53168381850067E+0002 1.53067165677861E+0002 + 1.52965995820061E+0002 1.52864872265818E+0002 1.52763795004285E+0002 1.52662764024613E+0002 1.52561779315956E+0002 + 1.52460840867464E+0002 1.52359948668291E+0002 1.52259102707588E+0002 1.52158302974507E+0002 1.52057549458202E+0002 + 1.51956842147823E+0002 1.51856181032523E+0002 1.51755566101454E+0002 1.51654997343768E+0002 1.51554474748618E+0002 + 1.51453998305155E+0002 1.51353568002532E+0002 1.51253183829901E+0002 1.51152845776414E+0002 1.51052553831224E+0002 + 1.50952307983481E+0002 1.50852108222339E+0002 1.50751954536950E+0002 1.50651846916465E+0002 1.50551785350038E+0002 + 1.50451769826819E+0002 1.50351800335962E+0002 1.50251876866618E+0002 1.50151999407939E+0002 1.50052167949079E+0002 + 1.49952382479188E+0002 1.49852642987419E+0002 1.49752949462924E+0002 1.49653301894856E+0002 1.49553700272366E+0002 + 1.49454144584607E+0002 1.49354634820730E+0002 1.49255170969888E+0002 1.49155753021234E+0002 1.49056380963918E+0002 + 1.48957054787094E+0002 1.48857774479914E+0002 1.48758540031529E+0002 1.48659351431092E+0002 1.48560208667755E+0002 + 1.48461111730670E+0002 1.48362060608989E+0002 1.48263055291865E+0002 1.48164095768449E+0002 1.48065182027894E+0002 + 1.47966314059352E+0002 1.47867491851975E+0002 1.47768715394915E+0002 1.47669984677324E+0002 1.47571299688355E+0002 + 1.47472660417159E+0002 1.47374066852889E+0002 1.47275518984698E+0002 1.47177016801736E+0002 1.47078560293156E+0002 + 1.46980149448111E+0002 1.46881784255753E+0002 1.46783464705233E+0002 1.46685190785704E+0002 1.46586962486317E+0002 + 1.46488779796226E+0002 1.46390642704583E+0002 1.46292551200539E+0002 1.46194505273246E+0002 1.46096504911857E+0002 + 1.45998550105524E+0002 1.45900640843399E+0002 1.45802777114634E+0002 1.45704958908382E+0002 1.45607186213794E+0002 + 1.45509459020023E+0002 1.45411777316220E+0002 1.45314141091539E+0002 1.45216550335131E+0002 1.45119005036148E+0002 + 1.45021505183742E+0002 1.44924050767066E+0002 1.44826641775271E+0002 1.44729278197511E+0002 1.44631960022936E+0002 + 1.44534687240700E+0002 1.44437459839954E+0002 1.44340277809850E+0002 1.44243141139541E+0002 1.44146049818179E+0002 + 1.44049003834916E+0002 1.43952003178903E+0002 1.43855047839294E+0002 1.43758137805241E+0002 1.43661273065895E+0002 + 1.43564453610408E+0002 1.43467679427934E+0002 1.43370950507623E+0002 1.43274266838629E+0002 1.43177628410102E+0002 + 1.43081035211197E+0002 1.42984487231064E+0002 1.42887984458855E+0002 1.42791526883724E+0002 1.42695114494821E+0002 + 1.42598747281300E+0002 1.42502425232312E+0002 1.42406148337009E+0002 1.42309916584545E+0002 1.42213729964070E+0002 + 1.42117588464736E+0002 1.42021492075697E+0002 1.41925440786105E+0002 1.41829434585110E+0002 1.41733473461867E+0002 + 1.41637557405526E+0002 1.41541686405239E+0002 1.41445860450160E+0002 1.41350079529440E+0002 1.41254343632231E+0002 + 1.41158652747686E+0002 1.41063006864956E+0002 1.40967405973195E+0002 1.40871850061553E+0002 1.40776339119183E+0002 + 1.40680873135237E+0002 1.40585452098868E+0002 1.40490075999227E+0002 1.40394744825467E+0002 1.40299458566739E+0002 + 1.40204217212197E+0002 1.40109020750992E+0002 1.40013869172276E+0002 1.39918762465201E+0002 1.39823700618920E+0002 + 1.39728683622585E+0002 1.39633711465348E+0002 1.39538784136361E+0002 1.39443901624775E+0002 1.39349063919745E+0002 + 1.39254271010420E+0002 1.39159522885955E+0002 1.39064819535500E+0002 1.38970160948208E+0002 1.38875547113231E+0002 + 1.38780978019722E+0002 1.38686453656832E+0002 1.38591974013713E+0002 1.38497539079518E+0002 1.38403148843399E+0002 + 1.38308803294508E+0002 1.38214502421997E+0002 1.38120246215018E+0002 1.38026034662724E+0002 1.37931867754266E+0002 + 1.37837745478798E+0002 1.37743667825470E+0002 1.37649634783435E+0002 1.37555646341845E+0002 1.37461702489853E+0002 + 1.37367803216610E+0002 1.37273948511269E+0002 1.37180138362982E+0002 1.37086372760900E+0002 1.36992651694177E+0002 + 1.36898975151964E+0002 1.36805343123414E+0002 1.36711755597678E+0002 1.36618212563909E+0002 1.36524714011258E+0002 + 1.36431259928879E+0002 1.36337850305923E+0002 1.36244485131542E+0002 1.36151164394888E+0002 1.36057888085115E+0002 + 1.35964656191373E+0002 1.35871468702815E+0002 1.35778325608593E+0002 1.35685226897859E+0002 1.35592172559766E+0002 + 1.35499162583465E+0002 1.35406196958109E+0002 1.35313275672850E+0002 1.35220398716840E+0002 1.35127566079231E+0002 + 1.35034777749175E+0002 1.34942033715824E+0002 1.34849333968332E+0002 1.34756678495849E+0002 1.34664067287528E+0002 + 1.34571500332521E+0002 1.34478977619980E+0002 1.34386499139057E+0002 1.34294064878905E+0002 1.34201674828676E+0002 + 1.34109328977522E+0002 1.34017027314594E+0002 1.33924769829046E+0002 1.33832556510028E+0002 1.33740387346695E+0002 + 1.33648262328196E+0002 1.33556181443686E+0002 1.33464144682315E+0002 1.33372152033237E+0002 1.33280203485602E+0002 + 1.33188299028564E+0002 1.33096438651274E+0002 1.33004622342885E+0002 1.32912850092549E+0002 1.32821121889418E+0002 + 1.32729437722644E+0002 1.32637797581379E+0002 1.32546201454775E+0002 1.32454649331985E+0002 1.32363141202160E+0002 + 1.32271677054454E+0002 1.32180256878017E+0002 1.32088880662003E+0002 1.31997548395563E+0002 1.31906260067849E+0002 + 1.31815015668014E+0002 1.31723815185209E+0002 1.31632658608588E+0002 1.31541545927301E+0002 1.31450477130502E+0002 + 1.31359452207342E+0002 1.31268471146974E+0002 1.31177533938549E+0002 1.31086640571220E+0002 1.30995791034139E+0002 + 1.30904985316458E+0002 1.30814223407329E+0002 1.30723505295905E+0002 1.30632830971337E+0002 1.30542200422778E+0002 + 1.30451613639380E+0002 1.30361070610295E+0002 1.30270571324675E+0002 1.30180115771672E+0002 1.30089703940439E+0002 + 1.29999335820128E+0002 1.29909011399890E+0002 1.29818730668878E+0002 1.29728493616244E+0002 1.29638300231141E+0002 + 1.29548150502719E+0002 1.29458044420133E+0002 1.29367981972533E+0002 1.29277963149071E+0002 1.29187987938901E+0002 + 1.29098056331174E+0002 1.29008168315042E+0002 1.28918323879658E+0002 1.28828523014173E+0002 1.28738765707740E+0002 + 1.28649051949511E+0002 1.28559381728638E+0002 1.28469755034273E+0002 1.28380171855568E+0002 1.28290632181676E+0002 + 1.28201136001749E+0002 1.28111683304938E+0002 1.28022274080396E+0002 1.27932908317275E+0002 1.27843586004728E+0002 + 1.27754307131906E+0002 1.27665071687961E+0002 1.27575879662047E+0002 1.27486731043314E+0002 1.27397625820915E+0002 + 1.27308563984002E+0002 1.27219545521728E+0002 1.27130570423244E+0002 1.27041638677702E+0002 1.26952750274256E+0002 + 1.26863905202056E+0002 1.26775103450255E+0002 1.26686345008006E+0002 1.26597629864460E+0002 1.26508958008769E+0002 + 1.26420329430086E+0002 1.26331744117563E+0002 1.26243202060352E+0002 1.26154703247605E+0002 1.26066247668475E+0002 + 1.25977835312112E+0002 1.25889466167671E+0002 1.25801140224302E+0002 1.25712857471158E+0002 1.25624617897391E+0002 + 1.25536421492153E+0002 1.25448268244596E+0002 1.25360158143873E+0002 1.25272091179136E+0002 1.25184067339536E+0002 + 1.25096086614226E+0002 1.25008148992359E+0002 1.24920254463085E+0002 1.24832403015559E+0002 1.24744594638930E+0002 + 1.24656829322352E+0002 1.24569107054977E+0002 1.24481427825958E+0002 1.24393791624445E+0002 1.24306198439591E+0002 + 1.24218648260549E+0002 1.24131141076471E+0002 1.24043676876508E+0002 1.23956255649814E+0002 1.23868877385539E+0002 + 1.23781542072836E+0002 1.23694249700858E+0002 1.23607000258757E+0002 1.23519793735684E+0002 1.23432630120792E+0002 + 1.23345509403232E+0002 1.23258431572158E+0002 1.23171396616722E+0002 1.23084404526074E+0002 1.22997455289368E+0002 + 1.22910548895756E+0002 1.22823685334390E+0002 1.22736864594422E+0002 1.22650086665004E+0002 1.22563351535288E+0002 + 1.22476659194427E+0002 1.22390009631572E+0002 1.22303402835876E+0002 1.22216838796492E+0002 1.22130317502570E+0002 + 1.22043838943263E+0002 1.21957403107724E+0002 1.21871009985104E+0002 1.21784659564556E+0002 1.21698351835232E+0002 + 1.21612086786284E+0002 1.21525864406864E+0002 1.21439684686124E+0002 1.21353547613217E+0002 1.21267453177294E+0002 + 1.21181401367508E+0002 1.21095392173011E+0002 1.21009425582955E+0002 1.20923501586493E+0002 1.20837620172775E+0002 + 1.20751781330955E+0002 1.20665985050185E+0002 1.20580231319616E+0002 1.20494520128402E+0002 1.20408851465694E+0002 + 1.20323225320643E+0002 1.20237641682404E+0002 1.20152100540126E+0002 1.20066601882964E+0002 1.19981145700068E+0002 + 1.19895731980592E+0002 1.19810360713686E+0002 1.19725031888504E+0002 1.19639745494198E+0002 1.19554501519919E+0002 + 1.19469299954819E+0002 1.19384140788052E+0002 1.19299024008769E+0002 1.19213949606122E+0002 1.19128917569263E+0002 + 1.19043927887345E+0002 1.18958980549519E+0002 1.18874075544939E+0002 1.18789212862755E+0002 1.18704392492121E+0002 + 1.18619614422187E+0002 1.18534878642108E+0002 1.18450185141033E+0002 1.18365533908117E+0002 1.18280924932510E+0002 + 1.18196358203366E+0002 1.18111833709836E+0002 1.18027351441072E+0002 1.17942911386226E+0002 1.17858513534451E+0002 + 1.17774157874899E+0002 1.17689844396722E+0002 1.17605573089072E+0002 1.17521343941101E+0002 1.17437156941962E+0002 + 1.17353012080806E+0002 1.17268909346786E+0002 1.17184848729054E+0002 1.17100830216762E+0002 1.17016853799061E+0002 + 1.16932919465106E+0002 1.16849027204046E+0002 1.16765177005036E+0002 1.16681368857226E+0002 1.16597602749769E+0002 + 1.16513878671817E+0002 1.16430196612522E+0002 1.16346556561037E+0002 1.16262958506513E+0002 1.16179402438103E+0002 + 1.16095888344958E+0002 1.16012416216232E+0002 1.15928986041076E+0002 1.15845597808642E+0002 1.15762251508082E+0002 + 1.15678947128549E+0002 1.15595684659195E+0002 1.15512464089172E+0002 1.15429285407631E+0002 1.15346148603726E+0002 + 1.15263053666609E+0002 1.15180000585430E+0002 1.15096989349344E+0002 1.15014019947501E+0002 1.14931092369054E+0002 + 1.14848206603155E+0002 1.14765362638956E+0002 1.14682560465610E+0002 1.14599800072268E+0002 1.14517081448083E+0002 + 1.14434404582207E+0002 1.14351769463792E+0002 1.14269176081990E+0002 1.14186624425954E+0002 1.14104114484834E+0002 + 1.14021646247785E+0002 1.13939219703957E+0002 1.13856834842503E+0002 1.13774491652575E+0002 1.13692190123325E+0002 + 1.13609930243906E+0002 1.13527712003469E+0002 1.13445535391167E+0002 1.13363400396152E+0002 1.13281307007576E+0002 + 1.13199255214590E+0002 1.13117245006348E+0002 1.13035276372002E+0002 1.12953349300703E+0002 1.12871463781604E+0002 + 1.12789619803856E+0002 1.12707817356613E+0002 1.12626056429026E+0002 1.12544337010247E+0002 1.12462659089429E+0002 + 1.12381022655723E+0002 1.12299427698282E+0002 1.12217874206258E+0002 1.12136362168803E+0002 1.12054891575069E+0002 + 1.11973462414209E+0002 1.11892074675374E+0002 1.11810728347717E+0002 1.11729423420390E+0002 1.11648159882545E+0002 + 1.11566937723334E+0002 1.11485756931909E+0002 1.11404617497423E+0002 1.11323519409027E+0002 1.11242462655874E+0002 + 1.11161447227116E+0002 1.11080473111905E+0002 1.10999540299393E+0002 1.10918648778732E+0002 1.10837798539075E+0002 + 1.10756989569574E+0002 1.10676221859380E+0002 1.10595495397647E+0002 1.10514810173525E+0002 1.10434166176168E+0002 + 1.10353563394727E+0002 1.10273001818355E+0002 1.10192481436204E+0002 1.10112002237425E+0002 1.10031564211172E+0002 + 1.09951167346595E+0002 1.09870811632848E+0002 1.09790497059082E+0002 1.09710223614450E+0002 1.09629991288104E+0002 + 1.09549800069196E+0002 1.09469649946878E+0002 1.09389540910302E+0002 1.09309472948620E+0002 1.09229446050985E+0002 + 1.09149460206548E+0002 1.09069515404463E+0002 1.08989611633880E+0002 1.08909748883953E+0002 1.08829927143833E+0002 + 1.08750146402672E+0002 1.08670406649623E+0002 1.08590707873837E+0002 1.08511050064468E+0002 1.08431433210666E+0002 + 1.08351857301585E+0002 1.08272322326376E+0002 1.08192828274192E+0002 1.08113375134184E+0002 1.08033962895505E+0002 + 1.07954591547307E+0002 1.07875261078742E+0002 1.07795971478962E+0002 1.07716722737120E+0002 1.07637514842367E+0002 + 1.07558347783856E+0002 1.07479221550739E+0002 1.07400136132168E+0002 1.07321091517295E+0002 1.07242087695273E+0002 + 1.07163124655252E+0002 1.07084202386387E+0002 1.07005320877828E+0002 1.06926480118728E+0002 1.06847680098239E+0002 + 1.06768920805514E+0002 1.06690202229704E+0002 1.06611524359961E+0002 1.06532887185438E+0002 1.06454290695287E+0002 + 1.06375734878659E+0002 1.06297219724708E+0002 1.06218745222586E+0002 1.06140311361443E+0002 1.06061918130433E+0002 + 1.05983565518708E+0002 1.05905253515420E+0002 1.05826982109721E+0002 1.05748751290763E+0002 1.05670561047699E+0002 + 1.05592411369680E+0002 1.05514302245858E+0002 1.05436233665386E+0002 1.05358205617417E+0002 1.05280218091101E+0002 + 1.05202271075592E+0002 1.05124364560041E+0002 1.05046498533600E+0002 1.04968672985422E+0002 1.04890887904660E+0002 + 1.04813143280464E+0002 1.04735439101987E+0002 1.04657775358382E+0002 1.04580152038800E+0002 1.04502569132393E+0002 + 1.04425026628315E+0002 1.04347524515716E+0002 1.04270062783749E+0002 1.04192641421567E+0002 1.04115260418321E+0002 + 1.04037919763164E+0002 1.03960619445247E+0002 1.03883359453723E+0002 1.03806139777744E+0002 1.03728960406462E+0002 + 1.03651821329029E+0002 1.03574722534598E+0002 1.03497664012320E+0002 1.03420645751348E+0002 1.03343667740834E+0002 + 1.03266729969930E+0002 1.03189832427788E+0002 1.03112975103561E+0002 1.03036157986400E+0002 1.02959381065457E+0002 + 1.02882644329886E+0002 1.02805947768837E+0002 1.02729291371464E+0002 1.02652675126917E+0002 1.02576099024350E+0002 + 1.02499563052915E+0002 1.02423067201763E+0002 1.02346611460047E+0002 1.02270195816919E+0002 1.02193820261532E+0002 + 1.02117484783036E+0002 1.02041189370585E+0002 1.01964934013331E+0002 1.01888718700425E+0002 1.01812543421021E+0002 + 1.01736408164269E+0002 1.01660312919323E+0002 1.01584257675333E+0002 1.01508242421454E+0002 1.01432267146836E+0002 + 1.01356331840632E+0002 1.01280436491994E+0002 1.01204581090074E+0002 1.01128765624024E+0002 1.01052990082997E+0002 + 1.00977254456144E+0002 1.00901558732618E+0002 1.00825902901571E+0002 1.00750286952154E+0002 1.00674710873521E+0002 + 1.00599174654824E+0002 1.00523678285214E+0002 1.00448221753843E+0002 1.00372805049864E+0002 1.00297428162429E+0002 + 1.00222091080691E+0002 1.00146793793800E+0002 1.00071536290910E+0002 9.99963185611728E+0001 9.99211405937399E+0001 + 9.98460023777637E+0001 9.97709039023966E+0001 9.96958451567907E+0001 9.96208261300980E+0001 9.95458468114708E+0001 + 9.94709071900612E+0001 9.93960072550213E+0001 9.93211469955033E+0001 9.92463264006594E+0001 9.91715454596416E+0001 + 9.90968041616022E+0001 9.90221024956933E+0001 9.89474404510671E+0001 9.88728180168757E+0001 9.87982351822712E+0001 + 9.87236919364058E+0001 9.86491882684317E+0001 9.85747241675010E+0001 9.85002996227659E+0001 9.84259146233784E+0001 + 9.83515691584909E+0001 9.82772632172554E+0001 9.82029967888240E+0001 9.81287698623489E+0001 9.80545824269823E+0001 + 9.79804344718763E+0001 9.79063259861831E+0001 9.78322569590549E+0001 9.77582273796437E+0001 9.76842372371017E+0001 + 9.76102865205811E+0001 9.75363752192340E+0001 9.74625033222126E+0001 9.73886708186691E+0001 9.73148776977554E+0001 + 9.72411239486240E+0001 9.71674095604269E+0001 9.70937345223161E+0001 9.70200988234440E+0001 9.69465024529626E+0001 + 9.68729454000241E+0001 9.67994276537806E+0001 9.67259492033843E+0001 9.66525100379874E+0001 9.65791101467419E+0001 + 9.65057495188001E+0001 9.64324281433141E+0001 9.63591460094361E+0001 9.62859031063182E+0001 9.62126994231124E+0001 + 9.61395349489712E+0001 9.60664096730464E+0001 9.59933235844904E+0001 9.59202766724552E+0001 9.58472689260931E+0001 + 9.57743003345560E+0001 9.57013708869963E+0001 9.56284805725661E+0001 9.55556293804175E+0001 9.54828172997026E+0001 + 9.54100443195736E+0001 9.53373104291828E+0001 9.52646156176821E+0001 9.51919598742238E+0001 9.51193431879601E+0001 + 9.50467655480430E+0001 9.49742269436247E+0001 9.49017273638574E+0001 9.48292667978932E+0001 9.47568452348843E+0001 + 9.46844626639828E+0001 9.46121190743409E+0001 9.45398144551108E+0001 9.44675487954445E+0001 9.43953220844942E+0001 + 9.43231343114122E+0001 9.42509854653505E+0001 9.41788755354612E+0001 9.41068045108966E+0001 9.40347723808088E+0001 + 9.39627791343500E+0001 9.38908247606722E+0001 9.38189092489277E+0001 9.37470325882685E+0001 9.36751947678469E+0001 + 9.36033957768151E+0001 9.35316356043250E+0001 9.34599142395290E+0001 9.33882316715791E+0001 9.33165878896275E+0001 + 9.32449828828264E+0001 9.31734166403279E+0001 9.31018891512841E+0001 9.30304004048472E+0001 9.29589503901694E+0001 + 9.28875390964028E+0001 9.28161665126996E+0001 9.27448326282119E+0001 9.26735374320919E+0001 9.26022809134916E+0001 + 9.25310630615633E+0001 9.24598838654592E+0001 9.23887433143313E+0001 9.23176413973319E+0001 9.22465781036130E+0001 + 9.21755534223268E+0001 9.21045673426255E+0001 9.20336198536613E+0001 9.19627109445862E+0001 9.18918406045525E+0001 + 9.18210088227122E+0001 9.17502155882175E+0001 9.16794608902207E+0001 9.16087447178738E+0001 9.15380670603290E+0001 + 9.14674279067383E+0001 9.13968272462541E+0001 9.13262650680284E+0001 9.12557413612134E+0001 9.11852561149613E+0001 + 9.11148093184242E+0001 9.10444009607542E+0001 9.09740310311034E+0001 9.09036995186242E+0001 9.08334064124685E+0001 + 9.07631517017886E+0001 9.06929353757366E+0001 9.06227574234646E+0001 9.05526178341249E+0001 9.04825165968695E+0001 + 9.04124537008506E+0001 9.03424291352204E+0001 9.02724428891309E+0001 9.02024949517344E+0001 9.01325853121831E+0001 + 9.00627139596290E+0001 8.99928808832243E+0001 8.99230860721212E+0001 8.98533295154718E+0001 8.97836112024282E+0001 + 8.97139311221427E+0001 8.96442892637674E+0001 8.95746856164544E+0001 8.95051201693558E+0001 8.94355929116239E+0001 + 8.93661038324107E+0001 8.92966529208685E+0001 8.92272401661494E+0001 8.91578655574054E+0001 8.90885290837889E+0001 + 8.90192307344519E+0001 8.89499704985466E+0001 8.88807483652251E+0001 8.88115643236396E+0001 8.87424183629422E+0001 + 8.86733104722852E+0001 8.86042406408205E+0001 8.85352088577005E+0001 8.84662151120772E+0001 8.83972593931028E+0001 + 8.83283416899294E+0001 8.82594619917092E+0001 8.81906202875944E+0001 8.81218165667371E+0001 8.80530508182894E+0001 + 8.79843230314036E+0001 8.79156331952316E+0001 8.78469812989258E+0001 8.77783673316383E+0001 8.77097912825211E+0001 + 8.76412531407265E+0001 8.75727528954066E+0001 8.75042905357136E+0001 8.74358660507996E+0001 8.73674794298168E+0001 + 8.72991306619172E+0001 8.72308197362531E+0001 8.71625466419767E+0001 8.70943113682400E+0001 8.70261139041953E+0001 + 8.69579542389945E+0001 8.68898323617901E+0001 8.68217482617340E+0001 8.67537019279784E+0001 8.66856933496755E+0001 + 8.66177225159774E+0001 8.65497894160363E+0001 8.64818940390044E+0001 8.64140363740336E+0001 8.63462164102764E+0001 + 8.62784341368848E+0001 8.62106895430108E+0001 8.61429826178068E+0001 8.60753133504248E+0001 8.60076817300169E+0001 + 8.59400877457355E+0001 8.58725313867325E+0001 8.58050126421601E+0001 8.57375315011706E+0001 8.56700879529159E+0001 + 8.56026819865484E+0001 8.55353135912202E+0001 8.54679827560833E+0001 8.54006894702900E+0001 8.53334337229924E+0001 + 8.52662155033426E+0001 8.51990348004929E+0001 8.51318916035953E+0001 8.50647859018020E+0001 8.49977176842652E+0001 + 8.49306869401369E+0001 8.48636936585695E+0001 8.47967378287149E+0001 8.47298194397254E+0001 8.46629384807532E+0001 + 8.45960949409503E+0001 8.45292888094689E+0001 8.44625200754611E+0001 8.43957887280793E+0001 8.43290947564753E+0001 + 8.42624381498015E+0001 8.41958188972099E+0001 8.41292369878528E+0001 8.40626924108823E+0001 8.39961851554505E+0001 + 8.39297152107096E+0001 8.38632825658117E+0001 8.37968872099090E+0001 8.37305291321536E+0001 8.36642083216977E+0001 + 8.35979247676934E+0001 8.35316784592929E+0001 8.34654693856484E+0001 8.33992975359120E+0001 8.33331628992358E+0001 + 8.32670654647719E+0001 8.32010052216727E+0001 8.31349821590901E+0001 8.30689962661763E+0001 8.30030475320836E+0001 + 8.29371359459640E+0001 8.28712614969698E+0001 8.28054241742529E+0001 8.27396239669657E+0001 8.26738608642602E+0001 + 8.26081348552886E+0001 8.25424459292031E+0001 8.24767940751558E+0001 8.24111792822988E+0001 8.23456015397843E+0001 + 8.22800608367646E+0001 8.22145571623916E+0001 8.21490905058176E+0001 8.20836608561947E+0001 8.20182682026751E+0001 + 8.19529125344108E+0001 8.18875938405542E+0001 8.18223121102573E+0001 8.17570673326722E+0001 8.16918594969512E+0001 + 8.16266885922464E+0001 8.15615546077098E+0001 8.14964575324938E+0001 8.14313973557504E+0001 8.13663740666317E+0001 + 8.13013876542900E+0001 8.12364381078774E+0001 8.11715254165460E+0001 8.11066495694480E+0001 8.10418105557355E+0001 + 8.09770083645607E+0001 8.09122429850757E+0001 8.08475144064328E+0001 8.07828226177840E+0001 8.07181676082814E+0001 + 8.06535493670773E+0001 8.05889678833238E+0001 8.05244231461731E+0001 8.04599151447773E+0001 8.03954438682885E+0001 + 8.03310093058589E+0001 8.02666114466406E+0001 8.02022502797858E+0001 8.01379257944468E+0001 8.00736379797755E+0001 + 8.00093868249242E+0001 7.99451723190449E+0001 7.98809944512900E+0001 7.98168532108114E+0001 7.97527485867614E+0001 + 7.96886805682922E+0001 7.96246491445557E+0001 7.95606543047043E+0001 7.94966960378901E+0001 7.94327743332652E+0001 + 7.93688891799817E+0001 7.93050405671919E+0001 7.92412284840479E+0001 7.91774529197018E+0001 7.91137138633057E+0001 + 7.90500113040119E+0001 7.89863452309724E+0001 7.89227156333395E+0001 7.88591225002652E+0001 7.87955658209018E+0001 + 7.87320455844014E+0001 7.86685617799161E+0001 7.86051143965981E+0001 7.85417034235995E+0001 7.84783288500725E+0001 + 7.84149906651693E+0001 7.83516888580419E+0001 7.82884234178426E+0001 7.82251943337235E+0001 7.81620015948367E+0001 + 7.80988451903344E+0001 7.80357251093688E+0001 7.79726413410919E+0001 7.79095938746561E+0001 7.78465826992132E+0001 + 7.77836078039157E+0001 7.77206691779155E+0001 7.76577668103650E+0001 7.75949006904161E+0001 7.75320708072211E+0001 + 7.74692771499321E+0001 7.74065197077012E+0001 7.73437984696807E+0001 7.72811134250226E+0001 7.72184645628791E+0001 + 7.71558518724024E+0001 7.70932753427446E+0001 7.70307349630579E+0001 7.69682307224944E+0001 7.69057626102063E+0001 + 7.68433306153457E+0001 7.67809347270647E+0001 7.67185749345156E+0001 7.66562512268505E+0001 7.65939635932215E+0001 + 7.65317120227808E+0001 7.64694965046804E+0001 7.64073170280727E+0001 7.63451735821097E+0001 7.62830661559436E+0001 + 7.62209947387265E+0001 7.61589593196106E+0001 7.60969598877481E+0001 7.60349964322910E+0001 7.59730689423915E+0001 + 7.59111774072019E+0001 7.58493218158742E+0001 7.57875021575606E+0001 7.57257184214133E+0001 7.56639705965843E+0001 + 7.56022586722259E+0001 7.55405826374902E+0001 7.54789424815293E+0001 7.54173381934954E+0001 7.53557697625407E+0001 + 7.52942371778173E+0001 7.52327404284773E+0001 7.51712795036730E+0001 7.51098543925564E+0001 7.50484650842797E+0001 + 7.49871115679951E+0001 7.49257938328547E+0001 7.48645118680106E+0001 7.48032656626151E+0001 7.47420552058202E+0001 + 7.46808804867781E+0001 7.46197414946410E+0001 7.45586382185611E+0001 7.44975706476904E+0001 7.44365387711811E+0001 + 7.43755425781854E+0001 7.43145820578554E+0001 7.42536571993433E+0001 7.41927679918012E+0001 7.41319144243813E+0001 + 7.40710964862357E+0001 7.40103141665166E+0001 7.39495674543762E+0001 7.38888563389665E+0001 7.38281808094398E+0001 + 7.37675408549481E+0001 7.37069364646437E+0001 7.36463676276786E+0001 7.35858343332051E+0001 7.35253365703753E+0001 + 7.34648743283414E+0001 7.34044475962554E+0001 7.33440563632696E+0001 7.32837006185361E+0001 7.32233803512070E+0001 + 7.31630955504345E+0001 7.31028462053708E+0001 7.30426323051680E+0001 7.29824538389782E+0001 7.29223107959536E+0001 + 7.28622031652464E+0001 7.28021309360087E+0001 7.27420940973926E+0001 7.26820926385504E+0001 7.26221265486341E+0001 + 7.25621958167959E+0001 7.25023004321880E+0001 7.24424403839625E+0001 7.23826156612716E+0001 7.23228262532673E+0001 + 7.22630721491020E+0001 7.22033533379277E+0001 7.21436698088965E+0001 7.20840215511607E+0001 7.20244085538723E+0001 + 7.19648308061836E+0001 7.19052882972466E+0001 7.18457810162136E+0001 7.17863089522367E+0001 7.17268720944679E+0001 + 7.16674704320596E+0001 7.16081039541638E+0001 7.15487726499327E+0001 7.14894765085184E+0001 7.14302155190730E+0001 + 7.13709896707489E+0001 7.13117989526980E+0001 7.12526433540725E+0001 7.11935228640247E+0001 7.11344374717066E+0001 + 7.10753871662704E+0001 7.10163719368682E+0001 7.09573917726522E+0001 7.08984466627746E+0001 7.08395365963875E+0001 + 7.07806615626430E+0001 7.07218215506933E+0001 7.06630165496906E+0001 7.06042465487870E+0001 7.05455115371347E+0001 + 7.04868115038857E+0001 7.04281464381923E+0001 7.03695163292066E+0001 7.03109211660808E+0001 7.02523609379670E+0001 + 7.01938356340173E+0001 7.01353452433840E+0001 7.00768897552191E+0001 7.00184691586749E+0001 6.99600834429034E+0001 + 6.99017325970568E+0001 6.98434166102873E+0001 6.97851354717470E+0001 6.97268891705881E+0001 6.96686776959628E+0001 + 6.96105010370231E+0001 6.95523591829212E+0001 6.94942521228093E+0001 6.94361798458395E+0001 6.93781423411641E+0001 + 6.93201395979350E+0001 6.92621716053046E+0001 6.92042383524249E+0001 6.91463398284480E+0001 6.90884760225262E+0001 + 6.90306469238116E+0001 6.89728525214563E+0001 6.89150928046125E+0001 6.88573677624324E+0001 6.87996773840680E+0001 + 6.87420216586716E+0001 6.86844005753954E+0001 6.86268141233913E+0001 6.85692622918117E+0001 6.85117450698085E+0001 + 6.84542624465341E+0001 6.83968144111406E+0001 6.83394009527801E+0001 6.82820220606047E+0001 6.82246777237666E+0001 + 6.81673679314180E+0001 6.81100926727109E+0001 6.80528519367977E+0001 6.79956457128304E+0001 6.79384739899611E+0001 + 6.78813367573420E+0001 6.78242340041253E+0001 6.77671657194632E+0001 6.77101318925077E+0001 6.76531325124110E+0001 + 6.75961675683253E+0001 6.75392370494027E+0001 6.74823409447953E+0001 6.74254792436554E+0001 6.73686519351351E+0001 + 6.73118590083866E+0001 6.72551004525618E+0001 6.71983762568131E+0001 6.71416864102927E+0001 6.70850309021525E+0001 + 6.70284097215448E+0001 6.69718228576218E+0001 6.69152702995355E+0001 6.68587520364382E+0001 6.68022680574820E+0001 + 6.67458183518190E+0001 6.66894029086014E+0001 6.66330217169813E+0001 6.65766747661110E+0001 6.65203620451425E+0001 + 6.64640835432280E+0001 6.64078392495196E+0001 6.63516291531695E+0001 6.62954532433299E+0001 6.62393115091529E+0001 + 6.61832039397906E+0001 6.61271305243953E+0001 6.60710912521190E+0001 6.60150861121139E+0001 6.59591150935322E+0001 + 6.59031781855259E+0001 6.58472753772474E+0001 6.57914066578487E+0001 6.57355720164819E+0001 6.56797714422992E+0001 + 6.56240049244528E+0001 6.55682724520948E+0001 6.55125740143774E+0001 6.54569096004527E+0001 6.54012791994729E+0001 + 6.53456828005901E+0001 6.52901203929565E+0001 6.52345919657242E+0001 6.51790975080454E+0001 6.51236370090722E+0001 + 6.50682104579568E+0001 6.50128178438513E+0001 6.49574591559079E+0001 6.49021343832787E+0001 6.48468435151159E+0001 + 6.47915865405717E+0001 6.47363634487981E+0001 6.46811742289474E+0001 6.46260188701717E+0001 6.45708973616231E+0001 + 6.45158096924538E+0001 6.44607558518160E+0001 6.44057358288617E+0001 6.43507496127432E+0001 6.42957971926126E+0001 + 6.42408785576220E+0001 6.41859936969237E+0001 6.41311425996696E+0001 6.40763252550121E+0001 6.40215416521033E+0001 + 6.39667917800953E+0001 6.39120756281402E+0001 6.38573931853902E+0001 6.38027444409974E+0001 6.37481293841141E+0001 + 6.36935480038924E+0001 6.36390002894844E+0001 6.35844862300422E+0001 6.35300058147180E+0001 6.34755590326640E+0001 + 6.34211458730324E+0001 6.33667663249752E+0001 6.33124203776446E+0001 6.32581080201928E+0001 6.32038292417719E+0001 + 6.31495840315341E+0001 6.30953723786315E+0001 6.30411942722163E+0001 6.29870497014406E+0001 6.29329386554566E+0001 + 6.28788611234164E+0001 6.28248170944723E+0001 6.27708065577762E+0001 6.27168295024805E+0001 6.26628859177371E+0001 + 6.26089757926984E+0001 6.25550991165164E+0001 6.25012558783433E+0001 6.24474460673312E+0001 6.23936696726323E+0001 + 6.23399266833988E+0001 6.22862170887827E+0001 6.22325408779364E+0001 6.21788980400118E+0001 6.21252885641611E+0001 + 6.20717124395366E+0001 6.20181696552903E+0001 6.19646602005744E+0001 6.19111840645411E+0001 6.18577412363425E+0001 + 6.18043317051307E+0001 6.17509554600579E+0001 6.16976124902763E+0001 6.16443027849381E+0001 6.15910263331952E+0001 + 6.15377831242000E+0001 6.14845731471046E+0001 6.14313963910610E+0001 6.13782528452216E+0001 6.13251424987383E+0001 + 6.12720653407635E+0001 6.12190213604491E+0001 6.11660105469474E+0001 6.11130328894105E+0001 6.10600883769907E+0001 + 6.10071769988399E+0001 6.09542987441104E+0001 6.09014536019544E+0001 6.08486415615239E+0001 6.07958626119712E+0001 + 6.07431167424484E+0001 6.06904039421075E+0001 6.06377242001009E+0001 6.05850775055806E+0001 6.05324638476988E+0001 + 6.04798832156076E+0001 6.04273355984593E+0001 6.03748209854058E+0001 6.03223393655995E+0001 6.02698907281924E+0001 + 6.02174750623367E+0001 6.01650923571845E+0001 6.01127426018881E+0001 6.00604257855995E+0001 6.00081418974708E+0001 + 5.99558909266544E+0001 5.99036728623023E+0001 5.98514876935666E+0001 5.97993354095995E+0001 5.97472159995532E+0001 + 5.96951294525797E+0001 5.96430757578314E+0001 5.95910549044602E+0001 5.95390668816185E+0001 5.94871116784582E+0001 + 5.94351892841315E+0001 5.93832996877908E+0001 5.93314428785880E+0001 5.92796188456753E+0001 5.92278275782048E+0001 + 5.91760690653288E+0001 5.91243432961994E+0001 5.90726502599687E+0001 5.90209899457888E+0001 5.89693623428120E+0001 + 5.89177674401904E+0001 5.88662052270761E+0001 5.88146756926213E+0001 5.87631788259781E+0001 5.87117146162987E+0001 + 5.86602830527352E+0001 5.86088841244398E+0001 5.85575178205647E+0001 5.85061841302619E+0001 5.84548830426837E+0001 + 5.84036145469822E+0001 5.83523786323095E+0001 5.83011752878178E+0001 5.82500045026592E+0001 5.81988662659860E+0001 + 5.81477605669502E+0001 5.80966873947040E+0001 5.80456467383995E+0001 5.79946385871890E+0001 5.79436629302245E+0001 + 5.78927197566582E+0001 5.78418090556423E+0001 5.77909308163288E+0001 5.77400850278700E+0001 5.76892716794181E+0001 + 5.76384907601251E+0001 5.75877422591432E+0001 5.75370261656246E+0001 5.74863424687214E+0001 5.74356911575857E+0001 + 5.73850722213698E+0001 5.73344856492257E+0001 5.72839314303057E+0001 5.72334095537618E+0001 5.71829200087462E+0001 + 5.71324627844112E+0001 5.70820378699087E+0001 5.70316452543911E+0001 5.69812849270103E+0001 5.69309568769186E+0001 + 5.68806610932682E+0001 5.68303975652111E+0001 5.67801662818996E+0001 5.67299672324858E+0001 5.66798004061218E+0001 + 5.66296657919597E+0001 5.65795633791519E+0001 5.65294931568503E+0001 5.64794551142071E+0001 5.64294492403746E+0001 + 5.63794755245048E+0001 5.63295339557498E+0001 5.62796245232619E+0001 5.62297472161933E+0001 5.61799020236959E+0001 + 5.61300889349221E+0001 5.60803079390239E+0001 5.60305590251535E+0001 5.59808421824631E+0001 5.59311574001048E+0001 + 5.58815046672307E+0001 5.58318839729931E+0001 5.57822953065439E+0001 5.57327386570356E+0001 5.56832140136200E+0001 + 5.56337213654495E+0001 5.55842607016762E+0001 5.55348320114521E+0001 5.54854352839295E+0001 5.54360705082606E+0001 + 5.53867376735974E+0001 5.53374367690922E+0001 5.52881677838970E+0001 5.52389307071640E+0001 5.51897255280454E+0001 + 5.51405522356933E+0001 5.50914108192599E+0001 5.50423012678973E+0001 5.49932235707577E+0001 5.49441777169933E+0001 + 5.48951636957561E+0001 5.48461814961984E+0001 5.47972311074722E+0001 5.47483125187298E+0001 5.46994257191232E+0001 + 5.46505706978047E+0001 5.46017474439264E+0001 5.45529559466405E+0001 5.45041961950990E+0001 5.44554681784542E+0001 + 5.44067718858581E+0001 5.43581073064630E+0001 5.43094744294210E+0001 5.42608732438843E+0001 5.42123037390049E+0001 + 5.41637659039351E+0001 5.41152597278270E+0001 5.40667851998328E+0001 5.40183423091046E+0001 5.39699310447945E+0001 + 5.39215513960547E+0001 5.38732033520374E+0001 5.38248869018947E+0001 5.37766020347788E+0001 5.37283487398417E+0001 + 5.36801270062358E+0001 5.36319368231130E+0001 5.35837781796256E+0001 5.35356510649258E+0001 5.34875554681656E+0001 + 5.34394913784972E+0001 5.33914587850728E+0001 5.33434576770445E+0001 5.32954880435645E+0001 5.32475498737849E+0001 + 5.31996431568579E+0001 5.31517678819356E+0001 5.31039240381702E+0001 5.30561116147139E+0001 5.30083306007187E+0001 + 5.29605809853368E+0001 5.29128627577205E+0001 5.28651759070218E+0001 5.28175204223928E+0001 5.27698962929858E+0001 + 5.27223035079529E+0001 5.26747420564462E+0001 5.26272119276179E+0001 5.25797131106202E+0001 5.25322455946052E+0001 + 5.24848093687250E+0001 5.24374044221318E+0001 5.23900307439777E+0001 5.23426883234150E+0001 5.22953771495957E+0001 + 5.22480972116720E+0001 5.22008484987961E+0001 5.21536310001200E+0001 5.21064447047961E+0001 5.20592896019763E+0001 + 5.20121656808129E+0001 5.19650729304580E+0001 5.19180113400638E+0001 5.18709808987823E+0001 5.18239815957659E+0001 + 5.17770134201665E+0001 5.17300763611365E+0001 5.16831704078278E+0001 5.16362955493927E+0001 5.15894517749833E+0001 + 5.15426390737518E+0001 5.14958574348504E+0001 5.14491068474311E+0001 5.14023873006461E+0001 5.13556987836476E+0001 + 5.13090412855878E+0001 5.12624147956187E+0001 5.12158193028925E+0001 5.11692547965614E+0001 5.11227212657776E+0001 + 5.10762186996932E+0001 5.10297470874602E+0001 5.09833064182310E+0001 5.09368966811576E+0001 5.08905178653922E+0001 + 5.08441699600870E+0001 5.07978529543940E+0001 5.07515668374655E+0001 5.07053115984536E+0001 5.06590872265104E+0001 + 5.06128937107881E+0001 5.05667310404389E+0001 5.05205992046148E+0001 5.04744981924682E+0001 5.04284279931510E+0001 + 5.03823885958155E+0001 5.03363799896138E+0001 5.02904021636980E+0001 5.02444551072204E+0001 5.01985388093330E+0001 + 5.01526532591880E+0001 5.01067984459376E+0001 5.00609743587339E+0001 5.00151809867290E+0001 4.99694183190752E+0001 + 4.99236863449246E+0001 4.98779850534293E+0001 4.98323144337414E+0001 4.97866744750131E+0001 4.97410651663967E+0001 + 4.96954864970441E+0001 4.96499384561077E+0001 4.96044210327394E+0001 4.95589342160915E+0001 4.95134779953162E+0001 + 4.94680523595656E+0001 4.94226572979917E+0001 4.93772927997469E+0001 4.93319588539832E+0001 4.92866554498528E+0001 + 4.92413825765078E+0001 4.91961402231004E+0001 4.91509283787827E+0001 4.91057470327070E+0001 4.90605961740252E+0001 + 4.90154757918897E+0001 4.89703858754525E+0001 4.89253264138658E+0001 4.88802973962818E+0001 4.88352988118525E+0001 + 4.87903306497302E+0001 4.87453928990670E+0001 4.87004855490151E+0001 4.86556085887266E+0001 4.86107620073536E+0001 + 4.85659457940483E+0001 4.85211599379629E+0001 4.84764044282495E+0001 4.84316792540602E+0001 4.83869844045473E+0001 + 4.83423198688628E+0001 4.82976856361590E+0001 4.82530816955879E+0001 4.82085080363017E+0001 4.81639646474526E+0001 + 4.81194515181927E+0001 4.80749686376741E+0001 4.80305159950491E+0001 4.79860935794698E+0001 4.79417013800883E+0001 + 4.78973393860568E+0001 4.78530075865274E+0001 4.78087059706523E+0001 4.77644345275836E+0001 4.77201932464735E+0001 + 4.76759821164741E+0001 4.76318011267376E+0001 4.75876502664161E+0001 4.75435295246618E+0001 4.74994388906269E+0001 + 4.74553783534635E+0001 4.74113479023237E+0001 4.73673475263596E+0001 4.73233772147235E+0001 4.72794369565676E+0001 + 4.72355267410438E+0001 4.71916465573045E+0001 4.71477963945017E+0001 4.71039762417876E+0001 4.70601860883144E+0001 + 4.70164259232341E+0001 4.69726957356990E+0001 4.69289955148612E+0001 4.68853252498729E+0001 4.68416849298862E+0001 + 4.67980745440532E+0001 4.67544940815262E+0001 4.67109435314572E+0001 4.66674228829984E+0001 4.66239321253019E+0001 + 4.65804712475201E+0001 4.65370402388048E+0001 4.64936390883084E+0001 4.64502677851829E+0001 4.64069263185806E+0001 + 4.63636146776535E+0001 4.63203328515539E+0001 4.62770808294338E+0001 4.62338586004455E+0001 4.61906661537410E+0001 + 4.61475034784726E+0001 4.61043705637923E+0001 4.60612673988524E+0001 4.60181939728049E+0001 4.59751502748021E+0001 + 4.59321362939961E+0001 4.58891520195389E+0001 4.58461974405829E+0001 4.58032725462802E+0001 4.57603773257828E+0001 + 4.57175117682429E+0001 4.56746758628128E+0001 4.56318695986445E+0001 4.55890929648901E+0001 4.55463459507020E+0001 + 4.55036285452321E+0001 4.54609407376327E+0001 4.54182825170558E+0001 4.53756538726538E+0001 4.53330547935786E+0001 + 4.52904852689825E+0001 4.52479452880175E+0001 4.52054348398360E+0001 4.51629539135899E+0001 4.51205024984315E+0001 + 4.50780805835129E+0001 4.50356881579863E+0001 4.49933252110038E+0001 4.49509917317175E+0001 4.49086877092797E+0001 + 4.48664131328424E+0001 4.48241679915579E+0001 4.47819522745782E+0001 4.47397659710555E+0001 4.46976090701421E+0001 + 4.46554815609899E+0001 4.46133834327512E+0001 4.45713146745781E+0001 4.45292752756228E+0001 4.44872652250375E+0001 + 4.44452845119742E+0001 4.44033331255851E+0001 4.43614110550224E+0001 4.43195182894383E+0001 4.42776548179848E+0001 + 4.42358206298142E+0001 4.41940157140786E+0001 4.41522400599301E+0001 4.41104936565209E+0001 4.40687764930031E+0001 + 4.40270885585289E+0001 4.39854298422505E+0001 4.39438003333200E+0001 4.39022000208895E+0001 4.38606288941112E+0001 + 4.38190869421372E+0001 4.37775741541198E+0001 4.37360905192110E+0001 4.36946360265630E+0001 4.36532106653280E+0001 + 4.36118144246580E+0001 4.35704472937053E+0001 4.35291092616221E+0001 4.34878003175604E+0001 4.34465204506724E+0001 + 4.34052696501102E+0001 4.33640479050261E+0001 4.33228552045721E+0001 4.32816915379005E+0001 4.32405568941633E+0001 + 4.31994512625127E+0001 4.31583746321009E+0001 4.31173269920801E+0001 4.30763083316023E+0001 4.30353186398197E+0001 + 4.29943579058845E+0001 4.29534261189488E+0001 4.29125232681648E+0001 4.28716493426846E+0001 4.28308043316604E+0001 + 4.27899882242444E+0001 4.27492010095886E+0001 4.27084426768452E+0001 4.26677132151665E+0001 4.26270126137044E+0001 + 4.25863408616113E+0001 4.25456979480392E+0001 4.25050838621403E+0001 4.24644985930667E+0001 4.24239421299706E+0001 + 4.23834144620042E+0001 4.23429155783196E+0001 4.23024454680689E+0001 4.22620041204043E+0001 4.22215915244779E+0001 + 4.21812076694420E+0001 4.21408525444486E+0001 4.21005261386499E+0001 4.20602284411980E+0001 4.20199594412452E+0001 + 4.19797191279435E+0001 4.19395074904452E+0001 4.18993245179023E+0001 4.18591701994670E+0001 4.18190445242914E+0001 + 4.17789474815278E+0001 4.17388790603282E+0001 4.16988392498449E+0001 4.16588280392299E+0001 4.16188454176355E+0001 + 4.15788913742137E+0001 4.15389658981167E+0001 4.14990689784967E+0001 4.14592006045058E+0001 4.14193607652962E+0001 + 4.13795494500201E+0001 4.13397666478295E+0001 4.13000123478766E+0001 4.12602865393136E+0001 4.12205892112927E+0001 + 4.11809203529659E+0001 4.11412799534854E+0001 4.11016680020035E+0001 4.10620844876722E+0001 4.10225293996436E+0001 + 4.09830027270701E+0001 4.09435044591035E+0001 4.09040345848963E+0001 4.08645930936004E+0001 4.08251799743681E+0001 + 4.07857952163515E+0001 4.07464388087027E+0001 4.07071107405739E+0001 4.06678110011173E+0001 4.06285395794850E+0001 + 4.05892964648291E+0001 4.05500816463018E+0001 4.05108951130553E+0001 4.04717368542417E+0001 4.04326068590131E+0001 + 4.03935051165218E+0001 4.03544316159198E+0001 4.03153863463593E+0001 4.02763692969925E+0001 4.02373804569715E+0001 + 4.01984198154484E+0001 4.01594873615755E+0001 4.01205830845048E+0001 4.00817069733886E+0001 4.00428590173789E+0001 + 4.00040392056280E+0001 3.99652475272879E+0001 3.99264839715109E+0001 3.98877485274490E+0001 3.98490411842544E+0001 + 3.98103619310794E+0001 3.97717107570759E+0001 3.97330876513963E+0001 3.96944926031925E+0001 3.96559256016169E+0001 + 3.96173866358215E+0001 3.95788756949585E+0001 3.95403927681800E+0001 3.95019378446382E+0001 3.94635109134852E+0001 + 3.94251119638732E+0001 3.93867409849544E+0001 3.93483979658808E+0001 3.93100828958048E+0001 3.92717957638783E+0001 + 3.92335365592535E+0001 3.91953052710827E+0001 3.91571018885179E+0001 3.91189264007113E+0001 3.90807787968150E+0001 + 3.90426590659813E+0001 3.90045671973622E+0001 3.89665031801099E+0001 3.89284670033766E+0001 3.88904586563144E+0001 + 3.88524781280754E+0001 3.88145254078119E+0001 3.87766004846759E+0001 3.87387033478196E+0001 3.87008339863952E+0001 + 3.86629923895548E+0001 3.86251785464506E+0001 3.85873924462347E+0001 3.85496340780593E+0001 3.85119034310765E+0001 + 3.84742004944384E+0001 3.84365252572973E+0001 3.83988777088053E+0001 3.83612578381145E+0001 3.83236656343770E+0001 + 3.82861010867451E+0001 3.82485641843709E+0001 3.82110549164065E+0001 3.81735732720041E+0001 3.81361192403159E+0001 + 3.80986928104939E+0001 3.80612939716903E+0001 3.80239227130574E+0001 3.79865790237472E+0001 3.79492628929118E+0001 + 3.79119743097035E+0001 3.78747132632744E+0001 3.78374797427767E+0001 3.78002737373625E+0001 3.77630952361838E+0001 + 3.77259442283931E+0001 3.76888207031422E+0001 3.76517246495834E+0001 3.76146560568689E+0001 3.75776149141508E+0001 + 3.75406012105813E+0001 3.75036149353125E+0001 3.74666560774965E+0001 3.74297246262855E+0001 3.73928205708317E+0001 + 3.73559439002872E+0001 3.73190946038042E+0001 3.72822726705348E+0001 3.72454780896311E+0001 3.72087108502454E+0001 + 3.71719709415297E+0001 3.71352583526363E+0001 3.70985730727172E+0001 3.70619150909247E+0001 3.70252843964108E+0001 + 3.69886809783277E+0001 3.69521048258276E+0001 3.69155559280627E+0001 3.68790342741850E+0001 3.68425398533468E+0001 + 3.68060726547001E+0001 3.67696326673972E+0001 3.67332198805901E+0001 3.66968342834311E+0001 3.66604758650723E+0001 + 3.66241446146658E+0001 3.65878405213638E+0001 3.65515635743185E+0001 3.65153137626819E+0001 3.64790910756063E+0001 + 3.64428955022437E+0001 3.64067270317465E+0001 3.63705856532666E+0001 3.63344713559562E+0001 3.62983841289676E+0001 + 3.62623239614528E+0001 3.62262908425640E+0001 3.61902847614534E+0001 3.61543057072731E+0001 3.61183536691752E+0001 + 3.60824286363119E+0001 3.60465305978354E+0001 3.60106595428978E+0001 3.59748154606513E+0001 3.59389983402479E+0001 + 3.59032081708400E+0001 3.58674449415795E+0001 3.58317086416187E+0001 3.57959992601098E+0001 3.57603167862048E+0001 + 3.57246612090559E+0001 3.56890325178153E+0001 3.56534307016351E+0001 3.56178557496675E+0001 3.55823076510646E+0001 + 3.55467863949786E+0001 3.55112919705617E+0001 3.54758243669658E+0001 3.54403835733434E+0001 3.54049695788464E+0001 + 3.53695823726270E+0001 3.53342219438375E+0001 3.52988882816298E+0001 3.52635813751563E+0001 3.52283012135690E+0001 + 3.51930477860200E+0001 3.51578210816617E+0001 3.51226210896460E+0001 3.50874477991251E+0001 3.50523011992513E+0001 + 3.50171812791766E+0001 3.49820880280532E+0001 3.49470214350332E+0001 3.49119814892689E+0001 3.48769681799122E+0001 + 3.48419814961155E+0001 3.48070214270309E+0001 3.47720879618104E+0001 3.47371810896064E+0001 3.47023007995708E+0001 + 3.46674470808558E+0001 3.46326199226137E+0001 3.45978193139966E+0001 3.45630452441565E+0001 3.45282977022458E+0001 + 3.44935766774164E+0001 3.44588821588206E+0001 3.44242141356105E+0001 3.43895725969383E+0001 3.43549575319561E+0001 + 3.43203689298161E+0001 3.42858067796704E+0001 3.42512710706712E+0001 3.42167617919706E+0001 3.41822789327208E+0001 + 3.41478224820739E+0001 3.41133924291821E+0001 3.40789887631975E+0001 3.40446114732723E+0001 3.40102605485586E+0001 + 3.39759359782087E+0001 3.39416377513745E+0001 3.39073658572083E+0001 3.38731202848623E+0001 3.38389010234886E+0001 + 3.38047080622393E+0001 3.37705413902666E+0001 3.37364009967227E+0001 3.37022868707596E+0001 3.36681990015296E+0001 + 3.36341373781848E+0001 3.36001019898773E+0001 3.35660928257594E+0001 3.35321098749830E+0001 3.34981531267005E+0001 + 3.34642225700640E+0001 3.34303181942255E+0001 3.33964399883373E+0001 3.33625879415515E+0001 3.33287620430203E+0001 + 3.32949622818958E+0001 3.32611886473301E+0001 3.32274411284755E+0001 3.31937197144840E+0001 3.31600243945079E+0001 + 3.31263551576992E+0001 3.30927119932101E+0001 3.30590948901928E+0001 3.30255038377994E+0001 3.29919388251821E+0001 + 3.29583998414930E+0001 3.29248868758843E+0001 3.28913999175081E+0001 3.28579389555166E+0001 3.28245039790619E+0001 + 3.27910949772962E+0001 3.27577119393716E+0001 3.27243548544403E+0001 3.26910237116545E+0001 3.26577185001662E+0001 + 3.26244392091277E+0001 3.25911858276910E+0001 3.25579583450084E+0001 3.25247567502320E+0001 3.24915810325139E+0001 + 3.24584311810063E+0001 3.24253071848614E+0001 3.23922090332313E+0001 3.23591367152680E+0001 3.23260902201240E+0001 + 3.22930695369511E+0001 3.22600746549016E+0001 3.22271055631278E+0001 3.21941622507816E+0001 3.21612447070152E+0001 + 3.21283529209809E+0001 3.20954868818307E+0001 3.20626465787168E+0001 3.20298320007914E+0001 3.19970431372066E+0001 + 3.19642799771146E+0001 3.19315425096675E+0001 3.18988307240174E+0001 3.18661446093165E+0001 3.18334841547171E+0001 + 3.18008493493711E+0001 3.17682401824308E+0001 3.17356566430484E+0001 3.17030987203759E+0001 3.16705664035655E+0001 + 3.16380596817694E+0001 3.16055785441397E+0001 3.15731229798286E+0001 3.15406929779883E+0001 3.15082885277708E+0001 + 3.14759096183284E+0001 3.14435562388131E+0001 3.14112283783771E+0001 3.13789260261727E+0001 3.13466491713519E+0001 + 3.13143978030669E+0001 3.12821719104698E+0001 3.12499714827128E+0001 3.12177965089480E+0001 3.11856469783277E+0001 + 3.11535228800039E+0001 3.11214242031288E+0001 3.10893509368545E+0001 3.10573030703332E+0001 3.10252805927171E+0001 + 3.09932834931583E+0001 3.09613117608089E+0001 3.09293653848211E+0001 3.08974443543471E+0001 3.08655486585390E+0001 + 3.08336782865490E+0001 3.08018332275291E+0001 3.07700134706316E+0001 3.07382190050087E+0001 3.07064498198124E+0001 + 3.06747059041949E+0001 3.06429872473084E+0001 3.06112938383049E+0001 3.05796256663368E+0001 3.05479827205561E+0001 + 3.05163649901149E+0001 3.04847724641655E+0001 3.04532051318599E+0001 3.04216629823504E+0001 3.03901460047890E+0001 + 3.03586541883280E+0001 3.03271875221195E+0001 3.02957459953155E+0001 3.02643295970684E+0001 3.02329383165302E+0001 + 3.02015721428531E+0001 3.01702310651892E+0001 3.01389150726907E+0001 3.01076241545097E+0001 3.00763582997984E+0001 + 3.00451174977090E+0001 3.00139017373935E+0001 2.99827110080042E+0001 2.99515452986932E+0001 2.99204045986126E+0001 + 2.98892888969146E+0001 2.98581981827514E+0001 2.98271324452751E+0001 2.97960916736378E+0001 2.97650758569917E+0001 + 2.97340849844890E+0001 2.97031190452818E+0001 2.96721780285222E+0001 2.96412619233625E+0001 2.96103707189547E+0001 + 2.95795044044510E+0001 2.95486629690035E+0001 2.95178464017645E+0001 2.94870546918861E+0001 2.94562878285203E+0001 + 2.94255458008195E+0001 2.93948285979356E+0001 2.93641362090209E+0001 2.93334686232275E+0001 2.93028258297076E+0001 + 2.92722078176133E+0001 2.92416145760969E+0001 2.92110460943103E+0001 2.91805023614058E+0001 2.91499833665355E+0001 + 2.91194890988516E+0001 2.90890195475062E+0001 2.90585747016515E+0001 2.90281545504397E+0001 2.89977590830228E+0001 + 2.89673882885531E+0001 2.89370421561826E+0001 2.89067206750636E+0001 2.88764238343482E+0001 2.88461516231885E+0001 + 2.88159040307367E+0001 2.87856810461449E+0001 2.87554826585654E+0001 2.87253088571502E+0001 2.86951596310515E+0001 + 2.86650349694214E+0001 2.86349348614121E+0001 2.86048592961758E+0001 2.85748082628646E+0001 2.85447817506306E+0001 + 2.85147797486261E+0001 2.84848022460031E+0001 2.84548492319138E+0001 2.84249206955104E+0001 2.83950166259449E+0001 + 2.83651370123697E+0001 2.83352818439367E+0001 2.83054511097982E+0001 2.82756447991063E+0001 2.82458629010132E+0001 + 2.82161054046710E+0001 2.81863722992319E+0001 2.81566635738480E+0001 2.81269792176715E+0001 2.80973192198545E+0001 + 2.80676835695491E+0001 2.80380722559076E+0001 2.80084852680821E+0001 2.79789225952247E+0001 2.79493842264876E+0001 + 2.79198701510229E+0001 2.78903803579827E+0001 2.78609148365193E+0001 2.78314735757849E+0001 2.78020565649314E+0001 + 2.77726637931111E+0001 2.77432952494762E+0001 2.77139509231787E+0001 2.76846308033709E+0001 2.76553348792049E+0001 + 2.76260631398328E+0001 2.75968155744068E+0001 2.75675921720791E+0001 2.75383929220018E+0001 2.75092178133270E+0001 + 2.74800668352069E+0001 2.74509399767937E+0001 2.74218372272394E+0001 2.73927585756963E+0001 2.73637040113166E+0001 + 2.73346735232522E+0001 2.73056671006555E+0001 2.72766847326786E+0001 2.72477264084735E+0001 2.72187921171925E+0001 + 2.71898818479878E+0001 2.71609955900113E+0001 2.71321333324155E+0001 2.71032950643522E+0001 2.70744807749738E+0001 + 2.70456904534324E+0001 2.70169240888801E+0001 2.69881816704690E+0001 2.69594631873514E+0001 2.69307686286793E+0001 + 2.69020979836050E+0001 2.68734512412806E+0001 2.68448283908581E+0001 2.68162294214899E+0001 2.67876543223280E+0001 + 2.67591030825246E+0001 2.67305756912318E+0001 2.67020721376018E+0001 2.66735924107867E+0001 2.66451364999387E+0001 + 2.66167043942099E+0001 2.65882960827526E+0001 2.65599115547188E+0001 2.65315507992606E+0001 2.65032138055304E+0001 + 2.64749005626801E+0001 2.64466110598619E+0001 2.64183452862281E+0001 2.63901032309307E+0001 2.63618848831219E+0001 + 2.63336902319538E+0001 2.63055192665787E+0001 2.62773719761486E+0001 2.62492483498157E+0001 2.62211483767322E+0001 + 2.61930720460502E+0001 2.61650193469218E+0001 2.61369902684993E+0001 2.61089847999347E+0001 2.60810029303802E+0001 + 2.60530446489880E+0001 2.60251099449102E+0001 2.59971988072990E+0001 2.59693112253065E+0001 2.59414471880848E+0001 + 2.59136066847862E+0001 2.58857897045628E+0001 2.58579962365666E+0001 2.58302262699500E+0001 2.58024797938650E+0001 + 2.57747567974637E+0001 2.57470572698984E+0001 2.57193812003212E+0001 2.56917285778842E+0001 2.56640993917395E+0001 + 2.56364936310394E+0001 2.56089112849360E+0001 2.55813523425815E+0001 2.55538167931279E+0001 2.55263046257274E+0001 + 2.54988158295323E+0001 2.54713503936946E+0001 2.54439083073665E+0001 2.54164895597001E+0001 2.53890941398476E+0001 + 2.53617220369612E+0001 2.53343732401929E+0001 2.53070477386951E+0001 2.52797455216197E+0001 2.52524665781189E+0001 + 2.52252108973450E+0001 2.51979784684500E+0001 2.51707692805862E+0001 2.51435833229055E+0001 2.51164205845603E+0001 + 2.50892810547027E+0001 2.50621647224848E+0001 2.50350715770587E+0001 2.50080016075766E+0001 2.49809548031907E+0001 + 2.49539311530532E+0001 2.49269306463160E+0001 2.48999532721315E+0001 2.48729990196518E+0001 2.48460678780290E+0001 + 2.48191598364153E+0001 2.47922748839628E+0001 2.47654130098236E+0001 2.47385742031501E+0001 2.47117584530941E+0001 + 2.46849657488080E+0001 2.46581960794439E+0001 2.46314494341539E+0001 2.46047258020902E+0001 2.45780251724049E+0001 + 2.45513475342503E+0001 2.45246928767783E+0001 2.44980611891413E+0001 2.44714524604912E+0001 2.44448666799804E+0001 + 2.44183038367609E+0001 2.43917639199849E+0001 2.43652469188046E+0001 2.43387528223720E+0001 2.43122816198394E+0001 + 2.42858333003589E+0001 2.42594078530826E+0001 2.42330052671628E+0001 2.42066255317515E+0001 2.41802686360009E+0001 + 2.41539345690631E+0001 2.41276233200904E+0001 2.41013348782348E+0001 2.40750692326485E+0001 2.40488263724837E+0001 + 2.40226062868925E+0001 2.39964089650270E+0001 2.39702343960395E+0001 2.39440825690820E+0001 2.39179534733068E+0001 + 2.38918470978659E+0001 2.38657634319116E+0001 2.38397024645959E+0001 2.38136641850710E+0001 2.37876485824891E+0001 + 2.37616556460023E+0001 2.37356853647628E+0001 2.37097377279228E+0001 2.36838127246343E+0001 2.36579103440495E+0001 + 2.36320305753206E+0001 2.36061734075998E+0001 2.35803388300391E+0001 2.35545268317908E+0001 2.35287374020069E+0001 + 2.35029705298397E+0001 2.34772262044413E+0001 2.34515044149638E+0001 2.34258051505594E+0001 2.34001284003803E+0001 + 2.33744741535785E+0001 2.33488423993063E+0001 2.33232331267158E+0001 2.32976463249591E+0001 2.32720819831885E+0001 + 2.32465400905559E+0001 2.32210206362137E+0001 2.31955236093140E+0001 2.31700489990088E+0001 2.31445967944504E+0001 + 2.31191669847909E+0001 2.30937595591825E+0001 2.30683745067772E+0001 2.30430118167274E+0001 2.30176714781850E+0001 + 2.29923534803023E+0001 2.29670578122314E+0001 2.29417844631245E+0001 2.29165334221337E+0001 2.28913046784112E+0001 + 2.28660982211091E+0001 2.28409140393795E+0001 2.28157521223747E+0001 2.27906124592468E+0001 2.27654950391478E+0001 + 2.27403998512301E+0001 2.27153268846457E+0001 2.26902761285467E+0001 2.26652475720854E+0001 2.26402412044139E+0001 + 2.26152570146843E+0001 2.25902949920488E+0001 2.25653551256595E+0001 2.25404374046686E+0001 2.25155418182283E+0001 + 2.24906683554906E+0001 2.24658170056078E+0001 2.24409877577319E+0001 2.24161806010152E+0001 2.23913955246098E+0001 + 2.23666325176679E+0001 2.23418915693415E+0001 2.23171726687829E+0001 2.22924758051442E+0001 2.22678009675775E+0001 + 2.22431481452351E+0001 2.22185173272690E+0001 2.21939085028314E+0001 2.21693216610744E+0001 2.21447567911503E+0001 + 2.21202138822111E+0001 2.20956929234090E+0001 2.20711939038962E+0001 2.20467168128248E+0001 2.20222616393470E+0001 + 2.19978283726149E+0001 2.19734170017806E+0001 2.19490275159964E+0001 2.19246599044143E+0001 2.19003141561866E+0001 + 2.18759902604653E+0001 2.18516882064027E+0001 2.18274079831508E+0001 2.18031495798618E+0001 2.17789129856879E+0001 + 2.17546981897813E+0001 2.17305051812940E+0001 2.17063339493783E+0001 2.16821844831862E+0001 2.16580567718700E+0001 + 2.16339508045818E+0001 2.16098665704736E+0001 2.15858040586978E+0001 2.15617632584064E+0001 2.15377441587516E+0001 + 2.15137467488856E+0001 2.14897710179604E+0001 2.14658169551283E+0001 2.14418845495414E+0001 2.14179737903518E+0001 + 2.13940846667117E+0001 2.13702171677733E+0001 2.13463712826886E+0001 2.13225470006100E+0001 2.12987443106894E+0001 + 2.12749632020791E+0001 2.12512036639311E+0001 2.12274656853977E+0001 2.12037492556311E+0001 2.11800543637833E+0001 + 2.11563809990065E+0001 2.11327291504529E+0001 2.11090988072746E+0001 2.10854899586237E+0001 2.10619025936525E+0001 + 2.10383367015130E+0001 2.10147922713574E+0001 2.09912692923379E+0001 2.09677677536067E+0001 2.09442876443158E+0001 + 2.09208289536174E+0001 2.08973916706637E+0001 2.08739757846068E+0001 2.08505812845989E+0001 2.08272081597922E+0001 + 2.08038563993387E+0001 2.07805259923906E+0001 2.07572169281002E+0001 2.07339291956194E+0001 2.07106627841005E+0001 + 2.06874176826957E+0001 2.06641938805571E+0001 2.06409913668368E+0001 2.06178101306870E+0001 2.05946501612598E+0001 + 2.05715114477075E+0001 2.05483939791820E+0001 2.05252977448357E+0001 2.05022227338206E+0001 2.04791689352889E+0001 + 2.04561363383928E+0001 2.04331249322843E+0001 2.04101347061157E+0001 2.03871656490391E+0001 2.03642177502067E+0001 + 2.03412909987706E+0001 2.03183853838829E+0001 2.02955008946958E+0001 2.02726375203615E+0001 2.02497952500321E+0001 + 2.02269740728598E+0001 2.02041739779967E+0001 2.01813949545949E+0001 2.01586369918067E+0001 2.01359000787841E+0001 + 2.01131842046793E+0001 2.00904893586445E+0001 2.00678155298319E+0001 2.00451627073935E+0001 2.00225308804815E+0001 + 1.99999200382481E+0001 1.99773301698454E+0001 1.99547612644256E+0001 1.99322133111409E+0001 1.99096862991433E+0001 + 1.98871802175850E+0001 1.98646950556183E+0001 1.98422308023951E+0001 1.98197874470677E+0001 1.97973649787883E+0001 + 1.97749633867090E+0001 1.97525826599819E+0001 1.97302227877592E+0001 1.97078837591930E+0001 1.96855655634356E+0001 + 1.96632681896389E+0001 1.96409916269553E+0001 1.96187358645368E+0001 1.95965008915357E+0001 1.95742866971039E+0001 + 1.95520932703938E+0001 1.95299206005574E+0001 1.95077686767469E+0001 1.94856374881145E+0001 1.94635270238123E+0001 + 1.94414372729924E+0001 1.94193682248070E+0001 1.93973198684083E+0001 1.93752921929485E+0001 1.93532851875795E+0001 + 1.93312988414537E+0001 1.93093331437232E+0001 1.92873880835400E+0001 1.92654636500565E+0001 1.92435598324246E+0001 + 1.92216766197967E+0001 1.91998140013247E+0001 1.91779719661609E+0001 1.91561505034575E+0001 1.91343496023665E+0001 + 1.91125692520401E+0001 1.90908094416305E+0001 1.90690701602899E+0001 1.90473513971703E+0001 1.90256531414240E+0001 + 1.90039753822030E+0001 1.89823181086596E+0001 1.89606813099459E+0001 1.89390649752140E+0001 1.89174690936160E+0001 + 1.88958936543043E+0001 1.88743386464308E+0001 1.88528040591478E+0001 1.88312898816073E+0001 1.88097961029616E+0001 + 1.87883227123628E+0001 1.87668696989630E+0001 1.87454370519145E+0001 1.87240247603693E+0001 1.87026328134796E+0001 + 1.86812612003975E+0001 1.86599099102752E+0001 1.86385789322649E+0001 1.86172682555187E+0001 1.85959778691888E+0001 + 1.85747077624273E+0001 1.85534579243863E+0001 1.85322283442180E+0001 1.85110190110746E+0001 1.84898299141083E+0001 + 1.84686610424710E+0001 1.84475123853151E+0001 1.84263839317927E+0001 1.84052756710559E+0001 1.83841875922568E+0001 + 1.83631196845477E+0001 1.83420719370807E+0001 1.83210443390078E+0001 1.83000368794814E+0001 1.82790495476535E+0001 + 1.82580823326762E+0001 1.82371352237018E+0001 1.82162082098824E+0001 1.81953012803701E+0001 1.81744144243170E+0001 + 1.81535476308754E+0001 1.81327008891974E+0001 1.81118741884352E+0001 1.80910675177408E+0001 1.80702808662665E+0001 + 1.80495142231643E+0001 1.80287675775865E+0001 1.80080409186852E+0001 1.79873342356125E+0001 1.79666475175207E+0001 + 1.79459807535617E+0001 1.79253339328879E+0001 1.79047070446514E+0001 1.78841000780042E+0001 1.78635130220986E+0001 + 1.78429458660866E+0001 1.78223985991206E+0001 1.78018712103525E+0001 1.77813636889346E+0001 1.77608760240190E+0001 + 1.77404082047579E+0001 1.77199602203034E+0001 1.76995320598076E+0001 1.76791237124228E+0001 1.76587351673010E+0001 + 1.76383664135945E+0001 1.76180174404553E+0001 1.75976882370356E+0001 1.75773787924876E+0001 1.75570890959634E+0001 + 1.75368191366152E+0001 1.75165689035952E+0001 1.74963383860554E+0001 1.74761275731480E+0001 1.74559364540252E+0001 + 1.74357650178391E+0001 1.74156132537419E+0001 1.73954811508858E+0001 1.73753686984228E+0001 1.73552758855052E+0001 + 1.73352027012850E+0001 1.73151491349145E+0001 1.72951151755458E+0001 1.72751008123310E+0001 1.72551060344223E+0001 + 1.72351308309719E+0001 1.72151751911318E+0001 1.71952391040543E+0001 1.71753225588915E+0001 1.71554255447955E+0001 + 1.71355480509185E+0001 1.71156900664127E+0001 1.70958515804302E+0001 1.70760325821231E+0001 1.70562330606437E+0001 + 1.70364530051440E+0001 1.70166924047762E+0001 1.69969512486924E+0001 1.69772295260449E+0001 1.69575272259857E+0001 + 1.69378443376671E+0001 1.69181808502411E+0001 1.68985367528599E+0001 1.68789120346757E+0001 1.68593066848406E+0001 + 1.68397206925068E+0001 1.68201540468264E+0001 1.68006067369515E+0001 1.67810787520344E+0001 1.67615700812272E+0001 + 1.67420807136820E+0001 1.67226106385509E+0001 1.67031598449862E+0001 1.66837283221400E+0001 1.66643160591644E+0001 + 1.66449230452116E+0001 1.66255492694337E+0001 1.66061947209829E+0001 1.65868593890113E+0001 1.65675432626711E+0001 + 1.65482463311145E+0001 1.65289685834935E+0001 1.65097100089604E+0001 1.64904705966673E+0001 1.64712503357663E+0001 + 1.64520492154096E+0001 1.64328672247494E+0001 1.64137043529377E+0001 1.63945605891268E+0001 1.63754359224688E+0001 + 1.63563303421159E+0001 1.63372438372202E+0001 1.63181763969338E+0001 1.62991280104089E+0001 1.62800986667976E+0001 + 1.62610883552522E+0001 1.62420970649248E+0001 1.62231247849674E+0001 1.62041715045323E+0001 1.61852372127716E+0001 + 1.61663218988375E+0001 1.61474255518821E+0001 1.61285481610576E+0001 1.61096897155161E+0001 1.60908502044097E+0001 + 1.60720296168907E+0001 1.60532279421111E+0001 1.60344451692232E+0001 1.60156812873790E+0001 1.59969362857308E+0001 + 1.59782101534306E+0001 1.59595028796307E+0001 1.59408144534831E+0001 1.59221448641401E+0001 1.59034941007538E+0001 + 1.58848621524763E+0001 1.58662490084597E+0001 1.58476546578564E+0001 1.58290790898183E+0001 1.58105222934976E+0001 + 1.57919842580465E+0001 1.57734649726172E+0001 1.57549644263618E+0001 1.57364826084324E+0001 1.57180195079812E+0001 + 1.56995751141603E+0001 1.56811494161220E+0001 1.56627424030183E+0001 1.56443540640013E+0001 1.56259843882234E+0001 + 1.56076333648365E+0001 1.55893009829929E+0001 1.55709872318447E+0001 1.55526921005441E+0001 1.55344155782432E+0001 + 1.55161576540941E+0001 1.54979183172490E+0001 1.54796975568601E+0001 1.54614953620796E+0001 1.54433117220594E+0001 + 1.54251466259519E+0001 1.54070000629092E+0001 1.53888720220834E+0001 1.53707624926266E+0001 1.53526714636911E+0001 + 1.53345989244289E+0001 1.53165448639923E+0001 1.52985092715333E+0001 1.52804921362042E+0001 1.52624934471570E+0001 + 1.52445131935440E+0001 1.52265513645172E+0001 1.52086079492289E+0001 1.51906829368312E+0001 1.51727763164762E+0001 + 1.51548880773160E+0001 1.51370182085030E+0001 1.51191666991890E+0001 1.51013335385265E+0001 1.50835187156674E+0001 + 1.50657222197640E+0001 1.50479440399684E+0001 1.50301841654327E+0001 1.50124425853091E+0001 1.49947192887497E+0001 + 1.49770142649068E+0001 1.49593275029324E+0001 1.49416589919787E+0001 1.49240087211978E+0001 1.49063766797420E+0001 + 1.48887628567633E+0001 1.48711672414139E+0001 1.48535898228460E+0001 1.48360305902116E+0001 1.48184895326631E+0001 + 1.48009666393524E+0001 1.47834618994318E+0001 1.47659753020534E+0001 1.47485068363694E+0001 1.47310564915319E+0001 + 1.47136242566931E+0001 1.46962101210051E+0001 1.46788140736200E+0001 1.46614361036901E+0001 1.46440762003675E+0001 + 1.46267343528043E+0001 1.46094105501526E+0001 1.45921047815647E+0001 1.45748170361926E+0001 1.45575473031886E+0001 + 1.45402955717048E+0001 1.45230618308933E+0001 1.45058460699062E+0001 1.44886482778958E+0001 1.44714684440142E+0001 + 1.44543065574136E+0001 1.44371626072460E+0001 1.44200365826637E+0001 1.44029284728187E+0001 1.43858382668633E+0001 + 1.43687659539496E+0001 1.43517115232297E+0001 1.43346749638558E+0001 1.43176562649801E+0001 1.43006554157547E+0001 + 1.42836724053317E+0001 1.42667072228633E+0001 1.42497598575017E+0001 1.42328302983989E+0001 1.42159185347073E+0001 + 1.41990245555788E+0001 1.41821483501657E+0001 1.41652899076201E+0001 1.41484492170942E+0001 1.41316262677400E+0001 + 1.41148210487099E+0001 1.40980335491558E+0001 1.40812637582300E+0001 1.40645116650846E+0001 1.40477772588719E+0001 + 1.40310605287438E+0001 1.40143614638525E+0001 1.39976800533504E+0001 1.39810162863893E+0001 1.39643701521216E+0001 + 1.39477416396994E+0001 1.39311307382748E+0001 1.39145374370000E+0001 1.38979617250271E+0001 1.38814035915083E+0001 + 1.38648630255957E+0001 1.38483400164415E+0001 1.38318345531979E+0001 1.38153466250169E+0001 1.37988762210508E+0001 + 1.37824233304516E+0001 1.37659879423716E+0001 1.37495700459629E+0001 1.37331696303776E+0001 1.37167866847679E+0001 + 1.37004211982860E+0001 1.36840731600840E+0001 1.36677425593140E+0001 1.36514293851282E+0001 1.36351336266787E+0001 + 1.36188552731178E+0001 1.36025943135975E+0001 1.35863507372700E+0001 1.35701245332875E+0001 1.35539156908020E+0001 + 1.35377241989659E+0001 1.35215500469311E+0001 1.35053932238499E+0001 1.34892537188744E+0001 1.34731315211568E+0001 + 1.34570266198492E+0001 1.34409390041037E+0001 1.34248686630726E+0001 1.34088155859080E+0001 1.33927797617619E+0001 + 1.33767611797866E+0001 1.33607598291343E+0001 1.33447756989570E+0001 1.33288087784070E+0001 1.33128590566363E+0001 + 1.32969265227971E+0001 1.32810111660417E+0001 1.32651129755220E+0001 1.32492319403904E+0001 1.32333680497988E+0001 + 1.32175212928996E+0001 1.32016916588448E+0001 1.31858791367866E+0001 1.31700837158771E+0001 1.31543053852685E+0001 + 1.31385441341129E+0001 1.31227999515626E+0001 1.31070728267695E+0001 1.30913627488860E+0001 1.30756697070641E+0001 + 1.30599936904560E+0001 1.30443346882139E+0001 1.30286926894898E+0001 1.30130676834361E+0001 1.29974596592047E+0001 + 1.29818686059478E+0001 1.29662945128177E+0001 1.29507373689664E+0001 1.29351971635461E+0001 1.29196738857090E+0001 + 1.29041675246072E+0001 1.28886780693929E+0001 1.28732055092182E+0001 1.28577498332352E+0001 1.28423110305961E+0001 + 1.28268890904531E+0001 1.28114840019584E+0001 1.27960957542640E+0001 1.27807243365221E+0001 1.27653697378849E+0001 + 1.27500319475045E+0001 1.27347109545331E+0001 1.27194067481228E+0001 1.27041193174258E+0001 1.26888486515942E+0001 + 1.26735947397802E+0001 1.26583575711359E+0001 1.26431371348135E+0001 1.26279334199651E+0001 1.26127464157430E+0001 + 1.25975761112991E+0001 1.25824224957858E+0001 1.25672855583550E+0001 1.25521652881591E+0001 1.25370616743501E+0001 + 1.25219747060802E+0001 1.25069043725016E+0001 1.24918506627663E+0001 1.24768135660266E+0001 1.24617930714346E+0001 + 1.24467891681424E+0001 1.24318018453022E+0001 1.24168310920662E+0001 1.24018768975865E+0001 1.23869392510152E+0001 + 1.23720181415045E+0001 1.23571135582066E+0001 1.23422254902736E+0001 1.23273539268577E+0001 1.23124988571110E+0001 + 1.22976602701856E+0001 1.22828381552337E+0001 1.22680325014075E+0001 1.22532432978592E+0001 1.22384705337408E+0001 + 1.22237141982045E+0001 1.22089742804024E+0001 1.21942507694868E+0001 1.21795436546098E+0001 1.21648529249235E+0001 + 1.21501785695800E+0001 1.21355205777316E+0001 1.21208789385304E+0001 1.21062536411285E+0001 1.20916446746781E+0001 + 1.20770520283313E+0001 1.20624756912402E+0001 1.20479156525572E+0001 1.20333719014342E+0001 1.20188444270234E+0001 + 1.20043332184770E+0001 1.19898382649472E+0001 1.19753595555860E+0001 1.19608970795457E+0001 1.19464508259784E+0001 + 1.19320207840362E+0001 1.19176069428714E+0001 1.19032092916359E+0001 1.18888278194821E+0001 1.18744625155620E+0001 + 1.18601133690278E+0001 1.18457803690317E+0001 1.18314635047257E+0001 1.18171627652622E+0001 1.18028781397931E+0001 + 1.17886096174707E+0001 1.17743571874471E+0001 1.17601208388744E+0001 1.17459005609049E+0001 1.17316963426906E+0001 + 1.17175081733837E+0001 1.17033360421364E+0001 1.16891799381008E+0001 1.16750398504291E+0001 1.16609157682734E+0001 + 1.16468076807859E+0001 1.16327155771187E+0001 1.16186394464239E+0001 1.16045792778538E+0001 1.15905350605604E+0001 + 1.15765067836960E+0001 1.15624944364127E+0001 1.15484980078626E+0001 1.15345174871978E+0001 1.15205528635706E+0001 + 1.15066041261331E+0001 1.14926712640374E+0001 1.14787542664357E+0001 1.14648531224802E+0001 1.14509678213229E+0001 + 1.14370983521160E+0001 1.14232447040118E+0001 1.14094068661623E+0001 1.13955848277197E+0001 1.13817785778361E+0001 + 1.13679881056637E+0001 1.13542134003547E+0001 1.13404544510611E+0001 1.13267112469353E+0001 1.13129837771292E+0001 + 1.12992720307950E+0001 1.12855759970850E+0001 1.12718956651512E+0001 1.12582310241459E+0001 1.12445820632211E+0001 + 1.12309487715290E+0001 1.12173311382217E+0001 1.12037291524515E+0001 1.11901428033704E+0001 1.11765720801306E+0001 + 1.11630169718843E+0001 1.11494774677837E+0001 1.11359535569807E+0001 1.11224452286277E+0001 1.11089524718768E+0001 + 1.10954752758801E+0001 1.10820136297898E+0001 1.10685675227580E+0001 1.10551369439368E+0001 1.10417218824785E+0001 + 1.10283223275352E+0001 1.10149382682590E+0001 1.10015696938021E+0001 1.09882165933166E+0001 1.09748789559547E+0001 + 1.09615567708685E+0001 1.09482500272102E+0001 1.09349587141320E+0001 1.09216828207859E+0001 1.09084223363242E+0001 + 1.08951772498989E+0001 1.08819475506623E+0001 1.08687332277665E+0001 1.08555342703637E+0001 1.08423506676059E+0001 + 1.08291824086454E+0001 1.08160294826343E+0001 1.08028918787247E+0001 1.07897695860689E+0001 1.07766625938188E+0001 + 1.07635708911268E+0001 1.07504944671450E+0001 1.07374333110254E+0001 1.07243874119203E+0001 1.07113567589819E+0001 + 1.06983413413621E+0001 1.06853411482133E+0001 1.06723561686876E+0001 1.06593863919370E+0001 1.06464318071138E+0001 + 1.06334924033702E+0001 1.06205681698582E+0001 1.06076590957300E+0001 1.05947651701378E+0001 1.05818863822338E+0001 + 1.05690227211699E+0001 1.05561741760986E+0001 1.05433407361717E+0001 1.05305223905417E+0001 1.05177191283605E+0001 + 1.05049309387803E+0001 1.04921578109533E+0001 1.04793997340316E+0001 1.04666566971675E+0001 1.04539286895129E+0001 + 1.04412157002202E+0001 1.04285177184413E+0001 1.04158347333286E+0001 1.04031667340341E+0001 1.03905137097100E+0001 + 1.03778756495084E+0001 1.03652525425816E+0001 1.03526443780815E+0001 1.03400511451605E+0001 1.03274728329706E+0001 + 1.03149094306641E+0001 1.03023609273929E+0001 1.02898273123094E+0001 1.02773085745656E+0001 1.02648047033137E+0001 + 1.02523156877059E+0001 1.02398415168943E+0001 1.02273821800310E+0001 1.02149376662683E+0001 1.02025079647582E+0001 + 1.01900930646529E+0001 1.01776929551046E+0001 1.01653076252654E+0001 1.01529370642875E+0001 1.01405812613230E+0001 + 1.01282402055240E+0001 1.01159138860428E+0001 1.01036022920314E+0001 1.00913054126421E+0001 1.00790232370269E+0001 + 1.00667557543381E+0001 1.00545029537277E+0001 1.00422648243480E+0001 1.00300413553510E+0001 1.00178325358890E+0001 + 1.00056383551141E+0001 9.99345880217838E+0000 9.98129386623404E+0000 9.96914353643324E+0000 9.95700780192813E+0000 + 9.94488665187086E+0000 9.93278007541357E+0000 9.92068806170842E+0000 9.90861059990756E+0000 9.89654767916315E+0000 + 9.88449928862733E+0000 9.87246541745225E+0000 9.86044605479008E+0000 9.84844118979295E+0000 9.83645081161302E+0000 + 9.82447490940243E+0000 9.81251347231335E+0000 9.80056648949793E+0000 9.78863395010830E+0000 9.77671584329663E+0000 + 9.76481215821508E+0000 9.75292288401577E+0000 9.74104800985088E+0000 9.72918752487254E+0000 9.71734141823292E+0000 + 9.70550967908416E+0000 9.69369229657842E+0000 9.68188925986784E+0000 9.67010055810458E+0000 9.65832618044078E+0000 + 9.64656611602861E+0000 9.63482035402021E+0000 9.62308888356773E+0000 9.61137169382332E+0000 9.59966877393915E+0000 + 9.58798011306734E+0000 9.57630570036006E+0000 9.56464552496946E+0000 9.55299957604769E+0000 9.54136784274691E+0000 + 9.52975031421924E+0000 9.51814697961688E+0000 9.50655782809194E+0000 9.49498284879658E+0000 9.48342203088298E+0000 + 9.47187536350325E+0000 9.46034283580957E+0000 9.44882443695408E+0000 9.43732015608892E+0000 9.42582998236627E+0000 + 9.41435390493826E+0000 9.40289191295705E+0000 9.39144399557479E+0000 9.38001014194362E+0000 9.36859034121571E+0000 + 9.35718458254319E+0000 9.34579285507824E+0000 9.33441514797298E+0000 9.32305145037958E+0000 9.31170175145019E+0000 + 9.30036604033695E+0000 9.28904430619204E+0000 9.27773653816757E+0000 9.26644272541572E+0000 9.25516285708863E+0000 + 9.24389692233846E+0000 9.23264491031736E+0000 9.22140681017747E+0000 9.21018261107094E+0000 9.19897230214995E+0000 + 9.18777587256661E+0000 9.17659331147311E+0000 9.16542460802158E+0000 9.15426975136417E+0000 9.14312873065304E+0000 + 9.13200153504034E+0000 9.12088815367822E+0000 9.10978857571882E+0000 9.09870279031432E+0000 9.08763078661683E+0000 + 9.07657255377854E+0000 9.06552808095158E+0000 9.05449735728811E+0000 9.04348037194028E+0000 9.03247711406023E+0000 + 9.02148757280013E+0000 9.01051173731212E+0000 8.99954959674835E+0000 8.98860114026098E+0000 8.97766635700215E+0000 + 8.96674523612402E+0000 8.95583776677874E+0000 8.94494393811845E+0000 8.93406373929533E+0000 8.92319715946150E+0000 + 8.91234418776912E+0000 8.90150481337035E+0000 8.89067902541734E+0000 8.87986681306224E+0000 8.86906816545719E+0000 + 8.85828307175435E+0000 8.84751152110587E+0000 8.83675350266391E+0000 8.82600900558061E+0000 8.81527801900813E+0000 + 8.80456053209861E+0000 8.79385653400421E+0000 8.78316601387708E+0000 8.77248896086937E+0000 8.76182536413323E+0000 + 8.75117521282082E+0000 8.74053849608428E+0000 8.72991520307576E+0000 8.71930532294742E+0000 8.70870884485141E+0000 + 8.69812575793988E+0000 8.68755605136498E+0000 8.67699971427886E+0000 8.66645673583368E+0000 8.65592710518158E+0000 + 8.64541081147472E+0000 8.63490784386524E+0000 8.62441819150531E+0000 8.61394184354706E+0000 8.60347878914265E+0000 + 8.59302901744424E+0000 8.58259251760396E+0000 8.57216927877399E+0000 8.56175929010646E+0000 8.55136254075353E+0000 + 8.54097901986735E+0000 8.53060871660006E+0000 8.52025162010383E+0000 8.50990771953080E+0000 8.49957700403313E+0000 + 8.48925946276296E+0000 8.47895508487245E+0000 8.46866385951375E+0000 8.45838577583900E+0000 8.44812082300036E+0000 + 8.43786899014999E+0000 8.42763026644004E+0000 8.41740464102264E+0000 8.40719210304996E+0000 8.39699264167415E+0000 + 8.38680624604735E+0000 8.37663290532173E+0000 8.36647260864943E+0000 8.35632534518259E+0000 8.34619110407339E+0000 + 8.33606987447395E+0000 8.32596164553645E+0000 8.31586640641302E+0000 8.30578414625581E+0000 8.29571485421699E+0000 + 8.28565851944870E+0000 8.27561513110309E+0000 8.26558467833232E+0000 8.25556715028853E+0000 8.24556253612388E+0000 + 8.23557082499051E+0000 8.22559200604059E+0000 8.21562606842626E+0000 8.20567300129966E+0000 8.19573279381296E+0000 + 8.18580543511830E+0000 8.17589091436785E+0000 8.16598922071373E+0000 8.15610034330811E+0000 8.14622427130315E+0000 + 8.13636099385097E+0000 8.12651050010377E+0000 8.11667277921365E+0000 8.10684782033279E+0000 8.09703561261334E+0000 + 8.08723614520745E+0000 8.07744940726726E+0000 8.06767538794494E+0000 8.05791407639262E+0000 8.04816546176247E+0000 + 8.03842953320663E+0000 8.02870627987726E+0000 8.01899569092650E+0000 8.00929775550650E+0000 7.99961246276943E+0000 + 7.98993980186743E+0000 7.98027976195265E+0000 7.97063233217724E+0000 7.96099750169336E+0000 7.95137525965315E+0000 + 7.94176559520877E+0000 7.93216849751236E+0000 7.92258395571608E+0000 7.91301195897209E+0000 7.90345249643252E+0000 + 7.89390555724954E+0000 7.88437113057530E+0000 7.87484920556193E+0000 7.86533977136161E+0000 7.85584281712647E+0000 + 7.84635833200867E+0000 7.83688630516037E+0000 7.82742672573371E+0000 7.81797958288083E+0000 7.80854486575390E+0000 + 7.79912256350507E+0000 7.78971266528649E+0000 7.78031516025031E+0000 7.77093003754867E+0000 7.76155728633373E+0000 + 7.75219689575766E+0000 7.74284885497257E+0000 7.73351315313065E+0000 7.72418977938404E+0000 7.71487872288487E+0000 + 7.70557997278533E+0000 7.69629351823753E+0000 7.68701934839365E+0000 7.67775745240584E+0000 7.66850781942623E+0000 + 7.65927043860700E+0000 7.65004529910027E+0000 7.64083239005822E+0000 7.63163170063299E+0000 7.62244321997672E+0000 + 7.61326693724158E+0000 7.60410284157971E+0000 7.59495092214326E+0000 7.58581116808440E+0000 7.57668356855526E+0000 + 7.56756811270799E+0000 7.55846478969475E+0000 7.54937358866771E+0000 7.54029449877898E+0000 7.53122750918074E+0000 + 7.52217260902514E+0000 7.51312978746432E+0000 7.50409903365044E+0000 7.49508033673565E+0000 7.48607368587209E+0000 + 7.47707907021193E+0000 7.46809647890731E+0000 7.45912590111039E+0000 7.45016732597331E+0000 7.44122074264823E+0000 + 7.43228614028729E+0000 7.42336350804265E+0000 7.41445283506647E+0000 7.40555411051088E+0000 7.39666732352805E+0000 + 7.38779246327012E+0000 7.37892951888924E+0000 7.37007847953758E+0000 7.36123933436726E+0000 7.35241207253047E+0000 + 7.34359668317933E+0000 7.33479315546600E+0000 7.32600147854264E+0000 7.31722164156138E+0000 7.30845363367440E+0000 + 7.29969744403383E+0000 7.29095306179183E+0000 7.28222047610055E+0000 7.27349967611214E+0000 7.26479065097876E+0000 + 7.25609338985254E+0000 7.24740788188565E+0000 7.23873411623024E+0000 7.23007208203846E+0000 7.22142176846245E+0000 + 7.21278316465437E+0000 7.20415625976638E+0000 7.19554104295061E+0000 7.18693750335924E+0000 7.17834563014439E+0000 + 7.16976541245823E+0000 7.16119683945291E+0000 7.15263990028058E+0000 7.14409458409339E+0000 7.13556088004349E+0000 + 7.12703877728303E+0000 7.11852826496417E+0000 7.11002933223905E+0000 7.10154196825983E+0000 7.09306616217866E+0000 + 7.08460190314768E+0000 7.07614918031907E+0000 7.06770798284494E+0000 7.05927829987747E+0000 7.05086012056881E+0000 + 7.04245343407110E+0000 7.03405822953650E+0000 7.02567449611716E+0000 7.01730222296523E+0000 7.00894139923286E+0000 + 7.00059201407220E+0000 6.99225405663540E+0000 6.98392751607462E+0000 6.97561238154201E+0000 6.96730864218971E+0000 + 6.95901628716988E+0000 6.95073530563467E+0000 6.94246568673623E+0000 6.93420741962672E+0000 6.92596049345828E+0000 + 6.91772489738306E+0000 6.90950062055322E+0000 6.90128765212090E+0000 6.89308598123828E+0000 6.88489559705747E+0000 + 6.87671648873065E+0000 6.86854864540996E+0000 6.86039205624756E+0000 6.85224671039559E+0000 6.84411259700621E+0000 + 6.83598970523157E+0000 6.82787802422381E+0000 6.81977754313510E+0000 6.81168825111757E+0000 6.80361013732339E+0000 + 6.79554319090472E+0000 6.78748740101367E+0000 6.77944275680243E+0000 6.77140924742314E+0000 6.76338686202794E+0000 + 6.75537558976901E+0000 6.74737541979847E+0000 6.73938634126848E+0000 6.73140834333120E+0000 6.72344141513877E+0000 + 6.71548554584336E+0000 6.70754072459710E+0000 6.69960694055215E+0000 6.69168418286066E+0000 6.68377244067479E+0000 + 6.67587170314668E+0000 6.66798195942848E+0000 6.66010319867236E+0000 6.65223541003044E+0000 6.64437858265490E+0000 + 6.63653270569788E+0000 6.62869776831152E+0000 6.62087375964800E+0000 6.61306066885945E+0000 6.60525848509802E+0000 + 6.59746719751587E+0000 6.58968679526514E+0000 6.58191726749801E+0000 6.57415860336659E+0000 6.56641079202306E+0000 + 6.55867382261957E+0000 6.55094768430825E+0000 6.54323236624128E+0000 6.53552785757079E+0000 6.52783414744894E+0000 + 6.52015122502788E+0000 6.51247907945976E+0000 6.50481769989673E+0000 6.49716707549094E+0000 6.48952719539456E+0000 + 6.48189804875971E+0000 6.47427962473857E+0000 6.46667191248327E+0000 6.45907490114597E+0000 6.45148857987883E+0000 + 6.44391293783399E+0000 6.43634796416360E+0000 6.42879364801982E+0000 6.42124997855479E+0000 6.41371694492068E+0000 + 6.40619453626962E+0000 6.39868274175377E+0000 6.39118155052528E+0000 6.38369095173631E+0000 6.37621093453900E+0000 + 6.36874148808550E+0000 6.36128260152798E+0000 6.35383426401857E+0000 6.34639646470943E+0000 6.33896919275271E+0000 + 6.33155243730056E+0000 6.32414618750514E+0000 6.31675043251859E+0000 6.30936516149307E+0000 6.30199036358073E+0000 + 6.29462602793371E+0000 6.28727214370418E+0000 6.27992870004427E+0000 6.27259568610615E+0000 6.26527309104196E+0000 + 6.25796090400385E+0000 6.25065911414399E+0000 6.24336771061451E+0000 6.23608668256756E+0000 6.22881601915531E+0000 + 6.22155570952991E+0000 6.21430574284349E+0000 6.20706610824821E+0000 6.19983679489624E+0000 6.19261779193971E+0000 + 6.18540908853078E+0000 6.17821067382159E+0000 6.17102253696431E+0000 6.16384466711108E+0000 6.15667705341405E+0000 + 6.14951968502537E+0000 6.14237255109721E+0000 6.13523564078169E+0000 6.12810894323100E+0000 6.12099244759725E+0000 + 6.11388614303262E+0000 6.10679001868925E+0000 6.09970406371929E+0000 6.09262826727490E+0000 6.08556261850823E+0000 + 6.07850710657142E+0000 6.07146172061663E+0000 6.06442644979601E+0000 6.05740128326171E+0000 6.05038621016588E+0000 + 6.04338121966068E+0000 6.03638630089826E+0000 6.02940144303076E+0000 6.02242663521033E+0000 6.01546186658914E+0000 + 6.00850712631933E+0000 6.00156240355304E+0000 5.99462768744244E+0000 5.98770296713968E+0000 5.98078823179690E+0000 + 5.97388347056626E+0000 5.96698867259990E+0000 5.96010382704999E+0000 5.95322892306866E+0000 5.94636394980808E+0000 + 5.93950889642039E+0000 5.93266375205774E+0000 5.92582850587229E+0000 5.91900314701619E+0000 5.91218766464159E+0000 + 5.90538204790064E+0000 5.89858628594548E+0000 5.89180036792828E+0000 5.88502428300118E+0000 5.87825802031634E+0000 + 5.87150156902590E+0000 5.86475491828202E+0000 5.85801805723686E+0000 5.85129097504254E+0000 5.84457366085125E+0000 + 5.83786610381511E+0000 5.83116829308628E+0000 5.82448021781693E+0000 5.81780186715919E+0000 5.81113323026521E+0000 + 5.80447429628716E+0000 5.79782505437717E+0000 5.79118549368742E+0000 5.78455560337003E+0000 5.77793537257716E+0000 + 5.77132479046097E+0000 5.76472384617361E+0000 5.75813252886723E+0000 5.75155082769397E+0000 5.74497873180599E+0000 + 5.73841623035545E+0000 5.73186331249449E+0000 5.72531996737527E+0000 5.71878618414993E+0000 5.71226195197063E+0000 + 5.70574725998951E+0000 5.69924209735874E+0000 5.69274645323046E+0000 5.68626031675682E+0000 5.67978367708997E+0000 + 5.67331652338207E+0000 5.66685884478527E+0000 5.66041063045171E+0000 5.65397186953355E+0000 5.64754255118295E+0000 + 5.64112266455203E+0000 5.63471219879298E+0000 5.62831114305793E+0000 5.62191948649904E+0000 5.61553721826845E+0000 + 5.60916432751831E+0000 5.60280080340079E+0000 5.59644663506803E+0000 5.59010181167218E+0000 5.58376632236540E+0000 + 5.57744015629982E+0000 5.57112330262761E+0000 5.56481575050092E+0000 5.55851748907190E+0000 5.55222850749270E+0000 + 5.54594879491547E+0000 5.53967834049236E+0000 5.53341713337552E+0000 5.52716516271711E+0000 5.52092241766928E+0000 + 5.51468888738417E+0000 5.50846456101394E+0000 5.50224942771074E+0000 5.49604347662672E+0000 5.48984669691403E+0000 + 5.48365907772483E+0000 5.47748060821127E+0000 5.47131127752548E+0000 5.46515107481964E+0000 5.45899998924588E+0000 + 5.45285800995637E+0000 5.44672512610325E+0000 5.44060132683867E+0000 5.43448660131478E+0000 5.42838093868374E+0000 + 5.42228432809769E+0000 5.41619675870880E+0000 5.41011821966920E+0000 5.40404870013105E+0000 5.39798818924651E+0000 + 5.39193667616772E+0000 5.38589415004683E+0000 5.37986060003600E+0000 5.37383601528737E+0000 5.36782038495310E+0000 + 5.36181369818535E+0000 5.35581594413625E+0000 5.34982711195797E+0000 5.34384719080265E+0000 5.33787616982244E+0000 + 5.33191403816950E+0000 5.32596078499598E+0000 5.32001639945402E+0000 5.31408087069579E+0000 5.30815418787343E+0000 + 5.30223634013909E+0000 5.29632731664492E+0000 5.29042710654308E+0000 5.28453569898572E+0000 5.27865308312498E+0000 + 5.27277924811302E+0000 5.26691418310199E+0000 5.26105787724404E+0000 5.25521031969133E+0000 5.24937149959600E+0000 + 5.24354140611021E+0000 5.23772002838609E+0000 5.23190735557583E+0000 5.22610337683155E+0000 5.22030808130541E+0000 + 5.21452145814956E+0000 5.20874349651615E+0000 5.20297418555734E+0000 5.19721351442528E+0000 5.19146147227211E+0000 + 5.18571804824999E+0000 5.17998323151107E+0000 5.17425701120750E+0000 5.16853937649144E+0000 5.16283031651503E+0000 + 5.15712982043042E+0000 5.15143787738977E+0000 5.14575447654522E+0000 5.14007960704893E+0000 5.13441325805306E+0000 + 5.12875541870975E+0000 5.12310607817114E+0000 5.11746522558941E+0000 5.11183285011668E+0000 5.10620894090512E+0000 + 5.10059348710688E+0000 5.09498647787412E+0000 5.08938790235897E+0000 5.08379774971359E+0000 5.07821600909013E+0000 + 5.07264266964075E+0000 5.06707772051760E+0000 5.06152115087282E+0000 5.05597294985857E+0000 5.05043310662700E+0000 + 5.04490161033026E+0000 5.03937845012050E+0000 5.03386361514987E+0000 5.02835709457053E+0000 5.02285887753462E+0000 + 5.01736895319431E+0000 5.01188731070173E+0000 5.00641393920904E+0000 5.00094882786839E+0000 4.99549196583194E+0000 + 4.99004334225182E+0000 4.98460294628020E+0000 4.97917076706923E+0000 4.97374679377106E+0000 4.96833101553784E+0000 + 4.96292342152171E+0000 4.95752400087483E+0000 4.95213274274936E+0000 4.94674963629745E+0000 4.94137467067123E+0000 + 4.93600783502288E+0000 4.93064911850453E+0000 4.92529851026834E+0000 4.91995599946646E+0000 4.91462157525105E+0000 + 4.90929522677424E+0000 4.90397694318820E+0000 4.89866671364508E+0000 4.89336452729702E+0000 4.88807037329618E+0000 + 4.88278424079471E+0000 4.87750611894477E+0000 4.87223599689849E+0000 4.86697386380803E+0000 4.86171970882556E+0000 + 4.85647352110320E+0000 4.85123528979313E+0000 4.84600500404748E+0000 4.84078265301841E+0000 4.83556822585808E+0000 + 4.83036171171862E+0000 4.82516309975220E+0000 4.81997237911097E+0000 4.81478953894707E+0000 4.80961456841266E+0000 + 4.80444745665989E+0000 4.79928819284090E+0000 4.79413676610786E+0000 4.78899316561291E+0000 4.78385738050821E+0000 + 4.77872939994590E+0000 4.77360921307814E+0000 4.76849680905708E+0000 4.76339217703486E+0000 4.75829530616364E+0000 + 4.75320618559558E+0000 4.74812480448282E+0000 4.74305115197752E+0000 4.73798521723182E+0000 4.73292698939787E+0000 + 4.72787645762784E+0000 4.72283361107386E+0000 4.71779843888810E+0000 4.71277093022270E+0000 4.70775107422981E+0000 + 4.70273886006158E+0000 4.69773427687017E+0000 4.69273731380773E+0000 4.68774796002641E+0000 4.68276620467836E+0000 + 4.67779203691572E+0000 4.67282544589067E+0000 4.66786642075533E+0000 4.66291495066187E+0000 4.65797102476244E+0000 + 4.65303463220918E+0000 4.64810576215425E+0000 4.64318440374981E+0000 4.63827054614799E+0000 4.63336417850096E+0000 + 4.62846528996086E+0000 4.62357386967985E+0000 4.61868990681007E+0000 4.61381339050368E+0000 4.60894430991283E+0000 + 4.60408265418967E+0000 4.59922841248636E+0000 4.59438157395503E+0000 4.58954212774785E+0000 4.58471006301697E+0000 + 4.57988536891453E+0000 4.57506803459270E+0000 4.57025804920361E+0000 4.56545540189942E+0000 4.56066008183228E+0000 + 4.55587207815435E+0000 4.55109138001778E+0000 4.54631797657470E+0000 4.54155185697729E+0000 4.53679301037768E+0000 + 4.53204142592804E+0000 4.52729709278050E+0000 4.52256000008723E+0000 4.51783013700038E+0000 4.51310749267208E+0000 + 4.50839205625450E+0000 4.50368381689980E+0000 4.49898276376011E+0000 4.49428888598759E+0000 4.48960217273439E+0000 + 4.48492261315266E+0000 4.48025019639456E+0000 4.47558491161224E+0000 4.47092674795784E+0000 4.46627569458352E+0000 + 4.46163174064143E+0000 4.45699487528372E+0000 4.45236508766254E+0000 4.44774236693005E+0000 4.44312670223838E+0000 + 4.43851808273971E+0000 4.43391649758617E+0000 4.42932193592992E+0000 4.42473438692311E+0000 4.42015383971789E+0000 + 4.41558028346642E+0000 4.41101370732083E+0000 4.40645410043329E+0000 4.40190145195595E+0000 4.39735575104096E+0000 + 4.39281698684046E+0000 4.38828514850661E+0000 4.38376022519157E+0000 4.37924220604748E+0000 4.37473108022649E+0000 + 4.37022683688076E+0000 4.36572946516243E+0000 4.36123895422366E+0000 4.35675529321660E+0000 4.35227847129340E+0000 + 4.34780847760622E+0000 4.34334530130719E+0000 4.33888893154848E+0000 4.33443935748224E+0000 4.32999656826061E+0000 + 4.32556055303575E+0000 4.32113130095981E+0000 4.31670880118494E+0000 4.31229304286329E+0000 4.30788401514702E+0000 + 4.30348170718827E+0000 4.29908610813919E+0000 4.29469720715195E+0000 4.29031499337868E+0000 4.28593945597154E+0000 + 4.28157058408268E+0000 4.27720836686426E+0000 4.27285279346842E+0000 4.26850385304731E+0000 4.26416153475309E+0000 + 4.25982582773790E+0000 4.25549672115391E+0000 4.25117420415326E+0000 4.24685826588810E+0000 4.24254889551057E+0000 + 4.23824608217285E+0000 4.23394981502707E+0000 4.22966008322538E+0000 4.22537687591995E+0000 4.22110018226291E+0000 + 4.21682999140642E+0000 4.21256629250264E+0000 4.20830907470371E+0000 4.20405832716178E+0000 4.19981403902901E+0000 + 4.19557619945754E+0000 4.19134479759953E+0000 4.18711982260714E+0000 4.18290126363250E+0000 4.17868910982778E+0000 + 4.17448335034512E+0000 4.17028397433667E+0000 4.16609097095459E+0000 4.16190432935103E+0000 4.15772403867813E+0000 + 4.15355008808806E+0000 4.14938246673295E+0000 4.14522116376497E+0000 4.14106616833626E+0000 4.13691746959898E+0000 + 4.13277505670527E+0000 4.12863891880730E+0000 4.12450904505719E+0000 4.12038542460712E+0000 4.11626804660924E+0000 + 4.11215690021568E+0000 4.10805197457861E+0000 4.10395325885017E+0000 4.09986074218252E+0000 4.09577441372781E+0000 + 4.09169426263819E+0000 4.08762027806581E+0000 4.08355244916282E+0000 4.07949076508137E+0000 4.07543521497362E+0000 + 4.07138578799171E+0000 4.06734247328780E+0000 4.06330526001404E+0000 4.05927413732258E+0000 4.05524909436557E+0000 + 4.05123012029516E+0000 4.04721720426350E+0000 4.04321033542275E+0000 4.03920950292506E+0000 4.03521469592257E+0000 + 4.03122590356744E+0000 4.02724311501182E+0000 4.02326631940787E+0000 4.01929550590772E+0000 4.01533066366354E+0000 + 4.01137178182747E+0000 4.00741884955167E+0000 4.00347185598829E+0000 3.99953079028948E+0000 3.99559564160739E+0000 + 3.99166639909416E+0000 3.98774305190196E+0000 3.98382558918294E+0000 3.97991400008924E+0000 3.97600827377302E+0000 + 3.97210839938642E+0000 3.96821436608161E+0000 3.96432616301072E+0000 3.96044377932592E+0000 3.95656720417935E+0000 + 3.95269642672317E+0000 3.94883143610952E+0000 3.94497222149056E+0000 3.94111877201843E+0000 3.93727107684530E+0000 + 3.93342912512331E+0000 3.92959290600460E+0000 3.92576240864135E+0000 3.92193762218568E+0000 3.91811853578977E+0000 + 3.91430513860575E+0000 3.91049741978578E+0000 3.90669536848201E+0000 3.90289897384659E+0000 3.89910822503167E+0000 + 3.89532311118941E+0000 3.89154362147195E+0000 3.88776974503145E+0000 3.88400147102006E+0000 3.88023878858992E+0000 + 3.87648168689320E+0000 3.87273015508204E+0000 3.86898418230859E+0000 3.86524375772500E+0000 3.86150887048343E+0000 + 3.85777950973603E+0000 3.85405566463495E+0000 3.85033732433233E+0000 3.84662447798033E+0000 3.84291711473111E+0000 + 3.83921522373681E+0000 3.83551879414959E+0000 3.83182781512159E+0000 3.82814227580497E+0000 3.82446216535187E+0000 + 3.82078747291446E+0000 3.81711818764488E+0000 3.81345429869528E+0000 3.80979579521781E+0000 3.80614266636463E+0000 + 3.80249490128788E+0000 3.79885248913972E+0000 3.79521541907230E+0000 3.79158368023777E+0000 3.78795726178829E+0000 + 3.78433615287599E+0000 3.78072034265304E+0000 3.77710982027158E+0000 3.77350457488377E+0000 3.76990459564176E+0000 + 3.76630987169770E+0000 3.76272039220373E+0000 3.75913614631202E+0000 3.75555712317472E+0000 3.75198331194396E+0000 + 3.74841470177192E+0000 3.74485128181072E+0000 3.74129304121254E+0000 3.73773996912952E+0000 3.73419205471380E+0000 + 3.73064928711755E+0000 3.72711165549291E+0000 3.72357914899204E+0000 3.72005175676709E+0000 3.71652946797020E+0000 + 3.71301227175353E+0000 3.70950015726923E+0000 3.70599311366944E+0000 3.70249113010634E+0000 3.69899419573205E+0000 + 3.69550229969874E+0000 3.69201543115856E+0000 3.68853357926365E+0000 3.68505673316618E+0000 3.68158488201828E+0000 + 3.67811801497212E+0000 3.67465612117984E+0000 3.67119918979359E+0000 3.66774720996552E+0000 3.66430017084780E+0000 + 3.66085806159256E+0000 3.65742087135196E+0000 3.65398858927815E+0000 3.65056120452329E+0000 3.64713870623951E+0000 + 3.64372108357898E+0000 3.64030832569385E+0000 3.63690042173626E+0000 3.63349736085837E+0000 3.63009913221233E+0000 + 3.62670572495030E+0000 3.62331712822441E+0000 3.61993333118683E+0000 3.61655432298970E+0000 3.61318009278518E+0000 + 3.60981062972541E+0000 3.60644592296256E+0000 3.60308596164876E+0000 3.59973073493618E+0000 3.59638023197695E+0000 + 3.59303444192324E+0000 3.58969335392720E+0000 3.58635695714097E+0000 3.58302524071671E+0000 3.57969819380657E+0000 + 3.57637580556270E+0000 3.57305806513725E+0000 3.56974496168238E+0000 3.56643648435022E+0000 3.56313262229295E+0000 + 3.55983336466270E+0000 3.55653870061162E+0000 3.55324861929188E+0000 3.54996310985562E+0000 3.54668216145499E+0000 + 3.54340576324214E+0000 3.54013390436923E+0000 3.53686657398840E+0000 3.53360376125181E+0000 3.53034545531161E+0000 + 3.52709164531995E+0000 3.52384232042898E+0000 3.52059746979084E+0000 3.51735708255771E+0000 3.51412114788172E+0000 + 3.51088965491503E+0000 3.50766259280978E+0000 3.50443995071813E+0000 3.50122171779223E+0000 3.49800788318423E+0000 + 3.49479843604629E+0000 3.49159336553055E+0000 3.48839266078916E+0000 3.48519631097428E+0000 3.48200430523806E+0000 + 3.47881663273264E+0000 3.47563328261019E+0000 3.47245424402285E+0000 3.46927950612277E+0000 3.46610905806211E+0000 + 3.46294288899301E+0000 3.45978098806763E+0000 3.45662334443812E+0000 3.45346994725662E+0000 3.45032078567530E+0000 + 3.44717584884629E+0000 3.44403512592177E+0000 3.44089860605386E+0000 3.43776627839474E+0000 3.43463813209653E+0000 + 3.43151415631141E+0000 3.42839434019152E+0000 3.42527867288901E+0000 3.42216714355603E+0000 3.41905974134473E+0000 + 3.41595645540727E+0000 3.41285727489579E+0000 3.40976218896245E+0000 3.40667118675941E+0000 3.40358425743880E+0000 + 3.40050139015278E+0000 3.39742257405350E+0000 3.39434779829312E+0000 3.39127705202379E+0000 3.38821032439765E+0000 + 3.38514760456686E+0000 3.38208888168356E+0000 3.37903414489992E+0000 3.37598338336808E+0000 3.37293658624019E+0000 + 3.36989374266841E+0000 3.36685484180488E+0000 3.36381987280176E+0000 3.36078882481120E+0000 3.35776168698534E+0000 + 3.35473844847635E+0000 3.35171909843637E+0000 3.34870362601755E+0000 3.34569202037205E+0000 3.34268427065201E+0000 + 3.33968036600959E+0000 3.33668029559694E+0000 3.33368404856621E+0000 3.33069161406955E+0000 3.32770298125911E+0000 + 3.32471813928705E+0000 3.32173707730551E+0000 3.31875978446665E+0000 3.31578624992261E+0000 3.31281646282555E+0000 + 3.30985041232763E+0000 3.30688808758098E+0000 3.30392947773777E+0000 3.30097457195014E+0000 3.29802335937024E+0000 + 3.29507582915024E+0000 3.29213197044227E+0000 3.28919177239849E+0000 3.28625522417105E+0000 3.28332231491210E+0000 + 3.28039303377380E+0000 3.27746736990829E+0000 3.27454531246772E+0000 3.27162685060426E+0000 3.26871197347004E+0000 + 3.26580067021721E+0000 3.26289292999795E+0000 3.25998874196438E+0000 3.25708809526867E+0000 3.25419097906296E+0000 + 3.25129738249940E+0000 3.24840729473016E+0000 3.24552070490737E+0000 3.24263760218319E+0000 3.23975797570978E+0000 + 3.23688181463927E+0000 3.23400910812383E+0000 3.23113984531561E+0000 3.22827401536675E+0000 3.22541160742941E+0000 + 3.22255261065573E+0000 3.21969701419788E+0000 3.21684480720800E+0000 3.21399597883824E+0000 3.21115051824076E+0000 + 3.20830841456770E+0000 3.20546965697122E+0000 3.20263423460346E+0000 3.19980213661659E+0000 3.19697335216274E+0000 + 3.19414787039408E+0000 3.19132568046275E+0000 3.18850677152091E+0000 3.18569113272070E+0000 3.18287875321428E+0000 + 3.18006962215379E+0000 3.17726372869140E+0000 3.17446106197925E+0000 3.17166161116948E+0000 3.16886536541427E+0000 + 3.16607231386574E+0000 3.16328244567607E+0000 3.16049574999739E+0000 3.15771221598185E+0000 3.15493183278162E+0000 + 3.15215458954884E+0000 3.14938047543567E+0000 3.14660947959424E+0000 3.14384159117673E+0000 3.14107679933526E+0000 + 3.13831509322201E+0000 3.13555646198911E+0000 3.13280089478873E+0000 3.13004838077300E+0000 3.12729890909409E+0000 + 3.12455246890414E+0000 3.12180904935531E+0000 3.11906863959975E+0000 3.11633122878960E+0000 3.11359680607703E+0000 + 3.11086536061417E+0000 3.10813688155318E+0000 3.10541135804622E+0000 3.10268877924544E+0000 3.09996913430297E+0000 + 3.09725241237099E+0000 3.09453860260163E+0000 3.09182769414706E+0000 3.08911967615941E+0000 3.08641453779085E+0000 + 3.08371226819352E+0000 3.08101285651957E+0000 3.07831629192117E+0000 3.07562256355045E+0000 3.07293166055956E+0000 + 3.07024357210067E+0000 3.06755828732592E+0000 3.06487579538746E+0000 3.06219608543745E+0000 3.05951914662803E+0000 + 3.05684496811135E+0000 3.05417353903958E+0000 3.05150484856485E+0000 3.04883888583933E+0000 3.04617564001515E+0000 + 3.04351510024448E+0000 3.04085725567946E+0000 3.03820209547225E+0000 3.03554960877500E+0000 3.03289978473985E+0000 + 3.03025261251896E+0000 3.02760808126449E+0000 3.02496618012857E+0000 3.02232689826337E+0000 3.01969022482103E+0000 + 3.01705614895371E+0000 3.01442465981356E+0000 3.01179574655272E+0000 3.00916939832336E+0000 3.00654560427761E+0000 + 3.00392435356764E+0000 3.00130563534559E+0000 2.99868943876362E+0000 2.99607575297387E+0000 2.99346456712850E+0000 + 2.99085587037966E+0000 2.98824965187950E+0000 2.98564590078017E+0000 2.98304460623382E+0000 2.98044575739261E+0000 + 2.97784934340868E+0000 2.97525535343419E+0000 2.97266377662128E+0000 2.97007460212212E+0000 2.96748781908885E+0000 + 2.96490341667361E+0000 2.96232138402857E+0000 2.95974171030588E+0000 2.95716438465768E+0000 2.95458939623613E+0000 + 2.95201673419337E+0000 2.94944638768156E+0000 2.94687834585286E+0000 2.94431259785941E+0000 2.94174913285336E+0000 + 2.93918793998687E+0000 2.93662900841208E+0000 2.93407232728115E+0000 2.93151788574622E+0000 2.92896567295946E+0000 + 2.92641567807301E+0000 2.92386789023902E+0000 2.92132229860964E+0000 2.91877889233703E+0000 2.91623766057334E+0000 + 2.91369859247071E+0000 2.91116167718131E+0000 2.90862690385727E+0000 2.90609426165075E+0000 2.90356373971391E+0000 + 2.90103532719889E+0000 2.89850901325784E+0000 2.89598478704293E+0000 2.89346263770629E+0000 2.89094255440007E+0000 + 2.88842452627645E+0000 2.88590854248755E+0000 2.88339459218553E+0000 2.88088266452255E+0000 2.87837274865076E+0000 + 2.87586483372230E+0000 2.87335890888933E+0000 2.87085496330400E+0000 2.86835298611846E+0000 2.86585296648486E+0000 + 2.86335489355536E+0000 2.86085875648210E+0000 2.85836454441723E+0000 2.85587224651292E+0000 2.85338185192130E+0000 + 2.85089334979453E+0000 2.84840672928477E+0000 2.84592197954415E+0000 2.84343908972484E+0000 2.84095804897899E+0000 + 2.83847884645874E+0000 2.83600147131625E+0000 2.83352591270367E+0000 2.83105215977314E+0000 2.82858020167683E+0000 + 2.82611002756689E+0000 2.82364162659545E+0000 2.82117498791468E+0000 2.81871010067673E+0000 2.81624695403375E+0000 + 2.81378553713789E+0000 2.81132583914129E+0000 2.80886784919612E+0000 2.80641155645452E+0000 2.80395695006865E+0000 + 2.80150401919065E+0000 2.79905275297268E+0000 2.79660314056689E+0000 2.79415517112542E+0000 2.79170883380044E+0000 + 2.78926411774409E+0000 2.78682101210853E+0000 2.78437950604589E+0000 2.78193958870835E+0000 2.77950124924804E+0000 + 2.77706447681712E+0000 2.77462926056774E+0000 2.77219558965205E+0000 2.76976345322220E+0000 2.76733284043035E+0000 + 2.76490374042864E+0000 2.76247614236923E+0000 2.76005003540427E+0000 2.75762540868591E+0000 2.75520225136629E+0000 + 2.75278055259758E+0000 2.75036030153192E+0000 2.74794148732147E+0000 2.74552409911837E+0000 2.74310812666675E+0000 + 2.74069356586256E+0000 2.73828041624951E+0000 2.73586867741918E+0000 2.73345834896315E+0000 2.73104943047298E+0000 + 2.72864192154028E+0000 2.72623582175660E+0000 2.72383113071354E+0000 2.72142784800267E+0000 2.71902597321556E+0000 + 2.71662550594380E+0000 2.71422644577897E+0000 2.71182879231264E+0000 2.70943254513640E+0000 2.70703770384182E+0000 + 2.70464426802048E+0000 2.70225223726395E+0000 2.69986161116383E+0000 2.69747238931168E+0000 2.69508457129909E+0000 + 2.69269815671763E+0000 2.69031314515889E+0000 2.68792953621444E+0000 2.68554732947586E+0000 2.68316652453473E+0000 + 2.68078712098262E+0000 2.67840911841112E+0000 2.67603251641181E+0000 2.67365731457626E+0000 2.67128351249605E+0000 + 2.66891110976276E+0000 2.66654010596798E+0000 2.66417050070327E+0000 2.66180229356022E+0000 2.65943548413041E+0000 + 2.65707007200541E+0000 2.65470605677680E+0000 2.65234343803617E+0000 2.64998221537508E+0000 2.64762238838513E+0000 + 2.64526395665789E+0000 2.64290691978493E+0000 2.64055127735784E+0000 2.63819702896819E+0000 2.63584417420756E+0000 + 2.63349271266754E+0000 2.63114264393970E+0000 2.62879396761562E+0000 2.62644668328687E+0000 2.62410079054504E+0000 + 2.62175628898171E+0000 2.61941317818845E+0000 2.61707145775684E+0000 2.61473112727846E+0000 2.61239218634490E+0000 + 2.61005463454772E+0000 2.60771847147851E+0000 2.60538369672885E+0000 2.60305030989031E+0000 2.60071831055448E+0000 + 2.59838769831293E+0000 2.59605847275723E+0000 2.59373063347898E+0000 2.59140418006975E+0000 2.58907911212111E+0000 + 2.58675542922465E+0000 2.58443313097195E+0000 2.58211221695458E+0000 2.57979268676412E+0000 2.57747453999215E+0000 + 2.57515777623024E+0000 2.57284239506999E+0000 2.57052839610297E+0000 2.56821577892075E+0000 2.56590454311491E+0000 + 2.56359468827703E+0000 2.56128621399870E+0000 2.55897911987149E+0000 2.55667340548698E+0000 2.55436907043674E+0000 + 2.55206611431236E+0000 2.54976453670542E+0000 2.54746433720749E+0000 2.54516551541015E+0000 2.54286807090498E+0000 + 2.54057200328357E+0000 2.53827731213748E+0000 2.53598399705830E+0000 2.53369205763760E+0000 2.53140149346697E+0000 + 2.52911230413798E+0000 2.52682448924222E+0000 2.52453804837125E+0000 2.52225298111667E+0000 2.51996928707004E+0000 + 2.51768696582295E+0000 2.51540601696698E+0000 2.51312644009370E+0000 2.51084823479469E+0000 2.50857140066153E+0000 + 2.50629593728581E+0000 2.50402184425909E+0000 2.50174912117296E+0000 2.49947776761900E+0000 2.49720778318878E+0000 + 2.49493916747389E+0000 2.49267192006590E+0000 2.49040604055639E+0000 2.48814152853694E+0000 2.48587838359913E+0000 + 2.48361660533453E+0000 2.48135619333474E+0000 2.47909714719132E+0000 2.47683946649585E+0000 2.47458315083991E+0000 + 2.47232819981508E+0000 2.47007461301295E+0000 2.46782239002508E+0000 2.46557153044306E+0000 2.46332203385846E+0000 + 2.46107389986287E+0000 2.45882712804786E+0000 2.45658171800502E+0000 2.45433766932591E+0000 2.45209498160212E+0000 + 2.44985365442523E+0000 2.44761368738682E+0000 2.44537508007846E+0000 2.44313783209174E+0000 2.44090194301823E+0000 + 2.43866741244951E+0000 2.43643423997716E+0000 2.43420242519276E+0000 2.43197196768789E+0000 2.42974286705412E+0000 + 2.42751512288304E+0000 2.42528873476622E+0000 2.42306370229525E+0000 2.42084002506169E+0000 2.41861770265714E+0000 + 2.41639673467316E+0000 2.41417712070134E+0000 2.41195886033326E+0000 2.40974195316049E+0000 2.40752639877461E+0000 + 2.40531219676721E+0000 2.40309934672986E+0000 2.40088784825413E+0000 2.39867770093161E+0000 2.39646890435388E+0000 + 2.39426145811252E+0000 2.39205536179910E+0000 2.38985061500520E+0000 2.38764721732241E+0000 2.38544516834229E+0000 + 2.38324446765644E+0000 2.38104511485642E+0000 2.37884710953382E+0000 2.37665045128021E+0000 2.37445513968717E+0000 + 2.37226117434629E+0000 2.37006855484914E+0000 2.36787728078730E+0000 2.36568735175235E+0000 2.36349876733586E+0000 + 2.36131152712943E+0000 2.35912563072461E+0000 2.35694107771300E+0000 2.35475786768617E+0000 2.35257600023570E+0000 + 2.35039547495317E+0000 2.34821629143016E+0000 2.34603844925825E+0000 2.34386194802901E+0000 2.34168678733403E+0000 + 2.33951296676488E+0000 2.33734048591314E+0000 2.33516934437039E+0000 2.33299954172821E+0000 2.33083107757818E+0000 + 2.32866395151187E+0000 2.32649816312087E+0000 2.32433371199675E+0000 2.32217059773110E+0000 2.32000881991549E+0000 + 2.31784837814150E+0000 2.31568927200070E+0000 2.31353150108468E+0000 2.31137506498502E+0000 2.30921996329330E+0000 + 2.30706619560108E+0000 2.30491376149996E+0000 2.30276266058151E+0000 2.30061289243731E+0000 2.29846445665894E+0000 + 2.29631735283798E+0000 2.29417158056600E+0000 2.29202713943458E+0000 2.28988402903531E+0000 2.28774224895976E+0000 + 2.28560179879951E+0000 2.28346267814614E+0000 2.28132488659123E+0000 2.27918842372635E+0000 2.27705328914309E+0000 + 2.27491948243303E+0000 2.27278700318773E+0000 2.27065585099879E+0000 2.26852602545778E+0000 2.26639752615627E+0000 + 2.26427035268586E+0000 2.26214450463811E+0000 2.26001998160460E+0000 2.25789678317692E+0000 2.25577490894664E+0000 + 2.25365435850534E+0000 2.25153513144460E+0000 2.24941722735601E+0000 2.24730064583112E+0000 2.24518538646153E+0000 + 2.24307144883882E+0000 2.24095883255456E+0000 2.23884753720033E+0000 2.23673756236772E+0000 2.23462890764829E+0000 + 2.23252157263363E+0000 2.23041555691532E+0000 2.22831086008493E+0000 2.22620748173405E+0000 2.22410542145425E+0000 + 2.22200467883711E+0000 2.21990525347421E+0000 2.21780714495713E+0000 2.21571035287745E+0000 2.21361487682674E+0000 + 2.21152071639659E+0000 2.20942787117857E+0000 2.20733634076426E+0000 2.20524612474525E+0000 2.20315722271311E+0000 + 2.20106963425941E+0000 2.19898335897574E+0000 2.19689839645368E+0000 2.19481474628480E+0000 2.19273240806069E+0000 + 2.19065138137292E+0000 2.18857166581307E+0000 2.18649326097271E+0000 2.18441616644344E+0000 2.18234038181682E+0000 + 2.18026590668444E+0000 2.17819274063787E+0000 2.17612088326870E+0000 2.17405033416850E+0000 2.17198109292884E+0000 + 2.16991315914132E+0000 2.16784653239750E+0000 2.16578121228897E+0000 2.16371719840731E+0000 2.16165449034409E+0000 + 2.15959308769089E+0000 2.15753299003930E+0000 2.15547419698088E+0000 2.15341670810722E+0000 2.15136052300990E+0000 + 2.14930564128050E+0000 2.14725206251059E+0000 2.14519978629175E+0000 2.14314881221557E+0000 2.14109913987361E+0000 + 2.13905076885747E+0000 2.13700369875872E+0000 2.13495792916893E+0000 2.13291345967969E+0000 2.13087028988257E+0000 + 2.12882841936915E+0000 2.12678784773102E+0000 2.12474857455974E+0000 2.12271059944691E+0000 2.12067392198409E+0000 + 2.11863854176288E+0000 2.11660445837483E+0000 2.11457167141154E+0000 2.11254018046458E+0000 2.11050998512554E+0000 + 2.10848108498598E+0000 2.10645347963749E+0000 2.10442716867166E+0000 2.10240215168004E+0000 2.10037842825423E+0000 + 2.09835599798581E+0000 2.09633486046634E+0000 2.09431501528742E+0000 2.09229646204062E+0000 2.09027920031752E+0000 + 2.08826322970969E+0000 2.08624854980872E+0000 2.08423516020618E+0000 2.08222306049366E+0000 2.08021225026273E+0000 + 2.07820272910497E+0000 2.07619449661196E+0000 2.07418755237527E+0000 2.07218189598650E+0000 2.07017752703721E+0000 + 2.06817444511898E+0000 2.06617264982340E+0000 2.06417214074203E+0000 2.06217291746647E+0000 2.06017497958829E+0000 + 2.05817832669906E+0000 2.05618295839037E+0000 2.05418887425380E+0000 2.05219607388092E+0000 2.05020455686331E+0000 + 2.04821432279255E+0000 2.04622537126022E+0000 2.04423770185790E+0000 2.04225131417717E+0000 2.04026620780961E+0000 + 2.03828238234679E+0000 2.03629983738029E+0000 2.03431857250169E+0000 2.03233858730258E+0000 2.03035988137452E+0000 + 2.02838245430910E+0000 2.02640630569790E+0000 2.02443143513250E+0000 2.02245784220447E+0000 2.02048552650539E+0000 + 2.01851448762684E+0000 2.01654472516041E+0000 2.01457623869766E+0000 2.01260902783018E+0000 2.01064309214955E+0000 + 2.00867843124734E+0000 2.00671504471514E+0000 2.00475293214451E+0000 2.00279209312705E+0000 2.00083252725433E+0000 + 1.99887423411793E+0000 1.99691721330943E+0000 1.99496146442040E+0000 1.99300698704243E+0000 1.99105378076709E+0000 + 1.98910184518596E+0000 1.98715117989062E+0000 1.98520178447266E+0000 1.98325365852364E+0000 1.98130680163515E+0000 + 1.97936121339876E+0000 1.97741689340606E+0000 1.97547384124862E+0000 1.97353205651802E+0000 1.97159153880585E+0000 + 1.96965228770367E+0000 1.96771430280307E+0000 1.96577758369563E+0000 1.96384212997292E+0000 1.96190794122652E+0000 + 1.95997501704802E+0000 1.95804335702899E+0000 1.95611296076101E+0000 1.95418382783566E+0000 1.95225595784452E+0000 + 1.95032935037916E+0000 1.94840400503117E+0000 1.94647992139212E+0000 1.94455709905360E+0000 1.94263553760717E+0000 + 1.94071523664443E+0000 1.93879619575694E+0000 1.93687841453629E+0000 1.93496189257405E+0000 1.93304662946181E+0000 + 1.93113262479115E+0000 1.92921987815363E+0000 1.92730838914085E+0000 1.92539815734437E+0000 1.92348918235579E+0000 + 1.92158146376667E+0000 1.91967500116859E+0000 1.91776979415314E+0000 1.91586584231189E+0000 1.91396314523643E+0000 + 1.91206170251832E+0000 1.91016151374915E+0000 1.90826257852050E+0000 1.90636489642395E+0000 1.90446846705107E+0000 + 1.90257328999345E+0000 1.90067936484266E+0000 1.89878669119028E+0000 1.89689526862788E+0000 1.89500509674706E+0000 + 1.89311617513939E+0000 1.89122850339644E+0000 1.88934208110979E+0000 1.88745690787103E+0000 1.88557298327173E+0000 + 1.88369030690347E+0000 1.88180887835783E+0000 1.87992869722639E+0000 1.87804976310073E+0000 1.87617207557242E+0000 + 1.87429563423305E+0000 1.87242043867418E+0000 1.87054648848741E+0000 1.86867378326431E+0000 1.86680232259646E+0000 + 1.86493210607544E+0000 1.86306313329282E+0000 1.86119540384019E+0000 1.85932891730913E+0000 1.85746367329120E+0000 + 1.85559967137800E+0000 1.85373691116109E+0000 1.85187539223207E+0000 1.85001511418250E+0000 1.84815607660397E+0000 + 1.84629827908805E+0000 1.84444172122633E+0000 1.84258640261038E+0000 1.84073232283178E+0000 1.83887948148211E+0000 + 1.83702787815294E+0000 1.83517751243587E+0000 1.83332838392246E+0000 1.83148049220429E+0000 1.82963383687295E+0000 + 1.82778841752001E+0000 1.82594423373705E+0000 1.82410128511565E+0000 1.82225957124739E+0000 1.82041909172384E+0000 + 1.81857984613659E+0000 1.81674183407721E+0000 1.81490505513729E+0000 1.81306950890839E+0000 1.81123519498211E+0000 + 1.80940211295002E+0000 1.80757026240369E+0000 1.80573964293471E+0000 1.80391025413465E+0000 1.80208209559510E+0000 + 1.80025516690763E+0000 1.79842946766382E+0000 1.79660499745525E+0000 1.79478175587350E+0000 1.79295974251015E+0000 + 1.79113895695677E+0000 1.78931939880495E+0000 1.78750106764626E+0000 1.78568396307228E+0000 1.78386808467459E+0000 + 1.78205343204477E+0000 1.78024000477440E+0000 1.77842780245506E+0000 1.77661682467832E+0000 1.77480707103577E+0000 + 1.77299854111898E+0000 1.77119123451952E+0000 1.76938515082900E+0000 1.76758028963896E+0000 1.76577665054101E+0000 + 1.76397423312672E+0000 1.76217303698765E+0000 1.76037306171540E+0000 1.75857430690155E+0000 1.75677677213766E+0000 + 1.75498045701533E+0000 1.75318536112612E+0000 1.75139148406162E+0000 1.74959882541341E+0000 1.74780738477306E+0000 + 1.74601716173216E+0000 1.74422815588228E+0000 1.74244036681499E+0000 1.74065379412189E+0000 1.73886843739455E+0000 + 1.73708429622454E+0000 1.73530137020345E+0000 1.73351965892285E+0000 1.73173916197432E+0000 1.72995987894945E+0000 + 1.72818180943981E+0000 1.72640495303697E+0000 1.72462930933253E+0000 1.72285487791805E+0000 1.72108165838511E+0000 + 1.71930965032530E+0000 1.71753885333019E+0000 1.71576926699136E+0000 1.71400089090040E+0000 1.71223372464887E+0000 + 1.71046776782836E+0000 1.70870302003044E+0000 1.70693948084670E+0000 1.70517714986871E+0000 1.70341602668806E+0000 + 1.70165611089631E+0000 1.69989740208506E+0000 1.69813989984587E+0000 1.69638360377034E+0000 1.69462851345002E+0000 + 1.69287462847651E+0000 1.69112194844139E+0000 1.68937047293622E+0000 1.68762020155260E+0000 1.68587113388210E+0000 + 1.68412326951629E+0000 1.68237660804676E+0000 1.68063114906508E+0000 1.67888689216284E+0000 1.67714383693161E+0000 + 1.67540198296298E+0000 1.67366132984851E+0000 1.67192187717979E+0000 1.67018362454840E+0000 1.66844657154592E+0000 + 1.66671071776392E+0000 1.66497606279398E+0000 1.66324260622769E+0000 1.66151034765662E+0000 1.65977928667234E+0000 + 1.65804942286645E+0000 1.65632075583051E+0000 1.65459328515611E+0000 1.65286701043482E+0000 1.65114193125823E+0000 + 1.64941804721791E+0000 1.64769535790544E+0000 1.64597386291239E+0000 1.64425356183036E+0000 1.64253445425091E+0000 + 1.64081653976563E+0000 1.63909981796609E+0000 1.63738428844388E+0000 1.63566995079056E+0000 1.63395680459773E+0000 + 1.63224484945696E+0000 1.63053408495982E+0000 1.62882451069790E+0000 1.62711612626277E+0000 1.62540893124602E+0000 + 1.62370292523922E+0000 1.62199810783396E+0000 1.62029447862180E+0000 1.61859203719433E+0000 1.61689078314312E+0000 + 1.61519071605977E+0000 1.61349183553584E+0000 1.61179414116291E+0000 1.61009763253256E+0000 1.60840230923637E+0000 + 1.60670817086593E+0000 1.60501521701280E+0000 1.60332344726857E+0000 1.60163286122481E+0000 1.59994345847311E+0000 + 1.59825523860504E+0000 1.59656820121218E+0000 1.59488234588612E+0000 1.59319767221842E+0000 1.59151417980067E+0000 + 1.58983186822445E+0000 1.58815073708133E+0000 1.58647078596289E+0000 1.58479201446072E+0000 1.58311442216639E+0000 + 1.58143800867148E+0000 1.57976277356757E+0000 1.57808871644623E+0000 1.57641583689905E+0000 1.57474413451761E+0000 + 1.57307360889348E+0000 1.57140425961824E+0000 1.56973608628347E+0000 1.56806908848075E+0000 1.56640326580166E+0000 + 1.56473861783778E+0000 1.56307514418069E+0000 1.56141284442195E+0000 1.55975171815316E+0000 1.55809176496589E+0000 + 1.55643298445173E+0000 1.55477537620224E+0000 1.55311893980901E+0000 1.55146367486361E+0000 1.54980958095764E+0000 + 1.54815665768265E+0000 1.54650490463024E+0000 1.54485432139198E+0000 1.54320490755945E+0000 1.54155666272423E+0000 + 1.53990958647789E+0000 1.53826367841203E+0000 1.53661893811820E+0000 1.53497536518800E+0000 1.53333295921301E+0000 + 1.53169171978479E+0000 1.53005164649493E+0000 1.52841273893502E+0000 1.52677499669661E+0000 1.52513841937131E+0000 + 1.52350300655068E+0000 1.52186875782630E+0000 1.52023567278976E+0000 1.51860375103262E+0000 1.51697299214647E+0000 + 1.51534339572290E+0000 1.51371496135347E+0000 1.51208768862976E+0000 1.51046157714336E+0000 1.50883662648584E+0000 + 1.50721283624878E+0000 1.50559020602377E+0000 1.50396873540237E+0000 1.50234842397617E+0000 1.50072927133674E+0000 + 1.49911127707567E+0000 1.49749444078454E+0000 1.49587876205492E+0000 1.49426424047838E+0000 1.49265087564652E+0000 + 1.49103866715091E+0000 1.48942761458312E+0000 1.48781771753474E+0000 1.48620897559735E+0000 1.48460138836251E+0000 + 1.48299495542182E+0000 1.48138967636685E+0000 1.47978555078918E+0000 1.47818257828039E+0000 1.47658075843206E+0000 + 1.47498009083576E+0000 1.47338057508307E+0000 1.47178221076558E+0000 1.47018499747486E+0000 1.46858893480249E+0000 + 1.46699402234005E+0000 1.46540025967911E+0000 1.46380764641127E+0000 1.46221618212808E+0000 1.46062586642114E+0000 + 1.45903669888203E+0000 1.45744867910231E+0000 1.45586180667358E+0000 1.45427608118740E+0000 1.45269150223536E+0000 + 1.45110806940904E+0000 1.44952578230001E+0000 1.44794464049986E+0000 1.44636464360016E+0000 1.44478579119249E+0000 + 1.44320808286843E+0000 1.44163151821955E+0000 1.44005609683745E+0000 1.43848181831369E+0000 1.43690868223985E+0000 + 1.43533668820751E+0000 1.43376583580826E+0000 1.43219612463367E+0000 1.43062755427532E+0000 1.42906012432479E+0000 + 1.42749383437365E+0000 1.42592868401349E+0000 1.42436467283588E+0000 1.42280180043240E+0000 1.42124006639464E+0000 + 1.41967947031417E+0000 1.41812001178256E+0000 1.41656169039140E+0000 1.41500450573227E+0000 1.41344845739674E+0000 + 1.41189354497640E+0000 1.41033976806282E+0000 1.40878712624758E+0000 1.40723561912226E+0000 1.40568524627844E+0000 + 1.40413600730769E+0000 1.40258790180160E+0000 1.40104092935175E+0000 1.39949508954971E+0000 1.39795038198706E+0000 + 1.39640680625538E+0000 1.39486436194625E+0000 1.39332304865125E+0000 1.39178286596195E+0000 1.39024381346995E+0000 + 1.38870589076680E+0000 1.38716909744410E+0000 1.38563343309342E+0000 1.38409889730634E+0000 1.38256548967443E+0000 + 1.38103320978929E+0000 1.37950205724248E+0000 1.37797203162559E+0000 1.37644313253019E+0000 1.37491535954786E+0000 + 1.37338871227019E+0000 1.37186319028874E+0000 1.37033879319511E+0000 1.36881552058086E+0000 1.36729337203757E+0000 + 1.36577234715683E+0000 1.36425244553022E+0000 1.36273366674930E+0000 1.36121601040567E+0000 1.35969947609089E+0000 + 1.35818406339656E+0000 1.35666977191424E+0000 1.35515660123552E+0000 1.35364455095197E+0000 1.35213362065517E+0000 + 1.35062380993671E+0000 1.34911511838815E+0000 1.34760754560109E+0000 1.34610109116709E+0000 1.34459575467774E+0000 + 1.34309153572461E+0000 1.34158843389929E+0000 1.34008644879335E+0000 1.33858557999837E+0000 1.33708582710594E+0000 + 1.33558718970762E+0000 1.33408966739499E+0000 1.33259325975965E+0000 1.33109796639316E+0000 1.32960378688710E+0000 + 1.32811072083305E+0000 1.32661876782260E+0000 1.32512792744731E+0000 1.32363819929877E+0000 1.32214958296856E+0000 + 1.32066207804826E+0000 1.31917568412944E+0000 1.31769040080368E+0000 1.31620622766257E+0000 1.31472316429767E+0000 + 1.31324121030058E+0000 1.31176036526286E+0000 1.31028062877610E+0000 1.30880200043187E+0000 1.30732447982176E+0000 + 1.30584806653734E+0000 1.30437276017019E+0000 1.30289856031190E+0000 1.30142546655403E+0000 1.29995347848816E+0000 + 1.29848259570589E+0000 1.29701281779878E+0000 1.29554414435841E+0000 1.29407657497637E+0000 1.29261010924422E+0000 + 1.29114474675356E+0000 1.28968048709595E+0000 1.28821732986299E+0000 1.28675527464623E+0000 1.28529432103727E+0000 + 1.28383446862769E+0000 1.28237571700906E+0000 1.28091806577296E+0000 1.27946151451096E+0000 1.27800606281466E+0000 + 1.27655171027562E+0000 1.27509845648542E+0000 1.27364630103566E+0000 1.27219524351789E+0000 1.27074528352371E+0000 + 1.26929642064468E+0000 1.26784865447240E+0000 1.26640198459843E+0000 1.26495641061436E+0000 1.26351193211176E+0000 + 1.26206854868222E+0000 1.26062625991731E+0000 1.25918506540861E+0000 1.25774496474770E+0000 1.25630595752616E+0000 + 1.25486804333556E+0000 1.25343122176749E+0000 1.25199549241353E+0000 1.25056085486525E+0000 1.24912730871423E+0000 + 1.24769485355206E+0000 1.24626348897030E+0000 1.24483321456054E+0000 1.24340402991436E+0000 1.24197593462333E+0000 + 1.24054892827904E+0000 1.23912301047306E+0000 1.23769818079697E+0000 1.23627443884235E+0000 1.23485178420078E+0000 + 1.23343021646384E+0000 1.23200973522311E+0000 1.23059034007016E+0000 1.22917203059657E+0000 1.22775480639393E+0000 + 1.22633866705381E+0000 1.22492361216778E+0000 1.22350964132744E+0000 1.22209675412435E+0000 1.22068495015010E+0000 + 1.21927422899627E+0000 1.21786459025443E+0000 1.21645603351616E+0000 1.21504855837304E+0000 1.21364216441665E+0000 + 1.21223685123857E+0000 1.21083261843038E+0000 1.20942946558365E+0000 1.20802739228996E+0000 1.20662639814090E+0000 + 1.20522648272804E+0000 1.20382764564296E+0000 1.20242988647725E+0000 1.20103320482246E+0000 1.19963760027020E+0000 + 1.19824307241203E+0000 1.19684962083953E+0000 1.19545724514429E+0000 1.19406594491788E+0000 1.19267571975188E+0000 + 1.19128656923786E+0000 1.18989849296742E+0000 1.18851149053212E+0000 1.18712556152355E+0000 1.18574070553328E+0000 + 1.18435692215289E+0000 1.18297421097396E+0000 1.18159257158807E+0000 1.18021200358680E+0000 1.17883250656173E+0000 + 1.17745408010443E+0000 1.17607672380649E+0000 1.17470043725948E+0000 1.17332522005499E+0000 1.17195107178458E+0000 + 1.17057799203984E+0000 1.16920598041235E+0000 1.16783503649369E+0000 1.16646515987544E+0000 1.16509635014916E+0000 + 1.16372860690645E+0000 1.16236192973889E+0000 1.16099631823804E+0000 1.15963177199549E+0000 1.15826829060282E+0000 + 1.15690587365160E+0000 1.15554452073342E+0000 1.15418423143985E+0000 1.15282500536248E+0000 1.15146684209288E+0000 + 1.15010974122262E+0000 1.14875370234330E+0000 1.14739872504648E+0000 1.14604480892375E+0000 1.14469195356668E+0000 + 1.14334015856686E+0000 1.14198942351586E+0000 1.14063974800526E+0000 1.13929113162663E+0000 1.13794357397157E+0000 + 1.13659707463165E+0000 1.13525163319843E+0000 1.13390724926352E+0000 1.13256392241847E+0000 1.13122165225488E+0000 + 1.12988043836432E+0000 1.12854028033837E+0000 1.12720117776860E+0000 1.12586313024660E+0000 1.12452613736395E+0000 + 1.12319019871222E+0000 1.12185531388299E+0000 1.12052148246785E+0000 1.11918870405836E+0000 1.11785697824612E+0000 + 1.11652630462269E+0000 1.11519668277965E+0000 1.11386811230859E+0000 1.11254059280109E+0000 1.11121412384871E+0000 + 1.10988870504305E+0000 1.10856433597568E+0000 1.10724101623817E+0000 1.10591874542212E+0000 1.10459752311908E+0000 + 1.10327734892066E+0000 1.10195822241841E+0000 1.10064014320393E+0000 1.09932311086879E+0000 1.09800712500456E+0000 + 1.09669218520284E+0000 1.09537829105519E+0000 1.09406544215320E+0000 1.09275363808844E+0000 1.09144287845249E+0000 + 1.09013316283693E+0000 1.08882449083335E+0000 1.08751686203331E+0000 1.08621027602840E+0000 1.08490473241020E+0000 + 1.08360023077028E+0000 1.08229677070023E+0000 1.08099435179162E+0000 1.07969297363602E+0000 1.07839263582503E+0000 + 1.07709333795022E+0000 1.07579507960316E+0000 1.07449786037544E+0000 1.07320167985864E+0000 1.07190653764433E+0000 + 1.07061243332409E+0000 1.06931936648950E+0000 1.06802733673213E+0000 1.06673634364358E+0000 1.06544638681542E+0000 + 1.06415746583922E+0000 1.06286958030656E+0000 1.06158272980903E+0000 1.06029691393819E+0000 1.05901213228564E+0000 + 1.05772838444295E+0000 1.05644567000169E+0000 1.05516398855345E+0000 1.05388333968981E+0000 1.05260372300234E+0000 + 1.05132513808262E+0000 1.05004758452223E+0000 1.04877106191276E+0000 1.04749556984577E+0000 1.04622110791285E+0000 + 1.04494767570557E+0000 1.04367527281552E+0000 1.04240389883427E+0000 1.04113355335341E+0000 1.03986423596450E+0000 + 1.03859594625914E+0000 1.03732868382889E+0000 1.03606244826534E+0000 1.03479723916007E+0000 1.03353305610465E+0000 + 1.03226989869066E+0000 1.03100776650968E+0000 1.02974665915330E+0000 1.02848657621308E+0000 1.02722751728061E+0000 + 1.02596948194747E+0000 1.02471246980523E+0000 1.02345648044548E+0000 1.02220151345979E+0000 1.02094756843974E+0000 + 1.01969464497691E+0000 1.01844274266288E+0000 1.01719186108922E+0000 1.01594199984753E+0000 1.01469315852936E+0000 + 1.01344533672631E+0000 1.01219853402996E+0000 1.01095275003187E+0000 1.00970798432363E+0000 1.00846423649683E+0000 + 1.00722150614302E+0000 1.00597979285381E+0000 1.00473909622076E+0000 1.00349941583545E+0000 1.00226075128946E+0000 + 1.00102310217438E+0000 9.99786468081769E-0001 9.98550848603220E-0001 9.97316243330307E-0001 9.96082651854609E-0001 + 9.94850073767706E-0001 9.93618508661176E-0001 9.92387956126597E-0001 9.91158415755548E-0001 9.89929887139607E-0001 + 9.88702369870354E-0001 9.87475863539367E-0001 9.86250367738225E-0001 9.85025882058507E-0001 9.83802406091791E-0001 + 9.82579939429656E-0001 9.81358481663681E-0001 9.80138032385444E-0001 9.78918591186524E-0001 9.77700157658500E-0001 + 9.76482731392950E-0001 9.75266311981454E-0001 9.74050899015590E-0001 9.72836492086936E-0001 9.71623090787072E-0001 + 9.70410694707575E-0001 9.69199303440025E-0001 9.67988916576000E-0001 9.66779533707080E-0001 9.65571154424843E-0001 + 9.64363778320867E-0001 9.63157404986730E-0001 9.61952034014014E-0001 9.60747664994295E-0001 9.59544297519152E-0001 + 9.58341931180164E-0001 9.57140565568910E-0001 9.55940200276967E-0001 9.54740834895917E-0001 9.53542469017336E-0001 + 9.52345102232804E-0001 9.51148734133899E-0001 9.49953364312199E-0001 9.48758992359285E-0001 9.47565617866734E-0001 + 9.46373240426125E-0001 9.45181859629036E-0001 9.43991475067048E-0001 9.42802086331736E-0001 9.41613693014682E-0001 + 9.40426294707464E-0001 9.39239891001659E-0001 9.38054481488848E-0001 9.36870065760608E-0001 9.35686643408518E-0001 + 9.34504214024158E-0001 9.33322777199106E-0001 9.32142332524940E-0001 9.30962879593239E-0001 9.29784417995581E-0001 + 9.28606947323546E-0001 9.27430467168713E-0001 9.26254977122660E-0001 9.25080476776965E-0001 9.23906965723207E-0001 + 9.22734443552966E-0001 9.21562909857819E-0001 9.20392364229346E-0001 9.19222806259126E-0001 9.18054235538736E-0001 + 9.16886651659754E-0001 9.15720054213762E-0001 9.14554442792337E-0001 9.13389816987057E-0001 9.12226176389502E-0001 + 9.11063520591249E-0001 9.09901849183879E-0001 9.08741161758969E-0001 9.07581457908098E-0001 9.06422737222845E-0001 + 9.05264999294789E-0001 9.04108243715507E-0001 9.02952470076580E-0001 9.01797677969586E-0001 9.00643866986103E-0001 + 8.99491036717710E-0001 8.98339186755985E-0001 8.97188316692508E-0001 8.96038426118858E-0001 8.94889514626612E-0001 + 8.93741581807350E-0001 8.92594627252651E-0001 8.91448650554091E-0001 8.90303651303252E-0001 8.89159629091711E-0001 + 8.88016583511048E-0001 8.86874514152840E-0001 8.85733420608666E-0001 8.84593302470106E-0001 8.83454159328738E-0001 + 8.82315990776140E-0001 8.81178796403892E-0001 8.80042575803572E-0001 8.78907328566758E-0001 8.77773054285029E-0001 + 8.76639752549965E-0001 8.75507422953144E-0001 8.74376065086144E-0001 8.73245678540544E-0001 8.72116262907924E-0001 + 8.70987817779860E-0001 8.69860342747934E-0001 8.68733837403722E-0001 8.67608301338804E-0001 8.66483734144758E-0001 + 8.65360135413163E-0001 8.64237504735599E-0001 8.63115841703643E-0001 8.61995145908874E-0001 8.60875416942870E-0001 + 8.59756654397212E-0001 8.58638857863477E-0001 8.57522026933244E-0001 8.56406161198092E-0001 8.55291260249599E-0001 + 8.54177323679344E-0001 8.53064351078906E-0001 8.51952342039863E-0001 8.50841296153795E-0001 8.49731213012280E-0001 + 8.48622092206896E-0001 8.47513933329223E-0001 8.46406735970839E-0001 8.45300499723322E-0001 8.44195224178253E-0001 + 8.43090908927208E-0001 8.41987553561766E-0001 8.40885157673508E-0001 8.39783720854010E-0001 8.38683242694853E-0001 + 8.37583722787615E-0001 8.36485160723873E-0001 8.35387556095208E-0001 8.34290908493197E-0001 8.33195217509420E-0001 + 8.32100482735456E-0001 8.31006703762882E-0001 8.29913880183276E-0001 8.28822011588220E-0001 8.27731097569291E-0001 + 8.26641137718068E-0001 8.25552131626129E-0001 8.24464078885053E-0001 8.23376979086418E-0001 8.22290831821804E-0001 + 8.21205636682789E-0001 8.20121393260953E-0001 8.19038101147872E-0001 8.17955759935127E-0001 8.16874369214296E-0001 + 8.15793928576957E-0001 8.14714437614691E-0001 8.13635895919074E-0001 8.12558303081686E-0001 8.11481658694104E-0001 + 8.10405962347910E-0001 8.09331213634681E-0001 8.08257412145995E-0001 8.07184557473431E-0001 8.06112649208568E-0001 + 8.05041686942985E-0001 8.03971670268260E-0001 8.02902598775973E-0001 8.01834472057701E-0001 8.00767289705024E-0001 + 7.99701051309519E-0001 7.98635756462767E-0001 7.97571404756346E-0001 7.96507995781834E-0001 7.95445529130810E-0001 + 7.94384004394851E-0001 7.93323421165539E-0001 7.92263779034451E-0001 7.91205077593166E-0001 7.90147316433263E-0001 + 7.89090495146319E-0001 7.88034613323914E-0001 7.86979670557627E-0001 7.85925666439036E-0001 7.84872600559721E-0001 + 7.83820472511259E-0001 7.82769281885229E-0001 7.81719028273210E-0001 7.80669711266782E-0001 7.79621330457522E-0001 + 7.78573885437009E-0001 7.77527375796822E-0001 7.76481801128539E-0001 7.75437161023740E-0001 7.74393455074004E-0001 + 7.73350682870908E-0001 7.72308844006031E-0001 7.71267938070951E-0001 7.70227964657250E-0001 7.69188923356504E-0001 + 7.68150813760291E-0001 7.67113635460193E-0001 7.66077388047785E-0001 7.65042071114647E-0001 7.64007684252359E-0001 + 7.62974227052499E-0001 7.61941699106645E-0001 7.60910100006376E-0001 7.59879429343271E-0001 7.58849686708909E-0001 + 7.57820871694867E-0001 7.56792983892726E-0001 7.55766022894064E-0001 7.54739988290459E-0001 7.53714879673489E-0001 + 7.52690696634735E-0001 7.51667438765774E-0001 7.50645105658185E-0001 7.49623696903547E-0001 7.48603212093438E-0001 + 7.47583650819438E-0001 7.46565012673125E-0001 7.45547297246078E-0001 7.44530504129875E-0001 7.43514632916095E-0001 + 7.42499683196316E-0001 7.41485654562118E-0001 7.40472546605080E-0001 7.39460358916779E-0001 7.38449091088795E-0001 + 7.37438742712705E-0001 7.36429313380090E-0001 7.35420802682528E-0001 7.34413210211597E-0001 7.33406535558877E-0001 + 7.32400778315945E-0001 7.31395938074380E-0001 7.30392014425761E-0001 7.29389006961668E-0001 7.28386915273678E-0001 + 7.27385738953371E-0001 7.26385477592323E-0001 7.25386130782116E-0001 7.24387698114328E-0001 7.23390179180537E-0001 + 7.22393573572321E-0001 7.21397880881260E-0001 7.20403100698931E-0001 7.19409232616915E-0001 7.18416276226790E-0001 + 7.17424231120134E-0001 7.16433096888526E-0001 7.15442873123543E-0001 7.14453559416768E-0001 7.13465155359776E-0001 + 7.12477660544147E-0001 7.11491074561459E-0001 7.10505397003292E-0001 7.09520627461223E-0001 7.08536765526832E-0001 + 7.07553810791697E-0001 7.06571762847398E-0001 7.05590621285512E-0001 7.04610385697618E-0001 7.03631055675295E-0001 + 7.02652630810123E-0001 7.01675110693679E-0001 7.00698494917542E-0001 6.99722783073292E-0001 6.98747974752505E-0001 + 6.97774069546762E-0001 6.96801067047641E-0001 6.95828966846721E-0001 6.94857768535580E-0001 6.93887471705797E-0001 + 6.92918075948951E-0001 6.91949580856621E-0001 6.90981986020385E-0001 6.90015291031822E-0001 6.89049495482511E-0001 + 6.88084598964029E-0001 6.87120601067957E-0001 6.86157501385873E-0001 6.85195299509355E-0001 6.84233995029983E-0001 + 6.83273587539333E-0001 6.82314076628987E-0001 6.81355461890522E-0001 6.80397742915517E-0001 6.79440919295550E-0001 + 6.78484990622201E-0001 6.77529956487047E-0001 6.76575816481669E-0001 6.75622570197644E-0001 6.74670217226552E-0001 + 6.73718757159970E-0001 6.72768189589477E-0001 6.71818514106653E-0001 6.70869730303076E-0001 6.69921837770325E-0001 + 6.68974836099978E-0001 6.68028724883614E-0001 6.67083503712811E-0001 6.66139172179149E-0001 6.65195729874207E-0001 + 6.64253176389562E-0001 6.63311511316794E-0001 6.62370734247480E-0001 6.61430844773202E-0001 6.60491842485535E-0001 + 6.59553726976061E-0001 6.58616497836356E-0001 6.57680154658000E-0001 6.56744697032571E-0001 6.55810124551649E-0001 + 6.54876436806811E-0001 6.53943633389637E-0001 6.53011713891706E-0001 6.52080677904595E-0001 6.51150525019884E-0001 + 6.50221254829152E-0001 6.49292866923976E-0001 6.48365360895937E-0001 6.47438736336612E-0001 6.46512992837579E-0001 + 6.45588129990419E-0001 6.44664147386710E-0001 6.43741044618030E-0001 6.42818821275958E-0001 6.41897476952072E-0001 + 6.40977011237952E-0001 6.40057423725176E-0001 6.39138714005323E-0001 6.38220881669971E-0001 6.37303926310700E-0001 + 6.36387847519087E-0001 6.35472644886712E-0001 6.34558318005153E-0001 6.33644866465990E-0001 6.32732289860800E-0001 + 6.31820587781162E-0001 6.30909759818656E-0001 6.29999805564859E-0001 6.29090724611351E-0001 6.28182516549711E-0001 + 6.27275180971516E-0001 6.26368717468345E-0001 6.25463125631778E-0001 6.24558405053394E-0001 6.23654555324769E-0001 + 6.22751576037485E-0001 6.21849466783118E-0001 6.20948227153248E-0001 6.20047856739454E-0001 6.19148355133314E-0001 + 6.18249721926407E-0001 6.17351956710312E-0001 6.16455059076606E-0001 6.15559028616870E-0001 6.14663864922682E-0001 + 6.13769567585620E-0001 6.12876136197263E-0001 6.11983570349190E-0001 6.11091869632980E-0001 6.10201033640211E-0001 + 6.09311061962461E-0001 6.08421954191311E-0001 6.07533709918338E-0001 6.06646328735120E-0001 6.05759810233238E-0001 + 6.04874154004269E-0001 6.03989359639793E-0001 6.03105426731387E-0001 6.02222354870630E-0001 6.01340143649102E-0001 + 6.00458792658381E-0001 5.99578301490046E-0001 5.98698669735675E-0001 5.97819896986847E-0001 5.96941982835140E-0001 + 5.96064926872134E-0001 5.95188728689408E-0001 5.94313387878539E-0001 5.93438904031107E-0001 5.92565276738690E-0001 + 5.91692505592867E-0001 5.90820590185217E-0001 5.89949530107318E-0001 5.89079324950749E-0001 5.88209974307089E-0001 + 5.87341477767916E-0001 5.86473834924810E-0001 5.85607045369348E-0001 5.84741108693111E-0001 5.83876024487675E-0001 + 5.83011792344621E-0001 5.82148411855525E-0001 5.81285882611969E-0001 5.80424204205530E-0001 5.79563376227786E-0001 + 5.78703398270317E-0001 5.77844269924700E-0001 5.76985990782516E-0001 5.76128560435343E-0001 5.75271978474759E-0001 + 5.74416244492343E-0001 5.73561358079673E-0001 5.72707318828329E-0001 5.71854126329889E-0001 5.71001780175932E-0001 + 5.70150279958036E-0001 5.69299625267781E-0001 5.68449815696744E-0001 5.67600850836505E-0001 5.66752730278643E-0001 + 5.65905453614735E-0001 5.65059020436361E-0001 5.64213430335100E-0001 5.63368682902529E-0001 5.62524777730229E-0001 + 5.61681714409777E-0001 5.60839492532752E-0001 5.59998111690733E-0001 5.59157571475298E-0001 5.58317871478027E-0001 + 5.57479011290499E-0001 5.56640990504291E-0001 5.55803808710982E-0001 5.54967465502151E-0001 5.54131960469377E-0001 + 5.53297293204239E-0001 5.52463463298315E-0001 5.51630470343184E-0001 5.50798313930425E-0001 5.49966993651615E-0001 + 5.49136509098335E-0001 5.48306859862163E-0001 5.47478045534677E-0001 5.46650065707456E-0001 5.45822919972079E-0001 + 5.44996607920125E-0001 5.44171129143171E-0001 5.43346483232799E-0001 5.42522669780584E-0001 5.41699688378107E-0001 + 5.40877538616945E-0001 5.40056220088679E-0001 5.39235732384886E-0001 5.38416075097146E-0001 5.37597247817036E-0001 + 5.36779250136135E-0001 5.35962081646023E-0001 5.35145741938278E-0001 5.34330230604478E-0001 5.33515547236203E-0001 + 5.32701691425031E-0001 5.31888662762541E-0001 5.31076460840311E-0001 5.30265085249920E-0001 5.29454535582948E-0001 + 5.28644811430972E-0001 5.27835912385571E-0001 5.27027838038323E-0001 5.26220587980809E-0001 5.25414161804606E-0001 + 5.24608559101294E-0001 5.23803779462450E-0001 5.22999822479652E-0001 5.22196687744482E-0001 5.21394374848517E-0001 + 5.20592883383335E-0001 5.19792212940516E-0001 5.18992363111637E-0001 5.18193333488277E-0001 5.17395123662017E-0001 + 5.16597733224434E-0001 5.15801161767106E-0001 5.15005408881613E-0001 5.14210474159532E-0001 5.13416357192444E-0001 + 5.12623057571927E-0001 5.11830574889559E-0001 5.11038908736919E-0001 5.10248058705585E-0001 5.09458024387137E-0001 + 5.08668805373153E-0001 5.07880401255212E-0001 5.07092811624892E-0001 5.06306036073773E-0001 5.05520074193432E-0001 + 5.04734925575449E-0001 5.03950589811402E-0001 5.03167066492871E-0001 5.02384355211433E-0001 5.01602455558667E-0001 + 5.00821367126152E-0001 5.00041089505468E-0001 4.99261622288192E-0001 4.98482965065903E-0001 4.97705117430180E-0001 + 4.96928078972601E-0001 4.96151849284747E-0001 4.95376427958194E-0001 4.94601814584522E-0001 4.93828008755309E-0001 + 4.93055010062134E-0001 4.92282818096576E-0001 4.91511432450214E-0001 4.90740852714626E-0001 4.89971078481391E-0001 + 4.89202109342087E-0001 4.88433944888294E-0001 4.87666584711590E-0001 4.86900028403553E-0001 4.86134275555763E-0001 + 4.85369325759799E-0001 4.84605178607238E-0001 4.83841833689659E-0001 4.83079290598642E-0001 4.82317548925765E-0001 + 4.81556608262606E-0001 4.80796468200745E-0001 4.80037128331759E-0001 4.79278588247229E-0001 4.78520847538732E-0001 + 4.77763905797847E-0001 4.77007762616154E-0001 4.76252417585229E-0001 4.75497870296653E-0001 4.74744120342004E-0001 + 4.73991167312860E-0001 4.73239010800801E-0001 4.72487650397405E-0001 4.71737085694210E-0001 4.70987316278492E-0001 + 4.70238341729562E-0001 4.69490161625857E-0001 4.68742775545816E-0001 4.67996183067878E-0001 4.67250383770478E-0001 + 4.66505377232058E-0001 4.65761163031054E-0001 4.65017740745905E-0001 4.64275109955049E-0001 4.63533270236923E-0001 + 4.62792221169966E-0001 4.62051962332617E-0001 4.61312493303313E-0001 4.60573813660493E-0001 4.59835922982595E-0001 + 4.59098820848056E-0001 4.58362506835315E-0001 4.57626980522811E-0001 4.56892241488981E-0001 4.56158289312263E-0001 + 4.55425123571096E-0001 4.54692743843918E-0001 4.53961149709167E-0001 4.53230340745281E-0001 4.52500316530698E-0001 + 4.51771076643857E-0001 4.51042620663195E-0001 4.50314948167151E-0001 4.49588058734163E-0001 4.48861951942669E-0001 + 4.48136627371108E-0001 4.47412084597916E-0001 4.46688323201533E-0001 4.45965342760397E-0001 4.45243142852946E-0001 + 4.44521723057618E-0001 4.43801082952851E-0001 4.43081222117083E-0001 4.42362140128752E-0001 4.41643836566298E-0001 + 4.40926311008157E-0001 4.40209563032768E-0001 4.39493592218568E-0001 4.38778398143998E-0001 4.38063980387494E-0001 + 4.37350338527494E-0001 4.36637472142437E-0001 4.35925380810761E-0001 4.35214064110904E-0001 4.34503521621304E-0001 + 4.33793752920400E-0001 4.33084757586629E-0001 4.32376535198429E-0001 4.31669085334239E-0001 4.30962407572498E-0001 + 4.30256501491642E-0001 4.29551366670111E-0001 4.28847002686343E-0001 4.28143409118775E-0001 4.27440585545845E-0001 + 4.26738531545992E-0001 4.26037246697655E-0001 4.25336730579271E-0001 4.24636982769278E-0001 4.23938002846114E-0001 + 4.23239790388219E-0001 4.22542344974029E-0001 4.21845666181983E-0001 4.21149753590520E-0001 4.20454606778077E-0001 + 4.19760225323091E-0001 4.19066608804003E-0001 4.18373756799250E-0001 4.17681668887269E-0001 4.16990344646500E-0001 + 4.16299783655379E-0001 4.15609985492347E-0001 4.14920949735840E-0001 4.14232675964296E-0001 4.13545163756155E-0001 + 4.12858412689853E-0001 4.12172422343829E-0001 4.11487192296522E-0001 4.10802722126370E-0001 4.10119011411810E-0001 + 4.09436059731281E-0001 4.08753866663220E-0001 4.08072431786067E-0001 4.07391754678260E-0001 4.06711834918236E-0001 + 4.06032672084433E-0001 4.05354265755290E-0001 4.04676615509245E-0001 4.03999720924736E-0001 4.03323581580201E-0001 + 4.02648197054079E-0001 4.01973566924807E-0001 4.01299690770824E-0001 4.00626568170567E-0001 3.99954198702476E-0001 + 3.99282581944988E-0001 3.98611717476541E-0001 3.97941604875573E-0001 3.97272243720523E-0001 3.96603633589829E-0001 + 3.95935774061929E-0001 3.95268664715261E-0001 3.94602305128263E-0001 3.93936694879374E-0001 3.93271833547031E-0001 + 3.92607720709673E-0001 3.91944355945738E-0001 3.91281738833664E-0001 3.90619868951889E-0001 3.89958745878851E-0001 + 3.89298369192988E-0001 3.88638738472740E-0001 3.87979853296543E-0001 3.87321713242837E-0001 3.86664317890058E-0001 + 3.86007666816645E-0001 3.85351759601037E-0001 3.84696595821672E-0001 3.84042175056988E-0001 3.83388496885422E-0001 + 3.82735560885413E-0001 3.82083366635400E-0001 3.81431913713820E-0001 3.80781201699111E-0001 3.80131230169712E-0001 + 3.79481998704061E-0001 3.78833506880596E-0001 3.78185754277755E-0001 3.77538740473977E-0001 3.76892465047699E-0001 + 3.76246927577359E-0001 3.75602127641396E-0001 3.74958064818248E-0001 3.74314738686354E-0001 3.73672148824150E-0001 + 3.73030294810076E-0001 3.72389176222570E-0001 3.71748792640069E-0001 3.71109143641012E-0001 3.70470228803837E-0001 + 3.69832047706983E-0001 3.69194599928886E-0001 3.68557885047986E-0001 3.67921902642721E-0001 3.67286652291528E-0001 + 3.66652133572847E-0001 3.66018346065115E-0001 3.65385289346770E-0001 3.64752962996250E-0001 3.64121366591994E-0001 + 3.63490499712439E-0001 3.62860361936025E-0001 3.62230952841189E-0001 3.61602272006368E-0001 3.60974319010002E-0001 + 3.60347093430529E-0001 3.59720594846387E-0001 3.59094822836013E-0001 3.58469776977846E-0001 3.57845456850324E-0001 + 3.57221862031886E-0001 3.56598992100969E-0001 3.55976846636012E-0001 3.55355425215453E-0001 3.54734727417729E-0001 + 3.54114752821279E-0001 3.53495501004542E-0001 3.52876971545956E-0001 3.52259164023957E-0001 3.51642078016986E-0001 + 3.51025713103479E-0001 3.50410068861875E-0001 3.49795144870613E-0001 3.49180940708130E-0001 3.48567455952864E-0001 + 3.47954690183254E-0001 3.47342642977738E-0001 3.46731313914753E-0001 3.46120702572739E-0001 3.45510808530133E-0001 + 3.44901631365374E-0001 3.44293170656899E-0001 3.43685425983147E-0001 3.43078396922556E-0001 3.42472083053564E-0001 + 3.41866483954609E-0001 3.41261599204129E-0001 3.40657428380563E-0001 3.40053971062348E-0001 3.39451226827924E-0001 + 3.38849195255727E-0001 3.38247875924197E-0001 3.37647268411770E-0001 3.37047372296887E-0001 3.36448187157984E-0001 + 3.35849712573499E-0001 3.35251948121872E-0001 3.34654893381539E-0001 3.34058547930940E-0001 3.33462911348513E-0001 + 3.32867983212695E-0001 3.32273763101925E-0001 3.31680250594640E-0001 3.31087445269279E-0001 3.30495346704281E-0001 + 3.29903954478083E-0001 3.29313268169123E-0001 3.28723287355841E-0001 3.28134011616672E-0001 3.27545440530057E-0001 + 3.26957573674433E-0001 3.26370410628238E-0001 3.25783950969911E-0001 3.25198194277890E-0001 3.24613140130611E-0001 + 3.24028788106515E-0001 3.23445137784039E-0001 3.22862188741621E-0001 3.22279940557700E-0001 3.21698392810712E-0001 + 3.21117545079098E-0001 3.20537396941295E-0001 3.19957947975740E-0001 3.19379197760873E-0001 3.18801145875131E-0001 + 3.18223791896952E-0001 3.17647135404775E-0001 3.17071175977038E-0001 3.16495913192179E-0001 3.15921346628636E-0001 + 3.15347475864846E-0001 3.14774300479250E-0001 3.14201820050284E-0001 3.13630034156387E-0001 3.13058942375996E-0001 + 3.12488544287551E-0001 3.11918839469488E-0001 3.11349827500247E-0001 3.10781507958266E-0001 3.10213880421982E-0001 + 3.09646944469834E-0001 3.09080699680260E-0001 3.08515145631698E-0001 3.07950281902586E-0001 3.07386108071363E-0001 + 3.06822623716466E-0001 3.06259828416334E-0001 3.05697721749405E-0001 3.05136303294117E-0001 3.04575572628908E-0001 + 3.04015529332217E-0001 3.03456172982481E-0001 3.02897503158138E-0001 3.02339519437628E-0001 3.01782221399387E-0001 + 3.01225608621855E-0001 3.00669680683469E-0001 3.00114437162668E-0001 2.99559877637888E-0001 2.99006001687570E-0001 + 2.98452808890151E-0001 2.97900298824069E-0001 2.97348471067762E-0001 2.96797325199668E-0001 2.96246860798226E-0001 + 2.95697077441874E-0001 2.95147974709049E-0001 2.94599552178191E-0001 2.94051809427736E-0001 2.93504746036124E-0001 + 2.92958361581793E-0001 2.92412655643180E-0001 2.91867627798724E-0001 2.91323277626863E-0001 2.90779604706034E-0001 + 2.90236608614678E-0001 2.89694288931231E-0001 2.89152645234131E-0001 2.88611677101817E-0001 2.88071384112727E-0001 + 2.87531765845298E-0001 2.86992821877971E-0001 2.86454551789181E-0001 2.85916955157368E-0001 2.85380031560970E-0001 + 2.84843780578424E-0001 2.84308201788169E-0001 2.83773294768644E-0001 2.83239059098286E-0001 2.82705494355533E-0001 + 2.82172600118824E-0001 2.81640375966597E-0001 2.81108821477289E-0001 2.80577936229340E-0001 2.80047719801187E-0001 + 2.79518171771269E-0001 2.78989291718022E-0001 2.78461079219887E-0001 2.77933533855300E-0001 2.77406655202701E-0001 + 2.76880442840526E-0001 2.76354896347215E-0001 2.75830015301205E-0001 2.75305799280935E-0001 2.74782247864843E-0001 + 2.74259360631367E-0001 2.73737137158945E-0001 2.73215577026015E-0001 2.72694679811015E-0001 2.72174445092385E-0001 + 2.71654872448561E-0001 2.71135961457981E-0001 2.70617711699085E-0001 2.70100122750310E-0001 2.69583194190094E-0001 + 2.69066925596876E-0001 2.68551316549094E-0001 2.68036366625185E-0001 2.67522075403588E-0001 2.67008442462742E-0001 + 2.66495467381083E-0001 2.65983149737052E-0001 2.65471489109084E-0001 2.64960485075620E-0001 2.64450137215096E-0001 + 2.63940445105952E-0001 2.63431408326625E-0001 2.62923026455553E-0001 2.62415299071175E-0001 2.61908225751928E-0001 + 2.61401806076251E-0001 2.60896039622582E-0001 2.60390925969360E-0001 2.59886464695021E-0001 2.59382655378006E-0001 + 2.58879497596750E-0001 2.58376990929694E-0001 2.57875134955275E-0001 2.57373929251930E-0001 2.56873373398099E-0001 + 2.56373466972220E-0001 2.55874209552729E-0001 2.55375600718067E-0001 2.54877640046671E-0001 2.54380327116978E-0001 + 2.53883661507428E-0001 2.53387642796458E-0001 2.52892270562506E-0001 2.52397544384012E-0001 2.51903463839412E-0001 + 2.51410028507145E-0001 2.50917237965649E-0001 2.50425091793363E-0001 2.49933589568724E-0001 2.49442730870170E-0001 + 2.48952515276141E-0001 2.48462942365073E-0001 2.47974011715405E-0001 2.47485722905575E-0001 2.46998075514022E-0001 + 2.46511069119184E-0001 2.46024703299498E-0001 2.45538977633403E-0001 2.45053891699337E-0001 2.44569445075738E-0001 + 2.44085637341044E-0001 2.43602468073694E-0001 2.43119936852126E-0001 2.42638043254777E-0001 2.42156786860086E-0001 + 2.41676167246492E-0001 2.41196183992432E-0001 2.40716836676344E-0001 2.40238124876666E-0001 2.39760048171837E-0001 + 2.39282606140296E-0001 2.38805798360479E-0001 2.38329624410826E-0001 2.37854083869773E-0001 2.37379176315760E-0001 + 2.36904901327225E-0001 2.36431258482606E-0001 2.35958247360341E-0001 2.35485867538868E-0001 2.35014118596625E-0001 + 2.34543000112051E-0001 2.34072511663583E-0001 2.33602652829660E-0001 2.33133423188720E-0001 2.32664822319201E-0001 + 2.32196849799541E-0001 2.31729505208178E-0001 2.31262788123552E-0001 2.30796698124098E-0001 2.30331234788257E-0001 + 2.29866397694466E-0001 2.29402186421162E-0001 2.28938600546785E-0001 2.28475639649773E-0001 2.28013303308563E-0001 + 2.27551591101594E-0001 2.27090502607304E-0001 2.26630037404131E-0001 2.26170195070513E-0001 2.25710975184889E-0001 + 2.25252377325697E-0001 2.24794401071374E-0001 2.24337046000358E-0001 2.23880311691089E-0001 2.23424197722004E-0001 + 2.22968703671542E-0001 2.22513829118140E-0001 2.22059573640236E-0001 2.21605936816269E-0001 2.21152918224678E-0001 + 2.20700517443899E-0001 2.20248734052372E-0001 2.19797567628535E-0001 2.19347017750824E-0001 2.18897083997680E-0001 + 2.18447765947539E-0001 2.17999063178841E-0001 2.17550975270023E-0001 2.17103501799523E-0001 2.16656642345779E-0001 + 2.16210396487231E-0001 2.15764763802315E-0001 2.15319743869470E-0001 2.14875336267135E-0001 2.14431540573746E-0001 + 2.13988356367743E-0001 2.13545783227564E-0001 2.13103820731647E-0001 2.12662468458429E-0001 2.12221725986350E-0001 + 2.11781592893846E-0001 2.11342068759358E-0001 2.10903153161322E-0001 2.10464845678176E-0001 2.10027145888360E-0001 + 2.09590053370310E-0001 2.09153567702466E-0001 2.08717688463265E-0001 2.08282415231145E-0001 2.07847747584545E-0001 + 2.07413685101903E-0001 2.06980227361657E-0001 2.06547373942245E-0001 2.06115124422105E-0001 2.05683478379676E-0001 + 2.05252435393396E-0001 2.04821995041701E-0001 2.04392156903032E-0001 2.03962920555826E-0001 2.03534285578522E-0001 + 2.03106251549557E-0001 2.02678818047368E-0001 2.02251984650396E-0001 2.01825750937078E-0001 2.01400116485852E-0001 + 2.00975080875156E-0001 2.00550643683428E-0001 2.00126804489106E-0001 1.99703562870630E-0001 1.99280918406436E-0001 + 1.98858870674963E-0001 1.98437419254649E-0001 1.98016563723932E-0001 1.97596303661251E-0001 1.97176638645043E-0001 + 1.96757568253747E-0001 1.96339092065801E-0001 1.95921209659643E-0001 1.95503920613711E-0001 1.95087224506443E-0001 + 1.94671120916278E-0001 1.94255609421654E-0001 1.93840689601008E-0001 1.93426361032779E-0001 1.93012623295406E-0001 + 1.92599475967326E-0001 1.92186918626977E-0001 1.91774950852798E-0001 1.91363572223226E-0001 1.90952782316701E-0001 + 1.90542580711659E-0001 1.90132966986540E-0001 1.89723940719781E-0001 1.89315501489821E-0001 1.88907648875097E-0001 + 1.88500382454048E-0001 1.88093701805112E-0001 1.87687606506727E-0001 1.87282096137332E-0001 1.86877170275364E-0001 + 1.86472828499262E-0001 1.86069070387463E-0001 1.85665895518406E-0001 1.85263303470530E-0001 1.84861293822272E-0001 + 1.84459866152070E-0001 1.84059020038362E-0001 1.83658755059588E-0001 1.83259070794184E-0001 1.82859966820589E-0001 + 1.82461442717242E-0001 1.82063498062579E-0001 1.81666132435041E-0001 1.81269345413064E-0001 1.80873136575087E-0001 + 1.80477505499547E-0001 1.80082451764884E-0001 1.79687974949535E-0001 1.79294074631939E-0001 1.78900750390533E-0001 + 1.78508001803756E-0001 1.78115828450046E-0001 1.77724229907840E-0001 1.77333205755578E-0001 1.76942755571698E-0001 + 1.76552878934637E-0001 1.76163575422834E-0001 1.75774844614726E-0001 1.75386686088752E-0001 1.74999099423351E-0001 + 1.74612084196960E-0001 1.74225639988017E-0001 1.73839766374961E-0001 1.73454462936230E-0001 1.73069729250262E-0001 + 1.72685564895494E-0001 1.72301969450366E-0001 1.71918942493316E-0001 1.71536483602781E-0001 1.71154592357199E-0001 + 1.70773268335010E-0001 1.70392511114651E-0001 1.70012320274559E-0001 1.69632695393175E-0001 1.69253636048934E-0001 + 1.68875141820276E-0001 1.68497212285639E-0001 1.68119847023461E-0001 1.67743045612181E-0001 1.67366807630235E-0001 + 1.66991132656063E-0001 1.66616020268102E-0001 1.66241470044791E-0001 1.65867481564568E-0001 1.65494054405872E-0001 + 1.65121188147139E-0001 1.64748882366808E-0001 1.64377136643319E-0001 1.64005950555107E-0001 1.63635323680613E-0001 + 1.63265255598274E-0001 1.62895745886528E-0001 1.62526794123813E-0001 1.62158399888568E-0001 1.61790562759230E-0001 + 1.61423282314238E-0001 1.61056558132030E-0001 1.60690389791044E-0001 1.60324776869718E-0001 1.59959718946491E-0001 + 1.59595215599800E-0001 1.59231266408084E-0001 1.58867870949780E-0001 1.58505028803328E-0001 1.58142739547165E-0001 + 1.57781002759730E-0001 1.57419818019459E-0001 1.57059184904793E-0001 1.56699102994168E-0001 1.56339571866023E-0001 + 1.55980591098797E-0001 1.55622160270926E-0001 1.55264278960850E-0001 1.54906946747007E-0001 1.54550163207834E-0001 + 1.54193927921770E-0001 1.53838240467254E-0001 1.53483100422722E-0001 1.53128507366614E-0001 1.52774460877367E-0001 + 1.52420960533420E-0001 1.52068005913211E-0001 1.51715596595178E-0001 1.51363732157759E-0001 1.51012412179392E-0001 + 1.50661636238516E-0001 1.50311403913569E-0001 1.49961714782988E-0001 1.49612568425212E-0001 1.49263964418679E-0001 + 1.48915902341828E-0001 1.48568381773095E-0001 1.48221402290921E-0001 1.47874963473742E-0001 1.47529064899997E-0001 + 1.47183706148124E-0001 1.46838886796561E-0001 1.46494606423746E-0001 1.46150864608118E-0001 1.45807660928115E-0001 + 1.45464994962174E-0001 1.45122866288734E-0001 1.44781274486234E-0001 1.44440219133111E-0001 1.44099699807803E-0001 + 1.43759716088749E-0001 1.43420267554386E-0001 1.43081353783153E-0001 1.42742974353489E-0001 1.42405128843830E-0001 + 1.42067816832616E-0001 1.41731037898285E-0001 1.41394791619274E-0001 1.41059077574022E-0001 1.40723895340967E-0001 + 1.40389244498547E-0001 1.40055124625200E-0001 1.39721535299365E-0001 1.39388476099480E-0001 1.39055946603982E-0001 + 1.38723946391310E-0001 1.38392475039902E-0001 1.38061532128197E-0001 1.37731117234631E-0001 1.37401229937645E-0001 + 1.37071869815675E-0001 1.36743036447160E-0001 1.36414729410538E-0001 1.36086948284247E-0001 1.35759692646726E-0001 + 1.35432962076412E-0001 1.35106756151743E-0001 1.34781074451159E-0001 1.34455916553096E-0001 1.34131282035994E-0001 + 1.33807170478289E-0001 1.33483581458422E-0001 1.33160514554828E-0001 1.32837969345948E-0001 1.32515945410218E-0001 + 1.32194442326078E-0001 1.31873459671964E-0001 1.31552997026316E-0001 1.31233053967572E-0001 1.30913630074169E-0001 + 1.30594724924546E-0001 1.30276338097141E-0001 1.29958469170392E-0001 1.29641117722737E-0001 1.29324283332615E-0001 + 1.29007965578464E-0001 1.28692164038721E-0001 1.28376878291825E-0001 1.28062107916214E-0001 1.27747852490327E-0001 + 1.27434111592601E-0001 1.27120884801474E-0001 1.26808171695385E-0001 1.26495971852772E-0001 1.26184284852073E-0001 + 1.25873110271726E-0001 1.25562447690170E-0001 1.25252296685842E-0001 1.24942656837180E-0001 1.24633527722623E-0001 + 1.24324908920610E-0001 1.24016800009577E-0001 1.23709200567964E-0001 1.23402110174208E-0001 1.23095528406748E-0001 + 1.22789454844021E-0001 1.22483889064466E-0001 1.22178830646522E-0001 1.21874279168625E-0001 1.21570234209215E-0001 + 1.21266695346730E-0001 1.20963662159607E-0001 1.20661134226284E-0001 1.20359111125201E-0001 1.20057592434795E-0001 + 1.19756577733505E-0001 1.19456066599768E-0001 1.19156058612022E-0001 1.18856553348706E-0001 1.18557550388258E-0001 + 1.18259049309116E-0001 1.17961049689719E-0001 1.17663551108504E-0001 1.17366553143909E-0001 1.17070055374373E-0001 + 1.16774057378334E-0001 1.16478558734230E-0001 1.16183559020499E-0001 1.15889057815579E-0001 1.15595054697909E-0001 + 1.15301549245926E-0001 1.15008541038070E-0001 1.14716029652777E-0001 1.14424014668486E-0001 1.14132495663636E-0001 + 1.13841472216664E-0001 1.13550943906008E-0001 1.13260910310108E-0001 1.12971371007400E-0001 1.12682325576323E-0001 + 1.12393773595315E-0001 1.12105714642815E-0001 1.11818148297260E-0001 1.11531074137089E-0001 1.11244491740740E-0001 + 1.10958400686651E-0001 1.10672800553260E-0001 1.10387690919005E-0001 1.10103071362325E-0001 1.09818941461657E-0001 + 1.09535300795440E-0001 1.09252148942112E-0001 1.08969485480111E-0001 1.08687309987875E-0001 1.08405622043843E-0001 + 1.08124421226452E-0001 1.07843707114140E-0001 1.07563479285347E-0001 1.07283737318510E-0001 1.07004480792067E-0001 + 1.06725709284456E-0001 1.06447422374116E-0001 1.06169619639484E-0001 1.05892300658999E-0001 1.05615465011099E-0001 + 1.05339112274222E-0001 1.05063242026806E-0001 1.04787853847290E-0001 1.04512947314112E-0001 1.04238522005709E-0001 + 1.03964577500520E-0001 1.03691113376983E-0001 1.03418129213536E-0001 1.03145624588617E-0001 1.02873599080665E-0001 + 1.02602052268118E-0001 1.02330983729414E-0001 1.02060393042990E-0001 1.01790279787286E-0001 1.01520643540739E-0001 + 1.01251483881787E-0001 1.00982800388869E-0001 1.00714592640423E-0001 1.00446860214887E-0001 1.00179602690698E-0001 + 9.99128196462967E-0002 9.96465106601191E-0002 9.93806753106040E-0002 9.91153131761896E-0002 9.88504238353139E-0002 + 9.85860068664153E-0002 9.83220618479319E-0002 9.80585883583019E-0002 9.77955859759633E-0002 9.75330542793543E-0002 + 9.72709928469130E-0002 9.70094012570777E-0002 9.67482790882866E-0002 9.64876259189777E-0002 9.62274413275893E-0002 + 9.59677248925592E-0002 9.57084761923260E-0002 9.54496948053277E-0002 9.51913803100025E-0002 9.49335322847884E-0002 + 9.46761503081237E-0002 9.44192339584463E-0002 9.41627828141947E-0002 9.39067964538070E-0002 9.36512744557213E-0002 + 9.33962163983756E-0002 9.31416218602081E-0002 9.28874904196572E-0002 9.26338216551609E-0002 9.23806151451574E-0002 + 9.21278704680847E-0002 9.18755872023812E-0002 9.16237649264846E-0002 9.13724032188336E-0002 9.11215016578662E-0002 + 9.08710598220205E-0002 9.06210772897346E-0002 9.03715536394465E-0002 9.01224884495948E-0002 8.98738812986173E-0002 + 8.96257317649524E-0002 8.93780394270381E-0002 8.91308038633126E-0002 8.88840246522138E-0002 8.86377013721803E-0002 + 8.83918336016500E-0002 8.81464209190612E-0002 8.79014629028519E-0002 8.76569591314602E-0002 8.74129091833245E-0002 + 8.71693126368829E-0002 8.69261690705735E-0002 8.66834780628344E-0002 8.64412391921038E-0002 8.61994520368196E-0002 + 8.59581161754205E-0002 8.57172311863444E-0002 8.54767966480293E-0002 8.52368121389136E-0002 8.49972772374353E-0002 + 8.47581915220324E-0002 8.45195545711434E-0002 8.42813659632064E-0002 8.40436252766594E-0002 8.38063320899407E-0002 + 8.35694859814881E-0002 8.33330865297402E-0002 8.30971333131351E-0002 8.28616259101107E-0002 8.26265638991054E-0002 + 8.23919468585573E-0002 8.21577743669042E-0002 8.19240460025848E-0002 8.16907613440371E-0002 8.14579199696991E-0002 + 8.12255214580091E-0002 8.09935653874050E-0002 8.07620513363253E-0002 8.05309788832080E-0002 8.03003476064913E-0002 + 8.00701570846133E-0002 7.98404068960121E-0002 7.96110966191259E-0002 7.93822258323930E-0002 7.91537941142514E-0002 + 7.89258010431393E-0002 7.86982461974949E-0002 7.84711291557561E-0002 7.82444494963615E-0002 7.80182067977490E-0002 + 7.77924006383568E-0002 7.75670305966230E-0002 7.73420962509858E-0002 7.71175971798832E-0002 7.68935329617536E-0002 + 7.66699031750352E-0002 7.64467073981659E-0002 7.62239452095840E-0002 7.60016161877275E-0002 7.57797199110348E-0002 + 7.55582559579440E-0002 7.53372239068931E-0002 7.51166233363205E-0002 7.48964538246641E-0002 7.46767149503620E-0002 + 7.44574062918528E-0002 7.42385274275743E-0002 7.40200779359647E-0002 7.38020573954622E-0002 7.35844653845048E-0002 + 7.33673014815310E-0002 7.31505652649788E-0002 7.29342563132862E-0002 7.27183742048916E-0002 7.25029185182329E-0002 + 7.22878888317483E-0002 7.20732847238762E-0002 7.18591057730546E-0002 7.16453515577216E-0002 7.14320216563154E-0002 + 7.12191156472741E-0002 7.10066331090360E-0002 7.07945736200392E-0002 7.05829367587219E-0002 7.03717221035221E-0002 + 7.01609292328781E-0002 6.99505577252278E-0002 6.97406071590098E-0002 6.95310771126619E-0002 6.93219671646225E-0002 + 6.91132768933295E-0002 6.89050058772211E-0002 6.86971536947357E-0002 6.84897199243113E-0002 6.82827041443860E-0002 + 6.80761059333980E-0002 6.78699248697855E-0002 6.76641605319865E-0002 6.74588124984394E-0002 6.72538803475822E-0002 + 6.70493636578531E-0002 6.68452620076903E-0002 6.66415749755317E-0002 6.64383021398158E-0002 6.62354430789807E-0002 + 6.60329973714644E-0002 6.58309645957051E-0002 6.56293443301411E-0002 6.54281361532101E-0002 6.52273396433509E-0002 + 6.50269543790013E-0002 6.48269799385995E-0002 6.46274159005837E-0002 6.44282618433918E-0002 6.42295173454624E-0002 + 6.40311819852334E-0002 6.38332553411430E-0002 6.36357369916293E-0002 6.34386265151305E-0002 6.32419234900847E-0002 + 6.30456274949302E-0002 6.28497381081050E-0002 6.26542549080474E-0002 6.24591774731955E-0002 6.22645053819873E-0002 + 6.20702382128612E-0002 6.18763755442552E-0002 6.16829169546076E-0002 6.14898620223564E-0002 6.12972103259399E-0002 + 6.11049614437959E-0002 6.09131149543631E-0002 6.07216704360793E-0002 6.05306274673828E-0002 6.03399856267116E-0002 + 6.01497444925039E-0002 5.99599036431981E-0002 5.97704626572321E-0002 5.95814211130441E-0002 5.93927785890723E-0002 + 5.92045346637548E-0002 5.90166889155297E-0002 5.88292409228354E-0002 5.86421902641099E-0002 5.84555365177914E-0002 + 5.82692792623179E-0002 5.80834180761276E-0002 5.78979525376589E-0002 5.77128822253498E-0002 5.75282067176384E-0002 + 5.73439255929629E-0002 5.71600384297614E-0002 5.69765448064720E-0002 5.67934443015331E-0002 5.66107364933828E-0002 + 5.64284209604591E-0002 5.62464972812003E-0002 5.60649650340443E-0002 5.58838237974296E-0002 5.57030731497942E-0002 + 5.55227126695763E-0002 5.53427419352139E-0002 5.51631605251454E-0002 5.49839680178086E-0002 5.48051639916421E-0002 + 5.46267480250838E-0002 5.44487196965719E-0002 5.42710785845445E-0002 5.40938242674397E-0002 5.39169563236960E-0002 + 5.37404743317512E-0002 5.35643778700436E-0002 5.33886665170114E-0002 5.32133398510926E-0002 5.30383974507254E-0002 + 5.28638388943481E-0002 5.26896637603987E-0002 5.25158716273155E-0002 5.23424620735365E-0002 5.21694346774998E-0002 + 5.19967890176439E-0002 5.18245246724067E-0002 5.16526412202264E-0002 5.14811382395411E-0002 5.13100153087890E-0002 + 5.11392720064082E-0002 5.09689079108370E-0002 5.07989226005135E-0002 5.06293156538758E-0002 5.04600866493621E-0002 + 5.02912351654105E-0002 5.01227607804592E-0002 4.99546630729465E-0002 4.97869416213103E-0002 4.96195960039889E-0002 + 4.94526257994204E-0002 4.92860305860429E-0002 4.91198099422947E-0002 4.89539634466140E-0002 4.87884906774388E-0002 + 4.86233912132073E-0002 4.84586646323575E-0002 4.82943105133279E-0002 4.81303284345564E-0002 4.79667179744813E-0002 + 4.78034787115407E-0002 4.76406102241727E-0002 4.74781120908154E-0002 4.73159838899071E-0002 4.71542251998860E-0002 + 4.69928355991902E-0002 4.68318146662577E-0002 4.66711619795268E-0002 4.65108771174357E-0002 4.63509596584224E-0002 + 4.61914091809253E-0002 4.60322252633823E-0002 4.58734074842317E-0002 4.57149554219115E-0002 4.55568686548601E-0002 + 4.53991467615155E-0002 4.52417893203159E-0002 4.50847959096994E-0002 4.49281661081042E-0002 4.47718994939685E-0002 + 4.46159956457304E-0002 4.44604541418280E-0002 4.43052745606996E-0002 4.41504564807833E-0002 4.39959994805171E-0002 + 4.38419031383394E-0002 4.36881670326882E-0002 4.35347907420018E-0002 4.33817738447182E-0002 4.32291159192755E-0002 + 4.30768165441121E-0002 4.29248752976661E-0002 4.27732917583755E-0002 4.26220655046785E-0002 4.24711961150134E-0002 + 4.23206831678180E-0002 4.21705262415310E-0002 4.20207249145901E-0002 4.18712787654337E-0002 4.17221873724999E-0002 + 4.15734503142267E-0002 4.14250671690525E-0002 4.12770375154154E-0002 4.11293609317534E-0002 4.09820369965048E-0002 + 4.08350652881078E-0002 4.06884453850002E-0002 4.05421768656207E-0002 4.03962593084071E-0002 4.02506922917976E-0002 + 4.01054753942304E-0002 3.99606081941437E-0002 3.98160902699755E-0002 3.96719212001642E-0002 3.95281005631478E-0002 + 3.93846279373644E-0002 3.92415029012523E-0002 3.90987250332495E-0002 3.89562939117943E-0002 3.88142091153249E-0002 + 3.86724702222793E-0002 3.85310768110956E-0002 3.83900284602122E-0002 3.82493247480670E-0002 3.81089652530984E-0002 + 3.79689495537444E-0002 3.78292772284432E-0002 3.76899478556330E-0002 3.75509610137517E-0002 3.74123162812378E-0002 + 3.72740132365294E-0002 3.71360514580645E-0002 3.69984305242814E-0002 3.68611500136181E-0002 3.67242095045128E-0002 + 3.65876085754038E-0002 3.64513468047291E-0002 3.63154237709270E-0002 3.61798390524355E-0002 3.60445922276927E-0002 + 3.59096828751371E-0002 3.57751105732065E-0002 3.56408749003393E-0002 3.55069754349735E-0002 3.53734117555473E-0002 + 3.52401834404988E-0002 3.51072900682663E-0002 3.49747312172878E-0002 3.48425064660016E-0002 3.47106153928458E-0002 + 3.45790575762584E-0002 3.44478325946779E-0002 3.43169400265421E-0002 3.41863794502894E-0002 3.40561504443579E-0002 + 3.39262525871857E-0002 3.37966854572108E-0002 3.36674486328717E-0002 3.35385416926064E-0002 3.34099642148530E-0002 + 3.32817157780498E-0002 3.31537959606347E-0002 3.30262043410461E-0002 3.28989404977221E-0002 3.27720040091008E-0002 + 3.26453944536204E-0002 3.25191114097191E-0002 3.23931544558348E-0002 3.22675231704060E-0002 3.21422171318707E-0002 + 3.20172359186671E-0002 3.18925791092332E-0002 3.17682462820073E-0002 3.16442370154276E-0002 3.15205508879322E-0002 + 3.13971874779593E-0002 3.12741463639469E-0002 3.11514271243333E-0002 3.10290293375565E-0002 3.09069525820549E-0002 + 3.07851964362665E-0002 3.06637604786295E-0002 3.05426442875821E-0002 3.04218474415622E-0002 3.03013695190083E-0002 + 3.01812100983584E-0002 3.00613687580507E-0002 2.99418450765233E-0002 2.98226386322143E-0002 2.97037490035619E-0002 + 2.95851757690044E-0002 2.94669185069798E-0002 2.93489767959264E-0002 2.92313502142822E-0002 2.91140383404853E-0002 + 2.89970407529740E-0002 2.88803570301865E-0002 2.87639867505609E-0002 2.86479294925353E-0002 2.85321848345479E-0002 + 2.84167523550368E-0002 2.83016316324403E-0002 2.81868222451964E-0002 2.80723237717434E-0002 2.79581357905193E-0002 + 2.78442578799623E-0002 2.77306896185106E-0002 2.76174305846024E-0002 2.75044803566758E-0002 2.73918385131690E-0002 + 2.72795046325200E-0002 2.71674782931671E-0002 2.70557590735484E-0002 2.69443465521022E-0002 2.68332403072665E-0002 + 2.67224399174794E-0002 2.66119449611792E-0002 2.65017550168040E-0002 2.63918696627920E-0002 2.62822884775813E-0002 + 2.61730110396101E-0002 2.60640369273165E-0002 2.59553657191386E-0002 2.58469969935147E-0002 2.57389303288830E-0002 + 2.56311653036815E-0002 2.55237014963484E-0002 2.54165384853218E-0002 2.53096758490400E-0002 2.52031131659410E-0002 + 2.50968500144632E-0002 2.49908859730445E-0002 2.48852206201231E-0002 2.47798535341372E-0002 2.46747842935250E-0002 + 2.45700124767247E-0002 2.44655376621743E-0002 2.43613594283120E-0002 2.42574773535759E-0002 2.41538910164044E-0002 + 2.40505999952355E-0002 2.39476038685073E-0002 2.38449022146580E-0002 2.37424946121258E-0002 2.36403806393488E-0002 + 2.35385598747652E-0002 2.34370318968131E-0002 2.33357962839307E-0002 2.32348526145562E-0002 2.31342004671276E-0002 + 2.30338394200832E-0002 2.29337690518612E-0002 2.28339889408996E-0002 2.27344986656366E-0002 2.26352978045105E-0002 + 2.25363859359591E-0002 2.24377626384210E-0002 2.23394274903341E-0002 2.22413800701367E-0002 2.21436199562668E-0002 + 2.20461467271625E-0002 2.19489599612622E-0002 2.18520592370039E-0002 2.17554441328259E-0002 2.16591142271661E-0002 + 2.15630690984629E-0002 2.14673083251542E-0002 2.13718314856785E-0002 2.12766381584737E-0002 2.11817279219780E-0002 + 2.10871003546296E-0002 2.09927550348666E-0002 2.08986915411273E-0002 2.08049094518497E-0002 2.07114083454720E-0002 + 2.06181878004324E-0002 2.05252473951690E-0002 2.04325867081199E-0002 2.03402053177234E-0002 2.02481028024176E-0002 + 2.01562787406406E-0002 2.00647327108306E-0002 1.99734642914258E-0002 1.98824730608643E-0002 1.97917585975843E-0002 + 1.97013204800239E-0002 1.96111582866212E-0002 1.95212715958146E-0002 1.94316599860419E-0002 1.93423230357416E-0002 + 1.92532603233517E-0002 1.91644714273103E-0002 1.90759559260557E-0002 1.89877133980258E-0002 1.88997434216591E-0002 + 1.88120455753935E-0002 1.87246194376673E-0002 1.86374645869186E-0002 1.85505806015856E-0002 1.84639670601062E-0002 + 1.83776235409190E-0002 1.82915496224618E-0002 1.82057448831730E-0002 1.81202089014905E-0002 1.80349412558526E-0002 + 1.79499415246975E-0002 1.78652092864633E-0002 1.77807441195882E-0002 1.76965456025103E-0002 1.76126133136678E-0002 + 1.75289468314987E-0002 1.74455457344414E-0002 1.73624096009339E-0002 1.72795380094145E-0002 1.71969305383211E-0002 + 1.71145867660921E-0002 1.70325062711655E-0002 1.69506886319796E-0002 1.68691334269725E-0002 1.67878402345822E-0002 + 1.67068086332471E-0002 1.66260382014052E-0002 1.65455285174947E-0002 1.64652791599538E-0002 1.63852897072207E-0002 + 1.63055597377333E-0002 1.62260888299300E-0002 1.61468765622489E-0002 1.60679225131281E-0002 1.59892262610059E-0002 + 1.59107873843203E-0002 1.58326054615094E-0002 1.57546800710116E-0002 1.56770107912648E-0002 1.55995972007074E-0002 + 1.55224388777774E-0002 1.54455354009129E-0002 1.53688863485522E-0002 1.52924912991335E-0002 1.52163498310948E-0002 + 1.51404615228743E-0002 1.50648259529101E-0002 1.49894426996406E-0002 1.49143113415036E-0002 1.48394314569375E-0002 + 1.47648026243805E-0002 1.46904244222705E-0002 1.46162964290459E-0002 1.45424182231448E-0002 1.44687893830052E-0002 + 1.43954094870654E-0002 1.43222781137636E-0002 1.42493948415379E-0002 1.41767592488264E-0002 1.41043709140673E-0002 + 1.40322294156987E-0002 1.39603343321589E-0002 1.38886852418860E-0002 1.38172817233181E-0002 1.37461233548933E-0002 + 1.36752097150499E-0002 1.36045403822260E-0002 1.35341149348597E-0002 1.34639329513893E-0002 1.33939940102528E-0002 + 1.33242976898884E-0002 1.32548435687343E-0002 1.31856312252287E-0002 1.31166602378096E-0002 1.30479301849153E-0002 + 1.29794406449839E-0002 1.29111911964534E-0002 1.28431814177623E-0002 1.27754108873485E-0002 1.27078791836502E-0002 + 1.26405858851057E-0002 1.25735305701529E-0002 1.25067128172301E-0002 1.24401322047755E-0002 1.23737883112272E-0002 + 1.23076807150234E-0002 1.22418089946022E-0002 1.21761727284017E-0002 1.21107714948602E-0002 1.20456048724158E-0002 + 1.19806724395066E-0002 1.19159737745708E-0002 1.18515084560465E-0002 1.17872760623720E-0002 1.17232761719854E-0002 + 1.16595083633247E-0002 1.15959722148283E-0002 1.15326673049342E-0002 1.14695932120805E-0002 1.14067495147055E-0002 + 1.13441357912474E-0002 1.12817516201442E-0002 1.12195965798341E-0002 1.11576702487552E-0002 1.10959722053458E-0002 + 1.10345020280440E-0002 1.09732592952880E-0002 1.09122435855158E-0002 1.08514544771657E-0002 1.07908915486758E-0002 + 1.07305543784842E-0002 1.06704425450292E-0002 1.06105556267489E-0002 1.05508932020814E-0002 1.04914548494648E-0002 + 1.04322401473375E-0002 1.03732486741374E-0002 1.03144800083028E-0002 1.02559337282719E-0002 1.01976094124826E-0002 + 1.01395066393733E-0002 1.00816249873821E-0002 1.00239640349472E-0002 9.96652336050664E-0003 9.90930254249863E-0003 + 9.85230115936129E-0003 9.79551878953285E-0003 9.73895501145143E-0003 9.68260940355520E-0003 9.62648154428229E-0003 + 9.57057101207088E-0003 9.51487738535906E-0003 9.45940024258509E-0003 9.40413916218709E-0003 9.34909372260319E-0003 + 9.29426350227157E-0003 9.23964807963032E-0003 9.18524703311771E-0003 9.13105994117183E-0003 9.07708638223085E-0003 + 9.02332593473292E-0003 8.96977817711619E-0003 8.91644268781879E-0003 8.86331904527895E-0003 8.81040682793478E-0003 + 8.75770561422445E-0003 8.70521498258611E-0003 8.65293451145786E-0003 8.60086377927796E-0003 8.54900236448452E-0003 + 8.49734984551569E-0003 8.44590580080963E-0003 8.39466980880449E-0003 8.34364144793840E-0003 8.29282029664958E-0003 + 8.24220593337616E-0003 8.19179793655628E-0003 8.14159588462812E-0003 8.09159935602977E-0003 8.04180792919948E-0003 + 7.99222118257537E-0003 7.94283869459559E-0003 7.89366004369830E-0003 7.84468480832165E-0003 7.79591256690375E-0003 + 7.74734289788286E-0003 7.69897537969707E-0003 7.65080959078455E-0003 7.60284510958346E-0003 7.55508151453191E-0003 + 7.50751838406813E-0003 7.46015529663025E-0003 7.41299183065642E-0003 7.36602756458478E-0003 7.31926207685351E-0003 + 7.27269494590072E-0003 7.22632575016464E-0003 7.18015406808339E-0003 7.13417947809513E-0003 7.08840155863801E-0003 + 7.04281988815015E-0003 6.99743404506977E-0003 6.95224360783502E-0003 6.90724815488402E-0003 6.86244726465495E-0003 + 6.81784051558596E-0003 6.77342748611517E-0003 6.72920775468080E-0003 6.68518089972098E-0003 6.64134649967387E-0003 + 6.59770413297761E-0003 6.55425337807034E-0003 6.51099381339027E-0003 6.46792501737553E-0003 6.42504656846428E-0003 + 6.38235804509467E-0003 6.33985902570485E-0003 6.29754908873295E-0003 6.25542781261719E-0003 6.21349477579570E-0003 + 6.17174955670664E-0003 6.13019173378814E-0003 6.08882088547835E-0003 6.04763659021549E-0003 6.00663842643767E-0003 + 5.96582597258305E-0003 5.92519880708979E-0003 5.88475650839604E-0003 5.84449865493993E-0003 5.80442482515969E-0003 + 5.76453459749342E-0003 5.72482755037930E-0003 5.68530326225546E-0003 5.64596131156005E-0003 5.60680127673128E-0003 + 5.56782273620728E-0003 5.52902526842619E-0003 5.49040845182618E-0003 5.45197186484540E-0003 5.41371508592198E-0003 + 5.37563769349414E-0003 5.33773926600000E-0003 5.30001938187771E-0003 5.26247761956544E-0003 5.22511355750130E-0003 + 5.18792677412353E-0003 5.15091684787023E-0003 5.11408335717957E-0003 5.07742588048971E-0003 5.04094399623880E-0003 + 5.00463728286496E-0003 4.96850531880642E-0003 4.93254768250129E-0003 4.89676395238774E-0003 4.86115370690393E-0003 + 4.82571652448797E-0003 4.79045198357808E-0003 4.75535966261239E-0003 4.72043914002906E-0003 4.68568999426624E-0003 + 4.65111180376209E-0003 4.61670414695473E-0003 4.58246660228239E-0003 4.54839874818318E-0003 4.51450016309526E-0003 + 4.48077042545679E-0003 4.44720911370590E-0003 4.41381580628080E-0003 4.38059008161962E-0003 4.34753151816051E-0003 + 4.31463969434163E-0003 4.28191418860114E-0003 4.24935457937716E-0003 4.21696044510791E-0003 4.18473136423151E-0003 + 4.15266691518612E-0003 4.12076667640990E-0003 4.08903022634098E-0003 4.05745714341756E-0003 4.02604700607778E-0003 + 3.99479939275979E-0003 3.96371388190175E-0003 3.93279005194181E-0003 3.90202748131810E-0003 3.87142574846884E-0003 + 3.84098443183215E-0003 3.81070310984619E-0003 3.78058136094912E-0003 3.75061876357906E-0003 3.72081489617424E-0003 + 3.69116933717274E-0003 3.66168166501274E-0003 3.63235145813245E-0003 3.60317829496994E-0003 3.57416175396346E-0003 + 3.54530141355106E-0003 3.51659685217100E-0003 3.48804764826134E-0003 3.45965338026028E-0003 3.43141362660603E-0003 + 3.40332796573664E-0003 3.37539597609037E-0003 3.34761723610529E-0003 3.31999132421959E-0003 3.29251781887147E-0003 + 3.26519629849901E-0003 3.23802634154044E-0003 3.21100752643383E-0003 3.18413943161739E-0003 3.15742163552932E-0003 + 3.13085371660768E-0003 3.10443525329071E-0003 3.07816582401649E-0003 3.05204500722322E-0003 3.02607238134909E-0003 + 3.00024752483217E-0003 2.97457001611071E-0003 2.94903943362278E-0003 2.92365535580662E-0003 2.89841736110030E-0003 + 2.87332502794201E-0003 2.84837793476996E-0003 2.82357566002223E-0003 2.79891778213704E-0003 2.77440387955247E-0003 + 2.75003353070672E-0003 2.72580631403799E-0003 2.70172180798435E-0003 2.67777959098404E-0003 2.65397924147513E-0003 + 2.63032033789582E-0003 2.60680245868431E-0003 2.58342518227867E-0003 2.56018808711714E-0003 2.53709075163779E-0003 + 2.51413275427883E-0003 2.49131367347844E-0003 2.46863308767471E-0003 2.44609057530586E-0003 2.42368571480998E-0003 + 2.40141808462530E-0003 2.37928726318991E-0003 2.35729282894198E-0003 2.33543436031973E-0003 2.31371143576122E-0003 + 2.29212363370470E-0003 2.27067053258823E-0003 2.24935171085003E-0003 2.22816674692826E-0003 2.20711521926104E-0003 + 2.18619670628656E-0003 2.16541078644294E-0003 2.14475703816835E-0003 2.12423503990099E-0003 2.10384437007894E-0003 + 2.08358460714043E-0003 2.06345532952354E-0003 2.04345611566648E-0003 2.02358654400742E-0003 2.00384619298445E-0003 + 1.98423464103581E-0003 1.96475146659957E-0003 1.94539624811396E-0003 1.92616856401708E-0003 1.90706799274710E-0003 + 1.88809411274223E-0003 1.86924650244054E-0003 1.85052474028027E-0003 1.83192840469949E-0003 1.81345707413641E-0003 + 1.79511032702921E-0003 1.77688774181598E-0003 1.75878889693493E-0003 1.74081337082418E-0003 1.72296074192189E-0003 + 1.70523058866627E-0003 1.68762248949540E-0003 1.67013602284749E-0003 1.65277076716066E-0003 1.63552630087308E-0003 + 1.61840220242293E-0003 1.60139805024832E-0003 1.58451342278746E-0003 1.56774789847845E-0003 1.55110105575950E-0003 + 1.53457247306871E-0003 1.51816172884427E-0003 1.50186840152436E-0003 1.48569206954708E-0003 1.46963231135064E-0003 + 1.45368870537315E-0003 1.43786083005278E-0003 1.42214826382772E-0003 1.40655058513607E-0003 1.39106737241605E-0003 + 1.37569820410575E-0003 1.36044265864336E-0003 1.34530031446705E-0003 1.33027075001494E-0003 1.31535354372524E-0003 + 1.30054827403604E-0003 1.28585451938552E-0003 1.27127185821188E-0003 1.25679986895322E-0003 1.24243813004773E-0003 + 1.22818621993353E-0003 1.21404371704883E-0003 1.20001019983173E-0003 1.18608524672041E-0003 1.17226843615305E-0003 + 1.15855934656776E-0003 1.14495755640275E-0003 1.13146264409612E-0003 1.11807418808605E-0003 1.10479176681072E-0003 + 1.09161495870824E-0003 1.07854334221682E-0003 1.06557649577456E-0003 1.05271399781965E-0003 1.03995542679026E-0003 + 1.02730036112450E-0003 1.01474837926057E-0003 1.00229905963659E-0003 9.89951980690744E-0004 9.77706720861190E-0004 + 9.65562858586053E-0004 9.53519972303528E-0004 9.41577640451732E-0004 9.29735441468861E-0004 9.17992953793031E-0004 + 9.06349755862419E-0004 8.94805426115199E-0004 8.83359542989491E-0004 8.72011684923486E-0004 8.60761430355305E-0004 + 8.49608357723123E-0004 8.38552045465113E-0004 8.27592072019395E-0004 8.16728015824163E-0004 8.05959455317535E-0004 + 7.95285968937686E-0004 7.84707135122790E-0004 7.74222532310968E-0004 7.63831738940411E-0004 7.53534333449240E-0004 + 7.43329894275646E-0004 7.33217999857751E-0004 7.23198228633729E-0004 7.13270159041752E-0004 7.03433369519943E-0004 + 6.93687438506491E-0004 6.84031944439519E-0004 6.74466465757201E-0004 6.64990580897708E-0004 6.55603868299164E-0004 + 6.46305906399758E-0004 6.37096273637614E-0004 6.27974548450904E-0004 6.18940309277800E-0004 6.09993134556427E-0004 + 6.01132602724970E-0004 5.92358292221558E-0004 5.83669781484361E-0004 5.75066648951549E-0004 5.66548473061250E-0004 + 5.58114832251649E-0004 5.49765304960872E-0004 5.41499469627106E-0004 5.33316904688477E-0004 5.25217188583157E-0004 + 5.17199899749314E-0004 5.09264616625078E-0004 5.01410917648632E-0004 4.93638381258105E-0004 4.85946585891668E-0004 + 4.78335109987488E-0004 4.70803531983697E-0004 4.63351430318475E-0004 4.55978383429955E-0004 4.48683969756304E-0004 + 4.41467767735692E-0004 4.34329355806249E-0004 4.27268312406157E-0004 4.20284215973547E-0004 4.13376644946588E-0004 + 4.06545177763447E-0004 3.99789392862258E-0004 3.93108868681199E-0004 3.86503183658404E-0004 3.79971916232051E-0004 + 3.73514644840275E-0004 3.67130947921243E-0004 3.60820403913121E-0004 3.54582591254045E-0004 3.48417088382192E-0004 + 3.42323473735697E-0004 3.36301325752727E-0004 3.30350222871447E-0004 3.24469743529994E-0004 3.18659466166545E-0004 + 3.12918969219234E-0004 3.07247831126230E-0004 3.01645630325696E-0004 2.96111945255771E-0004 2.90646354354630E-0004 + 2.85248436060409E-0004 2.79917768811274E-0004 2.74653931045391E-0004 2.69456501200898E-0004 2.64325057715968E-0004 + 2.59259179028741E-0004 2.54258443577389E-0004 2.49322429800053E-0004 2.44450716134896E-0004 2.39642881020082E-0004 + 2.34898502893753E-0004 2.30217160194079E-0004 2.25598431359202E-0004 2.21041894827286E-0004 2.16547129036493E-0004 + 2.12113712424966E-0004 2.07741223430874E-0004 2.03429240492361E-0004 1.99177342047589E-0004 1.94985106534722E-0004 + 1.90852112391901E-0004 1.86777938057296E-0004 1.82762161969051E-0004 1.78804362565328E-0004 1.74904118284289E-0004 + 1.71061007564079E-0004 1.67274608842866E-0004 1.63544500558793E-0004 1.59870261150029E-0004 1.56251469054718E-0004 + 1.52687702711022E-0004 1.49178540557104E-0004 1.45723561031108E-0004 1.42322342571201E-0004 1.38974463615528E-0004 + 1.35679502602252E-0004 1.32437037969534E-0004 1.29246648155518E-0004 1.26107911598372E-0004 1.23020406736242E-0004 + 1.19983712007289E-0004 1.16997405849674E-0004 1.14061066701544E-0004 1.11174273001064E-0004 1.08336603186381E-0004 + 1.05547635695655E-0004 1.02806948967049E-0004 1.00114121438708E-0004 9.74687315487979E-0005 9.48703577354658E-0005 + 9.23185784368767E-0005 8.98129720911782E-0005 8.73531171365308E-0005 8.49385920110947E-0005 8.25689751530180E-0005 + 8.02438450004647E-0005 7.79627799915833E-0005 7.57253585645338E-0005 7.35311591574761E-0005 7.13797602085590E-0005 + 6.92707401559458E-0005 6.72036774377857E-0005 6.51781504922385E-0005 6.31937377574634E-0005 6.12500176716102E-0005 + 5.93465686728414E-0005 5.74829691993069E-0005 5.56587976891661E-0005 5.38736325805780E-0005 5.21270523116929E-0005 + 5.04186353206728E-0005 4.87479600456682E-0005 4.71146049248407E-0005 4.55181483963412E-0005 4.39581688983285E-0005 + 4.24342448689614E-0005 4.09459547463909E-0005 3.94928769687781E-0005 3.80745899742744E-0005 3.66906722010384E-0005 + 3.53407020872285E-0005 3.40242580709964E-0005 3.27409185905026E-0005 3.14902620838989E-0005 3.02718669893439E-0005 + 2.90853117449955E-0005 2.79301747890060E-0005 2.68060345595354E-0005 2.57124694947362E-0005 2.46490580327663E-0005 + 2.36153786117838E-0005 2.26110096699412E-0005 2.16355296453981E-0005 2.06885169763075E-0005 1.97695501008286E-0005 + 1.88782074571146E-0005 1.80140674833232E-0005 1.71767086176120E-0005 1.63657092981342E-0005 1.55806479630489E-0005 + 1.48211030505094E-0005 1.40866529986734E-0005 1.33768762456983E-0005 1.26913512297377E-0005 1.20296563889501E-0005 + 1.13913701614896E-0005 1.07760709855133E-0005 1.01833372991785E-0005 9.61274754063934E-0006 9.06388014805387E-0006 + 8.53631355957643E-0006 8.02962621336415E-0006 7.54339654757398E-0006 7.07720300036048E-0006 6.63062400988136E-0006 + 6.20323801429131E-0006 5.79462345174794E-0006 5.40435876040603E-0006 5.03202237842247E-0006 4.67719274395399E-0006 + 4.33944829515560E-0006 4.01836747018457E-0006 3.71352870719603E-0006 3.42451044434667E-0006 3.15089111979312E-0006 + 2.89224917169064E-0006 2.64816303819626E-0006 2.41821115746533E-0006 2.20197196765444E-0006 1.99902390692011E-0006 + 1.80894541341780E-0006 1.63131492530434E-0006 1.46571088073529E-0006 1.31171171786715E-0006 1.16889587485630E-0006 + 1.03684178985844E-0006 9.15127901030187E-0007 8.03332646527295E-0007 7.01034464506315E-0007 6.07811793123075E-0007 + 5.23243070533923E-0007 4.46906734895152E-0007 3.78381224362676E-0007 3.17244977092896E-0007 2.63076431241777E-0007 + 2.15454024965600E-0007 1.73956196420597E-0007 1.38161383762800E-0007 1.07648025148502E-0007 8.19945587337706E-0008 + 6.07794226748309E-0008 4.35810551278788E-0008 2.99778942490272E-0008 1.95483781944935E-0008 1.18709451204131E-0008 + 6.52403318297620E-0009 3.08608053835717E-0009 1.13552534271508E-0009 2.50805752228054E-0010 1.03599230637174E-0011 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 + 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 + 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 + 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 + 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 + 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 + 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 + 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 + 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 + 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 + 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 + 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 + 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 + 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 + 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 + 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 + 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 + 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 + 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 + 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 + 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 + 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 + 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 + 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 + 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 + 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 + 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 + 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 + 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 + 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 + 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 + 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 + 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 + 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 + 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 + 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 + 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 + 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 + 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 1.00000000000000E+0012 4.36479917175008E+0003 + 4.34992830708945E+0003 4.33512976087375E+0003 4.32040298746778E+0003 4.30574744727214E+0003 4.29116260664165E+0003 + 4.27664793780492E+0003 4.26220291878511E+0003 4.24782703332184E+0003 4.23351977079422E+0003 4.21928062614503E+0003 + 4.20510909980599E+0003 4.19100469762407E+0003 4.17696693078897E+0003 4.16299531576152E+0003 4.14908937420327E+0003 + 4.13524863290697E+0003 4.12147262372810E+0003 4.10776088351747E+0003 4.09411295405465E+0003 4.08052838198252E+0003 + 4.06700671874260E+0003 4.05354752051150E+0003 4.04015034813815E+0003 4.02681476708196E+0003 4.01354034735196E+0003 + 4.00032666344670E+0003 3.98717329429509E+0003 3.97407982319811E+0003 3.96104583777129E+0003 3.94807092988805E+0003 + 3.93515469562392E+0003 3.92229673520146E+0003 3.90949665293603E+0003 3.89675405718237E+0003 3.88406856028184E+0003 + 3.87143977851057E+0003 3.85886733202821E+0003 3.84635084482753E+0003 3.83388994468467E+0003 3.82148426311012E+0003 + 3.80913343530046E+0003 3.79683710009068E+0003 3.78459489990730E+0003 3.77240648072209E+0003 3.76027149200647E+0003 + 3.74818958668658E+0003 3.73616042109895E+0003 3.72418365494687E+0003 3.71225895125731E+0003 3.70038597633851E+0003 + 3.68856439973815E+0003 3.67679389420212E+0003 3.66507413563389E+0003 3.65340480305445E+0003 3.64178557856277E+0003 + 3.63021614729695E+0003 3.61869619739581E+0003 3.60722541996104E+0003 3.59580350901995E+0003 3.58443016148865E+0003 + 3.57310507713588E+0003 3.56182795854724E+0003 3.55059851108998E+0003 3.53941644287827E+0003 3.52828146473898E+0003 + 3.51719329017794E+0003 3.50615163534667E+0003 3.49515621900956E+0003 3.48420676251158E+0003 3.47330298974635E+0003 + 3.46244462712475E+0003 3.45163140354390E+0003 3.44086305035666E+0003 3.43013930134145E+0003 3.41945989267261E+0003 + 3.40882456289107E+0003 3.39823305287554E+0003 3.38768510581397E+0003 3.37718046717558E+0003 3.36671888468311E+0003 + 3.35630010828559E+0003 3.34592389013140E+0003 3.33558998454179E+0003 3.32529814798468E+0003 3.31504813904891E+0003 + 3.30483971841879E+0003 3.29467264884902E+0003 3.28454669513999E+0003 3.27446162411338E+0003 3.26441720458813E+0003 + 3.25441320735673E+0003 3.24444940516183E+0003 3.23452557267319E+0003 3.22464148646497E+0003 3.21479692499329E+0003 + 3.20499166857411E+0003 3.19522549936146E+0003 3.18549820132592E+0003 3.17580956023339E+0003 3.16615936362424E+0003 + 3.15654740079262E+0003 3.14697346276617E+0003 3.13743734228593E+0003 3.12793883378658E+0003 3.11847773337689E+0003 + 3.10905383882053E+0003 3.09966694951703E+0003 3.09031686648311E+0003 3.08100339233417E+0003 3.07172633126613E+0003 + 3.06248548903741E+0003 3.05328067295127E+0003 3.04411169183827E+0003 3.03497835603908E+0003 3.02588047738747E+0003 + 3.01681786919351E+0003 3.00779034622704E+0003 2.99879772470138E+0003 2.98983982225715E+0003 2.98091645794650E+0003 + 2.97202745221734E+0003 2.96317262689794E+0003 2.95435180518166E+0003 2.94556481161195E+0003 2.93681147206745E+0003 + 2.92809161374739E+0003 2.91940506515715E+0003 2.91075165609399E+0003 2.90213121763301E+0003 2.89354358211326E+0003 + 2.88498858312408E+0003 2.87646605549161E+0003 2.86797583526542E+0003 2.85951775970541E+0003 2.85109166726882E+0003 + 2.84269739759745E+0003 2.83433479150503E+0003 2.82600369096475E+0003 2.81770393909697E+0003 2.80943538015712E+0003 + 2.80119785952369E+0003 2.79299122368642E+0003 2.78481532023469E+0003 2.77666999784596E+0003 2.76855510627444E+0003 + 2.76047049633992E+0003 2.75241601991667E+0003 2.74439152992253E+0003 2.73639688030818E+0003 2.72843192604648E+0003 + 2.72049652312201E+0003 2.71259052852068E+0003 2.70471380021954E+0003 2.69686619717671E+0003 2.68904757932138E+0003 + 2.68125780754403E+0003 2.67349674368671E+0003 2.66576425053349E+0003 2.65806019180096E+0003 2.65038443212899E+0003 + 2.64273683707144E+0003 2.63511727308712E+0003 2.62752560753080E+0003 2.61996170864435E+0003 2.61242544554802E+0003 + 2.60491668823179E+0003 2.59743530754685E+0003 2.58998117519720E+0003 2.58255416373132E+0003 2.57515414653398E+0003 + 2.56778099781817E+0003 2.56043459261707E+0003 2.55311480677616E+0003 2.54582151694545E+0003 2.53855460057178E+0003 + 2.53131393589120E+0003 2.52409940192147E+0003 2.51691087845470E+0003 2.50974824604996E+0003 2.50261138602609E+0003 + 2.49550018045460E+0003 2.48841451215256E+0003 2.48135426467568E+0003 2.47431932231144E+0003 2.46730957007227E+0003 + 2.46032489368889E+0003 2.45336517960368E+0003 2.44643031496409E+0003 2.43952018761627E+0003 2.43263468609862E+0003 + 2.42577369963551E+0003 2.41893711813108E+0003 2.41212483216306E+0003 2.40533673297671E+0003 2.39857271247883E+0003 + 2.39183266323181E+0003 2.38511647844781E+0003 2.37842405198294E+0003 2.37175527833157E+0003 2.36511005262070E+0003 + 2.35848827060434E+0003 2.35188982865802E+0003 2.34531462377337E+0003 2.33876255355271E+0003 2.33223351620375E+0003 + 2.32572741053433E+0003 2.31924413594724E+0003 2.31278359243510E+0003 2.30634568057527E+0003 2.29993030152485E+0003 + 2.29353735701577E+0003 2.28716674934983E+0003 2.28081838139394E+0003 2.27449215657530E+0003 2.26818797887668E+0003 + 2.26190575283180E+0003 2.25564538352065E+0003 2.24940677656500E+0003 2.24318983812386E+0003 2.23699447488903E+0003 + 2.23082059408070E+0003 2.22466810344314E+0003 2.21853691124032E+0003 2.21242692625175E+0003 2.20633805776819E+0003 + 2.20027021558757E+0003 2.19422331001085E+0003 2.18819725183796E+0003 2.18219195236380E+0003 2.17620732337423E+0003 + 2.17024327714222E+0003 2.16429972642391E+0003 2.15837658445478E+0003 2.15247376494588E+0003 2.14659118208008E+0003 + 2.14072875050834E+0003 2.13488638534605E+0003 2.12906400216941E+0003 2.12326151701184E+0003 2.11747884636044E+0003 + 2.11171590715245E+0003 2.10597261677182E+0003 2.10024889304579E+0003 2.09454465424142E+0003 2.08885981906231E+0003 + 2.08319430664526E+0003 2.07754803655697E+0003 2.07192092879078E+0003 2.06631290376351E+0003 2.06072388231222E+0003 + 2.05515378569112E+0003 2.04960253556839E+0003 2.04407005402319E+0003 2.03855626354253E+0003 2.03306108701831E+0003 + 2.02758444774433E+0003 2.02212626941332E+0003 2.01668647611406E+0003 2.01126499232844E+0003 2.00586174292865E+0003 + 2.00047665317434E+0003 1.99510964870980E+0003 1.98976065556123E+0003 1.98442960013395E+0003 1.97911640920973E+0003 + 1.97382100994412E+0003 1.96854332986372E+0003 1.96328329686362E+0003 1.95804083920480E+0003 1.95281588551149E+0003 + 1.94760836476869E+0003 1.94241820631962E+0003 1.93724533986319E+0003 1.93208969545161E+0003 1.92695120348785E+0003 + 1.92182979472327E+0003 1.91672540025522E+0003 1.91163795152465E+0003 1.90656738031377E+0003 1.90151361874369E+0003 + 1.89647659927218E+0003 1.89145625469133E+0003 1.88645251812530E+0003 1.88146532302810E+0003 1.87649460318140E+0003 + 1.87154029269224E+0003 1.86660232599097E+0003 1.86168063782904E+0003 1.85677516327686E+0003 1.85188583772172E+0003 + 1.84701259686569E+0003 1.84215537672354E+0003 1.83731411362070E+0003 1.83248874419124E+0003 1.82767920537582E+0003 + 1.82288543441975E+0003 1.81810736887097E+0003 1.81334494657812E+0003 1.80859810568860E+0003 1.80386678464664E+0003 + 1.79915092219143E+0003 1.79445045735518E+0003 1.78976532946134E+0003 1.78509547812264E+0003 1.78044084323937E+0003 + 1.77580136499748E+0003 1.77117698386685E+0003 1.76656764059946E+0003 1.76197327622762E+0003 1.75739383206226E+0003 + 1.75282924969119E+0003 1.74827947097735E+0003 1.74374443805713E+0003 1.73922409333867E+0003 1.73471837950022E+0003 + 1.73022723948844E+0003 1.72575061651678E+0003 1.72128845406385E+0003 1.71684069587181E+0003 1.71240728594475E+0003 + 1.70798816854714E+0003 1.70358328820221E+0003 1.69919258969045E+0003 1.69481601804801E+0003 1.69045351856520E+0003 + 1.68610503678496E+0003 1.68177051850137E+0003 1.67744990975814E+0003 1.67314315684714E+0003 1.66885020630693E+0003 + 1.66457100492131E+0003 1.66030549971785E+0003 1.65605363796652E+0003 1.65181536717822E+0003 1.64759063510338E+0003 + 1.64337938973058E+0003 1.63918157928518E+0003 1.63499715222790E+0003 1.63082605725351E+0003 1.62666824328946E+0003 + 1.62252365949455E+0003 1.61839225525757E+0003 1.61427398019604E+0003 1.61016878415486E+0003 1.60607661720504E+0003 + 1.60199742964239E+0003 1.59793117198629E+0003 1.59387779497837E+0003 1.58983724958129E+0003 1.58580948697751E+0003 + 1.58179445856802E+0003 1.57779211597113E+0003 1.57380241102127E+0003 1.56982529576777E+0003 1.56586072247366E+0003 + 1.56190864361452E+0003 1.55796901187723E+0003 1.55404178015890E+0003 1.55012690156561E+0003 1.54622432941134E+0003 + 1.54233401721680E+0003 1.53845591870827E+0003 1.53458998781654E+0003 1.53073617867573E+0003 1.52689444562222E+0003 + 1.52306474319354E+0003 1.51924702612730E+0003 1.51544124936008E+0003 1.51164736802637E+0003 1.50786533745750E+0003 + 1.50409511318060E+0003 1.50033665091751E+0003 1.49658990658380E+0003 1.49285483628767E+0003 1.48913139632898E+0003 + 1.48541954319818E+0003 1.48171923357533E+0003 1.47803042432911E+0003 1.47435307251577E+0003 1.47068713537820E+0003 + 1.46703257034490E+0003 1.46338933502903E+0003 1.45975738722745E+0003 1.45613668491972E+0003 1.45252718626719E+0003 + 1.44892884961202E+0003 1.44534163347625E+0003 1.44176549656087E+0003 1.43820039774489E+0003 1.43464629608441E+0003 + 1.43110315081171E+0003 1.42757092133436E+0003 1.42404956723428E+0003 1.42053904826687E+0003 1.41703932436011E+0003 + 1.41355035561369E+0003 1.41007210229812E+0003 1.40660452485386E+0003 1.40314758389045E+0003 1.39970124018566E+0003 + 1.39626545468464E+0003 1.39284018849904E+0003 1.38942540290622E+0003 1.38602105934836E+0003 1.38262711943166E+0003 + 1.37924354492552E+0003 1.37587029776168E+0003 1.37250734003346E+0003 1.36915463399490E+0003 1.36581214206001E+0003 + 1.36247982680189E+0003 1.35915765095204E+0003 1.35584557739949E+0003 1.35254356919005E+0003 1.34925158952552E+0003 + 1.34596960176294E+0003 1.34269756941380E+0003 1.33943545614328E+0003 1.33618322576950E+0003 1.33294084226277E+0003 + 1.32970826974481E+0003 1.32648547248806E+0003 1.32327241491489E+0003 1.32006906159690E+0003 1.31687537725418E+0003 + 1.31369132675457E+0003 1.31051687511296E+0003 1.30735198749057E+0003 1.30419662919424E+0003 1.30105076567570E+0003 + 1.29791436253092E+0003 1.29478738549934E+0003 1.29166980046324E+0003 1.28856157344701E+0003 1.28546267061650E+0003 + 1.28237305827831E+0003 1.27929270287910E+0003 1.27622157100498E+0003 1.27315962938077E+0003 1.27010684486937E+0003 + 1.26706318447111E+0003 1.26402861532308E+0003 1.26100310469845E+0003 1.25798662000587E+0003 1.25497912878880E+0003 + 1.25198059872488E+0003 1.24899099762527E+0003 1.24601029343404E+0003 1.24303845422753E+0003 1.24007544821373E+0003 + 1.23712124373167E+0003 1.23417580925075E+0003 1.23123911337019E+0003 1.22831112481838E+0003 1.22539181245230E+0003 + 1.22248114525687E+0003 1.21957909234440E+0003 1.21668562295398E+0003 1.21380070645085E+0003 1.21092431232586E+0003 + 1.20805641019485E+0003 1.20519696979808E+0003 1.20234596099967E+0003 1.19950335378697E+0003 1.19666911827003E+0003 + 1.19384322468102E+0003 1.19102564337367E+0003 1.18821634482269E+0003 1.18541529962321E+0003 1.18262247849025E+0003 + 1.17983785225812E+0003 1.17706139187992E+0003 1.17429306842695E+0003 1.17153285308820E+0003 1.16878071716978E+0003 + 1.16603663209440E+0003 1.16330056940081E+0003 1.16057250074330E+0003 1.15785239789115E+0003 1.15514023272811E+0003 + 1.15243597725187E+0003 1.14973960357354E+0003 1.14705108391714E+0003 1.14437039061909E+0003 1.14169749612765E+0003 + 1.13903237300249E+0003 1.13637499391412E+0003 1.13372533164340E+0003 1.13108335908105E+0003 1.12844904922715E+0003 + 1.12582237519064E+0003 1.12320331018882E+0003 1.12059182754688E+0003 1.11798790069737E+0003 1.11539150317978E+0003 + 1.11280260863998E+0003 1.11022119082981E+0003 1.10764722360656E+0003 1.10508068093251E+0003 1.10252153687446E+0003 + 1.09996976560323E+0003 1.09742534139324E+0003 1.09488823862202E+0003 1.09235843176974E+0003 1.08983589541877E+0003 + 1.08732060425319E+0003 1.08481253305838E+0003 1.08231165672053E+0003 1.07981795022622E+0003 1.07733138866191E+0003 + 1.07485194721359E+0003 1.07237960116625E+0003 1.06991432590348E+0003 1.06745609690705E+0003 1.06500488975641E+0003 + 1.06256068012831E+0003 1.06012344379636E+0003 1.05769315663057E+0003 1.05526979459697E+0003 1.05285333375712E+0003 + 1.05044375026777E+0003 1.04804102038035E+0003 1.04564512044063E+0003 1.04325602688825E+0003 1.04087371625631E+0003 + 1.03849816517099E+0003 1.03612935035112E+0003 1.03376724860776E+0003 1.03141183684380E+0003 1.02906309205357E+0003 + 1.02672099132243E+0003 1.02438551182636E+0003 1.02205663083156E+0003 1.01973432569409E+0003 1.01741857385944E+0003 + 1.01510935286211E+0003 1.01280664032531E+0003 1.01051041396049E+0003 1.00822065156697E+0003 1.00593733103159E+0003 + 1.00366043032830E+0003 1.00138992751776E+0003 9.99125800747024E+0002 9.96868028249086E+0002 9.94616588342565E+0002 + 9.92371459431302E+0002 9.90132620003999E+0002 9.87900048633843E+0002 9.85673723978145E+0002 9.83453624777970E+0002 + 9.81239729857774E+0002 9.79032018125042E+0002 9.76830468569925E+0002 9.74635060264887E+0002 9.72445772364342E+0002 + 9.70262584104301E+0002 9.68085474802019E+0002 9.65914423855645E+0002 9.63749410743867E+0002 9.61590415025566E+0002 + 9.59437416339473E+0002 9.57290394403818E+0002 9.55149329015990E+0002 9.53014200052195E+0002 9.50884987467115E+0002 + 9.48761671293570E+0002 9.46644231642184E+0002 9.44532648701043E+0002 9.42426902735371E+0002 9.40326974087190E+0002 + 9.38232843174992E+0002 9.36144490493413E+0002 9.34061896612902E+0002 9.31985042179399E+0002 9.29913907914007E+0002 + 9.27848474612674E+0002 9.25788723145868E+0002 9.23734634458260E+0002 9.21686189568404E+0002 9.19643369568425E+0002 + 9.17606155623698E+0002 9.15574528972540E+0002 9.13548470925893E+0002 9.11527962867021E+0002 9.09512986251191E+0002 + 9.07503522605375E+0002 9.05499553527938E+0002 9.03501060688336E+0002 9.01508025826813E+0002 8.99520430754095E+0002 + 8.97538257351098E+0002 8.95561487568618E+0002 8.93590103427047E+0002 8.91624087016064E+0002 8.89663420494347E+0002 + 8.87708086089281E+0002 8.85758066096659E+0002 8.83813342880402E+0002 8.81873898872257E+0002 8.79939716571521E+0002 + 8.78010778544747E+0002 8.76087067425462E+0002 8.74168565913880E+0002 8.72255256776626E+0002 8.70347122846444E+0002 + 8.68444147021930E+0002 8.66546312267242E+0002 8.64653601611829E+0002 8.62765998150154E+0002 8.60883485041418E+0002 + 8.59006045509287E+0002 8.57133662841619E+0002 8.55266320390195E+0002 8.53404001570448E+0002 8.51546689861192E+0002 + 8.49694368804362E+0002 8.47847022004738E+0002 8.46004633129688E+0002 8.44167185908902E+0002 8.42334664134130E+0002 + 8.40507051658916E+0002 8.38684332398349E+0002 8.36866490328791E+0002 8.35053509487629E+0002 8.33245373973016E+0002 + 8.31442067943613E+0002 8.29643575618339E+0002 8.27849881276115E+0002 8.26060969255612E+0002 8.24276823955005E+0002 + 8.22497429831718E+0002 8.20722771402179E+0002 8.18952833241570E+0002 8.17187599983584E+0002 8.15427056320178E+0002 + 8.13671187001330E+0002 8.11919976834797E+0002 8.10173410685871E+0002 8.08431473477138E+0002 8.06694150188245E+0002 + 8.04961425855653E+0002 8.03233285572406E+0002 8.01509714487890E+0002 7.99790697807603E+0002 7.98076220792915E+0002 + 7.96366268760842E+0002 7.94660827083806E+0002 7.92959881189412E+0002 7.91263416560211E+0002 7.89571418733476E+0002 + 7.87883873300973E+0002 7.86200765908733E+0002 7.84522082256827E+0002 7.82847808099140E+0002 7.81177929243152E+0002 + 7.79512431549707E+0002 7.77851300932800E+0002 7.76194523359349E+0002 7.74542084848980E+0002 7.72893971473808E+0002 + 7.71250169358212E+0002 7.69610664678632E+0002 7.67975443663338E+0002 7.66344492592226E+0002 7.64717797796598E+0002 + 7.63095345658954E+0002 7.61477122612774E+0002 7.59863115142311E+0002 7.58253309782382E+0002 7.56647693118154E+0002 + 7.55046251784939E+0002 7.53448972467986E+0002 7.51855841902276E+0002 7.50266846872313E+0002 7.48681974211923E+0002 + 7.47101210804048E+0002 7.45524543580545E+0002 7.43951959521981E+0002 7.42383445657436E+0002 7.40818989064301E+0002 + 7.39258576868077E+0002 7.37702196242181E+0002 7.36149834407743E+0002 7.34601478633415E+0002 7.33057116235172E+0002 + 7.31516734576119E+0002 7.29980321066291E+0002 7.28447863162472E+0002 7.26919348367990E+0002 7.25394764232533E+0002 + 7.23874098351957E+0002 7.22357338368095E+0002 7.20844471968569E+0002 7.19335486886601E+0002 7.17830370900829E+0002 + 7.16329111835116E+0002 7.14831697558367E+0002 7.13338115984344E+0002 7.11848355071482E+0002 7.10362402822705E+0002 + 7.08880247285244E+0002 7.07401876550458E+0002 7.05927278753649E+0002 7.04456442073885E+0002 7.02989354733819E+0002 + 7.01526004999512E+0002 7.00066381180255E+0002 6.98610471628392E+0002 6.97158264739144E+0002 6.95709748950435E+0002 + 6.94264912742714E+0002 6.92823744638786E+0002 6.91386233203634E+0002 6.89952367044251E+0002 6.88522134809466E+0002 + 6.87095525189777E+0002 6.85672526917173E+0002 6.84253128764975E+0002 6.82837319547659E+0002 6.81425088120694E+0002 + 6.80016423380370E+0002 6.78611314263637E+0002 6.77209749747936E+0002 6.75811718851035E+0002 6.74417210630863E+0002 + 6.73026214185352E+0002 6.71638718652266E+0002 6.70254713209049E+0002 6.68874187072654E+0002 6.67497129499390E+0002 + 6.66123529784756E+0002 6.64753377263286E+0002 6.63386661308391E+0002 6.62023371332197E+0002 6.60663496785391E+0002 + 6.59307027157064E+0002 6.57953951974554E+0002 6.56604260803295E+0002 6.55257943246656E+0002 6.53914988945793E+0002 + 6.52575387579492E+0002 6.51239128864021E+0002 6.49906202552972E+0002 6.48576598437116E+0002 6.47250306344249E+0002 + 6.45927316139044E+0002 6.44607617722900E+0002 6.43291201033796E+0002 6.41978056046138E+0002 6.40668172770622E+0002 + 6.39361541254073E+0002 6.38058151579314E+0002 6.36757993865009E+0002 6.35461058265525E+0002 6.34167334970785E+0002 + 6.32876814206126E+0002 6.31589486232154E+0002 6.30305341344606E+0002 6.29024369874204E+0002 6.27746562186515E+0002 + 6.26471908681815E+0002 6.25200399794940E+0002 6.23932025995157E+0002 6.22666777786020E+0002 6.21404645705232E+0002 + 6.20145620324507E+0002 6.18889692249439E+0002 6.17636852119358E+0002 6.16387090607200E+0002 6.15140398419367E+0002 + 6.13896766295598E+0002 6.12656185008832E+0002 6.11418645365075E+0002 6.10184138203267E+0002 6.08952654395152E+0002 + 6.07724184845143E+0002 6.06498720490194E+0002 6.05276252299667E+0002 6.04056771275204E+0002 6.02840268450598E+0002 + 6.01626734891661E+0002 6.00416161696101E+0002 5.99208539993389E+0002 5.98003860944635E+0002 5.96802115742461E+0002 + 5.95603295610872E+0002 5.94407391805138E+0002 5.93214395611659E+0002 5.92024298347848E+0002 5.90837091362005E+0002 + 5.89652766033193E+0002 5.88471313771114E+0002 5.87292726015989E+0002 5.86116994238437E+0002 5.84944109939350E+0002 + 5.83774064649775E+0002 5.82606849930792E+0002 5.81442457373398E+0002 5.80280878598382E+0002 5.79122105256211E+0002 + 5.77966129026909E+0002 5.76812941619943E+0002 5.75662534774100E+0002 5.74514900257376E+0002 5.73370029866856E+0002 + 5.72227915428599E+0002 5.71088548797525E+0002 5.69951921857299E+0002 5.68818026520215E+0002 5.67686854727083E+0002 + 5.66558398447119E+0002 5.65432649677828E+0002 5.64309600444894E+0002 5.63189242802065E+0002 5.62071568831049E+0002 + 5.60956570641395E+0002 5.59844240370385E+0002 5.58734570182928E+0002 5.57627552271445E+0002 5.56523178855765E+0002 + 5.55421442183011E+0002 5.54322334527495E+0002 5.53225848190614E+0002 5.52131975500736E+0002 5.51040708813096E+0002 + 5.49952040509691E+0002 5.48865962999176E+0002 5.47782468716750E+0002 5.46701550124061E+0002 5.45623199709099E+0002 + 5.44547409986088E+0002 5.43474173495384E+0002 5.42403482803376E+0002 5.41335330502378E+0002 5.40269709210531E+0002 + 5.39206611571695E+0002 5.38146030255356E+0002 5.37087957956519E+0002 5.36032387395608E+0002 5.34979311318369E+0002 + 5.33928722495767E+0002 5.32880613723888E+0002 5.31834977823842E+0002 5.30791807641659E+0002 5.29751096048200E+0002 + 5.28712835939048E+0002 5.27677020234423E+0002 5.26643641879074E+0002 5.25612693842192E+0002 5.24584169117306E+0002 + 5.23558060722194E+0002 5.22534361698784E+0002 5.21513065113061E+0002 5.20494164054969E+0002 5.19477651638325E+0002 + 5.18463521000717E+0002 5.17451765303415E+0002 5.16442377731277E+0002 5.15435351492657E+0002 5.14430679819316E+0002 + 5.13428355966324E+0002 5.12428373211973E+0002 5.11430724857686E+0002 5.10435404227927E+0002 5.09442404670108E+0002 + 5.08451719554502E+0002 5.07463342274154E+0002 5.06477266244789E+0002 5.05493484904726E+0002 5.04511991714789E+0002 + 5.03532780158222E+0002 5.02555843740594E+0002 5.01581175989722E+0002 5.00608770455575E+0002 4.99638620710195E+0002 + 4.98670720347604E+0002 4.97705062983726E+0002 4.96741642256296E+0002 4.95780451824776E+0002 4.94821485370273E+0002 + 4.93864736595453E+0002 4.92910199224456E+0002 4.91957867002816E+0002 4.91007733697374E+0002 4.90059793096196E+0002 + 4.89114039008495E+0002 4.88170465264541E+0002 4.87229065715586E+0002 4.86289834233781E+0002 4.85352764712091E+0002 + 4.84417851064220E+0002 4.83485087224527E+0002 4.82554467147946E+0002 4.81625984809909E+0002 4.80699634206264E+0002 + 4.79775409353195E+0002 4.78853304287148E+0002 4.77933313064745E+0002 4.77015429762716E+0002 4.76099648477812E+0002 + 4.75185963326732E+0002 4.74274368446046E+0002 4.73364857992116E+0002 4.72457426141023E+0002 4.71552067088487E+0002 + 4.70648775049793E+0002 4.69747544259717E+0002 4.68848368972448E+0002 4.67951243461515E+0002 4.67056162019711E+0002 + 4.66163118959022E+0002 4.65272108610547E+0002 4.64383125324432E+0002 4.63496163469789E+0002 4.62611217434630E+0002 + 4.61728281625788E+0002 4.60847350468850E+0002 4.59968418408083E+0002 4.59091479906357E+0002 4.58216529445084E+0002 + 4.57343561524137E+0002 4.56472570661785E+0002 4.55603551394620E+0002 4.54736498277486E+0002 4.53871405883412E+0002 + 4.53008268803538E+0002 4.52147081647050E+0002 4.51287839041107E+0002 4.50430535630775E+0002 4.49575166078957E+0002 + 4.48721725066325E+0002 4.47870207291251E+0002 4.47020607469742E+0002 4.46172920335368E+0002 4.45327140639200E+0002 + 4.44483263149739E+0002 4.43641282652853E+0002 4.42801193951706E+0002 4.41962991866697E+0002 4.41126671235390E+0002 + 4.40292226912453E+0002 4.39459653769586E+0002 4.38628946695464E+0002 4.37800100595665E+0002 4.36973110392613E+0002 + 4.36147971025504E+0002 4.35324677450255E+0002 4.34503224639426E+0002 4.33683607582170E+0002 4.32865821284159E+0002 + 4.32049860767529E+0002 4.31235721070811E+0002 4.30423397248877E+0002 4.29612884372868E+0002 4.28804177530139E+0002 + 4.27997271824196E+0002 4.27192162374632E+0002 4.26388844317072E+0002 4.25587312803103E+0002 4.24787563000224E+0002 + 4.23989590091777E+0002 4.23193389276892E+0002 4.22398955770424E+0002 4.21606284802897E+0002 4.20815371620441E+0002 + 4.20026211484737E+0002 4.19238799672952E+0002 4.18453131477687E+0002 4.17669202206917E+0002 4.16887007183928E+0002 + 4.16106541747266E+0002 4.15327801250675E+0002 4.14550781063043E+0002 4.13775476568339E+0002 4.13001883165563E+0002 + 4.12229996268684E+0002 4.11459811306589E+0002 4.10691323723021E+0002 4.09924528976524E+0002 4.09159422540393E+0002 + 4.08395999902612E+0002 4.07634256565800E+0002 4.06874188047159E+0002 4.06115789878417E+0002 4.05359057605771E+0002 + 4.04603986789838E+0002 4.03850573005597E+0002 4.03098811842335E+0002 4.02348698903595E+0002 4.01600229807123E+0002 + 4.00853400184812E+0002 4.00108205682650E+0002 3.99364641960670E+0002 3.98622704692892E+0002 3.97882389567276E+0002 + 3.97143692285666E+0002 3.96406608563740E+0002 3.95671134130957E+0002 3.94937264730508E+0002 3.94204996119259E+0002 + 3.93474324067708E+0002 3.92745244359927E+0002 3.92017752793514E+0002 3.91291845179543E+0002 3.90567517342514E+0002 + 3.89844765120302E+0002 3.89123584364104E+0002 3.88403970938397E+0002 3.87685920720882E+0002 3.86969429602435E+0002 + 3.86254493487064E+0002 3.85541108291850E+0002 3.84829269946911E+0002 3.84118974395340E+0002 3.83410217593167E+0002 + 3.82702995509308E+0002 3.81997304125513E+0002 3.81293139436325E+0002 3.80590497449028E+0002 3.79889374183599E+0002 + 3.79189765672667E+0002 3.78491667961458E+0002 3.77795077107754E+0002 3.77099989181845E+0002 3.76406400266480E+0002 + 3.75714306456826E+0002 3.75023703860416E+0002 3.74334588597111E+0002 3.73646956799045E+0002 3.72960804610586E+0002 + 3.72276128188292E+0002 3.71592923700858E+0002 3.70911187329080E+0002 3.70230915265805E+0002 3.69552103715890E+0002 + 3.68874748896152E+0002 3.68198847035333E+0002 3.67524394374045E+0002 3.66851387164737E+0002 3.66179821671642E+0002 + 3.65509694170742E+0002 3.64841000949717E+0002 3.64173738307909E+0002 3.63507902556272E+0002 3.62843490017337E+0002 + 3.62180497025163E+0002 3.61518919925297E+0002 3.60858755074734E+0002 3.60199998841871E+0002 3.59542647606466E+0002 + 3.58886697759602E+0002 3.58232145703635E+0002 3.57578987852163E+0002 3.56927220629977E+0002 3.56276840473027E+0002 + 3.55627843828374E+0002 3.54980227154155E+0002 3.54333986919538E+0002 3.53689119604687E+0002 3.53045621700715E+0002 + 3.52403489709652E+0002 3.51762720144397E+0002 3.51123309528684E+0002 3.50485254397040E+0002 3.49848551294747E+0002 + 3.49213196777801E+0002 3.48579187412874E+0002 3.47946519777276E+0002 3.47315190458915E+0002 3.46685196056256E+0002 + 3.46056533178289E+0002 3.45429198444485E+0002 3.44803188484761E+0002 3.44178499939438E+0002 3.43555129459209E+0002 + 3.42933073705098E+0002 3.42312329348421E+0002 3.41692893070751E+0002 3.41074761563883E+0002 3.40457931529790E+0002 + 3.39842399680593E+0002 3.39228162738520E+0002 3.38615217435872E+0002 3.38003560514985E+0002 3.37393188728193E+0002 + 3.36784098837796E+0002 3.36176287616017E+0002 3.35569751844972E+0002 3.34964488316632E+0002 3.34360493832788E+0002 + 3.33757765205015E+0002 3.33156299254634E+0002 3.32556092812686E+0002 3.31957142719883E+0002 3.31359445826588E+0002 + 3.30762998992767E+0002 3.30167799087964E+0002 3.29573842991263E+0002 3.28981127591250E+0002 3.28389649785987E+0002 + 3.27799406482970E+0002 3.27210394599100E+0002 3.26622611060647E+0002 3.26036052803217E+0002 3.25450716771718E+0002 + 3.24866599920329E+0002 3.24283699212462E+0002 3.23702011620734E+0002 3.23121534126930E+0002 3.22542263721972E+0002 + 3.21964197405889E+0002 3.21387332187777E+0002 3.20811665085775E+0002 3.20237193127026E+0002 3.19663913347648E+0002 + 3.19091822792704E+0002 3.18520918516164E+0002 3.17951197580879E+0002 3.17382657058546E+0002 3.16815294029679E+0002 + 3.16249105583572E+0002 3.15684088818277E+0002 3.15120240840565E+0002 3.14557558765896E+0002 3.13996039718392E+0002 + 3.13435680830802E+0002 3.12876479244475E+0002 3.12318432109324E+0002 3.11761536583803E+0002 3.11205789834870E+0002 + 3.10651189037960E+0002 3.10097731376956E+0002 3.09545414044154E+0002 3.08994234240239E+0002 3.08444189174253E+0002 + 3.07895276063564E+0002 3.07347492133838E+0002 3.06800834619011E+0002 3.06255300761255E+0002 3.05710887810954E+0002 + 3.05167593026673E+0002 3.04625413675127E+0002 3.04084347031158E+0002 3.03544390377698E+0002 3.03005541005748E+0002 + 3.02467796214346E+0002 3.01931153310537E+0002 3.01395609609350E+0002 3.00861162433765E+0002 3.00327809114687E+0002 + 2.99795546990918E+0002 2.99264373409129E+0002 2.98734285723833E+0002 2.98205281297355E+0002 2.97677357499809E+0002 + 2.97150511709065E+0002 2.96624741310729E+0002 2.96100043698107E+0002 2.95576416272185E+0002 2.95053856441601E+0002 + 2.94532361622613E+0002 2.94011929239080E+0002 2.93492556722430E+0002 2.92974241511634E+0002 2.92456981053182E+0002 + 2.91940772801057E+0002 2.91425614216703E+0002 2.90911502769007E+0002 2.90398435934266E+0002 2.89886411196168E+0002 + 2.89375426045759E+0002 2.88865477981423E+0002 2.88356564508852E+0002 2.87848683141025E+0002 2.87341831398179E+0002 + 2.86836006807786E+0002 2.86331206904527E+0002 2.85827429230265E+0002 2.85324671334025E+0002 2.84822930771963E+0002 + 2.84322205107346E+0002 2.83822491910525E+0002 2.83323788758912E+0002 2.82826093236951E+0002 2.82329402936102E+0002 + 2.81833715454808E+0002 2.81339028398476E+0002 2.80845339379452E+0002 2.80352646016995E+0002 2.79860945937255E+0002 + 2.79370236773250E+0002 2.78880516164839E+0002 2.78391781758702E+0002 2.77904031208314E+0002 2.77417262173922E+0002 + 2.76931472322523E+0002 2.76446659327838E+0002 2.75962820870292E+0002 2.75479954636989E+0002 2.74998058321689E+0002 + 2.74517129624786E+0002 2.74037166253285E+0002 2.73558165920778E+0002 2.73080126347422E+0002 2.72603045259919E+0002 + 2.72126920391489E+0002 2.71651749481851E+0002 2.71177530277198E+0002 2.70704260530179E+0002 2.70231937999874E+0002 + 2.69760560451768E+0002 2.69290125657739E+0002 2.68820631396028E+0002 2.68352075451218E+0002 2.67884455614217E+0002 + 2.67417769682231E+0002 2.66952015458746E+0002 2.66487190753506E+0002 2.66023293382488E+0002 2.65560321167888E+0002 + 2.65098271938093E+0002 2.64637143527663E+0002 2.64176933777309E+0002 2.63717640533873E+0002 2.63259261650307E+0002 + 2.62801794985651E+0002 2.62345238405013E+0002 2.61889589779549E+0002 2.61434846986443E+0002 2.60981007908883E+0002 + 2.60528070436046E+0002 2.60076032463073E+0002 2.59624891891051E+0002 2.59174646626991E+0002 2.58725294583812E+0002 + 2.58276833680317E+0002 2.57829261841175E+0002 2.57382576996900E+0002 2.56936777083831E+0002 2.56491860044115E+0002 + 2.56047823825685E+0002 2.55604666382240E+0002 2.55162385673229E+0002 2.54720979663825E+0002 2.54280446324915E+0002 + 2.53840783633071E+0002 2.53401989570538E+0002 2.52964062125212E+0002 2.52526999290622E+0002 2.52090799065908E+0002 + 2.51655459455808E+0002 2.51220978470632E+0002 2.50787354126251E+0002 2.50354584444070E+0002 2.49922667451018E+0002 + 2.49491601179523E+0002 2.49061383667497E+0002 2.48632012958314E+0002 2.48203487100798E+0002 2.47775804149197E+0002 + 2.47348962163172E+0002 2.46922959207775E+0002 2.46497793353430E+0002 2.46073462675918E+0002 2.45649965256359E+0002 + 2.45227299181192E+0002 2.44805462542156E+0002 2.44384453436279E+0002 2.43964269965853E+0002 2.43544910238421E+0002 + 2.43126372366758E+0002 2.42708654468852E+0002 2.42291754667889E+0002 2.41875671092236E+0002 2.41460401875423E+0002 + 2.41045945156124E+0002 2.40632299078143E+0002 2.40219461790394E+0002 2.39807431446887E+0002 2.39396206206710E+0002 + 2.38985784234011E+0002 2.38576163697983E+0002 2.38167342772844E+0002 2.37759319637827E+0002 2.37352092477156E+0002 + 2.36945659480035E+0002 2.36540018840627E+0002 2.36135168758041E+0002 2.35731107436316E+0002 2.35327833084402E+0002 + 2.34925343916145E+0002 2.34523638150272E+0002 2.34122714010375E+0002 2.33722569724890E+0002 2.33323203527090E+0002 + 2.32924613655061E+0002 2.32526798351691E+0002 2.32129755864651E+0002 2.31733484446382E+0002 2.31337982354079E+0002 + 2.30943247849674E+0002 2.30549279199820E+0002 2.30156074675877E+0002 2.29763632553899E+0002 2.29371951114612E+0002 + 2.28981028643406E+0002 2.28590863430313E+0002 2.28201453769999E+0002 2.27812797961742E+0002 2.27424894309421E+0002 + 2.27037741121501E+0002 2.26651336711016E+0002 2.26265679395555E+0002 2.25880767497248E+0002 2.25496599342750E+0002 + 2.25113173263228E+0002 2.24730487594344E+0002 2.24348540676241E+0002 2.23967330853531E+0002 2.23586856475277E+0002 + 2.23207115894981E+0002 2.22828107470566E+0002 2.22449829564368E+0002 2.22072280543116E+0002 2.21695458777919E+0002 + 2.21319362644254E+0002 2.20943990521951E+0002 2.20569340795177E+0002 2.20195411852423E+0002 2.19822202086492E+0002 + 2.19449709894482E+0002 2.19077933677774E+0002 2.18706871842019E+0002 2.18336522797121E+0002 2.17966884957227E+0002 + 2.17597956740710E+0002 2.17229736570158E+0002 2.16862222872361E+0002 2.16495414078292E+0002 2.16129308623102E+0002 + 2.15763904946099E+0002 2.15399201490739E+0002 2.15035196704611E+0002 2.14671889039425E+0002 2.14309276950997E+0002 + 2.13947358899237E+0002 2.13586133348135E+0002 2.13225598765752E+0002 2.12865753624199E+0002 2.12506596399632E+0002 + 2.12148125572234E+0002 2.11790339626204E+0002 2.11433237049746E+0002 2.11076816335052E+0002 2.10721075978293E+0002 + 2.10366014479603E+0002 2.10011630343071E+0002 2.09657922076723E+0002 2.09304888192514E+0002 2.08952527206314E+0002 + 2.08600837637893E+0002 2.08249818010912E+0002 2.07899466852910E+0002 2.07549782695291E+0002 2.07200764073310E+0002 + 2.06852409526066E+0002 2.06504717596484E+0002 2.06157686831307E+0002 2.05811315781080E+0002 2.05465603000142E+0002 + 2.05120547046612E+0002 2.04776146482377E+0002 2.04432399873082E+0002 2.04089305788114E+0002 2.03746862800594E+0002 + 2.03405069487364E+0002 2.03063924428975E+0002 2.02723426209676E+0002 2.02383573417402E+0002 2.02044364643761E+0002 + 2.01705798484026E+0002 2.01367873537119E+0002 2.01030588405602E+0002 2.00693941695667E+0002 2.00357932017123E+0002 + 2.00022557983381E+0002 1.99687818211451E+0002 1.99353711321923E+0002 1.99020235938960E+0002 1.98687390690285E+0002 + 1.98355174207171E+0002 1.98023585124429E+0002 1.97692622080398E+0002 1.97362283716933E+0002 1.97032568679394E+0002 + 1.96703475616635E+0002 1.96375003180994E+0002 1.96047150028283E+0002 1.95719914817774E+0002 1.95393296212190E+0002 + 1.95067292877696E+0002 1.94741903483884E+0002 1.94417126703768E+0002 1.94092961213767E+0002 1.93769405693702E+0002 + 1.93446458826776E+0002 1.93124119299573E+0002 1.92802385802041E+0002 1.92481257027485E+0002 1.92160731672555E+0002 + 1.91840808437234E+0002 1.91521486024834E+0002 1.91202763141977E+0002 1.90884638498592E+0002 1.90567110807901E+0002 + 1.90250178786410E+0002 1.89933841153898E+0002 1.89618096633410E+0002 1.89302943951242E+0002 1.88988381836933E+0002 + 1.88674409023259E+0002 1.88361024246217E+0002 1.88048226245017E+0002 1.87736013762074E+0002 1.87424385542998E+0002 + 1.87113340336582E+0002 1.86802876894792E+0002 1.86492993972761E+0002 1.86183690328777E+0002 1.85874964724270E+0002 + 1.85566815923810E+0002 1.85259242695090E+0002 1.84952243808920E+0002 1.84645818039218E+0002 1.84339964162999E+0002 + 1.84034680960366E+0002 1.83729967214499E+0002 1.83425821711651E+0002 1.83122243241131E+0002 1.82819230595300E+0002 + 1.82516782569560E+0002 1.82214897962347E+0002 1.81913575575116E+0002 1.81612814212339E+0002 1.81312612681490E+0002 + 1.81012969793039E+0002 1.80713884360444E+0002 1.80415355200136E+0002 1.80117381131518E+0002 1.79819960976952E+0002 + 1.79523093561746E+0002 1.79226777714155E+0002 1.78931012265361E+0002 1.78635796049473E+0002 1.78341127903514E+0002 + 1.78047006667411E+0002 1.77753431183990E+0002 1.77460400298965E+0002 1.77167912860929E+0002 1.76875967721345E+0002 + 1.76584563734541E+0002 1.76293699757696E+0002 1.76003374650835E+0002 1.75713587276821E+0002 1.75424336501342E+0002 + 1.75135621192908E+0002 1.74847440222838E+0002 1.74559792465256E+0002 1.74272676797079E+0002 1.73986092098008E+0002 + 1.73700037250525E+0002 1.73414511139878E+0002 1.73129512654078E+0002 1.72845040683888E+0002 1.72561094122813E+0002 + 1.72277671867099E+0002 1.71994772815717E+0002 1.71712395870356E+0002 1.71430539935422E+0002 1.71149203918019E+0002 + 1.70868386727951E+0002 1.70588087277707E+0002 1.70308304482457E+0002 1.70029037260043E+0002 1.69750284530967E+0002 + 1.69472045218393E+0002 1.69194318248127E+0002 1.68917102548618E+0002 1.68640397050948E+0002 1.68364200688820E+0002 + 1.68088512398558E+0002 1.67813331119091E+0002 1.67538655791952E+0002 1.67264485361265E+0002 1.66990818773742E+0002 + 1.66717654978671E+0002 1.66444992927913E+0002 1.66172831575890E+0002 1.65901169879581E+0002 1.65630006798511E+0002 + 1.65359341294746E+0002 1.65089172332887E+0002 1.64819498880056E+0002 1.64550319905898E+0002 1.64281634382566E+0002 + 1.64013441284715E+0002 1.63745739589498E+0002 1.63478528276556E+0002 1.63211806328011E+0002 1.62945572728459E+0002 + 1.62679826464963E+0002 1.62414566527045E+0002 1.62149791906681E+0002 1.61885501598288E+0002 1.61621694598726E+0002 + 1.61358369907282E+0002 1.61095526525670E+0002 1.60833163458017E+0002 1.60571279710863E+0002 1.60309874293149E+0002 + 1.60048946216212E+0002 1.59788494493777E+0002 1.59528518141951E+0002 1.59269016179216E+0002 1.59009987626423E+0002 + 1.58751431506781E+0002 1.58493346845855E+0002 1.58235732671558E+0002 1.57978588014142E+0002 1.57721911906193E+0002 + 1.57465703382625E+0002 1.57209961480671E+0002 1.56954685239878E+0002 1.56699873702099E+0002 1.56445525911488E+0002 + 1.56191640914492E+0002 1.55938217759846E+0002 1.55685255498562E+0002 1.55432753183931E+0002 1.55180709871505E+0002 + 1.54929124619101E+0002 1.54677996486789E+0002 1.54427324536886E+0002 1.54177107833949E+0002 1.53927345444773E+0002 + 1.53678036438378E+0002 1.53429179886007E+0002 1.53180774861118E+0002 1.52932820439380E+0002 1.52685315698663E+0002 + 1.52438259719034E+0002 1.52191651582749E+0002 1.51945490374250E+0002 1.51699775180155E+0002 1.51454505089254E+0002 + 1.51209679192503E+0002 1.50965296583016E+0002 1.50721356356060E+0002 1.50477857609048E+0002 1.50234799441536E+0002 + 1.49992180955213E+0002 1.49750001253895E+0002 1.49508259443523E+0002 1.49266954632153E+0002 1.49026085929952E+0002 + 1.48785652449190E+0002 1.48545653304237E+0002 1.48306087611554E+0002 1.48066954489689E+0002 1.47828253059271E+0002 + 1.47589982443003E+0002 1.47352141765657E+0002 1.47114730154069E+0002 1.46877746737129E+0002 1.46641190645781E+0002 + 1.46405061013015E+0002 1.46169356973857E+0002 1.45934077665372E+0002 1.45699222226649E+0002 1.45464789798801E+0002 + 1.45230779524958E+0002 1.44997190550261E+0002 1.44764022021857E+0002 1.44531273088891E+0002 1.44298942902503E+0002 + 1.44067030615823E+0002 1.43835535383962E+0002 1.43604456364010E+0002 1.43373792715027E+0002 1.43143543598041E+0002 + 1.42913708176040E+0002 1.42684285613968E+0002 1.42455275078718E+0002 1.42226675739128E+0002 1.41998486765974E+0002 + 1.41770707331968E+0002 1.41543336611747E+0002 1.41316373781873E+0002 1.41089818020825E+0002 1.40863668508992E+0002 + 1.40637924428673E+0002 1.40412584964066E+0002 1.40187649301267E+0002 1.39963116628260E+0002 1.39738986134918E+0002 + 1.39515257012992E+0002 1.39291928456109E+0002 1.39068999659765E+0002 1.38846469821322E+0002 1.38624338140002E+0002 + 1.38402603816879E+0002 1.38181266054878E+0002 1.37960324058767E+0002 1.37739777035156E+0002 1.37519624192486E+0002 + 1.37299864741026E+0002 1.37080497892873E+0002 1.36861522861939E+0002 1.36642938863951E+0002 1.36424745116445E+0002 + 1.36206940838762E+0002 1.35989525252038E+0002 1.35772497579208E+0002 1.35555857044991E+0002 1.35339602875894E+0002 + 1.35123734300201E+0002 1.34908250547970E+0002 1.34693150851029E+0002 1.34478434442972E+0002 1.34264100559150E+0002 + 1.34050148436670E+0002 1.33836577314389E+0002 1.33623386432910E+0002 1.33410575034574E+0002 1.33198142363462E+0002 + 1.32986087665381E+0002 1.32774410187868E+0002 1.32563109180179E+0002 1.32352183893288E+0002 1.32141633579883E+0002 + 1.31931457494355E+0002 1.31721654892801E+0002 1.31512225033017E+0002 1.31303167174489E+0002 1.31094480578394E+0002 + 1.30886164507595E+0002 1.30678218226632E+0002 1.30470641001722E+0002 1.30263432100750E+0002 1.30056590793272E+0002 + 1.29850116350500E+0002 1.29644008045308E+0002 1.29438265152219E+0002 1.29232886947407E+0002 1.29027872708687E+0002 + 1.28823221715515E+0002 1.28618933248981E+0002 1.28415006591806E+0002 1.28211441028338E+0002 1.28008235844544E+0002 + 1.27805390328009E+0002 1.27602903767934E+0002 1.27400775455124E+0002 1.27199004681992E+0002 1.26997590742547E+0002 + 1.26796532932398E+0002 1.26595830548741E+0002 1.26395482890363E+0002 1.26195489257630E+0002 1.25995848952491E+0002 + 1.25796561278464E+0002 1.25597625540641E+0002 1.25399041045679E+0002 1.25200807101796E+0002 1.25002923018768E+0002 + 1.24805388107924E+0002 1.24608201682142E+0002 1.24411363055845E+0002 1.24214871544998E+0002 1.24018726467102E+0002 + 1.23822927141191E+0002 1.23627472887827E+0002 1.23432363029097E+0002 1.23237596888608E+0002 1.23043173791484E+0002 + 1.22849093064362E+0002 1.22655354035385E+0002 1.22461956034204E+0002 1.22268898391968E+0002 1.22076180441321E+0002 + 1.21883801516403E+0002 1.21691760952840E+0002 1.21500058087744E+0002 1.21308692259705E+0002 1.21117662808793E+0002 + 1.20926969076549E+0002 1.20736610405982E+0002 1.20546583129351E+0002 1.20356784364301E+0002 1.20167166410514E+0002 + 1.19977729507389E+0002 1.19788473892638E+0002 1.19599399802290E+0002 1.19410507470695E+0002 1.19221797130529E+0002 + 1.19033269012795E+0002 1.18844923346828E+0002 1.18656760360296E+0002 1.18468780279211E+0002 1.18280983327922E+0002 + 1.18093369729127E+0002 1.17905939703874E+0002 1.17718693471563E+0002 1.17531631249951E+0002 1.17344753255157E+0002 + 1.17158059701663E+0002 1.16971550802317E+0002 1.16785226768344E+0002 1.16599087809337E+0002 1.16413134133272E+0002 + 1.16227365946508E+0002 1.16041783453786E+0002 1.15856386858241E+0002 1.15671176361397E+0002 1.15486152163179E+0002 + 1.15301314461909E+0002 1.15116663454316E+0002 1.14932199335534E+0002 1.14747922299112E+0002 1.14563832537010E+0002 + 1.14379930239609E+0002 1.14196215595713E+0002 1.14012688792552E+0002 1.13829350015784E+0002 1.13646199449502E+0002 + 1.13463237276235E+0002 1.13280463676955E+0002 1.13097878831075E+0002 1.12915482916459E+0002 1.12733276109422E+0002 + 1.12551258584733E+0002 1.12369430515621E+0002 1.12187792073780E+0002 1.12006343429367E+0002 1.11825084751011E+0002 + 1.11644016205815E+0002 1.11463137959358E+0002 1.11282450175703E+0002 1.11101953017394E+0002 1.10921646645468E+0002 + 1.10741531219451E+0002 1.10561606897366E+0002 1.10381873835736E+0002 1.10202332189586E+0002 1.10022982112450E+0002 + 1.09843823756372E+0002 1.09664857271910E+0002 1.09486082808139E+0002 1.09307500512659E+0002 1.09129110531593E+0002 + 1.08950913009593E+0002 1.08772908089846E+0002 1.08595095914074E+0002 1.08417476622540E+0002 1.08240050354050E+0002 + 1.08062817245958E+0002 1.07885777434171E+0002 1.07708931053149E+0002 1.07532278235912E+0002 1.07355819114043E+0002 + 1.07179553817689E+0002 1.07003482475569E+0002 1.06827605214975E+0002 1.06651922161776E+0002 1.06476433440422E+0002 + 1.06301139173949E+0002 1.06126039483979E+0002 1.05951134490729E+0002 1.05776424313009E+0002 1.05601909068230E+0002 + 1.05427588872408E+0002 1.05253463840161E+0002 1.05079534084723E+0002 1.04905799717939E+0002 1.04732260850273E+0002 + 1.04558917590811E+0002 1.04385770047264E+0002 1.04212818325972E+0002 1.04040062531909E+0002 1.03867502768683E+0002 + 1.03695139138546E+0002 1.03522971742390E+0002 1.03351000679758E+0002 1.03179226048841E+0002 1.03007647946487E+0002 + 1.02836266468204E+0002 1.02665081708159E+0002 1.02494093759188E+0002 1.02323302712794E+0002 1.02152708659158E+0002 + 1.01982311687133E+0002 1.01812111884256E+0002 1.01642109336747E+0002 1.01472304129516E+0002 1.01302696346162E+0002 + 1.01133286068984E+0002 1.00964073378975E+0002 1.00795058355836E+0002 1.00626241077971E+0002 1.00457621622495E+0002 + 1.00289200065238E+0002 1.00120976480748E+0002 9.99529509422930E+0001 9.97851235218664E+0001 9.96174942901907E+0001 + 9.94500633167204E+0001 9.92828306696464E+0001 9.91157964158989E+0001 9.89489606211516E+0001 9.87823233498257E+0001 + 9.86158846650921E+0001 9.84496446288766E+0001 9.82836033018634E+0001 9.81177607434978E+0001 9.79521170119907E+0001 + 9.77866721643218E+0001 9.76214262562432E+0001 9.74563793422842E+0001 9.72915314757531E+0001 9.71268827087424E+0001 + 9.69624330921309E+0001 9.67981826755897E+0001 9.66341315075828E+0001 9.64702796353737E+0001 9.63066271050267E+0001 + 9.61431739614120E+0001 9.59799202482091E+0001 9.58168660079093E+0001 9.56540112818209E+0001 9.54913561100721E+0001 + 9.53289005316141E+0001 9.51666445842261E+0001 9.50045883045170E+0001 9.48427317279312E+0001 9.46810748887505E+0001 + 9.45196178200981E+0001 9.43583605539430E+0001 9.41973031211028E+0001 9.40364455512475E+0001 9.38757878729030E+0001 + 9.37153301134549E+0001 9.35550722991522E+0001 9.33950144551107E+0001 9.32351566053163E+0001 9.30754987726289E+0001 + 9.29160409787866E+0001 9.27567832444078E+0001 9.25977255889962E+0001 9.24388680309437E+0001 9.22802105875339E+0001 + 9.21217532749461E+0001 9.19634961082582E+0001 9.18054391014511E+0001 9.16475822674116E+0001 9.14899256179365E+0001 + 9.13324691637354E+0001 9.11752129144351E+0001 9.10181568785822E+0001 9.08613010636478E+0001 9.07046454760303E+0001 + 9.05481901210588E+0001 9.03919350029972E+0001 9.02358801250470E+0001 9.00800254893516E+0001 8.99243710969998E+0001 + 8.97689169480283E+0001 8.96136630414267E+0001 8.94586093751394E+0001 8.93037559460706E+0001 8.91491027500869E+0001 + 8.89946497820212E+0001 8.88403970356759E+0001 8.86863445038271E+0001 8.85324921782266E+0001 8.83788400496070E+0001 + 8.82253881076848E+0001 8.80721363411628E+0001 8.79190847377353E+0001 8.77662332840902E+0001 8.76135819659128E+0001 + 8.74611307678897E+0001 8.73088796737121E+0001 8.71568286660788E+0001 8.70049777267004E+0001 8.68533268363022E+0001 + 8.67018759746274E+0001 8.65506251204418E+0001 8.63995742515355E+0001 8.62487233447281E+0001 8.60980723758709E+0001 + 8.59476213198502E+0001 8.57973701505919E+0001 8.56473188410644E+0001 8.54974673632812E+0001 8.53478156883053E+0001 + 8.51983637862526E+0001 8.50491116262947E+0001 8.49000591766624E+0001 8.47512064046500E+0001 8.46025532766169E+0001 + 8.44540997579935E+0001 8.43058458132822E+0001 8.41577914060618E+0001 8.40099364989912E+0001 8.38622810538123E+0001 + 8.37148250313535E+0001 8.35675683915329E+0001 8.34205110933621E+0001 8.32736530949489E+0001 8.31269943535014E+0001 + 8.29805348253304E+0001 8.28342744658541E+0001 8.26882132296001E+0001 8.25423510702094E+0001 8.23966879404398E+0001 + 8.22512237921686E+0001 8.21059585763967E+0001 8.19608922432518E+0001 8.18160247419910E+0001 8.16713560210049E+0001 + 8.15268860278205E+0001 8.13826147091046E+0001 8.12385420106672E+0001 8.10946678774644E+0001 8.09509922536026E+0001 + 8.08075150823406E+0001 8.06642363060935E+0001 8.05211558664359E+0001 8.03782737041054E+0001 8.02355897590053E+0001 + 8.00931039702089E+0001 7.99508162759609E+0001 7.98087266136826E+0001 7.96668349199743E+0001 7.95251411306182E+0001 + 7.93836451805824E+0001 7.92423470040233E+0001 7.91012465342899E+0001 7.89603437039254E+0001 7.88196384446726E+0001 + 7.86791306874750E+0001 7.85388203624809E+0001 7.83987073990475E+0001 7.82587917257420E+0001 7.81190732703470E+0001 + 7.79795519598621E+0001 7.78402277205076E+0001 7.77011004777286E+0001 7.75621701561958E+0001 7.74234366798115E+0001 + 7.72848999717111E+0001 7.71465599542659E+0001 7.70084165490881E+0001 7.68704696770316E+0001 7.67327192581972E+0001 + 7.65951652119342E+0001 7.64578074568448E+0001 7.63206459107861E+0001 7.61836804908742E+0001 7.60469111134865E+0001 + 7.59103376942650E+0001 7.57739601481199E+0001 7.56377783892322E+0001 7.55017923310572E+0001 7.53660018863272E+0001 + 7.52304069670543E+0001 7.50950074845345E+0001 7.49598033493500E+0001 7.48247944713722E+0001 7.46899807597654E+0001 + 7.45553621229891E+0001 7.44209384688016E+0001 7.42867097042629E+0001 7.41526757357376E+0001 7.40188364688983E+0001 + 7.38851918087278E+0001 7.37517416595234E+0001 7.36184859248986E+0001 7.34854245077872E+0001 7.33525573104456E+0001 + 7.32198842344562E+0001 7.30874051807300E+0001 7.29551200495103E+0001 7.28230287403746E+0001 7.26911311522386E+0001 + 7.25594271833589E+0001 7.24279167313358E+0001 7.22965996931158E+0001 7.21654759649962E+0001 7.20345454426256E+0001 + 7.19038080210091E+0001 7.17732635945104E+0001 7.16429120568541E+0001 7.15127533011295E+0001 7.13827872197934E+0001 + 7.12530137046726E+0001 7.11234326469674E+0001 7.09940439372538E+0001 7.08648474654871E+0001 7.07358431210044E+0001 + 7.06070307925277E+0001 7.04784103681664E+0001 7.03499817354208E+0001 7.02217447811845E+0001 7.00936993917474E+0001 + 6.99658454527989E+0001 6.98381828494297E+0001 6.97107114661363E+0001 6.95834311868225E+0001 6.94563418948025E+0001 + 6.93294434728046E+0001 6.92027358029726E+0001 6.90762187668700E+0001 6.89498922454821E+0001 6.88237561192187E+0001 + 6.86978102679174E+0001 6.85720545708459E+0001 6.84464889067055E+0001 6.83211131536329E+0001 6.81959271892042E+0001 + 6.80709308904363E+0001 6.79461241337910E+0001 6.78215067951771E+0001 6.76970787499525E+0001 6.75728398729290E+0001 + 6.74487900383723E+0001 6.73249291200075E+0001 6.72012569910198E+0001 6.70777735240579E+0001 6.69544785912375E+0001 + 6.68313720641427E+0001 6.67084538138294E+0001 6.65857237108285E+0001 6.64631816251474E+0001 6.63408274262739E+0001 + 6.62186609831781E+0001 6.60966821643154E+0001 6.59748908376292E+0001 6.58532868705536E+0001 6.57318701300160E+0001 + 6.56106404824395E+0001 6.54895977937462E+0001 6.53687419293592E+0001 6.52480727542061E+0001 6.51275901327201E+0001 + 6.50072939288445E+0001 6.48871840060343E+0001 6.47672602272585E+0001 6.46475224550035E+0001 6.45279705512759E+0001 + 6.44086043776038E+0001 6.42894237950408E+0001 6.41704286641679E+0001 6.40516188450959E+0001 6.39329941974689E+0001 + 6.38145545804659E+0001 6.36962998528038E+0001 6.35782298727399E+0001 6.34603444980749E+0001 6.33426435861542E+0001 + 6.32251269938721E+0001 6.31077945776734E+0001 6.29906461935557E+0001 6.28736816970728E+0001 6.27569009433363E+0001 + 6.26403037870190E+0001 6.25238900823567E+0001 6.24076596831509E+0001 6.22916124427720E+0001 6.21757482141601E+0001 + 6.20600668498299E+0001 6.19445682018707E+0001 6.18292521219510E+0001 6.17141184613193E+0001 6.15991670708076E+0001 + 6.14843978008338E+0001 6.13698105014035E+0001 6.12554050221130E+0001 6.11411812121517E+0001 6.10271389203044E+0001 + 6.09132779949539E+0001 6.07995982840829E+0001 6.06860996352772E+0001 6.05727818957278E+0001 6.04596449122331E+0001 + 6.03466885312016E+0001 6.02339125986536E+0001 6.01213169602249E+0001 6.00089014611682E+0001 5.98966659463553E+0001 + 5.97846102602806E+0001 5.96727342470622E+0001 5.95610377504450E+0001 5.94495206138028E+0001 5.93381826801410E+0001 + 5.92270237920981E+0001 5.91160437919493E+0001 5.90052425216077E+0001 5.88946198226271E+0001 5.87841755362045E+0001 + 5.86739095031819E+0001 5.85638215640493E+0001 5.84539115589462E+0001 5.83441793276646E+0001 5.82346247096508E+0001 + 5.81252475440081E+0001 5.80160476694987E+0001 5.79070249245461E+0001 5.77981791472377E+0001 5.76895101753266E+0001 + 5.75810178462338E+0001 5.74727019970509E+0001 5.73645624645422E+0001 5.72565990851468E+0001 5.71488116949807E+0001 + 5.70412001298394E+0001 5.69337642251999E+0001 5.68265038162229E+0001 5.67194187377552E+0001 5.66125088243317E+0001 + 5.65057739101775E+0001 5.63992138292105E+0001 5.62928284150431E+0001 5.61866175009848E+0001 5.60805809200441E+0001 + 5.59747185049306E+0001 5.58690300880579E+0001 5.57635155015443E+0001 5.56581745772165E+0001 5.55530071466108E+0001 + 5.54480130409756E+0001 5.53431920912735E+0001 5.52385441281829E+0001 5.51340689821013E+0001 5.50297664831461E+0001 + 5.49256364611576E+0001 5.48216787457008E+0001 5.47178931660674E+0001 5.46142795512782E+0001 5.45108377300845E+0001 + 5.44075675309714E+0001 5.43044687821583E+0001 5.42015413116027E+0001 5.40987849470007E+0001 5.39961995157898E+0001 + 5.38937848451513E+0001 5.37915407620114E+0001 5.36894670930440E+0001 5.35875636646725E+0001 5.34858303030720E+0001 + 5.33842668341706E+0001 5.32828730836525E+0001 5.31816488769592E+0001 5.30805940392918E+0001 5.29797083956130E+0001 + 5.28789917706491E+0001 5.27784439888918E+0001 5.26780648746004E+0001 5.25778542518037E+0001 5.24778119443022E+0001 + 5.23779377756694E+0001 5.22782315692547E+0001 5.21786931481842E+0001 5.20793223353639E+0001 5.19801189534806E+0001 + 5.18810828250047E+0001 5.17822137721913E+0001 5.16835116170828E+0001 5.15849761815103E+0001 5.14866072870957E+0001 + 5.13884047552541E+0001 5.12903684071948E+0001 5.11924980639239E+0001 5.10947935462458E+0001 5.09972546747653E+0001 + 5.08998812698892E+0001 5.08026731518289E+0001 5.07056301406012E+0001 5.06087520560308E+0001 5.05120387177524E+0001 + 5.04154899452116E+0001 5.03191055576679E+0001 5.02228853741958E+0001 5.01268292136867E+0001 5.00309368948511E+0001 + 4.99352082362198E+0001 4.98396430561463E+0001 4.97442411728084E+0001 4.96490024042100E+0001 4.95539265681830E+0001 + 4.94590134823884E+0001 4.93642629643196E+0001 4.92696748313026E+0001 4.91752489004984E+0001 4.90809849889053E+0001 + 4.89868829133595E+0001 4.88929424905383E+0001 4.87991635369603E+0001 4.87055458689885E+0001 4.86120893028311E+0001 + 4.85187936545439E+0001 4.84256587400317E+0001 4.83326843750496E+0001 4.82398703752058E+0001 4.81472165559624E+0001 + 4.80547227326373E+0001 4.79623887204064E+0001 4.78702143343044E+0001 4.77781993892275E+0001 4.76863436999343E+0001 + 4.75946470810476E+0001 4.75031093470567E+0001 4.74117303123183E+0001 4.73205097910587E+0001 4.72294475973747E+0001 + 4.71385435452367E+0001 4.70477974484886E+0001 4.69572091208509E+0001 4.68667783759212E+0001 4.67765050271767E+0001 + 4.66863888879755E+0001 4.65964297715579E+0001 4.65066274910487E+0001 4.64169818594583E+0001 4.63274926896843E+0001 + 4.62381597945133E+0001 4.61489829866226E+0001 4.60599620785813E+0001 4.59710968828527E+0001 4.58823872117949E+0001 + 4.57938328776630E+0001 4.57054336926106E+0001 4.56171894686913E+0001 4.55291000178602E+0001 4.54411651519755E+0001 + 4.53533846828001E+0001 4.52657584220028E+0001 4.51782861811605E+0001 4.50909677717591E+0001 4.50038030051955E+0001 + 4.49167916927787E+0001 4.48299336457314E+0001 4.47432286751922E+0001 4.46566765922156E+0001 4.45702772077752E+0001 + 4.44840303327642E+0001 4.43979357779968E+0001 4.43119933542105E+0001 4.42262028720666E+0001 4.41405641421522E+0001 + 4.40550769749820E+0001 4.39697411809991E+0001 4.38845565705764E+0001 4.37995229540189E+0001 4.37146401415643E+0001 + 4.36299079433850E+0001 4.35453261695891E+0001 4.34608946302219E+0001 4.33766131352678E+0001 4.32924814946513E+0001 + 4.32084995182382E+0001 4.31246670158375E+0001 4.30409837972028E+0001 4.29574496720329E+0001 4.28740644499747E+0001 + 4.27908279406227E+0001 4.27077399535223E+0001 4.26248002981694E+0001 4.25420087840134E+0001 4.24593652204572E+0001 + 4.23768694168595E+0001 4.22945211825357E+0001 4.22123203267594E+0001 4.21302666587636E+0001 4.20483599877425E+0001 + 4.19666001228521E+0001 4.18849868732123E+0001 4.18035200479076E+0001 4.17221994559888E+0001 4.16410249064741E+0001 + 4.15599962083510E+0001 4.14791131705765E+0001 4.13983756020794E+0001 4.13177833117613E+0001 4.12373361084974E+0001 + 4.11570338011388E+0001 4.10768761985128E+0001 4.09968631094248E+0001 4.09169943426594E+0001 4.08372697069813E+0001 + 4.07576890111373E+0001 4.06782520638569E+0001 4.05989586738539E+0001 4.05198086498277E+0001 4.04408018004642E+0001 + 4.03619379344372E+0001 4.02832168604100E+0001 4.02046383870361E+0001 4.01262023229607E+0001 4.00479084768217E+0001 + 3.99697566572515E+0001 3.98917466728772E+0001 3.98138783323229E+0001 3.97361514442101E+0001 3.96585658171594E+0001 + 3.95811212597916E+0001 3.95038175807283E+0001 3.94266545885938E+0001 3.93496320920164E+0001 3.92727498996287E+0001 + 3.91960078200695E+0001 3.91194056619847E+0001 3.90429432340287E+0001 3.89666203448651E+0001 3.88904368031681E+0001 + 3.88143924176240E+0001 3.87384869969315E+0001 3.86627203498040E+0001 3.85870922849691E+0001 3.85116026111717E+0001 + 3.84362511371736E+0001 3.83610376717549E+0001 3.82859620237161E+0001 3.82110240018775E+0001 3.81362234150821E+0001 + 3.80615600721954E+0001 3.79870337821069E+0001 3.79126443537317E+0001 3.78383915960105E+0001 3.77642753179118E+0001 + 3.76902953284322E+0001 3.76164514365979E+0001 3.75427434514655E+0001 3.74691711821232E+0001 3.73957344376921E+0001 + 3.73224330273267E+0001 3.72492667602162E+0001 3.71762354455858E+0001 3.71033388926974E+0001 3.70305769108509E+0001 + 3.69579493093849E+0001 3.68854558976781E+0001 3.68130964851499E+0001 3.67408708812620E+0001 3.66687788955189E+0001 + 3.65968203374689E+0001 3.65249950167057E+0001 3.64533027428687E+0001 3.63817433256442E+0001 3.63103165747669E+0001 + 3.62390223000201E+0001 3.61678603112370E+0001 3.60968304183020E+0001 3.60259324311512E+0001 3.59551661597737E+0001 + 3.58845314142123E+0001 3.58140280045649E+0001 3.57436557409847E+0001 3.56734144336819E+0001 3.56033038929243E+0001 + 3.55333239290383E+0001 3.54634743524099E+0001 3.53937549734853E+0001 3.53241656027727E+0001 3.52547060508419E+0001 + 3.51853761283263E+0001 3.51161756459238E+0001 3.50471044143968E+0001 3.49781622445742E+0001 3.49093489473515E+0001 + 3.48406643336919E+0001 3.47721082146277E+0001 3.47036804012606E+0001 3.46353807047628E+0001 3.45672089363778E+0001 + 3.44991649074216E+0001 3.44312484292829E+0001 3.43634593134249E+0001 3.42957973713854E+0001 3.42282624147780E+0001 + 3.41608542552928E+0001 3.40935727046976E+0001 3.40264175748383E+0001 3.39593886776400E+0001 3.38924858251079E+0001 + 3.38257088293280E+0001 3.37590575024678E+0001 3.36925316567777E+0001 3.36261311045911E+0001 3.35598556583258E+0001 + 3.34937051304844E+0001 3.34276793336554E+0001 3.33617780805139E+0001 3.32960011838226E+0001 3.32303484564320E+0001 + 3.31648197112820E+0001 3.30994147614024E+0001 3.30341334199134E+0001 3.29689755000265E+0001 3.29039408150456E+0001 + 3.28390291783677E+0001 3.27742404034833E+0001 3.27095743039775E+0001 3.26450306935309E+0001 3.25806093859199E+0001 + 3.25163101950177E+0001 3.24521329347953E+0001 3.23880774193221E+0001 3.23241434627661E+0001 3.22603308793958E+0001 + 3.21966394835798E+0001 3.21330690897882E+0001 3.20696195125930E+0001 3.20062905666694E+0001 3.19430820667956E+0001 + 3.18799938278543E+0001 3.18170256648332E+0001 3.17541773928254E+0001 3.16914488270308E+0001 3.16288397827562E+0001 + 3.15663500754160E+0001 3.15039795205335E+0001 3.14417279337409E+0001 3.13795951307802E+0001 3.13175809275044E+0001 + 3.12556851398774E+0001 3.11939075839755E+0001 3.11322480759870E+0001 3.10707064322140E+0001 3.10092824690725E+0001 + 3.09479760030931E+0001 3.08867868509216E+0001 3.08257148293200E+0001 3.07647597551669E+0001 3.07039214454581E+0001 + 3.06431997173073E+0001 3.05825943879470E+0001 3.05221052747288E+0001 3.04617321951242E+0001 3.04014749667252E+0001 + 3.03413334072451E+0001 3.02813073345187E+0001 3.02213965665035E+0001 3.01616009212798E+0001 3.01019202170516E+0001 + 3.00423542721473E+0001 2.99829029050201E+0001 2.99235659342485E+0001 2.98643431785375E+0001 2.98052344567184E+0001 + 2.97462395877500E+0001 2.96873583907190E+0001 2.96285906848404E+0001 2.95699362894584E+0001 2.95113950240471E+0001 + 2.94529667082104E+0001 2.93946511616831E+0001 2.93364482043316E+0001 2.92783576561542E+0001 2.92203793372817E+0001 + 2.91625130679780E+0001 2.91047586686405E+0001 2.90471159598011E+0001 2.89895847621263E+0001 2.89321648964180E+0001 + 2.88748561836139E+0001 2.88176584447882E+0001 2.87605715011520E+0001 2.87035951740540E+0001 2.86467292849806E+0001 + 2.85899736555573E+0001 2.85333281075483E+0001 2.84767924628577E+0001 2.84203665435294E+0001 2.83640501717482E+0001 + 2.83078431698400E+0001 2.82517453602727E+0001 2.81957565656559E+0001 2.81398766087422E+0001 2.80841053124276E+0001 + 2.80284424997513E+0001 2.79728879938972E+0001 2.79174416181936E+0001 2.78621031961142E+0001 2.78068725512784E+0001 + 2.77517495074516E+0001 2.76967338885459E+0001 2.76418255186207E+0001 2.75870242218828E+0001 2.75323298226873E+0001 + 2.74777421455376E+0001 2.74232610150863E+0001 2.73688862561355E+0001 2.73146176936372E+0001 2.72604551526938E+0001 + 2.72063984585584E+0001 2.71524474366358E+0001 2.70986019124820E+0001 2.70448617118059E+0001 2.69912266604684E+0001 + 2.69376965844839E+0001 2.68842713100201E+0001 2.68309506633988E+0001 2.67777344710961E+0001 2.67246225597429E+0001 + 2.66716147561254E+0001 2.66187108871857E+0001 2.65659107800213E+0001 2.65132142618870E+0001 2.64606211601940E+0001 + 2.64081313025109E+0001 2.63557445165643E+0001 2.63034606302385E+0001 2.62512794715769E+0001 2.61992008687812E+0001 + 2.61472246502130E+0001 2.60953506443932E+0001 2.60435786800031E+0001 2.59919085858844E+0001 2.59403401910397E+0001 + 2.58888733246329E+0001 2.58375078159895E+0001 2.57862434945971E+0001 2.57350801901057E+0001 2.56840177323279E+0001 + 2.56330559512399E+0001 2.55821946769808E+0001 2.55314337398541E+0001 2.54807729703271E+0001 2.54302121990322E+0001 + 2.53797512567663E+0001 2.53293899744917E+0001 2.52791281833367E+0001 2.52289657145949E+0001 2.51789023997271E+0001 + 2.51289380703600E+0001 2.50790725582879E+0001 2.50293056954722E+0001 2.49796373140419E+0001 2.49300672462943E+0001 + 2.48805953246948E+0001 2.48312213818777E+0001 2.47819452506461E+0001 2.47327667639726E+0001 2.46836857549992E+0001 + 2.46347020570383E+0001 2.45858155035721E+0001 2.45370259282536E+0001 2.44883331649067E+0001 2.44397370475264E+0001 + 2.43912374102794E+0001 2.43428340875040E+0001 2.42945269137107E+0001 2.42463157235822E+0001 2.41982003519743E+0001 + 2.41501806339154E+0001 2.41022564046073E+0001 2.40544274994253E+0001 2.40066937539187E+0001 2.39590550038107E+0001 + 2.39115110849990E+0001 2.38640618335560E+0001 2.38167070857290E+0001 2.37694466779404E+0001 2.37222804467885E+0001 + 2.36752082290467E+0001 2.36282298616650E+0001 2.35813451817693E+0001 2.35345540266623E+0001 2.34878562338234E+0001 + 2.34412516409087E+0001 2.33947400857521E+0001 2.33483214063650E+0001 2.33019954409363E+0001 2.32557620278330E+0001 + 2.32096210056006E+0001 2.31635722129630E+0001 2.31176154888227E+0001 2.30717506722615E+0001 2.30259776025402E+0001 + 2.29802961190990E+0001 2.29347060615582E+0001 2.28892072697176E+0001 2.28437995835572E+0001 2.27984828432375E+0001 + 2.27532568890996E+0001 2.27081215616652E+0001 2.26630767016373E+0001 2.26181221498999E+0001 2.25732577475184E+0001 + 2.25284833357400E+0001 2.24837987559939E+0001 2.24392038498909E+0001 2.23946984592246E+0001 2.23502824259707E+0001 + 2.23059555922875E+0001 2.22617178005166E+0001 2.22175688931822E+0001 2.21735087129920E+0001 2.21295371028369E+0001 + 2.20856539057918E+0001 2.20418589651149E+0001 2.19981521242489E+0001 2.19545332268202E+0001 2.19110021166400E+0001 + 2.18675586377037E+0001 2.18242026341915E+0001 2.17809339504685E+0001 2.17377524310847E+0001 2.16946579207756E+0001 + 2.16516502644618E+0001 2.16087293072495E+0001 2.15658948944308E+0001 2.15231468714833E+0001 2.14804850840711E+0001 + 2.14379093780441E+0001 2.13954195994385E+0001 2.13530155944775E+0001 2.13106972095703E+0001 2.12684642913133E+0001 + 2.12263166864896E+0001 2.11842542420696E+0001 2.11422768052107E+0001 2.11003842232579E+0001 2.10585763437435E+0001 + 2.10168530143874E+0001 2.09752140830976E+0001 2.09336593979696E+0001 2.08921888072871E+0001 2.08508021595221E+0001 + 2.08094993033348E+0001 2.07682800875737E+0001 2.07271443612760E+0001 2.06860919736675E+0001 2.06451227741627E+0001 + 2.06042366123652E+0001 2.05634333380674E+0001 2.05227128012511E+0001 2.04820748520870E+0001 2.04415193409356E+0001 + 2.04010461183463E+0001 2.03606550350585E+0001 2.03203459420012E+0001 2.02801186902931E+0001 2.02399731312428E+0001 + 2.01999091163489E+0001 2.01599264973001E+0001 2.01200251259752E+0001 2.00802048544434E+0001 2.00404655349640E+0001 + 2.00008070199872E+0001 1.99612291621533E+0001 1.99217318142935E+0001 1.98823148294296E+0001 1.98429780607742E+0001 + 1.98037213617308E+0001 1.97645445858939E+0001 1.97254475870492E+0001 1.96864302191730E+0001 1.96474923364334E+0001 + 1.96086337931894E+0001 1.95698544439914E+0001 1.95311541435814E+0001 1.94925327468926E+0001 1.94539901090500E+0001 + 1.94155260853701E+0001 1.93771405313610E+0001 1.93388333027227E+0001 1.93006042553469E+0001 1.92624532453172E+0001 + 1.92243801289090E+0001 1.91863847625899E+0001 1.91484670030194E+0001 1.91106267070490E+0001 1.90728637317226E+0001 + 1.90351779342759E+0001 1.89975691721371E+0001 1.89600373029267E+0001 1.89225821844573E+0001 1.88852036747340E+0001 + 1.88479016319545E+0001 1.88106759145085E+0001 1.87735263809785E+0001 1.87364528901395E+0001 1.86994553009590E+0001 + 1.86625334725972E+0001 1.86256872644066E+0001 1.85889165359327E+0001 1.85522211469136E+0001 1.85156009572801E+0001 + 1.84790558271556E+0001 1.84425856168565E+0001 1.84061901868920E+0001 1.83698693979636E+0001 1.83336231109664E+0001 + 1.82974511869878E+0001 1.82613534873084E+0001 1.82253298734013E+0001 1.81893802069328E+0001 1.81535043497622E+0001 + 1.81177021639414E+0001 1.80819735117154E+0001 1.80463182555223E+0001 1.80107362579930E+0001 1.79752273819513E+0001 + 1.79397914904140E+0001 1.79044284465910E+0001 1.78691381138852E+0001 1.78339203558921E+0001 1.77987750364006E+0001 + 1.77637020193924E+0001 1.77287011690421E+0001 1.76937723497175E+0001 1.76589154259791E+0001 1.76241302625805E+0001 + 1.75894167244682E+0001 1.75547746767816E+0001 1.75202039848531E+0001 1.74857045142079E+0001 1.74512761305644E+0001 + 1.74169186998334E+0001 1.73826320881190E+0001 1.73484161617179E+0001 1.73142707871197E+0001 1.72801958310069E+0001 + 1.72461911602548E+0001 1.72122566419311E+0001 1.71783921432968E+0001 1.71445975318052E+0001 1.71108726751024E+0001 + 1.70772174410275E+0001 1.70436316976116E+0001 1.70101153130789E+0001 1.69766681558461E+0001 1.69432900945223E+0001 + 1.69099809979092E+0001 1.68767407350009E+0001 1.68435691749841E+0001 1.68104661872379E+0001 1.67774316413334E+0001 + 1.67444654070346E+0001 1.67115673542973E+0001 1.66787373532696E+0001 1.66459752742923E+0001 1.66132809878978E+0001 + 1.65806543648107E+0001 1.65480952759479E+0001 1.65156035924181E+0001 1.64831791855221E+0001 1.64508219267525E+0001 + 1.64185316877940E+0001 1.63863083405227E+0001 1.63541517570070E+0001 1.63220618095065E+0001 1.62900383704728E+0001 + 1.62580813125489E+0001 1.62261905085694E+0001 1.61943658315605E+0001 1.61626071547397E+0001 1.61309143515158E+0001 + 1.60992872954891E+0001 1.60677258604508E+0001 1.60362299203836E+0001 1.60047993494613E+0001 1.59734340220485E+0001 + 1.59421338127009E+0001 1.59108985961652E+0001 1.58797282473789E+0001 1.58486226414700E+0001 1.58175816537576E+0001 + 1.57866051597512E+0001 1.57556930351508E+0001 1.57248451558470E+0001 1.56940613979208E+0001 1.56633416376435E+0001 + 1.56326857514766E+0001 1.56020936160718E+0001 1.55715651082708E+0001 1.55411001051056E+0001 1.55106984837978E+0001 + 1.54803601217591E+0001 1.54500848965906E+0001 1.54198726860836E+0001 1.53897233682185E+0001 1.53596368211656E+0001 + 1.53296129232844E+0001 1.52996515531237E+0001 1.52697525894217E+0001 1.52399159111056E+0001 1.52101413972920E+0001 + 1.51804289272859E+0001 1.51507783805818E+0001 1.51211896368625E+0001 1.50916625759997E+0001 1.50621970780539E+0001 + 1.50327930232736E+0001 1.50034502920963E+0001 1.49741687651473E+0001 1.49449483232405E+0001 1.49157888473777E+0001 + 1.48866902187486E+0001 1.48576523187311E+0001 1.48286750288908E+0001 1.47997582309808E+0001 1.47709018069422E+0001 + 1.47421056389032E+0001 1.47133696091798E+0001 1.46846936002748E+0001 1.46560774948785E+0001 1.46275211758684E+0001 + 1.45990245263085E+0001 1.45705874294501E+0001 1.45422097687310E+0001 1.45138914277758E+0001 1.44856322903953E+0001 + 1.44574322405872E+0001 1.44292911625350E+0001 1.44012089406087E+0001 1.43731854593644E+0001 1.43452206035437E+0001 + 1.43173142580746E+0001 1.42894663080705E+0001 1.42616766388304E+0001 1.42339451358389E+0001 1.42062716847660E+0001 + 1.41786561714666E+0001 1.41510984819812E+0001 1.41235985025349E+0001 1.40961561195378E+0001 1.40687712195850E+0001 + 1.40414436894557E+0001 1.40141734161142E+0001 1.39869602867086E+0001 1.39598041885717E+0001 1.39327050092203E+0001 + 1.39056626363549E+0001 1.38786769578604E+0001 1.38517478618050E+0001 1.38248752364407E+0001 1.37980589702028E+0001 + 1.37712989517103E+0001 1.37445950697651E+0001 1.37179472133523E+0001 1.36913552716399E+0001 1.36648191339787E+0001 + 1.36383386899024E+0001 1.36119138291269E+0001 1.35855444415508E+0001 1.35592304172548E+0001 1.35329716465019E+0001 + 1.35067680197368E+0001 1.34806194275864E+0001 1.34545257608592E+0001 1.34284869105452E+0001 1.34025027678160E+0001 + 1.33765732240242E+0001 1.33506981707040E+0001 1.33248774995703E+0001 1.32991111025190E+0001 1.32733988716267E+0001 + 1.32477406991505E+0001 1.32221364775281E+0001 1.31965860993774E+0001 1.31710894574965E+0001 1.31456464448636E+0001 + 1.31202569546364E+0001 1.30949208801528E+0001 1.30696381149300E+0001 1.30444085526645E+0001 1.30192320872323E+0001 + 1.29941086126885E+0001 1.29690380232671E+0001 1.29440202133807E+0001 1.29190550776211E+0001 1.28941425107581E+0001 + 1.28692824077400E+0001 1.28444746636936E+0001 1.28197191739233E+0001 1.27950158339118E+0001 1.27703645393193E+0001 + 1.27457651859835E+0001 1.27212176699200E+0001 1.26967218873212E+0001 1.26722777345568E+0001 1.26478851081734E+0001 + 1.26235439048947E+0001 1.25992540216205E+0001 1.25750153554277E+0001 1.25508278035692E+0001 1.25266912634740E+0001 + 1.25026056327473E+0001 1.24785708091700E+0001 1.24545866906989E+0001 1.24306531754661E+0001 1.24067701617793E+0001 + 1.23829375481211E+0001 1.23591552331494E+0001 1.23354231156969E+0001 1.23117410947709E+0001 1.22881090695536E+0001 + 1.22645269394011E+0001 1.22409946038440E+0001 1.22175119625870E+0001 1.21940789155085E+0001 1.21706953626608E+0001 + 1.21473612042697E+0001 1.21240763407342E+0001 1.21008406726269E+0001 1.20776541006930E+0001 1.20545165258509E+0001 + 1.20314278491917E+0001 1.20083879719789E+0001 1.19853967956484E+0001 1.19624542218084E+0001 1.19395601522390E+0001 + 1.19167144888923E+0001 1.18939171338919E+0001 1.18711679895331E+0001 1.18484669582826E+0001 1.18258139427779E+0001 + 1.18032088458279E+0001 1.17806515704121E+0001 1.17581420196809E+0001 1.17356800969546E+0001 1.17132657057246E+0001 + 1.16908987496518E+0001 1.16685791325673E+0001 1.16463067584719E+0001 1.16240815315362E+0001 1.16019033560998E+0001 + 1.15797721366721E+0001 1.15576877779310E+0001 1.15356501847238E+0001 1.15136592620661E+0001 1.14917149151422E+0001 + 1.14698170493049E+0001 1.14479655700749E+0001 1.14261603831411E+0001 1.14044013943602E+0001 1.13826885097564E+0001 + 1.13610216355213E+0001 1.13394006780143E+0001 1.13178255437612E+0001 1.12962961394550E+0001 1.12748123719556E+0001 + 1.12533741482893E+0001 1.12319813756488E+0001 1.12106339613928E+0001 1.11893318130463E+0001 1.11680748382999E+0001 + 1.11468629450099E+0001 1.11256960411981E+0001 1.11045740350516E+0001 1.10834968349224E+0001 1.10624643493275E+0001 + 1.10414764869488E+0001 1.10205331566324E+0001 1.09996342673889E+0001 1.09787797283931E+0001 1.09579694489838E+0001 + 1.09372033386633E+0001 1.09164813070980E+0001 1.08958032641172E+0001 1.08751691197137E+0001 1.08545787840434E+0001 + 1.08340321674247E+0001 1.08135291803392E+0001 1.07930697334304E+0001 1.07726537375045E+0001 1.07522811035297E+0001 + 1.07319517426359E+0001 1.07116655661150E+0001 1.06914224854204E+0001 1.06712224121666E+0001 1.06510652581294E+0001 + 1.06309509352457E+0001 1.06108793556129E+0001 1.05908504314892E+0001 1.05708640752931E+0001 1.05509201996033E+0001 + 1.05310187171585E+0001 1.05111595408573E+0001 1.04913425837577E+0001 1.04715677590775E+0001 1.04518349801934E+0001 + 1.04321441606413E+0001 1.04124952141159E+0001 1.03928880544707E+0001 1.03733225957175E+0001 1.03537987520265E+0001 + 1.03343164377259E+0001 1.03148755673019E+0001 1.02954760553982E+0001 1.02761178168163E+0001 1.02568007665147E+0001 + 1.02375248196093E+0001 1.02182898913727E+0001 1.01990958972343E+0001 1.01799427527801E+0001 1.01608303737524E+0001 + 1.01417586760496E+0001 1.01227275757262E+0001 1.01037369889922E+0001 1.00847868322133E+0001 1.00658770219107E+0001 + 1.00470074747606E+0001 1.00281781075941E+0001 1.00093888373972E+0001 9.99063958131067E+0000 9.97193025662920E+0000 + 9.95326078080198E+0000 9.93463107143223E+0000 9.91604104627677E+0000 9.89749062324618E+0000 9.87897972040440E+0000 + 9.86050825596846E+0000 9.84207614830855E+0000 9.82368331594760E+0000 9.80532967756114E+0000 9.78701515197714E+0000 + 9.76873965817579E+0000 9.75050311528928E+0000 9.73230544260160E+0000 9.71414655954840E+0000 9.69602638571677E+0000 + 9.67794484084495E+0000 9.65990184482230E+0000 9.64189731768891E+0000 9.62393117963559E+0000 9.60600335100351E+0000 + 9.58811375228412E+0000 9.57026230411891E+0000 9.55244892729916E+0000 9.53467354276583E+0000 9.51693607160922E+0000 + 9.49923643506903E+0000 9.48157455453388E+0000 9.46395035154121E+0000 9.44636374777723E+0000 9.42881466507640E+0000 + 9.41130302542158E+0000 9.39382875094360E+0000 9.37639176392116E+0000 9.35899198678051E+0000 9.34162934209545E+0000 + 9.32430375258699E+0000 9.30701514112315E+0000 9.28976343071878E+0000 9.27254854453539E+0000 9.25537040588093E+0000 + 9.23822893820962E+0000 9.22112406512163E+0000 9.20405571036306E+0000 9.18702379782555E+0000 9.17002825154627E+0000 + 9.15306899570756E+0000 9.13614595463682E+0000 9.11925905280627E+0000 9.10240821483276E+0000 9.08559336547759E+0000 + 9.06881442964629E+0000 9.05207133238838E+0000 9.03536399889722E+0000 9.01869235450987E+0000 9.00205632470669E+0000 + 8.98545583511135E+0000 8.96889081149054E+0000 8.95236117975373E+0000 8.93586686595304E+0000 8.91940779628302E+0000 + 8.90298389708038E+0000 8.88659509482392E+0000 8.87024131613424E+0000 8.85392248777347E+0000 8.83763853664528E+0000 + 8.82138938979445E+0000 8.80517497440683E+0000 8.78899521780903E+0000 8.77285004746833E+0000 8.75673939099236E+0000 + 8.74066317612897E+0000 8.72462133076598E+0000 8.70861378293110E+0000 8.69264046079155E+0000 8.67670129265400E+0000 + 8.66079620696428E+0000 8.64492513230723E+0000 8.62908799740648E+0000 8.61328473112429E+0000 8.59751526246123E+0000 + 8.58177952055613E+0000 8.56607743468578E+0000 8.55040893426473E+0000 8.53477394884517E+0000 8.51917240811664E+0000 + 8.50360424190586E+0000 8.48806938017655E+0000 8.47256775302913E+0000 8.45709929070073E+0000 8.44166392356478E+0000 + 8.42626158213084E+0000 8.41089219704454E+0000 8.39555569908723E+0000 8.38025201917579E+0000 8.36498108836257E+0000 + 8.34974283783501E+0000 8.33453719891554E+0000 8.31936410306134E+0000 8.30422348186421E+0000 8.28911526705021E+0000 + 8.27403939047967E+0000 8.25899578414683E+0000 8.24398438017968E+0000 8.22900511083983E+0000 8.21405790852215E+0000 + 8.19914270575477E+0000 8.18425943519867E+0000 8.16940802964771E+0000 8.15458842202821E+0000 8.13980054539888E+0000 + 8.12504433295058E+0000 8.11031971800613E+0000 8.09562663402008E+0000 8.08096501457857E+0000 8.06633479339906E+0000 + 8.05173590433019E+0000 8.03716828135153E+0000 8.02263185857341E+0000 8.00812657023669E+0000 7.99365235071261E+0000 + 7.97920913450259E+0000 7.96479685623787E+0000 7.95041545067965E+0000 7.93606485271847E+0000 7.92174499737435E+0000 + 7.90745581979645E+0000 7.89319725526287E+0000 7.87896923918038E+0000 7.86477170708446E+0000 7.85060459463880E+0000 + 7.83646783763537E+0000 7.82236137199397E+0000 7.80828513376226E+0000 7.79423905911539E+0000 7.78022308435590E+0000 + 7.76623714591346E+0000 7.75228118034475E+0000 7.73835512433317E+0000 7.72445891468871E+0000 7.71059248834770E+0000 + 7.69675578237260E+0000 7.68294873395195E+0000 7.66917128039999E+0000 7.65542335915644E+0000 7.64170490778660E+0000 + 7.62801586398076E+0000 7.61435616555425E+0000 7.60072575044720E+0000 7.58712455672428E+0000 7.57355252257462E+0000 + 7.56000958631142E+0000 7.54649568637196E+0000 7.53301076131727E+0000 7.51955474983196E+0000 7.50612759072407E+0000 + 7.49272922292484E+0000 7.47935958548849E+0000 7.46601861759204E+0000 7.45270625853514E+0000 7.43942244773984E+0000 + 7.42616712475039E+0000 7.41294022923311E+0000 7.39974170097607E+0000 7.38657147988901E+0000 7.37342950600311E+0000 + 7.36031571947074E+0000 7.34723006056537E+0000 7.33417246968122E+0000 7.32114288733324E+0000 7.30814125415681E+0000 + 7.29516751090756E+0000 7.28222159846116E+0000 7.26930345781317E+0000 7.25641303007879E+0000 7.24355025649275E+0000 + 7.23071507840902E+0000 7.21790743730064E+0000 7.20512727475958E+0000 7.19237453249651E+0000 7.17964915234051E+0000 + 7.16695107623910E+0000 7.15428024625783E+0000 7.14163660458020E+0000 7.12902009350744E+0000 7.11643065545826E+0000 + 7.10386823296878E+0000 7.09133276869222E+0000 7.07882420539876E+0000 7.06634248597536E+0000 7.05388755342553E+0000 + 7.04145935086915E+0000 7.02905782154225E+0000 7.01668290879692E+0000 7.00433455610101E+0000 6.99201270703795E+0000 + 6.97971730530660E+0000 6.96744829472103E+0000 6.95520561921037E+0000 6.94298922281852E+0000 6.93079904970411E+0000 + 6.91863504414014E+0000 6.90649715051391E+0000 6.89438531332679E+0000 6.88229947719402E+0000 6.87023958684454E+0000 + 6.85820558712076E+0000 6.84619742297842E+0000 6.83421503948637E+0000 6.82225838182637E+0000 6.81032739529294E+0000 + 6.79842202529313E+0000 6.78654221734636E+0000 6.77468791708420E+0000 6.76285907025019E+0000 6.75105562269966E+0000 + 6.73927752039958E+0000 6.72752470942826E+0000 6.71579713597527E+0000 6.70409474634121E+0000 6.69241748693752E+0000 + 6.68076530428628E+0000 6.66913814502006E+0000 6.65753595588167E+0000 6.64595868372404E+0000 6.63440627551003E+0000 + 6.62287867831212E+0000 6.61137583931239E+0000 6.59989770580227E+0000 6.58844422518228E+0000 6.57701534496199E+0000 + 6.56561101275966E+0000 6.55423117630221E+0000 6.54287578342490E+0000 6.53154478207126E+0000 6.52023812029283E+0000 + 6.50895574624903E+0000 6.49769760820693E+0000 6.48646365454100E+0000 6.47525383373311E+0000 6.46406809437216E+0000 + 6.45290638515401E+0000 6.44176865488125E+0000 6.43065485246299E+0000 6.41956492691474E+0000 6.40849882735816E+0000 + 6.39745650302092E+0000 6.38643790323654E+0000 6.37544297744411E+0000 6.36447167518819E+0000 6.35352394611860E+0000 + 6.34259973999023E+0000 6.33169900666289E+0000 6.32082169610107E+0000 6.30996775837382E+0000 6.29913714365451E+0000 + 6.28832980222068E+0000 6.27754568445385E+0000 6.26678474083935E+0000 6.25604692196615E+0000 6.24533217852660E+0000 + 6.23464046131633E+0000 6.22397172123405E+0000 6.21332590928137E+0000 6.20270297656257E+0000 6.19210287428453E+0000 + 6.18152555375641E+0000 6.17097096638955E+0000 6.16043906369731E+0000 6.14992979729486E+0000 6.13944311889895E+0000 + 6.12897898032784E+0000 6.11853733350100E+0000 6.10811813043902E+0000 6.09772132326342E+0000 6.08734686419643E+0000 + 6.07699470556083E+0000 6.06666479977976E+0000 6.05635709937662E+0000 6.04607155697472E+0000 6.03580812529734E+0000 + 6.02556675716731E+0000 6.01534740550700E+0000 6.00515002333811E+0000 5.99497456378138E+0000 5.98482098005661E+0000 + 5.97468922548230E+0000 5.96457925347557E+0000 5.95449101755202E+0000 5.94442447132538E+0000 5.93437956850757E+0000 + 5.92435626290832E+0000 5.91435450843511E+0000 5.90437425909300E+0000 5.89441546898432E+0000 5.88447809230872E+0000 + 5.87456208336277E+0000 5.86466739653994E+0000 5.85479398633033E+0000 5.84494180732057E+0000 5.83511081419359E+0000 + 5.82530096172847E+0000 5.81551220480026E+0000 5.80574449837982E+0000 5.79599779753366E+0000 5.78627205742370E+0000 + 5.77656723330714E+0000 5.76688328053631E+0000 5.75722015455851E+0000 5.74757781091572E+0000 5.73795620524460E+0000 + 5.72835529327615E+0000 5.71877503083569E+0000 5.70921537384254E+0000 5.69967627831002E+0000 5.69015770034509E+0000 + 5.68065959614834E+0000 5.67118192201373E+0000 5.66172463432844E+0000 5.65228768957269E+0000 5.64287104431958E+0000 + 5.63347465523501E+0000 5.62409847907728E+0000 5.61474247269718E+0000 5.60540659303765E+0000 5.59609079713367E+0000 + 5.58679504211210E+0000 5.57751928519148E+0000 5.56826348368191E+0000 5.55902759498484E+0000 5.54981157659288E+0000 + 5.54061538608969E+0000 5.53143898114982E+0000 5.52228231953850E+0000 5.51314535911143E+0000 5.50402805781470E+0000 + 5.49493037368465E+0000 5.48585226484755E+0000 5.47679368951957E+0000 5.46775460600661E+0000 5.45873497270401E+0000 + 5.44973474809655E+0000 5.44075389075817E+0000 5.43179235935186E+0000 5.42285011262943E+0000 5.41392710943143E+0000 + 5.40502330868697E+0000 5.39613866941346E+0000 5.38727315071660E+0000 5.37842671179006E+0000 5.36959931191542E+0000 + 5.36079091046199E+0000 5.35200146688663E+0000 5.34323094073357E+0000 5.33447929163428E+0000 5.32574647930732E+0000 + 5.31703246355810E+0000 5.30833720427881E+0000 5.29966066144821E+0000 5.29100279513148E+0000 5.28236356548005E+0000 + 5.27374293273145E+0000 5.26514085720909E+0000 5.25655729932226E+0000 5.24799221956578E+0000 5.23944557851995E+0000 + 5.23091733685033E+0000 5.22240745530765E+0000 5.21391589472761E+0000 5.20544261603069E+0000 5.19698758022203E+0000 + 5.18855074839131E+0000 5.18013208171247E+0000 5.17173154144367E+0000 5.16334908892709E+0000 5.15498468558878E+0000 + 5.14663829293842E+0000 5.13830987256931E+0000 5.12999938615809E+0000 5.12170679546470E+0000 5.11343206233203E+0000 + 5.10517514868600E+0000 5.09693601653521E+0000 5.08871462797091E+0000 5.08051094516674E+0000 5.07232493037872E+0000 + 5.06415654594487E+0000 5.05600575428533E+0000 5.04787251790195E+0000 5.03975679937833E+0000 5.03165856137952E+0000 + 5.02357776665191E+0000 5.01551437802322E+0000 5.00746835840206E+0000 4.99943967077800E+0000 4.99142827822139E+0000 + 4.98343414388313E+0000 4.97545723099453E+0000 4.96749750286720E+0000 4.95955492289290E+0000 4.95162945454334E+0000 + 4.94372106137005E+0000 4.93582970700423E+0000 4.92795535515663E+0000 4.92009796961731E+0000 4.91225751425558E+0000 + 4.90443395301981E+0000 4.89662724993728E+0000 4.88883736911401E+0000 4.88106427473467E+0000 4.87330793106235E+0000 + 4.86556830243846E+0000 4.85784535328257E+0000 4.85013904809229E+0000 4.84244935144304E+0000 4.83477622798797E+0000 + 4.82711964245782E+0000 4.81947955966067E+0000 4.81185594448192E+0000 4.80424876188410E+0000 4.79665797690665E+0000 + 4.78908355466586E+0000 4.78152546035470E+0000 4.77398365924264E+0000 4.76645811667552E+0000 4.75894879807545E+0000 + 4.75145566894057E+0000 4.74397869484499E+0000 4.73651784143859E+0000 4.72907307444692E+0000 4.72164435967097E+0000 + 4.71423166298715E+0000 4.70683495034701E+0000 4.69945418777721E+0000 4.69208934137926E+0000 4.68474037732952E+0000 + 4.67740726187890E+0000 4.67008996135286E+0000 4.66278844215116E+0000 4.65550267074770E+0000 4.64823261369051E+0000 + 4.64097823760150E+0000 4.63373950917629E+0000 4.62651639518422E+0000 4.61930886246799E+0000 4.61211687794372E+0000 + 4.60494040860066E+0000 4.59777942150115E+0000 4.59063388378038E+0000 4.58350376264640E+0000 4.57638902537976E+0000 + 4.56928963933358E+0000 4.56220557193327E+0000 4.55513679067650E+0000 4.54808326313293E+0000 4.54104495694415E+0000 + 4.53402183982353E+0000 4.52701387955612E+0000 4.52002104399843E+0000 4.51304330107831E+0000 4.50608061879484E+0000 + 4.49913296521822E+0000 4.49220030848954E+0000 4.48528261682070E+0000 4.47837985849427E+0000 4.47149200186336E+0000 + 4.46461901535146E+0000 4.45776086745228E+0000 4.45091752672966E+0000 4.44408896181743E+0000 4.43727514141924E+0000 + 4.43047603430843E+0000 4.42369160932794E+0000 4.41692183539009E+0000 4.41016668147654E+0000 4.40342611663803E+0000 + 4.39670010999440E+0000 4.38998863073434E+0000 4.38329164811531E+0000 4.37660913146332E+0000 4.36994105017290E+0000 + 4.36328737370693E+0000 4.35664807159650E+0000 4.35002311344076E+0000 4.34341246890680E+0000 4.33681610772951E+0000 + 4.33023399971150E+0000 4.32366611472286E+0000 4.31711242270111E+0000 4.31057289365105E+0000 4.30404749764462E+0000 + 4.29753620482076E+0000 4.29103898538530E+0000 4.28455580961079E+0000 4.27808664783642E+0000 4.27163147046785E+0000 + 4.26519024797709E+0000 4.25876295090236E+0000 4.25234954984799E+0000 4.24595001548425E+0000 4.23956431854725E+0000 + 4.23319242983875E+0000 4.22683432022615E+0000 4.22048996064222E+0000 4.21415932208510E+0000 4.20784237561804E+0000 + 4.20153909236941E+0000 4.19524944353243E+0000 4.18897340036515E+0000 4.18271093419028E+0000 4.17646201639507E+0000 + 4.17022661843116E+0000 4.16400471181447E+0000 4.15779626812508E+0000 4.15160125900708E+0000 4.14541965616849E+0000 + 4.13925143138104E+0000 4.13309655648016E+0000 4.12695500336477E+0000 4.12082674399719E+0000 4.11471175040299E+0000 + 4.10860999467088E+0000 4.10252144895260E+0000 4.09644608546276E+0000 4.09038387647872E+0000 4.08433479434053E+0000 + 4.07829881145071E+0000 4.07227590027413E+0000 4.06626603333801E+0000 4.06026918323165E+0000 4.05428532260640E+0000 + 4.04831442417543E+0000 4.04235646071380E+0000 4.03641140505812E+0000 4.03047923010654E+0000 4.02455990881862E+0000 + 4.01865341421519E+0000 4.01275971937827E+0000 4.00687879745082E+0000 4.00101062163684E+0000 3.99515516520103E+0000 + 3.98931240146876E+0000 3.98348230382598E+0000 3.97766484571905E+0000 3.97186000065462E+0000 3.96606774219955E+0000 + 3.96028804398073E+0000 3.95452087968504E+0000 3.94876622305913E+0000 3.94302404790942E+0000 3.93729432810182E+0000 + 3.93157703756178E+0000 3.92587215027410E+0000 3.92017964028273E+0000 3.91449948169081E+0000 3.90883164866042E+0000 + 3.90317611541254E+0000 3.89753285622688E+0000 3.89190184544180E+0000 3.88628305745418E+0000 3.88067646671928E+0000 + 3.87508204775068E+0000 3.86949977512006E+0000 3.86392962345723E+0000 3.85837156744988E+0000 3.85282467439297E+0000 + 3.84728110918344E+0000 3.84173908469871E+0000 3.83619861802066E+0000 3.83065972624502E+0000 3.82512242648142E+0000 + 3.81958673585334E+0000 3.81405267149812E+0000 3.80852025056699E+0000 3.80298949022501E+0000 3.79746040765114E+0000 + 3.79193302003821E+0000 3.78640734459291E+0000 3.78088339853577E+0000 3.77536119910124E+0000 3.76984076353759E+0000 + 3.76432210910699E+0000 3.75880525308546E+0000 3.75329021276291E+0000 3.74777700544308E+0000 3.74226564844361E+0000 + 3.73675615909599E+0000 3.73124855474559E+0000 3.72574285275165E+0000 3.72023907048726E+0000 3.71473722533940E+0000 + 3.70923733470889E+0000 3.70373941601044E+0000 3.69824348667262E+0000 3.69274956413788E+0000 3.68725766586252E+0000 + 3.68176780931672E+0000 3.67628001198451E+0000 3.67079429136382E+0000 3.66531066496641E+0000 3.65982915031794E+0000 + 3.65434976495791E+0000 3.64887252643971E+0000 3.64339745233059E+0000 3.63792456021167E+0000 3.63245386767794E+0000 + 3.62698539233823E+0000 3.62151915181528E+0000 3.61605516374567E+0000 3.61059344577987E+0000 3.60513401558218E+0000 + 3.59967689083082E+0000 3.59422208921783E+0000 3.58876962844915E+0000 3.58331952624456E+0000 3.57787180033773E+0000 + 3.57242646847620E+0000 3.56698354842136E+0000 3.56154305794847E+0000 3.55610501484668E+0000 3.55066943691898E+0000 + 3.54523634198225E+0000 3.53980574786721E+0000 3.53437767241848E+0000 3.52895213349454E+0000 3.52352914896770E+0000 + 3.51810873672420E+0000 3.51269091466411E+0000 3.50727570070136E+0000 3.50186311276378E+0000 3.49645316879304E+0000 + 3.49104588674468E+0000 3.48564128458814E+0000 3.48023938030668E+0000 3.47484019189745E+0000 3.46944373737149E+0000 + 3.46405003475367E+0000 3.45865910208275E+0000 3.45327095741134E+0000 3.44788561880595E+0000 3.44250310434693E+0000 + 3.43712343212850E+0000 3.43174662025876E+0000 3.42637268685966E+0000 3.42100165006705E+0000 3.41563352803060E+0000 + 3.41026833891389E+0000 3.40490610089436E+0000 3.39954683216329E+0000 3.39419055092586E+0000 3.38883727540111E+0000 + 3.38348702382193E+0000 3.37813981443509E+0000 3.37279566550125E+0000 3.36745459529490E+0000 3.36211662210442E+0000 + 3.35678176423205E+0000 3.35145003999390E+0000 3.34612146771994E+0000 3.34079606575404E+0000 3.33547385245389E+0000 + 3.33015484619108E+0000 3.32483906535105E+0000 3.31952652833313E+0000 3.31421725355050E+0000 3.30891125943021E+0000 + 3.30360856441318E+0000 3.29830918695420E+0000 3.29301314552193E+0000 3.28772045859888E+0000 3.28243114468146E+0000 + 3.27714522227991E+0000 3.27186270991838E+0000 3.26658362613484E+0000 3.26130798948116E+0000 3.25603581852308E+0000 + 3.25076713184019E+0000 3.24550194802596E+0000 3.24024028568772E+0000 3.23498216344667E+0000 3.22972759993788E+0000 + 3.22447661381030E+0000 3.21922922372671E+0000 3.21398544836380E+0000 3.20874530641211E+0000 3.20350881657604E+0000 + 3.19827599757387E+0000 3.19304686813775E+0000 3.18782144701368E+0000 3.18259975296155E+0000 3.17738180475510E+0000 + 3.17216762118193E+0000 3.16695722104356E+0000 3.16175062315531E+0000 3.15654784634641E+0000 3.15134890945995E+0000 + 3.14615383135286E+0000 3.14096263089600E+0000 3.13577532697403E+0000 3.13059193848551E+0000 3.12541248434288E+0000 + 3.12023698347242E+0000 3.11506545481429E+0000 3.10989791732252E+0000 3.10473438996501E+0000 3.09957489172353E+0000 + 3.09441944159370E+0000 3.08926805858502E+0000 3.08412076172086E+0000 3.07897757003846E+0000 3.07383850258891E+0000 + 3.06870357843719E+0000 3.06357281666215E+0000 3.05844623635647E+0000 3.05332385662674E+0000 3.04820569659339E+0000 + 3.04309177539076E+0000 3.03798211216699E+0000 3.03287672608414E+0000 3.02777563631813E+0000 3.02267886205873E+0000 + 3.01758642250959E+0000 3.01249833688824E+0000 3.00741462442604E+0000 3.00233530436826E+0000 2.99726039597402E+0000 + 2.99218991851629E+0000 2.98712389128195E+0000 2.98206233357170E+0000 2.97700526470014E+0000 2.97195270399574E+0000 + 2.96690467080081E+0000 2.96186118447155E+0000 2.95682226437802E+0000 2.95178792990415E+0000 2.94675820044774E+0000 + 2.94173309542045E+0000 2.93671263424782E+0000 2.93169683636925E+0000 2.92668572123801E+0000 2.92167930832122E+0000 + 2.91667761709990E+0000 2.91168066706893E+0000 2.90668847773703E+0000 2.90170106862682E+0000 2.89671845927477E+0000 + 2.89174066923122E+0000 2.88676771806039E+0000 2.88179962534036E+0000 2.87683641066306E+0000 2.87187809363433E+0000 + 2.86692469387382E+0000 2.86197623101511E+0000 2.85703272470559E+0000 2.85209419460657E+0000 2.84716066039320E+0000 + 2.84223214175449E+0000 2.83730865839332E+0000 2.83239023002647E+0000 2.82747687638455E+0000 2.82256861721206E+0000 + 2.81766547226736E+0000 2.81276746132267E+0000 2.80787460416408E+0000 2.80298692059157E+0000 2.79810443041897E+0000 + 2.79322715347397E+0000 2.78835510959813E+0000 2.78348831864690E+0000 2.77862680048957E+0000 2.77377057500933E+0000 + 2.76891966210319E+0000 2.76407408168207E+0000 2.75923385367075E+0000 2.75439899800786E+0000 2.74956953464591E+0000 + 2.74474548355128E+0000 2.73992686470422E+0000 2.73511369809883E+0000 2.73030600374310E+0000 2.72550380165887E+0000 + 2.72070711188186E+0000 2.71591595446166E+0000 2.71113034946171E+0000 2.70635031695933E+0000 2.70157587704571E+0000 + 2.69680704982591E+0000 2.69204385541885E+0000 2.68728631395731E+0000 2.68253444558796E+0000 2.67778827047132E+0000 + 2.67304780878179E+0000 2.66831308070762E+0000 2.66358410645095E+0000 2.65886090622777E+0000 2.65414350026794E+0000 + 2.64943190881521E+0000 2.64472615212716E+0000 2.64002625047527E+0000 2.63533222414488E+0000 2.63064409343518E+0000 + 2.62596187865925E+0000 2.62128560014403E+0000 2.61661527823033E+0000 2.61195093327281E+0000 2.60729258564003E+0000 + 2.60264025571438E+0000 2.59799396389216E+0000 2.59335373058350E+0000 2.58871957621243E+0000 2.58409152121681E+0000 + 2.57946958604841E+0000 2.57485379117283E+0000 2.57024415706957E+0000 2.56564070423197E+0000 2.56104345316726E+0000 + 2.55645242439653E+0000 2.55186763845472E+0000 2.54728911589066E+0000 2.54271687726706E+0000 2.53815094316045E+0000 + 2.53359133416128E+0000 2.52903807087384E+0000 2.52449117391628E+0000 2.51995066392065E+0000 2.51541656153283E+0000 + 2.51088888741260E+0000 2.50636766223359E+0000 2.50185290668329E+0000 2.49734464146309E+0000 2.49284288728821E+0000 + 2.48834766488777E+0000 2.48385899500472E+0000 2.47937689839593E+0000 2.47490139583208E+0000 2.47043250809777E+0000 + 2.46597025599143E+0000 2.46151466032538E+0000 2.45706574192579E+0000 2.45262352163271E+0000 2.44818802030006E+0000 + 2.44375925879562E+0000 2.43933725800104E+0000 2.43492203881184E+0000 2.43051362213741E+0000 2.42611202890099E+0000 + 2.42171728003972E+0000 2.41732939650458E+0000 2.41294839926042E+0000 2.40857430928599E+0000 2.40420714757385E+0000 + 2.39984693513048E+0000 2.39549369297621E+0000 2.39114744214523E+0000 2.38680820368561E+0000 2.38247599865928E+0000 + 2.37815084814203E+0000 2.37383277322354E+0000 2.36952179500734E+0000 2.36521793461083E+0000 2.36092121316530E+0000 + 2.35663165181585E+0000 2.35234927172152E+0000 2.34807409405518E+0000 2.34380614000356E+0000 2.33954543076728E+0000 + 2.33529198756081E+0000 2.33104583161249E+0000 2.32680698416455E+0000 2.32257546647306E+0000 2.31835129980798E+0000 + 2.31413450545311E+0000 2.30992510470614E+0000 2.30572311887863E+0000 2.30152856929599E+0000 2.29734147729751E+0000 + 2.29316186423635E+0000 2.28898975147953E+0000 2.28482516040794E+0000 2.28066811241634E+0000 2.27651862891336E+0000 + 2.27237673132149E+0000 2.26824244107709E+0000 2.26411577963040E+0000 2.25999676844550E+0000 2.25588542900037E+0000 + 2.25178178278684E+0000 2.24768585131062E+0000 2.24359765609126E+0000 2.23951721866220E+0000 2.23544456057076E+0000 + 2.23137970337811E+0000 2.22732266865927E+0000 2.22327347800317E+0000 2.21923215301257E+0000 2.21519871530412E+0000 + 2.21117318650833E+0000 2.20715558826958E+0000 2.20314594224613E+0000 2.19914427011007E+0000 2.19515059354739E+0000 + 2.19116493425794E+0000 2.18718731395546E+0000 2.18321775436750E+0000 2.17925627723554E+0000 2.17530290431489E+0000 + 2.17135765737473E+0000 2.16742055819814E+0000 2.16349162858203E+0000 2.15957089033720E+0000 2.15565836528830E+0000 + 2.15175407527386E+0000 2.14785804214628E+0000 2.14397028777182E+0000 2.14009083403062E+0000 2.13621970281667E+0000 + 2.13235691603784E+0000 2.12850249561586E+0000 2.12465646348634E+0000 2.12081884159875E+0000 2.11698965191642E+0000 + 2.11316891641657E+0000 2.10935665709025E+0000 2.10555289594243E+0000 2.10175765499190E+0000 2.09797095627134E+0000 + 2.09419282182730E+0000 2.09042327372019E+0000 2.08666233402429E+0000 2.08291002482775E+0000 2.07916636823257E+0000 + 2.07543138635467E+0000 2.07170510132377E+0000 2.06798753528349E+0000 2.06427871039133E+0000 2.06057864881864E+0000 + 2.05688737275065E+0000 2.05320490438644E+0000 2.04953126593897E+0000 2.04586647963507E+0000 2.04221056771543E+0000 + 2.03856355243461E+0000 2.03492545605962E+0000 2.03129629159125E+0000 2.02767604068693E+0000 2.02406467836620E+0000 + 2.02046217961697E+0000 2.01686851939552E+0000 2.01328367262648E+0000 2.00970761420285E+0000 2.00614031898600E+0000 + 2.00258176180566E+0000 1.99903191745994E+0000 1.99549076071530E+0000 1.99195826630657E+0000 1.98843440893693E+0000 + 1.98491916327795E+0000 1.98141250396956E+0000 1.97791440562005E+0000 1.97442484280606E+0000 1.97094379007262E+0000 + 1.96747122193311E+0000 1.96400711286930E+0000 1.96055143733128E+0000 1.95710416973755E+0000 1.95366528447494E+0000 + 1.95023475589868E+0000 1.94681255833233E+0000 1.94339866606784E+0000 1.93999305336551E+0000 1.93659569445402E+0000 + 1.93320656353041E+0000 1.92982563476008E+0000 1.92645288227679E+0000 1.92308828018268E+0000 1.91973180254824E+0000 + 1.91638342341235E+0000 1.91304311678223E+0000 1.90971085663346E+0000 1.90638661691003E+0000 1.90307037152424E+0000 + 1.89976209435678E+0000 1.89646175925672E+0000 1.89316934004146E+0000 1.88988481049680E+0000 1.88660814437688E+0000 + 1.88333931540423E+0000 1.88007829726972E+0000 1.87682506363259E+0000 1.87357958812047E+0000 1.87034184432932E+0000 + 1.86711180582349E+0000 1.86388944613568E+0000 1.86067473876697E+0000 1.85746765718679E+0000 1.85426817483295E+0000 + 1.85107626511161E+0000 1.84789190139730E+0000 1.84471505703293E+0000 1.84154570532975E+0000 1.83838381956740E+0000 + 1.83522937299387E+0000 1.83208233882551E+0000 1.82894269024706E+0000 1.82581040041160E+0000 1.82268544244058E+0000 + 1.81956778942382E+0000 1.81645741441952E+0000 1.81335429045421E+0000 1.81025839052282E+0000 1.80716968758863E+0000 + 1.80408815458327E+0000 1.80101376440677E+0000 1.79794648992749E+0000 1.79488630398219E+0000 1.79183317937595E+0000 + 1.78878708888226E+0000 1.78574800524296E+0000 1.78271590116825E+0000 1.77969074933669E+0000 1.77667252239521E+0000 + 1.77366119295911E+0000 1.77065673361206E+0000 1.76765911690609E+0000 1.76466831536158E+0000 1.76168430146730E+0000 + 1.75870704768037E+0000 1.75573652642627E+0000 1.75277271009887E+0000 1.74981557106038E+0000 1.74686508164139E+0000 + 1.74392121414084E+0000 1.74098394082605E+0000 1.73805323393270E+0000 1.73512906566484E+0000 1.73221140819488E+0000 + 1.72930023366359E+0000 1.72639551418012E+0000 1.72349722182196E+0000 1.72060532863499E+0000 1.71771980663345E+0000 + 1.71484062779995E+0000 1.71196776408543E+0000 1.70910118740925E+0000 1.70624086965909E+0000 1.70338678269102E+0000 + 1.70053889832947E+0000 1.69769718836722E+0000 1.69486162456545E+0000 1.69203217865366E+0000 1.68920882232975E+0000 + 1.68639152725998E+0000 1.68358026507896E+0000 1.68077500738968E+0000 1.67797572576348E+0000 1.67518239174007E+0000 + 1.67239497682756E+0000 1.66961345250237E+0000 1.66683779020931E+0000 1.66406796136156E+0000 1.66130393734066E+0000 + 1.65854568949653E+0000 1.65579318914742E+0000 1.65304640757997E+0000 1.65030531604920E+0000 1.64756988577845E+0000 + 1.64484008795947E+0000 1.64211589375235E+0000 1.63939727428555E+0000 1.63668420065591E+0000 1.63397664392861E+0000 + 1.63127457513721E+0000 1.62857796528364E+0000 1.62588678533819E+0000 1.62320100623949E+0000 1.62052059889459E+0000 + 1.61784553417885E+0000 1.61517578293604E+0000 1.61251131597825E+0000 1.60985210408598E+0000 1.60719811800807E+0000 + 1.60454932846172E+0000 1.60190570613252E+0000 1.59926722167439E+0000 1.59663384570966E+0000 1.59400554882899E+0000 + 1.59138230159141E+0000 1.58876407452433E+0000 1.58615083812350E+0000 1.58354256285308E+0000 1.58093921914555E+0000 + 1.57834077740176E+0000 1.57574720799096E+0000 1.57315848125073E+0000 1.57057456748703E+0000 1.56799543697418E+0000 + 1.56542105995488E+0000 1.56285140664017E+0000 1.56028644720947E+0000 1.55772615181056E+0000 1.55517049055960E+0000 + 1.55261943354110E+0000 1.55007295080794E+0000 1.54753101238136E+0000 1.54499358825098E+0000 1.54246064837476E+0000 + 1.53993216267905E+0000 1.53740810105855E+0000 1.53488843337633E+0000 1.53237312946383E+0000 1.52986215912085E+0000 + 1.52735549211556E+0000 1.52485309818448E+0000 1.52235494703252E+0000 1.51986100833293E+0000 1.51737125172734E+0000 + 1.51488564682575E+0000 1.51240416320650E+0000 1.50992677041633E+0000 1.50745343797033E+0000 1.50498413535194E+0000 + 1.50251883201297E+0000 1.50005749737363E+0000 1.49760010082245E+0000 1.49514661171635E+0000 1.49269699938060E+0000 + 1.49025123310885E+0000 1.48780928216312E+0000 1.48537111577377E+0000 1.48293670313955E+0000 1.48050601342755E+0000 + 1.47807901598121E+0000 1.47565568939487E+0000 1.47323602504290E+0000 1.47082001522334E+0000 1.46840765222400E+0000 + 1.46599892832244E+0000 1.46359383578600E+0000 1.46119236687181E+0000 1.45879451382670E+0000 1.45640026888734E+0000 + 1.45400962428011E+0000 1.45162257222119E+0000 1.44923910491649E+0000 1.44685921456173E+0000 1.44448289334237E+0000 + 1.44211013343363E+0000 1.43974092700050E+0000 1.43737526619775E+0000 1.43501314316990E+0000 1.43265455005124E+0000 + 1.43029947896583E+0000 1.42794792202749E+0000 1.42559987133980E+0000 1.42325531899611E+0000 1.42091425707955E+0000 + 1.41857667766300E+0000 1.41624257280911E+0000 1.41391193457029E+0000 1.41158475498871E+0000 1.40926102609634E+0000 + 1.40694073991486E+0000 1.40462388845578E+0000 1.40231046372031E+0000 1.40000045769948E+0000 1.39769386237405E+0000 + 1.39539066971457E+0000 1.39309087168133E+0000 1.39079446022440E+0000 1.38850142728363E+0000 1.38621176478861E+0000 + 1.38392546465870E+0000 1.38164251880304E+0000 1.37936291912053E+0000 1.37708665749982E+0000 1.37481372581935E+0000 + 1.37254411594730E+0000 1.37027781974164E+0000 1.36801482905009E+0000 1.36575513571014E+0000 1.36349873154905E+0000 + 1.36124560838382E+0000 1.35899575802127E+0000 1.35674917225792E+0000 1.35450584288011E+0000 1.35226576166391E+0000 + 1.35002892037518E+0000 1.34779531076951E+0000 1.34556492459231E+0000 1.34333775357870E+0000 1.34111378945361E+0000 + 1.33889302393170E+0000 1.33667544871741E+0000 1.33446105550496E+0000 1.33224983597831E+0000 1.33004178181121E+0000 + 1.32783688466716E+0000 1.32563513619942E+0000 1.32343652805102E+0000 1.32124105185478E+0000 1.31904869923326E+0000 + 1.31685946179877E+0000 1.31467333115343E+0000 1.31249029888909E+0000 1.31031035658738E+0000 1.30813349581969E+0000 + 1.30595970814719E+0000 1.30378898512079E+0000 1.30162131828118E+0000 1.29945669915882E+0000 1.29729511927393E+0000 + 1.29513657013649E+0000 1.29298104324626E+0000 1.29082853009275E+0000 1.28867902215525E+0000 1.28653251090279E+0000 + 1.28438898779421E+0000 1.28224844427806E+0000 1.28011087179271E+0000 1.27797626176625E+0000 1.27584460561656E+0000 + 1.27371589475129E+0000 1.27159012056784E+0000 1.26946727445337E+0000 1.26734734778484E+0000 1.26523033192894E+0000 + 1.26311621824213E+0000 1.26100499807066E+0000 1.25889666275053E+0000 1.25679120360749E+0000 1.25468861195707E+0000 + 1.25258887910458E+0000 1.25049199634507E+0000 1.24839795496337E+0000 1.24630674623408E+0000 1.24421836142154E+0000 + 1.24213279177989E+0000 1.24005002855301E+0000 1.23797006297456E+0000 1.23589288626795E+0000 1.23381848964637E+0000 + 1.23174686431277E+0000 1.22967800145987E+0000 1.22761189227015E+0000 1.22554852791586E+0000 1.22348789955901E+0000 + 1.22142999835137E+0000 1.21937481543450E+0000 1.21732234193969E+0000 1.21527256898802E+0000 1.21322548769035E+0000 + 1.21118108914726E+0000 1.20913936444914E+0000 1.20710030467611E+0000 1.20506390089808E+0000 1.20303014417472E+0000 + 1.20099902555546E+0000 1.19897053607950E+0000 1.19694466677581E+0000 1.19492140866311E+0000 1.19290075274989E+0000 + 1.19088269003443E+0000 1.18886721150474E+0000 1.18685430813862E+0000 1.18484397090362E+0000 1.18283619075707E+0000 + 1.18083095864605E+0000 1.17882826550742E+0000 1.17682810226780E+0000 1.17483045984357E+0000 1.17283532914088E+0000 + 1.17084270105565E+0000 1.16885256647356E+0000 1.16686491627005E+0000 1.16487974131034E+0000 1.16289703244940E+0000 + 1.16091678053199E+0000 1.15893897639260E+0000 1.15696361085551E+0000 1.15499067473476E+0000 1.15302015883416E+0000 + 1.15105205394727E+0000 1.14908635085744E+0000 1.14712304033776E+0000 1.14516211315110E+0000 1.14320356005009E+0000 + 1.14124737177714E+0000 1.13929353906439E+0000 1.13734205263380E+0000 1.13539290319704E+0000 1.13344608145559E+0000 + 1.13150157810065E+0000 1.12955938381323E+0000 1.12761948926409E+0000 1.12568188511374E+0000 1.12374656201247E+0000 + 1.12181351060033E+0000 1.11988272150715E+0000 1.11795418535251E+0000 1.11602789274575E+0000 1.11410383428600E+0000 + 1.11218200056213E+0000 1.11026238215278E+0000 1.10834496962638E+0000 1.10642975354109E+0000 1.10451672444487E+0000 + 1.10260587287541E+0000 1.10069718936020E+0000 1.09879066441646E+0000 1.09688628855121E+0000 1.09498405226121E+0000 + 1.09308394603301E+0000 1.09118596034290E+0000 1.08929008565694E+0000 1.08739631243098E+0000 1.08550463111061E+0000 + 1.08361503213118E+0000 1.08172750591784E+0000 1.07984204288547E+0000 1.07795863343873E+0000 1.07607726861821E+0000 + 1.07419794617127E+0000 1.07232066782494E+0000 1.07044543535834E+0000 1.06857225055041E+0000 1.06670111517993E+0000 + 1.06483203102550E+0000 1.06296499986555E+0000 1.06110002347833E+0000 1.05923710364195E+0000 1.05737624213432E+0000 + 1.05551744073320E+0000 1.05366070121615E+0000 1.05180602536060E+0000 1.04995341494377E+0000 1.04810287174275E+0000 + 1.04625439753441E+0000 1.04440799409550E+0000 1.04256366320257E+0000 1.04072140663201E+0000 1.03888122616002E+0000 + 1.03704312356267E+0000 1.03520710061582E+0000 1.03337315909517E+0000 1.03154130077627E+0000 1.02971152743447E+0000 + 1.02788384084497E+0000 1.02605824278279E+0000 1.02423473502278E+0000 1.02241331933963E+0000 1.02059399750784E+0000 + 1.01877677130177E+0000 1.01696164249557E+0000 1.01514861286325E+0000 1.01333768417864E+0000 1.01152885821540E+0000 + 1.00972213674701E+0000 1.00791752154680E+0000 1.00611501438791E+0000 1.00431461704332E+0000 1.00251633128584E+0000 + 1.00072015888810E+0000 9.98926101622578E-0001 9.97134161261555E-0001 9.95344339577165E-0001 9.93556638341363E-0001 + 9.91771059325930E-0001 9.89987604302481E-0001 9.88206275042461E-0001 9.86427073317138E-0001 9.84650000897622E-0001 + 9.82875059554841E-0001 9.81102251059557E-0001 9.79331577182361E-0001 9.77563039693673E-0001 9.75796640363746E-0001 + 9.74032380962658E-0001 9.72270263260320E-0001 9.70510289026470E-0001 9.68752460030677E-0001 9.66996778042335E-0001 + 9.65243244830679E-0001 9.63491862164761E-0001 9.61742631813471E-0001 9.59995555545523E-0001 9.58250635129462E-0001 + 9.56507872333668E-0001 9.54767268926341E-0001 9.53028826675519E-0001 9.51292547349063E-0001 9.49558432714670E-0001 + 9.47826484539859E-0001 9.46096704591989E-0001 9.44369094638238E-0001 9.42643656445617E-0001 9.40920391780970E-0001 + 9.39199302410965E-0001 9.37480390102106E-0001 9.35763656620722E-0001 9.34049103732974E-0001 9.32336733204848E-0001 + 9.30626546802164E-0001 9.28918546290568E-0001 9.27212733435545E-0001 9.25509110002396E-0001 9.23807677756261E-0001 + 9.22108438462105E-0001 9.20411393884722E-0001 9.18716545788743E-0001 9.17023895938620E-0001 9.15333446098637E-0001 + 9.13645198032910E-0001 9.11959153505382E-0001 9.10275314279827E-0001 9.08593682119848E-0001 9.06914258788875E-0001 + 9.05237046050174E-0001 9.03562045666834E-0001 9.01889259401776E-0001 9.00218689017755E-0001 8.98550336277345E-0001 + 8.96884202942962E-0001 8.95220290776840E-0001 8.93558601541050E-0001 8.91899136997491E-0001 8.90241898907891E-0001 + 8.88586889033807E-0001 8.86934109136628E-0001 8.85283560977568E-0001 8.83635246317673E-0001 8.81989166917822E-0001 + 8.80345324538719E-0001 8.78703720940899E-0001 8.77064357884725E-0001 8.75427237130394E-0001 8.73792360437925E-0001 + 8.72159729567176E-0001 8.70529346277828E-0001 8.68901212329391E-0001 8.67275329481211E-0001 8.65651699492454E-0001 + 8.64030324122128E-0001 8.62411205129056E-0001 8.60794344271904E-0001 8.59179743309157E-0001 8.57567403999139E-0001 + 8.55957328099992E-0001 8.54349517369701E-0001 8.52743973566070E-0001 8.51140698446739E-0001 8.49539693769172E-0001 + 8.47940961290665E-0001 8.46344502768347E-0001 8.44750319959173E-0001 8.43158414619928E-0001 8.41568788507226E-0001 + 8.39981443377510E-0001 8.38396380987055E-0001 8.36813603091965E-0001 8.35233111448172E-0001 8.33654907811440E-0001 + 8.32078993937360E-0001 8.30505371581351E-0001 8.28934042498667E-0001 8.27365008444390E-0001 8.25798271173427E-0001 + 8.24233832440520E-0001 8.22671694000237E-0001 8.21111857606976E-0001 8.19554325014969E-0001 8.17999097978270E-0001 + 8.16446178250769E-0001 8.14895567586184E-0001 8.13347267738057E-0001 8.11801280459769E-0001 8.10257607504524E-0001 + 8.08716250625356E-0001 8.07177211575133E-0001 8.05640492106547E-0001 8.04106093972122E-0001 8.02574018924212E-0001 + 8.01044268715001E-0001 7.99516845096501E-0001 7.97991749820554E-0001 7.96468984638831E-0001 7.94948551302833E-0001 + 7.93430451563895E-0001 7.91914687173172E-0001 7.90401259881657E-0001 7.88890171440169E-0001 7.87381423599355E-0001 + 7.85875018109698E-0001 7.84370956721504E-0001 7.82869241184909E-0001 7.81369873249881E-0001 7.79872854666220E-0001 + 7.78378187183547E-0001 7.76885872551322E-0001 7.75395912518830E-0001 7.73908308835184E-0001 7.72423063249331E-0001 + 7.70940177510044E-0001 7.69459653365927E-0001 7.67981492565414E-0001 7.66505696856767E-0001 7.65032267988078E-0001 + 7.63561207707269E-0001 7.62092517762091E-0001 7.60626199900114E-0001 7.59162254031591E-0001 7.57700673119209E-0001 + 7.56241448476825E-0001 7.54784571409281E-0001 7.53330033212420E-0001 7.51877825173073E-0001 7.50427938569066E-0001 + 7.48980364669219E-0001 7.47535094733345E-0001 7.46092120012251E-0001 7.44651431747740E-0001 7.43213021172606E-0001 + 7.41776879510632E-0001 7.40342997976605E-0001 7.38911367776295E-0001 7.37481980106476E-0001 7.36054826154906E-0001 + 7.34629897100342E-0001 7.33207184112533E-0001 7.31786678352221E-0001 7.30368370971141E-0001 7.28952253112026E-0001 + 7.27538315908599E-0001 7.26126550485574E-0001 7.24716947958667E-0001 7.23309499434576E-0001 7.21904196011002E-0001 + 7.20501028776636E-0001 7.19099988811162E-0001 7.17701067185259E-0001 7.16304254960600E-0001 7.14909543189847E-0001 + 7.13516922916663E-0001 7.12126385175700E-0001 7.10737920992602E-0001 7.09351521384011E-0001 7.07967177357557E-0001 + 7.06584879911871E-0001 7.05204620036573E-0001 7.03826388712275E-0001 7.02450176910586E-0001 7.01075975594104E-0001 + 6.99703775716427E-0001 6.98333568222147E-0001 6.96965344046838E-0001 6.95599094117080E-0001 6.94234809350441E-0001 + 6.92872480655482E-0001 6.91512098931763E-0001 6.90153655069831E-0001 6.88797139951229E-0001 6.87442544448495E-0001 + 6.86089859425160E-0001 6.84739075735745E-0001 6.83390184225771E-0001 6.82043175731746E-0001 6.80698041081179E-0001 + 6.79354771092564E-0001 6.78013356575394E-0001 6.76673788330156E-0001 6.75336057148326E-0001 6.74000153812380E-0001 + 6.72666069095782E-0001 6.71333793762991E-0001 6.70003318569461E-0001 6.68674634261639E-0001 6.67347731576966E-0001 + 6.66022601243875E-0001 6.64699233981793E-0001 6.63377620501140E-0001 6.62057751503335E-0001 6.60739617680782E-0001 + 6.59423209716885E-0001 6.58108518286038E-0001 6.56795534053631E-0001 6.55484247676044E-0001 6.54174649800655E-0001 + 6.52866731065835E-0001 6.51560482100945E-0001 6.50255893526341E-0001 6.48952955953373E-0001 6.47651659984390E-0001 + 6.46351996212723E-0001 6.45053955222706E-0001 6.43757527589664E-0001 6.42462703879914E-0001 6.41169474650766E-0001 + 6.39877830450528E-0001 6.38587761818499E-0001 6.37299259284971E-0001 6.36012313371226E-0001 6.34726914589548E-0001 + 6.33443053443210E-0001 6.32160720426476E-0001 6.30879906024608E-0001 6.29600600713859E-0001 6.28322794961478E-0001 + 6.27046479225702E-0001 6.25771643955769E-0001 6.24498279591906E-0001 6.23226376565336E-0001 6.21955925298271E-0001 + 6.20686916203922E-0001 6.19419339686491E-0001 6.18153186141173E-0001 6.16888445954159E-0001 6.15625109502631E-0001 + 6.14363167154764E-0001 6.13102609269729E-0001 6.11843426197693E-0001 6.10585608279809E-0001 6.09329145848232E-0001 + 6.08074029226101E-0001 6.06820248727557E-0001 6.05567794657731E-0001 6.04316657312751E-0001 6.03066826979730E-0001 + 6.01818293936786E-0001 6.00571048453020E-0001 5.99325080788533E-0001 5.98080381194419E-0001 5.96836939912763E-0001 + 5.95594747176648E-0001 5.94353793210144E-0001 5.93114068228319E-0001 5.91875562437235E-0001 5.90638266033946E-0001 + 5.89402169206499E-0001 5.88167262133937E-0001 5.86933534986292E-0001 5.85700977924595E-0001 5.84469581100869E-0001 + 5.83239334658127E-0001 5.82010228730381E-0001 5.80782253442633E-0001 5.79555398910876E-0001 5.78329655242106E-0001 + 5.77105012534302E-0001 5.75881460876444E-0001 5.74658990348499E-0001 5.73437591021435E-0001 5.72217252957207E-0001 + 5.70997966208769E-0001 5.69779720820064E-0001 5.68562506826032E-0001 5.67346314252604E-0001 5.66131133116704E-0001 + 5.64916953426253E-0001 5.63703765180167E-0001 5.62491558368346E-0001 5.61280322971695E-0001 5.60070048962104E-0001 + 5.58860726302461E-0001 5.57652344946649E-0001 5.56444894839539E-0001 5.55238365917001E-0001 5.54032748105895E-0001 + 5.52828031324076E-0001 5.51624205480391E-0001 5.50421260474686E-0001 5.49219186197794E-0001 5.48017972531543E-0001 + 5.46817609348759E-0001 5.45618086513254E-0001 5.44419393879841E-0001 5.43221521294323E-0001 5.42024458593495E-0001 + 5.40828195605151E-0001 5.39632722148071E-0001 5.38438028032036E-0001 5.37244103057816E-0001 5.36050937017176E-0001 + 5.34858519692874E-0001 5.33666840858662E-0001 5.32475890279285E-0001 5.31285657710483E-0001 5.30096132898988E-0001 + 5.28907305582527E-0001 5.27719165489818E-0001 5.26531702340576E-0001 5.25344905845507E-0001 5.24158765706313E-0001 + 5.22973271615687E-0001 5.21788413257315E-0001 5.20604180305880E-0001 5.19420562427057E-0001 5.18237549277513E-0001 + 5.17055130504911E-0001 5.15873295838342E-0001 5.14692040187364E-0001 5.13511366368137E-0001 5.12331277863832E-0001 + 5.11151778159905E-0001 5.09972870744100E-0001 5.08794559106447E-0001 5.07616846739267E-0001 5.06439737137163E-0001 + 5.05263233797031E-0001 5.04087340218050E-0001 5.02912059901689E-0001 5.01737396351701E-0001 5.00563353074125E-0001 + 4.99389933577299E-0001 4.98217141371834E-0001 4.97044979970634E-0001 4.95873452888892E-0001 4.94702563644085E-0001 + 4.93532315755979E-0001 4.92362712746628E-0001 4.91193758140370E-0001 4.90025455463836E-0001 4.88857808245938E-0001 + 4.87690820017879E-0001 4.86524494313147E-0001 4.85358834667520E-0001 4.84193844619063E-0001 4.83029527708124E-0001 + 4.81865887477344E-0001 4.80702927471646E-0001 4.79540651238246E-0001 4.78379062326642E-0001 4.77218164288621E-0001 + 4.76057960678259E-0001 4.74898455051917E-0001 4.73739650968244E-0001 4.72581551988178E-0001 4.71424161674941E-0001 + 4.70267483594045E-0001 4.69111521313288E-0001 4.67956278402753E-0001 4.66801758434818E-0001 4.65647964984137E-0001 + 4.64494901627662E-0001 4.63342571944625E-0001 4.62190979516550E-0001 4.61040127927241E-0001 4.59890020762800E-0001 + 4.58740661611608E-0001 4.57592054064336E-0001 4.56444201713941E-0001 4.55297108155670E-0001 4.54150776987057E-0001 + 4.53005211807918E-0001 4.51860416220362E-0001 4.50716393828783E-0001 4.49573148239865E-0001 4.48430683062572E-0001 + 4.47289001908165E-0001 4.46148108390185E-0001 4.45008006124464E-0001 4.43868698729117E-0001 4.42730189824552E-0001 + 4.41592483033461E-0001 4.40455581980823E-0001 4.39319490293907E-0001 4.38184211602264E-0001 4.37049749537738E-0001 + 4.35916107734456E-0001 4.34783289828835E-0001 4.33651299459579E-0001 4.32520140267677E-0001 4.31389815896408E-0001 + 4.30260329991335E-0001 4.29131686200313E-0001 4.28003888173481E-0001 4.26876939563265E-0001 4.25750844024380E-0001 + 4.24625605213825E-0001 4.23501226790891E-0001 4.22377712417156E-0001 4.21255065756478E-0001 4.20133290475010E-0001 + 4.19012390241190E-0001 4.17892368725741E-0001 4.16773229601677E-0001 4.15654976544299E-0001 4.14537613231191E-0001 + 4.13421143342228E-0001 4.12305570559570E-0001 4.11190898567665E-0001 4.10077131053254E-0001 4.08964271705354E-0001 + 4.07852324215279E-0001 4.06741292276624E-0001 4.05631179585274E-0001 4.04521989839403E-0001 4.03413726739470E-0001 + 4.02306393988220E-0001 4.01199995290688E-0001 4.00094534354194E-0001 3.98990014888347E-0001 3.97886440605044E-0001 + 3.96783815218466E-0001 3.95682142445084E-0001 3.94581426003655E-0001 3.93481669615223E-0001 3.92382877003121E-0001 + 3.91285051892969E-0001 3.90188198012673E-0001 3.89092319092424E-0001 3.87997418864706E-0001 3.86903501064286E-0001 + 3.85810569428220E-0001 3.84718627695852E-0001 3.83627679608809E-0001 3.82537728911010E-0001 3.81448779348658E-0001 + 3.80360834670248E-0001 3.79273898626557E-0001 3.78187974970651E-0001 3.77103067457884E-0001 3.76019179845898E-0001 + 3.74936315894618E-0001 3.73854479366262E-0001 3.72773674025334E-0001 3.71693903638619E-0001 3.70615171975198E-0001 + 3.69537482806434E-0001 3.68460839905981E-0001 3.67385247049775E-0001 3.66310708016042E-0001 3.65237226585299E-0001 + 3.64164806540342E-0001 3.63093451666261E-0001 3.62023165750433E-0001 3.60953952582518E-0001 3.59885815954468E-0001 + 3.58818759660518E-0001 3.57752787497191E-0001 3.56687903263303E-0001 3.55624110759950E-0001 3.54561413790517E-0001 + 3.53499816160681E-0001 3.52439321678398E-0001 3.51379934153918E-0001 3.50321657399778E-0001 3.49264495230797E-0001 + 3.48208451464086E-0001 3.47153529919044E-0001 3.46099734417350E-0001 3.45047068782980E-0001 3.43995536842192E-0001 + 3.42945142423530E-0001 3.41895889357829E-0001 3.40847781478209E-0001 3.39800822620075E-0001 3.38755016621126E-0001 + 3.37710367321343E-0001 3.36666878562995E-0001 3.35624554190637E-0001 3.34583398051115E-0001 3.33543413993562E-0001 + 3.32504605869393E-0001 3.31466977532317E-0001 3.30430532838323E-0001 3.29395275645696E-0001 3.28361209815000E-0001 + 3.27328339209091E-0001 3.26296667693112E-0001 3.25266199134491E-0001 3.24236937402944E-0001 3.23208886370477E-0001 + 3.22182049911380E-0001 3.21156431902232E-0001 3.20132036221898E-0001 3.19108866751530E-0001 3.18086927374570E-0001 + 3.17066221976745E-0001 3.16046754446068E-0001 3.15028528672844E-0001 3.14011548549660E-0001 3.12995817971393E-0001 + 3.11981340835206E-0001 3.10968121040551E-0001 3.09956162489167E-0001 3.08945469085078E-0001 3.07936044734596E-0001 + 3.06927893141280E-0001 3.05921015571441E-0001 3.04915411690879E-0001 3.03911081136434E-0001 3.02908023543882E-0001 + 3.01906238547932E-0001 3.00905725782224E-0001 2.99906484879338E-0001 2.98908515470783E-0001 2.97911817186999E-0001 + 2.96916389657365E-0001 2.95922232510188E-0001 2.94929345372713E-0001 2.93937727871117E-0001 2.92947379630510E-0001 + 2.91958300274935E-0001 2.90970489427368E-0001 2.89983946709719E-0001 2.88998671742835E-0001 2.88014664146492E-0001 + 2.87031923539399E-0001 2.86050449539201E-0001 2.85070241762476E-0001 2.84091299824734E-0001 2.83113623340422E-0001 + 2.82137211922916E-0001 2.81162065184526E-0001 2.80188182736500E-0001 2.79215564189013E-0001 2.78244209151180E-0001 + 2.77274117231044E-0001 2.76305288035584E-0001 2.75337721170711E-0001 2.74371416241272E-0001 2.73406372851045E-0001 + 2.72442590602743E-0001 2.71480069098011E-0001 2.70518807937429E-0001 2.69558806720509E-0001 2.68600065045695E-0001 + 2.67642582510372E-0001 2.66686358710849E-0001 2.65731393242372E-0001 2.64777685699123E-0001 2.63825235674215E-0001 + 2.62874042759692E-0001 2.61924106546538E-0001 2.60975426624664E-0001 2.60028002582918E-0001 2.59081834009080E-0001 + 2.58136920489865E-0001 2.57193261610919E-0001 2.56250856956824E-0001 2.55309706111094E-0001 2.54369808656175E-0001 + 2.53431164173451E-0001 2.52493772243234E-0001 2.51557632444775E-0001 2.50622744356253E-0001 2.49689107554783E-0001 + 2.48756721616415E-0001 2.47825586116127E-0001 2.46895700627840E-0001 2.45967064724398E-0001 2.45039677977585E-0001 + 2.44113539958117E-0001 2.43188650235641E-0001 2.42265008378742E-0001 2.41342613954933E-0001 2.40421466530666E-0001 + 2.39501565671323E-0001 2.38582910941219E-0001 2.37665501903604E-0001 2.36749338120663E-0001 2.35834419153509E-0001 + 2.34920744562196E-0001 2.34008313905705E-0001 2.33097126741953E-0001 2.32187182627790E-0001 2.31278481119001E-0001 + 2.30371021770303E-0001 2.29464804135345E-0001 2.28559827766712E-0001 2.27656092215922E-0001 2.26753597033425E-0001 + 2.25852341768607E-0001 2.24952325969784E-0001 2.24053549184207E-0001 2.23156010958064E-0001 2.22259710836469E-0001 + 2.21364648363475E-0001 2.20470823082069E-0001 2.19578234534167E-0001 2.18686882260622E-0001 2.17796765801219E-0001 + 2.16907884694675E-0001 2.16020238478647E-0001 2.15133826689716E-0001 2.14248648863403E-0001 2.13364704534161E-0001 + 2.12481993235375E-0001 2.11600514499364E-0001 2.10720267857383E-0001 2.09841252839616E-0001 2.08963468975186E-0001 + 2.08086915792142E-0001 2.07211592817471E-0001 2.06337499577097E-0001 2.05464635595871E-0001 2.04593000397579E-0001 + 2.03722593504943E-0001 2.02853414439616E-0001 2.01985462722186E-0001 2.01118737872174E-0001 2.00253239408032E-0001 + 1.99388966847150E-0001 1.98525919705848E-0001 1.97664097499380E-0001 1.96803499741935E-0001 1.95944125946635E-0001 + 1.95085975625532E-0001 1.94229048289617E-0001 1.93373343448810E-0001 1.92518860611967E-0001 1.91665599286876E-0001 + 1.90813558980260E-0001 1.89962739197774E-0001 1.89113139444006E-0001 1.88264759222479E-0001 1.87417598035649E-0001 + 1.86571655384905E-0001 1.85726930770570E-0001 1.84883423691899E-0001 1.84041133647083E-0001 1.83200060133244E-0001 + 1.82360202646439E-0001 1.81521560681658E-0001 1.80684133732823E-0001 1.79847921292793E-0001 1.79012922853355E-0001 + 1.78179137905235E-0001 1.77346565938090E-0001 1.76515206440509E-0001 1.75685058900019E-0001 1.74856122803073E-0001 + 1.74028397635065E-0001 1.73201882880319E-0001 1.72376578022092E-0001 1.71552482542575E-0001 1.70729595922894E-0001 + 1.69907917643104E-0001 1.69087447182200E-0001 1.68268184018105E-0001 1.67450127627677E-0001 1.66633277486709E-0001 + 1.65817633069926E-0001 1.65003193850987E-0001 1.64189959302482E-0001 1.63377928895939E-0001 1.62567102101816E-0001 + 1.61757478389506E-0001 1.60949057227334E-0001 1.60141838082560E-0001 1.59335820421377E-0001 1.58531003708910E-0001 + 1.57727387409220E-0001 1.56924970985298E-0001 1.56123753899074E-0001 1.55323735611406E-0001 1.54524915582086E-0001 + 1.53727293269843E-0001 1.52930868132337E-0001 1.52135639626160E-0001 1.51341607206842E-0001 1.50548770328842E-0001 + 1.49757128445554E-0001 1.48966681009305E-0001 1.48177427471357E-0001 1.47389367281905E-0001 1.46602499890075E-0001 + 1.45816824743929E-0001 1.45032341290462E-0001 1.44249048975602E-0001 1.43466947244210E-0001 1.42686035540083E-0001 + 1.41906313305947E-0001 1.41127779983465E-0001 1.40350435013233E-0001 1.39574277834778E-0001 1.38799308224872E-0001 + 1.38025527391799E-0001 1.37252936923115E-0001 1.36481538406939E-0001 1.35711333431951E-0001 1.34942323587389E-0001 + 1.34174510463056E-0001 1.33407895649310E-0001 1.32642480737073E-0001 1.31878267317827E-0001 1.31115256983612E-0001 + 1.30353451327032E-0001 1.29592851941250E-0001 1.28833460419987E-0001 1.28075278357528E-0001 1.27318307348715E-0001 + 1.26562548988953E-0001 1.25808004874209E-0001 1.25054676601005E-0001 1.24302565766427E-0001 1.23551673968122E-0001 + 1.22802002804295E-0001 1.22053553873714E-0001 1.21306328775705E-0001 1.20560329110156E-0001 1.19815556477514E-0001 + 1.19072012478788E-0001 1.18329698715546E-0001 1.17588616789918E-0001 1.16848768304594E-0001 1.16110154862821E-0001 + 1.15372778068413E-0001 1.14636639525738E-0001 1.13901740839727E-0001 1.13168083615874E-0001 1.12435669460229E-0001 + 1.11704499979405E-0001 1.10974576780574E-0001 1.10245901471468E-0001 1.09518475660384E-0001 1.08792300956174E-0001 + 1.08067378968251E-0001 1.07343711306592E-0001 1.06621299581730E-0001 1.05900145404763E-0001 1.05180250387346E-0001 + 1.04461616141694E-0001 1.03744244280585E-0001 1.03028136417356E-0001 1.02313294165904E-0001 1.01599719140687E-0001 + 1.00887412956726E-0001 1.00176377229596E-0001 9.94666135754387E-0002 9.87581236109512E-0002 9.80509089533966E-0002 + 9.73449712205926E-0002 9.66403120309217E-0002 9.59369330033248E-0002 9.52348357573029E-0002 9.45340219129180E-0002 + 9.38344930907934E-0002 9.31362509121113E-0002 9.24392969986156E-0002 9.17436329726088E-0002 9.10492604569554E-0002 + 9.03561810750808E-0002 8.96643964509683E-0002 8.89739082091640E-0002 8.82847179747733E-0002 8.75968273734629E-0002 + 8.69102380314571E-0002 8.62249515755463E-0002 8.55409696330753E-0002 8.48582938319523E-0002 8.41769258006460E-0002 + 8.34968671681825E-0002 8.28181195641543E-0002 8.21406846187083E-0002 8.14645639625551E-0002 8.07897592269646E-0002 + 8.01162720437669E-0002 7.94441040453524E-0002 7.87732568646744E-0002 7.81037321352433E-0002 7.74355314911314E-0002 + 7.67686565669708E-0002 7.61031089979551E-0002 7.54388904198376E-0002 7.47760024689321E-0002 7.41144467821121E-0002 + 7.34542249968126E-0002 7.27953387510286E-0002 7.21377896833149E-0002 7.14815794327881E-0002 7.08267096391247E-0002 + 7.01731819425603E-0002 6.95209979838913E-0002 6.88701594044758E-0002 6.82206678462329E-0002 6.75725249516388E-0002 + 6.69257323637337E-0002 6.62802917261152E-0002 6.56362046829440E-0002 6.49934728789384E-0002 6.43520979593799E-0002 + 6.37120815701088E-0002 6.30734253575264E-0002 6.24361309685927E-0002 6.18002000508309E-0002 6.11656342523238E-0002 + 6.05324352217122E-0002 5.99006046082006E-0002 5.92701440615516E-0002 5.86410552320897E-0002 5.80133397706984E-0002 + 5.73869993288237E-0002 5.67620355584693E-0002 5.61384501122013E-0002 5.55162446431459E-0002 5.48954208049877E-0002 + 5.42759802519760E-0002 5.36579246389156E-0002 5.30412556211756E-0002 5.24259748546834E-0002 5.18120839959266E-0002 + 5.11995847019542E-0002 5.05884786303753E-0002 4.99787674393605E-0002 4.93704527876387E-0002 4.87635363345010E-0002 + 4.81580197397972E-0002 4.75539046639379E-0002 4.69511927678966E-0002 4.63498857132037E-0002 4.57499851619526E-0002 + 4.51514927767952E-0002 4.45544102209443E-0002 4.39587391581749E-0002 4.33644812528202E-0002 4.27716381697744E-0002 + 4.21802115744923E-0002 4.15902031329894E-0002 4.10016145118406E-0002 4.04144473781831E-0002 3.98287033997124E-0002 + 3.92443842446857E-0002 3.86614915819197E-0002 3.80800270807916E-0002 3.74999924112413E-0002 3.69213892437654E-0002 + 3.63442192494245E-0002 3.57684840998354E-0002 3.51941854671793E-0002 3.46213250241967E-0002 3.40499044441859E-0002 + 3.34799254010106E-0002 3.29113895690898E-0002 3.23442986234066E-0002 3.17786542395010E-0002 3.12144580934780E-0002 + 3.06517118619997E-0002 3.00904172222883E-0002 2.95305758521282E-0002 2.89721894298640E-0002 2.84152596343988E-0002 + 2.78597881451993E-0002 2.73057766422892E-0002 2.67532268062548E-0002 2.62021403182426E-0002 2.56525188599585E-0002 + 2.51043641136698E-0002 2.45576777622037E-0002 2.40124614889479E-0002 2.34687169778506E-0002 2.29264459134206E-0002 + 2.23856499807252E-0002 2.18463308653962E-0002 2.13084902536218E-0002 2.07721298321528E-0002 2.02372512882993E-0002 + 1.97038563099320E-0002 1.91719465854831E-0002 1.86415238039444E-0002 1.81125896548671E-0002 1.75851458283645E-0002 + 1.70591940151093E-0002 1.65347359063344E-0002 1.60117731938354E-0002 1.54903075699640E-0002 1.49703407276367E-0002 + 1.44518743603283E-0002 1.39349101620726E-0002 1.34194498274675E-0002 1.29054950516685E-0002 1.23930475303913E-0002 + 1.18821089599139E-0002 1.13726810370734E-0002 1.08647654592672E-0002 1.03583639244542E-0002 9.85347813115343E-0003 + 9.35010977844352E-0003 8.84826056596361E-0003 8.34793219391260E-0003 7.84912636305337E-0003 7.35184477470476E-0003 + 6.85608913074776E-0003 6.36186113362482E-0003 5.86916248633711E-0003 5.37799489244619E-0003 4.88836005607625E-0003 + 4.40025968191020E-0003 3.91369547519054E-0003 3.42866914172194E-0003 2.94518238786835E-0003 2.46323692055426E-0003 + 1.98283444726568E-0003 1.50397667604773E-0003 1.02666531550562E-0003 5.50902074806502E-0004 7.66886636765047E-0005 +-3.95973207596573E-0004 -8.67081828165058E-0004 -1.33663548662176E-0003 -1.80463247099796E-0003 -2.27107106876550E-0003 +-2.73594956683471E-0003 -3.19926625155546E-0003 -3.66101940871846E-0003 -4.12120732355325E-0003 -4.57982828072882E-0003 +-5.03688056435433E-0003 -5.49236245797815E-0003 -5.94627224458802E-0003 -6.39860820661193E-0003 -6.84936862591630E-0003 +-7.29855178380926E-0003 -7.74615596103584E-0003 -8.19217943778239E-0003 -8.63662049367569E-0003 -9.07947740777885E-0003 +-9.52074845859832E-0003 -9.96043192407767E-0003 -1.03985260816014E-0002 -1.08350292079921E-0002 -1.12699395795140E-0002 +-1.17032554718697E-0002 -1.21349751602011E-0002 -1.25650969190898E-0002 -1.29936190225584E-0002 -1.34205397440674E-0002 +-1.38458573565176E-0002 -1.42695701322490E-0002 -1.46916763430425E-0002 -1.51121742601166E-0002 -1.55310621541305E-0002 +-1.59483382951834E-0002 -1.63640009528133E-0002 -1.67780483959988E-0002 -1.71904788931561E-0002 -1.76012907121428E-0002 +-1.80104821202562E-0002 -1.84180513842321E-0002 -1.88239967702462E-0002 -1.92283165439147E-0002 -1.96310089702915E-0002 +-2.00320723138721E-0002 -2.04315048385906E-0002 -2.08293048078206E-0002 -2.12254704843762E-0002 -2.16200001305099E-0002 +-2.20128920079144E-0002 -2.24041443777216E-0002 -2.27937555005039E-0002 -2.31817236362725E-0002 -2.35680470444790E-0002 +-2.39527239840128E-0002 -2.43357527132052E-0002 -2.47171314898253E-0002 -2.50968585710829E-0002 -2.54749322136269E-0002 +-2.58513506735462E-0002 -2.62261122063681E-0002 -2.65992150670611E-0002 -2.69706575100323E-0002 -2.73404377891292E-0002 +-2.77085541576381E-0002 -2.80750048682845E-0002 -2.84397881732347E-0002 -2.88029023240946E-0002 -2.91643455719085E-0002 +-2.95241161671609E-0002 -2.98822123597762E-0002 -3.02386323991179E-0002 -3.05933745339899E-0002 -3.09464370126343E-0002 +-3.12978180827343E-0002 -3.16475159914117E-0002 -3.19955289852284E-0002 -3.23418553101855E-0002 -3.26864932117239E-0002 +-3.30294409347244E-0002 -3.33706967235069E-0002 -3.37102588218309E-0002 -3.40481254728962E-0002 -3.43842949193413E-0002 +-3.47187654032448E-0002 -3.50515351661247E-0002 -3.53826024489386E-0002 -3.57119654920842E-0002 -3.60396225353977E-0002 +-3.63655718181562E-0002 -3.66898115790754E-0002 -3.70123400563112E-0002 -3.73331554874586E-0002 -3.76522561095521E-0002 +-3.79696401590670E-0002 -3.82853058719166E-0002 -3.85992514834549E-0002 -3.89114752284753E-0002 -3.92219753412097E-0002 +-3.95307500553321E-0002 -3.98377976039525E-0002 -4.01431162196242E-0002 -4.04467041343382E-0002 -4.07485595795242E-0002 +-4.10486807860535E-0002 -4.13470659842358E-0002 -4.16437134038207E-0002 -4.19386212739972E-0002 -4.22317878233951E-0002 +-4.25232112800810E-0002 -4.28128898715644E-0002 -4.31008218247921E-0002 -4.33870053661519E-0002 -4.36714387214696E-0002 +-4.39541201160119E-0002 -4.42350477744852E-0002 -4.45142199210345E-0002 -4.47916347792455E-0002 -4.50672905721423E-0002 +-4.53411855221900E-0002 -4.56133178512918E-0002 -4.58836857807910E-0002 -4.61522875314714E-0002 -4.64191213235554E-0002 +-4.66841853767055E-0002 -4.69474779100236E-0002 -4.72089971420512E-0002 -4.74687412907688E-0002 -4.77267085735977E-0002 +-4.79828972073981E-0002 -4.82373054084699E-0002 -4.84899313925522E-0002 -4.87407733748246E-0002 -4.89898295699052E-0002 +-4.92370981918530E-0002 -4.94825774541651E-0002 -4.97262655697792E-0002 -4.99681607510725E-0002 -5.02082612098612E-0002 +-5.04465651574022E-0002 -5.06830708043910E-0002 -5.09177763609631E-0002 -5.11506800366934E-0002 -5.13817800405962E-0002 +-5.16110745811265E-0002 -5.18385618661773E-0002 -5.20642401030827E-0002 -5.22881074986156E-0002 -5.25101622589880E-0002 +-5.27304025898524E-0002 -5.29488266963009E-0002 -5.31654327828645E-0002 -5.33802190535143E-0002 -5.35931837116612E-0002 +-5.38043249601552E-0002 -5.40136412368282E-0002 -5.42211342064388E-0002 -5.44268078764645E-0002 -5.46306663103846E-0002 +-5.48327135752555E-0002 -5.50329537417089E-0002 -5.52313908839542E-0002 -5.54280290797766E-0002 -5.56228724105385E-0002 +-5.58159249611773E-0002 -5.60071908202086E-0002 -5.61966740797237E-0002 -5.63843788353905E-0002 -5.65703091864530E-0002 +-5.67544692357326E-0002 -5.69368630896257E-0002 -5.71174948581064E-0002 -5.72963686547257E-0002 -5.74734885966097E-0002 +-5.76488588044614E-0002 -5.78224834025611E-0002 -5.79943665187645E-0002 -5.81645122845044E-0002 -5.83329248347908E-0002 +-5.84996083082080E-0002 -5.86645668469195E-0002 -5.88278045966630E-0002 -5.89893257067542E-0002 -5.91491343300840E-0002 +-5.93072346231210E-0002 -5.94636307459100E-0002 -5.96183268620714E-0002 -5.97713271388035E-0002 -5.99226357468798E-0002 +-6.00722568606507E-0002 -6.02201946580439E-0002 -6.03664533205626E-0002 -6.05110370332866E-0002 -6.06539499848721E-0002 +-6.07951963675525E-0002 -6.09347803771370E-0002 -6.10727062130123E-0002 -6.12089780781395E-0002 -6.13436001790585E-0002 +-6.14765767258842E-0002 -6.16079119323086E-0002 -6.17376100156000E-0002 -6.18656751966033E-0002 -6.19921116997406E-0002 +-6.21169237530078E-0002 -6.22401155879807E-0002 -6.23616914398098E-0002 -6.24816555472221E-0002 -6.26000121525216E-0002 +-6.27167655015884E-0002 -6.28319198438793E-0002 -6.29454794324275E-0002 -6.30574485238424E-0002 -6.31678313783113E-0002 +-6.32766322595952E-0002 -6.33838554350345E-0002 -6.34895051755437E-0002 -6.35935857556164E-0002 -6.36961014533197E-0002 +-6.37970565503002E-0002 -6.38964553317784E-0002 -6.39943020865525E-0002 -6.40906011069970E-0002 -6.41853566890637E-0002 +-6.42785731322795E-0002 -6.43702547397481E-0002 -6.44604058181505E-0002 -6.45490306777437E-0002 -6.46361336323610E-0002 +-6.47217189994124E-0002 -6.48057910998840E-0002 -6.48883542583390E-0002 -6.49694128029175E-0002 -6.50489710653335E-0002 +-6.51270333808818E-0002 -6.52036040884293E-0002 -6.52786875304222E-0002 -6.53522880528822E-0002 -6.54244100054079E-0002 +-6.54950577411738E-0002 -6.55642356169312E-0002 -6.56319479930077E-0002 -6.56981992333082E-0002 -6.57629937053126E-0002 +-6.58263357800789E-0002 -6.58882298322401E-0002 -6.59486802400073E-0002 -6.60076913851661E-0002 -6.60652676530806E-0002 +-6.61214134326900E-0002 -6.61761331165108E-0002 -6.62294311006351E-0002 -6.62813117847324E-0002 -6.63317795720483E-0002 +-6.63808388694045E-0002 -6.64284940872001E-0002 -6.64747496394102E-0002 -6.65196099435854E-0002 -6.65630794208552E-0002 +-6.66051624959228E-0002 -6.66458635970701E-0002 -6.66851871561537E-0002 -6.67231376086087E-0002 -6.67597193934446E-0002 +-6.67949369532489E-0002 -6.68287947341848E-0002 -6.68612971859921E-0002 -6.68924487619872E-0002 -6.69222539190636E-0002 +-6.69507171176902E-0002 -6.69778428219126E-0002 -6.70036354993535E-0002 -6.70280996212115E-0002 -6.70512396622623E-0002 +-6.70730601008575E-0002 -6.70935654189254E-0002 -6.71127601019706E-0002 -6.71306486390745E-0002 -6.71472355228948E-0002 +-6.71625252496659E-0002 -6.71765223191983E-0002 -6.71892312348795E-0002 -6.72006565036725E-0002 -6.72108026361182E-0002 +-6.72196741463331E-0002 -6.72272755520102E-0002 -6.72336113744190E-0002 -6.72386861384059E-0002 -6.72425043723938E-0002 +-6.72450706083809E-0002 -6.72463893819432E-0002 -6.72464652322330E-0002 -6.72453027019784E-0002 -6.72429063374849E-0002 +-6.72392806886341E-0002 -6.72344303088832E-0002 -6.72283597552674E-0002 -6.72210735883976E-0002 -6.72125763724608E-0002 +-6.72028726752214E-0002 -6.71919670680199E-0002 -6.71798641257727E-0002 -6.71665684269734E-0002 -6.71520845536920E-0002 +-6.71364170915753E-0002 -6.71195706298453E-0002 -6.71015497613017E-0002 -6.70823590823206E-0002 -6.70620031928540E-0002 +-6.70404866964310E-0002 -6.70178142001563E-0002 -6.69939903147123E-0002 -6.69690196543568E-0002 -6.69429068369249E-0002 +-6.69156564838276E-0002 -6.68872732200528E-0002 -6.68577616741646E-0002 -6.68271264783037E-0002 -6.67953722681869E-0002 +-6.67625036831084E-0002 -6.67285253659381E-0002 -6.66934419631230E-0002 -6.66572581246855E-0002 -6.66199785042257E-0002 +-6.65816077589194E-0002 -6.65421505495195E-0002 -6.65016115403546E-0002 -6.64599953993306E-0002 -6.64173067979295E-0002 +-6.63735504112100E-0002 -6.63287309178064E-0002 -6.62828529999311E-0002 -6.62359213433714E-0002 -6.61879406374920E-0002 +-6.61389155752334E-0002 -6.60888508531138E-0002 -6.60377511712265E-0002 -6.59856212332426E-0002 -6.59324657464081E-0002 +-6.58782894215470E-0002 -6.58230969730584E-0002 -6.57668931189200E-0002 -6.57096825806831E-0002 -6.56514700834781E-0002 +-6.55922603560102E-0002 -6.55320581305620E-0002 -6.54708681429921E-0002 -6.54086951327359E-0002 -6.53455438428047E-0002 +-6.52814190197874E-0002 -6.52163254138481E-0002 -6.51502677787286E-0002 -6.50832508717460E-0002 -6.50152794537952E-0002 +-6.49463582893460E-0002 -6.48764921464458E-0002 -6.48056857967185E-0002 -6.47339440153639E-0002 -6.46612715811587E-0002 +-6.45876732764564E-0002 -6.45131538871856E-0002 -6.44377182028533E-0002 -6.43613710165417E-0002 -6.42841171249096E-0002 +-6.42059613281930E-0002 -6.41269084302033E-0002 -6.40469632383294E-0002 -6.39661305635361E-0002 -6.38844152203649E-0002 +-6.38018220269339E-0002 -6.37183558049369E-0002 -6.36340213796457E-0002 -6.35488235799071E-0002 -6.34627672381451E-0002 +-6.33758571903601E-0002 -6.32880982761290E-0002 -6.31994953386050E-0002 -6.31100532245180E-0002 -6.30197767841744E-0002 +-6.29286708714568E-0002 -6.28367403438247E-0002 -6.27439900623138E-0002 -6.26504248915361E-0002 -6.25560496996808E-0002 +-6.24608693585127E-0002 -6.23648887433735E-0002 -6.22681127331817E-0002 -6.21705462104318E-0002 -6.20721940611950E-0002 +-6.19730611751190E-0002 -6.18731524454278E-0002 -6.17724727689224E-0002 -6.16710270459794E-0002 -6.15688201805524E-0002 +-6.14658570801717E-0002 -6.13621426559439E-0002 -6.12576818225520E-0002 -6.11524794982557E-0002 -6.10465406048907E-0002 +-6.09398700678696E-0002 -6.08324728161814E-0002 -6.07243537823917E-0002 -6.06155179026424E-0002 -6.05059701166519E-0002 +-6.03957153677153E-0002 -6.02847586027037E-0002 -6.01731047720651E-0002 -6.00607588298240E-0002 -5.99477257335815E-0002 +-5.98340104445145E-0002 -5.97196179273771E-0002 -5.96045531504995E-0002 -5.94888210857884E-0002 -5.93724267087277E-0002 +-5.92553749983769E-0002 -5.91376709373719E-0002 -5.90193195119258E-0002 -5.89003257118277E-0002 -5.87806945304436E-0002 +-5.86604309647153E-0002 -5.85395400151619E-0002 -5.84180266858787E-0002 -5.82958959845368E-0002 -5.81731529223846E-0002 +-5.80498025142468E-0002 -5.79258497785247E-0002 -5.78012997371958E-0002 -5.76761574158141E-0002 -5.75504278435101E-0002 +-5.74241160529910E-0002 -5.72972270805407E-0002 -5.71697659660190E-0002 -5.70417377528618E-0002 -5.69131474880829E-0002 +-5.67840002222716E-0002 -5.66543010095940E-0002 -5.65240549077925E-0002 -5.63932669781858E-0002 -5.62619422856697E-0002 +-5.61300858987158E-0002 -5.59977028893728E-0002 -5.58647983332654E-0002 -5.57313773095953E-0002 -5.55974449011402E-0002 +-5.54630061942540E-0002 -5.53280662788682E-0002 -5.51926302484898E-0002 -5.50567032002030E-0002 -5.49202902346679E-0002 +-5.47833964561209E-0002 -5.46460269723752E-0002 -5.45081868948213E-0002 -5.43698813384252E-0002 -5.42311154217295E-0002 +-5.40918942668531E-0002 -5.39522229994921E-0002 -5.38121067489188E-0002 -5.36715506479817E-0002 -5.35305598331057E-0002 +-5.33891394442928E-0002 -5.32472946251209E-0002 -5.31050305227447E-0002 -5.29623522878954E-0002 -5.28192650748805E-0002 +-5.26757740415840E-0002 -5.25318843494666E-0002 -5.23876011635652E-0002 -5.22429296524934E-0002 -5.20978749884414E-0002 +-5.19524423471754E-0002 -5.18066369080384E-0002 -5.16604638539499E-0002 -5.15139283714060E-0002 -5.13670356504793E-0002 +-5.12197908848184E-0002 -5.10721992716485E-0002 -5.09242660117719E-0002 -5.07759963095671E-0002 -5.06273953729887E-0002 +-5.04784684135681E-0002 -5.03292206464134E-0002 -5.01796572902084E-0002 -5.00297835672143E-0002 -4.98796047032683E-0002 +-4.97291259277836E-0002 -4.95783524737519E-0002 -4.94272895777388E-0002 -4.92759424798878E-0002 -4.91243164239184E-0002 +-4.89724166571275E-0002 -4.88202484303872E-0002 -4.86678169981468E-0002 -4.85151276184321E-0002 -4.83621855528454E-0002 +-4.82089960665646E-0002 -4.80555644283457E-0002 -4.79018959105201E-0002 -4.77479957889956E-0002 -4.75938693432569E-0002 +-4.74395218563651E-0002 -4.72849586149578E-0002 -4.71301849092490E-0002 -4.69752060330293E-0002 -4.68200272836657E-0002 +-4.66646539621013E-0002 -4.65090913728568E-0002 -4.63533448240281E-0002 -4.61974196272882E-0002 -4.60413210978870E-0002 +-4.58850545546500E-0002 -4.57286253199794E-0002 -4.55720387198546E-0002 -4.54153000838311E-0002 -4.52584147450402E-0002 +-4.51013880401906E-0002 -4.49442253095670E-0002 -4.47869318970306E-0002 -4.46295131500193E-0002 -4.44719744195479E-0002 +-4.43143210602066E-0002 -4.41565584301627E-0002 -4.39986918911601E-0002 -4.38407268085190E-0002 -4.36826685511362E-0002 +-4.35245224914850E-0002 -4.33662940056147E-0002 -4.32079884731517E-0002 -4.30496112772986E-0002 -4.28911678048349E-0002 +-4.27326634461160E-0002 -4.25741035950740E-0002 -4.24154936492173E-0002 -4.22568390096311E-0002 -4.20981450809773E-0002 +-4.19394172714939E-0002 -4.17806609929949E-0002 -4.16218816608722E-0002 -4.14630846940924E-0002 -4.13042755152000E-0002 +-4.11454595503157E-0002 -4.09866422291362E-0002 -4.08278289849350E-0002 -4.06690252545619E-0002 -4.05102364784435E-0002 +-4.03514681005828E-0002 -4.01927255685590E-0002 -4.00340143335282E-0002 -3.98753398502227E-0002 -3.97167075769513E-0002 +-3.95581229755992E-0002 -3.93995915116287E-0002 -3.92411186540778E-0002 -3.90827098755613E-0002 -3.89243706522706E-0002 +-3.87661064639735E-0002 -3.86079227940140E-0002 -3.84498251293132E-0002 -3.82918189603682E-0002 -3.81339097812528E-0002 +-3.79761030896167E-0002 -3.78184043866871E-0002 -3.76608191772673E-0002 -3.75033529697365E-0002 -3.73460112760512E-0002 +-3.71887996117441E-0002 -3.70317234959237E-0002 -3.68747884512763E-0002 -3.67180000040638E-0002 -3.65613636841247E-0002 +-3.64048850248740E-0002 -3.62485695633033E-0002 -3.60924228399805E-0002 -3.59364503990504E-0002 -3.57806577882340E-0002 +-3.56250505588286E-0002 -3.54696342657084E-0002 -3.53144144673232E-0002 -3.51593967257007E-0002 -3.50045866064444E-0002 +-3.48499896787336E-0002 -3.46956115153252E-0002 -3.45414576925517E-0002 -3.43875337903226E-0002 -3.42338453921240E-0002 +-3.40803980850179E-0002 -3.39271974596435E-0002 -3.37742491102159E-0002 -3.36215586345267E-0002 -3.34691316339448E-0002 +-3.33169737134144E-0002 -3.31650904814568E-0002 -3.30134875501702E-0002 -3.28621705352284E-0002 -3.27111450558822E-0002 +-3.25604167349589E-0002 -3.24099911988622E-0002 -3.22598740775720E-0002 -3.21100710046455E-0002 -3.19605876172151E-0002 +-3.18114295559909E-0002 -3.16626024652594E-0002 -3.15141119928824E-0002 -3.13659637902996E-0002 -3.12181635125263E-0002 +-3.10707168181544E-0002 -3.09236293693529E-0002 -3.07769068318661E-0002 -3.06305548750166E-0002 -3.04845791717012E-0002 +-3.03389853983952E-0002 -3.01937792351494E-0002 -3.00489663655913E-0002 -2.99045524769245E-0002 -2.97605432599299E-0002 +-2.96169444089639E-0002 -2.94737616219604E-0002 -2.93310006004292E-0002 -2.91886670494564E-0002 -2.90467666777050E-0002 +-2.89053051974142E-0002 -2.87642883244002E-0002 -2.86237217780549E-0002 -2.84836112813476E-0002 -2.83439625608232E-0002 +-2.82047813466034E-0002 -2.80660733723867E-0002 -2.79278443754477E-0002 -2.77901000966379E-0002 -2.76528462803845E-0002 +-2.75160886746921E-0002 -2.73798330311412E-0002 -2.72440851048891E-0002 -2.71088506546695E-0002 -2.69741354427925E-0002 +-2.68399452351444E-0002 -2.67062858011888E-0002 -2.65731629139652E-0002 -2.64405823500893E-0002 -2.63085498897541E-0002 +-2.61770713167284E-0002 -2.60461524183581E-0002 -2.59157989855648E-0002 -2.57860168128472E-0002 -2.56568116982803E-0002 +-2.55281894435156E-0002 -2.54001558537809E-0002 -2.52727167378809E-0002 -2.51458779081964E-0002 -2.50196451806848E-0002 +-2.48940243748801E-0002 -2.47690213138928E-0002 -2.46446418244097E-0002 -2.45208917366939E-0002 -2.43977768845855E-0002 +-2.42753031055009E-0002 -2.41534762404330E-0002 -2.40323021339507E-0002 -2.39117866342003E-0002 -2.37919355929035E-0002 +-2.36727548653597E-0002 -2.35542503104437E-0002 -2.34364277906075E-0002 -2.33192931718791E-0002 -2.32028523238635E-0002 +-2.30871111197416E-0002 -2.29720754362713E-0002 -2.28577511537867E-0002 -2.27441441561983E-0002 -2.26312603309934E-0002 +-2.25191055692358E-0002 -2.24076857655654E-0002 -2.22970068181984E-0002 -2.21870746289288E-0002 -2.20778951031255E-0002 +-2.19694741497347E-0002 -2.18618176812790E-0002 -2.17549316138570E-0002 -2.16488218671450E-0002 -2.15434943643942E-0002 +-2.14389550324339E-0002 -2.13352098016685E-0002 -2.12322646060793E-0002 -2.11301253832248E-0002 -2.10287980742391E-0002 +-2.09282886238332E-0002 -2.08286029802942E-0002 -2.07297470954866E-0002 -2.06317269248502E-0002 -2.05345484274019E-0002 +-2.04382175657354E-0002 -2.03427403060200E-0002 -2.02481226180029E-0002 -2.01543704750057E-0002 -2.00614898539286E-0002 +-1.99694867352469E-0002 -1.98783671030130E-0002 -1.97881369448559E-0002 -1.96988022519802E-0002 -1.96103690191682E-0002 +-1.95228432447779E-0002 -1.94362309307438E-0002 -1.93505380825775E-0002 -1.92657707093659E-0002 -1.91819348237737E-0002 +-1.90990364420418E-0002 -1.90170815839865E-0002 -1.89360762730022E-0002 -1.88560265360582E-0002 -1.87769384037017E-0002 +-1.86988179100554E-0002 -1.86216710928191E-0002 -1.85455039932686E-0002 -1.84703226562565E-0002 -1.83961331302116E-0002 +-1.83229414671397E-0002 -1.82507537226226E-0002 -1.81795759558187E-0002 -1.81094142294630E-0002 -1.80402746098672E-0002 +-1.79721631669185E-0002 -1.79050859740819E-0002 -1.78390488485948E-0002 -1.77740534807635E-0002 -1.77100982529137E-0002 +-1.76471814530983E-0002 -1.75853013679429E-0002 -1.75244562826454E-0002 -1.74646444809764E-0002 -1.74058642452790E-0002 +-1.73481138564683E-0002 -1.72913915940325E-0002 -1.72356957360316E-0002 -1.71810245590987E-0002 -1.71273763384386E-0002 +-1.70747493478294E-0002 -1.70231418596214E-0002 -1.69725521447368E-0002 -1.69229784726708E-0002 -1.68744191114911E-0002 +-1.68268723278377E-0002 -1.67803363869229E-0002 -1.67348095525317E-0002 -1.66902900870217E-0002 -1.66467762513225E-0002 +-1.66042663049364E-0002 -1.65627585059385E-0002 -1.65222511109756E-0002 -1.64827423752677E-0002 -1.64442305526069E-0002 +-1.64067138953576E-0002 -1.63701906544572E-0002 -1.63346590794150E-0002 -1.63001174183132E-0002 -1.62665639178060E-0002 +-1.62339968231205E-0002 -1.62024143780561E-0002 -1.61718148249846E-0002 -1.61421964048502E-0002 -1.61135573571698E-0002 +-1.60858959200323E-0002 -1.60592103301001E-0002 -1.60334988226067E-0002 -1.60087596313587E-0002 -1.59849909887356E-0002 +-1.59621911256885E-0002 -1.59403582717418E-0002 -1.59194906549914E-0002 -1.58995865021069E-0002 -1.58806440383291E-0002 +-1.58626614874717E-0002 -1.58456370719217E-0002 -1.58295690126373E-0002 -1.58144555291500E-0002 -1.58002948395631E-0002 +-1.57870851605531E-0002 -1.57748247073684E-0002 -1.57635116938300E-0002 -1.57531443323317E-0002 -1.57437208338391E-0002 +-1.57352394078909E-0002 -1.57276982625979E-0002 -1.57210956046436E-0002 -1.57154296392834E-0002 -1.57106985703460E-0002 +-1.57069006002319E-0002 -1.57040339299146E-0002 -1.57020967589393E-0002 -1.57010872854245E-0002 -1.57010037060605E-0002 +-1.57018442161106E-0002 -1.57036070094100E-0002 -1.57062902783671E-0002 -1.57098922139618E-0002 -1.57144110057473E-0002 +-1.57198448418490E-0002 -1.57261919089645E-0002 -1.57334503923640E-0002 -1.57416184758904E-0002 -1.57506943419589E-0002 +-1.57606761715572E-0002 -1.57715621442451E-0002 -1.57833504381555E-0002 -1.57960392299930E-0002 -1.58096266950356E-0002 +-1.58241110071330E-0002 -1.58394903387076E-0002 -1.58557628607542E-0002 -1.58729267428404E-0002 -1.58909801531056E-0002 +-1.59099212582624E-0002 -1.59297482235952E-0002 -1.59504592129615E-0002 -1.59720523887907E-0002 -1.59945259120849E-0002 +-1.60178779424187E-0002 -1.60421066379392E-0002 -1.60672101553659E-0002 -1.60931866499905E-0002 -1.61200342756774E-0002 +-1.61477511848638E-0002 -1.61763355285586E-0002 -1.62057854563439E-0002 -1.62360991163738E-0002 -1.62672746553749E-0002 +-1.62993102186464E-0002 -1.63322039500603E-0002 -1.63659539920601E-0002 -1.64005584856626E-0002 -1.64360155704567E-0002 +-1.64723233846041E-0002 -1.65094800648387E-0002 -1.65474837464667E-0002 -1.65863325633669E-0002 -1.66260246479907E-0002 +-1.66665581313620E-0002 -1.67079311430766E-0002 -1.67501418113037E-0002 -1.67931882627842E-0002 -1.68370686228316E-0002 +-1.68817810153323E-0002 -1.69273235627443E-0002 -1.69736943860993E-0002 -1.70208916050002E-0002 -1.70689133376230E-0002 +-1.71177577007162E-0002 -1.71674228096004E-0002 -1.72179067781692E-0002 -1.72692077188881E-0002 -1.73213237427955E-0002 +-1.73742529595018E-0002 -1.74279934771905E-0002 -1.74825434026171E-0002 -1.75379008411094E-0002 -1.75940638965681E-0002 +-1.76510306714662E-0002 -1.77087992668489E-0002 -1.77673677823344E-0002 -1.78267343161130E-0002 -1.78868969649473E-0002 +-1.79478538241729E-0002 -1.80096029876972E-0002 -1.80721425480006E-0002 -1.81354705961357E-0002 -1.81995852217278E-0002 +-1.82644845129741E-0002 -1.83301665566450E-0002 -1.83966294380829E-0002 -1.84638712412026E-0002 -1.85318900484917E-0002 +-1.86006839410100E-0002 -1.86702509983899E-0002 -1.87405892988362E-0002 -1.88116969191261E-0002 -1.88835719346093E-0002 +-1.89562124192082E-0002 -1.90296164454171E-0002 -1.91037820843035E-0002 -1.91787074055068E-0002 -1.92543904772387E-0002 +-1.93308293662842E-0002 -1.94080221380000E-0002 -1.94859668563156E-0002 -1.95646615837327E-0002 -1.96441043813258E-0002 +-1.97242933087416E-0002 -1.98052264241997E-0002 -1.98869017844909E-0002 -1.99693174449802E-0002 -2.00524714596042E-0002 +-2.01363618808717E-0002 -2.02209867598643E-0002 -2.03063441462361E-0002 -2.03924320882135E-0002 -2.04792486325955E-0002 +-2.05667918247535E-0002 -2.06550597086311E-0002 -2.07440503267452E-0002 -2.08337617201841E-0002 -2.09241919286093E-0002 +-2.10153389902541E-0002 -2.11072009419249E-0002 -2.11997758190006E-0002 -2.12930616554318E-0002 -2.13870564837425E-0002 +-2.14817583350282E-0002 -2.15771652389577E-0002 -2.16732752237720E-0002 -2.17700863162843E-0002 -2.18675965418803E-0002 +-2.19658039245187E-0002 -2.20647064867299E-0002 -2.21643022496173E-0002 -2.22645892328567E-0002 -2.23655654546960E-0002 +-2.24672289319559E-0002 -2.25695776800295E-0002 -2.26726097128823E-0002 -2.27763230430524E-0002 -2.28807156816500E-0002 +-2.29857856383584E-0002 -2.30915309214325E-0002 -2.31979495377005E-0002 -2.33050394925626E-0002 -2.34127987899914E-0002 +-2.35212254325324E-0002 -2.36303174213028E-0002 -2.37400727559933E-0002 -2.38504894348659E-0002 -2.39615654547563E-0002 +-2.40732988110716E-0002 -2.41856874977919E-0002 -2.42987295074695E-0002 -2.44124228312294E-0002 -2.45267654587693E-0002 +-2.46417553783583E-0002 -2.47573905768393E-0002 -2.48736690396267E-0002 -2.49905887507077E-0002 -2.51081476926422E-0002 +-2.52263438465622E-0002 -2.53451751921724E-0002 -2.54646397077494E-0002 -2.55847353701432E-0002 -2.57054601547755E-0002 +-2.58268120356409E-0002 -2.59487889853061E-0002 -2.60713889749106E-0002 -2.61946099741661E-0002 -2.63184499513568E-0002 +-2.64429068733396E-0002 -2.65679787055437E-0002 -2.66936634119708E-0002 -2.68199589551947E-0002 -2.69468632963622E-0002 +-2.70743743951921E-0002 -2.72024902099762E-0002 -2.73312086975783E-0002 -2.74605278134349E-0002 -2.75904455115547E-0002 +-2.77209597445192E-0002 -2.78520684634820E-0002 -2.79837696181696E-0002 -2.81160611568806E-0002 -2.82489410264861E-0002 +-2.83824071724299E-0002 -2.85164575387278E-0002 -2.86510900679686E-0002 -2.87863027013135E-0002 -2.89220933784956E-0002 +-2.90584600378211E-0002 -2.91954006161681E-0002 -2.93329130489877E-0002 -2.94709952703031E-0002 -2.96096452127104E-0002 +-2.97488608073774E-0002 -2.98886399840449E-0002 -3.00289806710263E-0002 -3.01698807952070E-0002 -3.03113382820452E-0002 +-3.04533510555715E-0002 -3.05959170383886E-0002 -3.07390341516723E-0002 -3.08827003151703E-0002 -3.10269134472030E-0002 +-3.11716714646636E-0002 -3.13169722830169E-0002 -3.14628138163010E-0002 -3.16091939771260E-0002 -3.17561106766745E-0002 +-3.19035618247019E-0002 -3.20515453295358E-0002 -3.22000590980760E-0002 -3.23491010357952E-0002 -3.24986690467383E-0002 +-3.26487610335227E-0002 -3.27993748973387E-0002 -3.29505085379484E-0002 -3.31021598536865E-0002 -3.32543267414605E-0002 +-3.34070070967500E-0002 -3.35601988136072E-0002 -3.37138997846573E-0002 -3.38681079010967E-0002 -3.40228210526953E-0002 +-3.41780371277952E-0002 -3.43337540133108E-0002 -3.44899695947295E-0002 -3.46466817561102E-0002 -3.48038883800850E-0002 +-3.49615873478581E-0002 -3.51197765392067E-0002 -3.52784538324798E-0002 -3.54376171045992E-0002 -3.55972642310591E-0002 +-3.57573930859262E-0002 -3.59180015418395E-0002 -3.60790874700108E-0002 -3.62406487402241E-0002 -3.64026832208356E-0002 +-3.65651887787747E-0002 -3.67281632795425E-0002 -3.68916045872129E-0002 -3.70555105644326E-0002 -3.72198790724201E-0002 +-3.73847079709668E-0002 -3.75499951184362E-0002 -3.77157383717646E-0002 -3.78819355864608E-0002 -3.80485846166060E-0002 +-3.82156833148534E-0002 -3.83832295324292E-0002 -3.85512211191319E-0002 -3.87196559233325E-0002 -3.88885317919744E-0002 +-3.90578465705735E-0002 -3.92275981032180E-0002 -3.93977842325687E-0002 -3.95684027998591E-0002 -3.97394516448946E-0002 +-3.99109286060537E-0002 -4.00828315202868E-0002 -4.02551582231170E-0002 -4.04279065486399E-0002 -4.06010743295235E-0002 +-4.07746593970084E-0002 -4.09486595809077E-0002 -4.11230727096062E-0002 -4.12978966100623E-0002 -4.14731291078060E-0002 +-4.16487680269404E-0002 -4.18248111901405E-0002 -4.20012564186540E-0002 -4.21781015323012E-0002 -4.23553443494747E-0002 +-4.25329826871395E-0002 -4.27110143608333E-0002 -4.28894371846659E-0002 -4.30682489713198E-0002 -4.32474475320501E-0002 +-4.34270306766840E-0002 -4.36069962136215E-0002 -4.37873419498350E-0002 -4.39680656908689E-0002 -4.41491652408406E-0002 +-4.43306384024398E-0002 -4.45124829769288E-0002 -4.46946967641421E-0002 -4.48772775624868E-0002 -4.50602231689423E-0002 +-4.52435313790606E-0002 -4.54271999869664E-0002 -4.56112267853563E-0002 -4.57956095655002E-0002 -4.59803461172392E-0002 +-4.61654342289881E-0002 -4.63508716877335E-0002 -4.65366562790347E-0002 -4.67227857870232E-0002 -4.69092579944035E-0002 +-4.70960706824517E-0002 -4.72832216310172E-0002 -4.74707086185214E-0002 -4.76585294219583E-0002 -4.78466818168946E-0002 +-4.80351635774687E-0002 -4.82239724763923E-0002 -4.84131062849491E-0002 -4.86025627729955E-0002 -4.87923397089600E-0002 +-4.89824348598443E-0002 -4.91728459912215E-0002 -4.93635708672380E-0002 -4.95546072506124E-0002 -4.97459529026356E-0002 +-4.99376055831714E-0002 -5.01295630506554E-0002 -5.03218230620963E-0002 -5.05143833730749E-0002 -5.07072417377444E-0002 +-5.09003959088309E-0002 -5.10938436376326E-0002 -5.12875826740199E-0002 -5.14816107664364E-0002 -5.16759256618976E-0002 +-5.18705251059915E-0002 -5.20654068428789E-0002 -5.22605686152928E-0002 -5.24560081645385E-0002 -5.26517232304941E-0002 +-5.28477115516099E-0002 -5.30439708649088E-0002 -5.32404989059866E-0002 -5.34372934090103E-0002 -5.36343521067206E-0002 +-5.38316727304303E-0002 -5.40292530100243E-0002 -5.42270906739605E-0002 -5.44251834492690E-0002 -5.46235290615520E-0002 +-5.48221252349849E-0002 -5.50209696923150E-0002 -5.52200601548624E-0002 -5.54193943425195E-0002 -5.56189699737508E-0002 +-5.58187847655940E-0002 -5.60188364336586E-0002 -5.62191226921272E-0002 -5.64196412537542E-0002 -5.66203898298671E-0002 +-5.68213661303652E-0002 -5.70225678637206E-0002 -5.72239927369781E-0002 -5.74256384557544E-0002 -5.76275027242394E-0002 +-5.78295832451945E-0002 -5.80318777199544E-0002 -5.82343838484260E-0002 -5.84370993290883E-0002 -5.86400218589934E-0002 +-5.88431491337655E-0002 -5.90464788476011E-0002 -5.92500086932695E-0002 -5.94537363621123E-0002 -5.96576595440434E-0002 +-5.98617759275497E-0002 -6.00660831996899E-0002 -6.02705790460954E-0002 -6.04752611509703E-0002 -6.06801271970909E-0002 +-6.08851748658062E-0002 -6.10904018370374E-0002 -6.12958057892781E-0002 -6.15013843995946E-0002 -6.17071353436257E-0002 +-6.19130562955823E-0002 -6.21191449282485E-0002 -6.23253989129798E-0002 -6.25318159197049E-0002 -6.27383936169249E-0002 +-6.29451296717132E-0002 -6.31520217497156E-0002 -6.33590675151507E-0002 -6.35662646308090E-0002 -6.37736107580540E-0002 +-6.39811035568214E-0002 -6.41887406856194E-0002 -6.43965198015289E-0002 -6.46044385602025E-0002 -6.48124946158662E-0002 +-6.50206856213178E-0002 -6.52290092279281E-0002 -6.54374630856398E-0002 -6.56460448429687E-0002 -6.58547521470023E-0002 +-6.60635826434010E-0002 -6.62725339763977E-0002 -6.64816037887977E-0002 -6.66907897219789E-0002 -6.69000894158912E-0002 +-6.71095005090572E-0002 -6.73190206385723E-0002 -6.75286474401038E-0002 -6.77383785478921E-0002 -6.79482115947494E-0002 +-6.81581442120609E-0002 -6.83681740297835E-0002 -6.85782986764476E-0002 -6.87885157791554E-0002 -6.89988229635818E-0002 +-6.92092178539737E-0002 -6.94196980731512E-0002 -6.96302612425062E-0002 -6.98409049820035E-0002 -7.00516269101802E-0002 +-7.02624246441461E-0002 -7.04732957995827E-0002 -7.06842379907447E-0002 -7.08952488304592E-0002 -7.11063259301254E-0002 +-7.13174668997155E-0002 -7.15286693477734E-0002 -7.17399308814161E-0002 -7.19512491063328E-0002 -7.21626216267852E-0002 +-7.23740460456075E-0002 -7.25855199642065E-0002 -7.27970409825610E-0002 -7.30086066992227E-0002 -7.32202147113155E-0002 +-7.34318626145359E-0002 -7.36435480031531E-0002 -7.38552684700081E-0002 -7.40670216065150E-0002 -7.42788050026600E-0002 +-7.44906162470019E-0002 -7.47024529266719E-0002 -7.49143126273739E-0002 -7.51261929333838E-0002 -7.53380914275503E-0002 +-7.55500056912945E-0002 -7.57619333046099E-0002 -7.59738718460627E-0002 -7.61858188927910E-0002 -7.63977720205059E-0002 +-7.66097288034908E-0002 -7.68216868146015E-0002 -7.70336436252663E-0002 -7.72455968054862E-0002 -7.74575439238340E-0002 +-7.76694825474556E-0002 -7.78814102420692E-0002 -7.80933245719653E-0002 -7.83052231000070E-0002 -7.85171033876299E-0002 +-7.87289629948417E-0002 -7.89407994802232E-0002 -7.91526104009271E-0002 -7.93643933126789E-0002 -7.95761457697764E-0002 +-7.97878653250897E-0002 -7.99995495300617E-0002 -8.02111959347076E-0002 -8.04228020876150E-0002 -8.06343655359444E-0002 +-8.08458838254278E-0002 -8.10573545003706E-0002 -8.12687751036502E-0002 -8.14801431767166E-0002 -8.16914562595924E-0002 +-8.19027118908724E-0002 -8.21139076077237E-0002 -8.23250409458863E-0002 -8.25361094396727E-0002 -8.27471106219671E-0002 +-8.29580420242275E-0002 -8.31689011764827E-0002 -8.33796856073353E-0002 -8.35903928439597E-0002 -8.38010204121031E-0002 +-8.40115658360848E-0002 -8.42220266387971E-0002 -8.44324003417040E-0002 -8.46426844648426E-0002 -8.48528765268222E-0002 +-8.50629740448246E-0002 -8.52729745346043E-0002 -8.54828755104875E-0002 -8.56926744853738E-0002 -8.59023689707346E-0002 +-8.61119564766142E-0002 -8.63214345116292E-0002 -8.65308005829686E-0002 -8.67400521963936E-0002 -8.69491868562383E-0002 +-8.71582020654092E-0002 -8.73670953253852E-0002 -8.75758641362177E-0002 -8.77845059965301E-0002 -8.79930184035190E-0002 +-8.82013988529530E-0002 -8.84096448391731E-0002 -8.86177538550932E-0002 -8.88257233921995E-0002 -8.90335509405502E-0002 +-8.92412339887764E-0002 -8.94487700240816E-0002 -8.96561565322419E-0002 -8.98633909976056E-0002 -9.00704709030934E-0002 +-9.02773937301987E-0002 -9.04841569589873E-0002 -9.06907580680975E-0002 -9.08971945347399E-0002 -9.11034638346978E-0002 +-9.13095634423267E-0002 -9.15154908305546E-0002 -9.17212434708822E-0002 -9.19268188333824E-0002 -9.21322143867008E-0002 +-9.23374275980551E-0002 -9.25424559332359E-0002 -9.27472968566058E-0002 -9.29519478311002E-0002 -9.31564063182270E-0002 +-9.33606697780665E-0002 -9.35647356692710E-0002 -9.37686014490659E-0002 -9.39722645732487E-0002 -9.41757224961896E-0002 +-9.43789726708312E-0002 -9.45820125486881E-0002 -9.47848395798481E-0002 -9.49874512129710E-0002 -9.51898448952892E-0002 +-9.53920180726073E-0002 -9.55939681893032E-0002 -9.57956926883259E-0002 -9.59971890111980E-0002 -9.61984545980141E-0002 +-9.63994868874413E-0002 -9.66002833167195E-0002 -9.68008413216604E-0002 -9.70011583366485E-0002 -9.72012317946409E-0002 +-9.74010591271670E-0002 -9.76006377643287E-0002 -9.77999651348006E-0002 -9.79990386658291E-0002 -9.81978557832337E-0002 +-9.83964139114060E-0002 -9.85947104733104E-0002 -9.87927428904836E-0002 -9.89905085830344E-0002 -9.91880049696446E-0002 +-9.93852294675682E-0002 -9.95821794926316E-0002 -9.97788524592339E-0002 -9.99752457803467E-0002 -1.00171356867513E-0001 +-1.00367183130850E-0001 -1.00562721979047E-0001 -1.00757970819364E-0001 -1.00952927057636E-0001 -1.01147588098268E-0001 +-1.01341951344239E-0001 -1.01536014197100E-0001 -1.01729774056975E-0001 -1.01923228322560E-0001 -1.02116374391124E-0001 +-1.02309209658506E-0001 -1.02501731519121E-0001 -1.02693937365955E-0001 -1.02885824590566E-0001 -1.03077390583084E-0001 +-1.03268632732214E-0001 -1.03459548425230E-0001 -1.03650135047980E-0001 -1.03840389984886E-0001 -1.04030310618941E-0001 +-1.04219894331710E-0001 -1.04409138503331E-0001 -1.04598040512514E-0001 -1.04786597736543E-0001 -1.04974807551273E-0001 +-1.05162667331132E-0001 -1.05350174449120E-0001 -1.05537326276809E-0001 -1.05724120184346E-0001 -1.05910553540448E-0001 +-1.06096623712404E-0001 -1.06282328066078E-0001 -1.06467663965905E-0001 -1.06652628774892E-0001 -1.06837219854619E-0001 +-1.07021434565239E-0001 -1.07205270265476E-0001 -1.07388724312628E-0001 -1.07571794062566E-0001 -1.07754476869730E-0001 +-1.07936770087136E-0001 -1.08118671066371E-0001 -1.08300177157596E-0001 -1.08481285709541E-0001 -1.08661994069511E-0001 +-1.08842299583385E-0001 -1.09022199595610E-0001 -1.09201691449209E-0001 -1.09380772485778E-0001 -1.09559440045481E-0001 +-1.09737691467060E-0001 -1.09915524087825E-0001 -1.10092935243661E-0001 -1.10269922269025E-0001 -1.10446482496946E-0001 +-1.10622613259026E-0001 -1.10798311885438E-0001 -1.10973575704930E-0001 -1.11148402044820E-0001 -1.11322788231000E-0001 +-1.11496731587934E-0001 -1.11670229438658E-0001 -1.11843279104782E-0001 -1.12015877906486E-0001 -1.12188023162524E-0001 +-1.12359712190224E-0001 -1.12530942305482E-0001 -1.12701710822772E-0001 -1.12872015055135E-0001 -1.13041852314189E-0001 +-1.13211219910123E-0001 -1.13380115151696E-0001 -1.13548535346242E-0001 -1.13716477799669E-0001 -1.13883939816453E-0001 +-1.14050918699646E-0001 -1.14217411750871E-0001 -1.14383416270324E-0001 -1.14548929556773E-0001 -1.14713948907560E-0001 +-1.14878471618596E-0001 -1.15042494984369E-0001 -1.15206016297935E-0001 -1.15369032850925E-0001 -1.15531541933544E-0001 +-1.15693540834565E-0001 -1.15855026841337E-0001 -1.16015997239781E-0001 -1.16176449314388E-0001 -1.16336380348226E-0001 +-1.16495787622930E-0001 -1.16654668418713E-0001 -1.16813020014355E-0001 -1.16970839687213E-0001 -1.17128124713215E-0001 +-1.17284872366859E-0001 -1.17441079921219E-0001 -1.17596744647941E-0001 -1.17751863817240E-0001 -1.17906434697908E-0001 +-1.18060454557306E-0001 -1.18213920661370E-0001 -1.18366830274606E-0001 -1.18519180660095E-0001 -1.18670969079489E-0001 +-1.18822192793013E-0001 -1.18972849059463E-0001 -1.19122935136209E-0001 -1.19272448279194E-0001 -1.19421385742932E-0001 +-1.19569744780509E-0001 -1.19717522643587E-0001 -1.19864716582395E-0001 -1.20011323845739E-0001 -1.20157341680996E-0001 +-1.20302767334114E-0001 -1.20447598049617E-0001 -1.20591831070597E-0001 -1.20735463638721E-0001 -1.20878492994230E-0001 +-1.21020916375933E-0001 -1.21162731021216E-0001 -1.21303934166035E-0001 -1.21444523044919E-0001 -1.21584494890969E-0001 +-1.21723846935860E-0001 -1.21862576409837E-0001 -1.22000680541719E-0001 -1.22138156558899E-0001 -1.22275001687339E-0001 +-1.22411213151575E-0001 -1.22546788174717E-0001 -1.22681723978446E-0001 -1.22816017783015E-0001 -1.22949666807250E-0001 +-1.23082668268549E-0001 -1.23215019382885E-0001 -1.23346717737894E-0001 -1.23477763147160E-0001 -1.23608156247243E-0001 +-1.23737897676555E-0001 -1.23866988074041E-0001 -1.23995428079179E-0001 -1.24123218331982E-0001 -1.24250359472997E-0001 +-1.24376852143304E-0001 -1.24502696984520E-0001 -1.24627894638792E-0001 -1.24752445748804E-0001 -1.24876350957773E-0001 +-1.24999610909450E-0001 -1.25122226248120E-0001 -1.25244197618602E-0001 -1.25365525666249E-0001 -1.25486211036949E-0001 +-1.25606254377122E-0001 -1.25725656333725E-0001 -1.25844417554246E-0001 -1.25962538686709E-0001 -1.26080020379671E-0001 +-1.26196863282224E-0001 -1.26313068043993E-0001 -1.26428635315138E-0001 -1.26543565746352E-0001 -1.26657859988862E-0001 +-1.26771518694431E-0001 -1.26884542515355E-0001 -1.26996932104462E-0001 -1.27108688115116E-0001 -1.27219811201216E-0001 +-1.27330302017193E-0001 -1.27440161218014E-0001 -1.27549389459176E-0001 -1.27657987396716E-0001 -1.27765955687200E-0001 +-1.27873294987732E-0001 -1.27980005955945E-0001 -1.28086089250012E-0001 -1.28191545528636E-0001 -1.28296375451054E-0001 +-1.28400579677040E-0001 -1.28504158866899E-0001 -1.28607113681472E-0001 -1.28709444782133E-0001 -1.28811152830790E-0001 +-1.28912238489886E-0001 -1.29012702422396E-0001 -1.29112545291832E-0001 -1.29211767762239E-0001 -1.29310370498193E-0001 +-1.29408354164808E-0001 -1.29505719427731E-0001 -1.29602466953142E-0001 -1.29698597407756E-0001 -1.29794111458821E-0001 +-1.29889009774121E-0001 -1.29983293021971E-0001 -1.30076961871223E-0001 -1.30170016991262E-0001 -1.30262459052006E-0001 +-1.30354288723908E-0001 -1.30445506677956E-0001 -1.30536113585669E-0001 -1.30626110119104E-0001 -1.30715496950850E-0001 +-1.30804274754028E-0001 -1.30892444202297E-0001 -1.30980005969848E-0001 -1.31066960731406E-0001 -1.31153309162229E-0001 +-1.31239051938112E-0001 -1.31324189735382E-0001 -1.31408723230899E-0001 -1.31492653102060E-0001 -1.31575980026794E-0001 +-1.31658704683563E-0001 -1.31740827751367E-0001 -1.31822349909735E-0001 -1.31903271838735E-0001 -1.31983594218964E-0001 +-1.32063317731558E-0001 -1.32142443058183E-0001 -1.32220970881042E-0001 -1.32298901882870E-0001 -1.32376236746936E-0001 +-1.32452976157046E-0001 -1.32529120797535E-0001 -1.32604671353277E-0001 -1.32679628509678E-0001 -1.32753992952677E-0001 +-1.32827765368747E-0001 -1.32900946444899E-0001 -1.32973536868672E-0001 -1.33045537328144E-0001 -1.33116948511925E-0001 +-1.33187771109158E-0001 -1.33258005809523E-0001 -1.33327653303230E-0001 -1.33396714281028E-0001 -1.33465189434195E-0001 +-1.33533079454546E-0001 -1.33600385034429E-0001 -1.33667106866728E-0001 -1.33733245644859E-0001 -1.33798802062771E-0001 +-1.33863776814950E-0001 -1.33928170596413E-0001 -1.33991984102715E-0001 -1.34055218029941E-0001 -1.34117873074712E-0001 +-1.34179949934183E-0001 -1.34241449306042E-0001 -1.34302371888513E-0001 -1.34362718380351E-0001 -1.34422489480849E-0001 +-1.34481685889831E-0001 -1.34540308307655E-0001 -1.34598357435216E-0001 -1.34655833973939E-0001 -1.34712738625786E-0001 +-1.34769072093252E-0001 -1.34824835079366E-0001 -1.34880028287692E-0001 -1.34934652422326E-0001 -1.34988708187899E-0001 +-1.35042196289578E-0001 -1.35095117433061E-0001 -1.35147472324581E-0001 -1.35199261670906E-0001 -1.35250486179338E-0001 +-1.35301146557712E-0001 -1.35351243514397E-0001 -1.35400777758297E-0001 -1.35449749998849E-0001 -1.35498160946025E-0001 +-1.35546011310331E-0001 -1.35593301802806E-0001 -1.35640033135024E-0001 -1.35686206019093E-0001 -1.35731821167654E-0001 +-1.35776879293884E-0001 -1.35821381111492E-0001 -1.35865327334722E-0001 -1.35908718678352E-0001 -1.35951555857694E-0001 +-1.35993839588594E-0001 -1.36035570587432E-0001 -1.36076749571122E-0001 -1.36117377257112E-0001 -1.36157454363384E-0001 +-1.36196981608455E-0001 -1.36235959711374E-0001 -1.36274389391727E-0001 -1.36312271369630E-0001 -1.36349606365738E-0001 +-1.36386395101235E-0001 -1.36422638297842E-0001 -1.36458336677814E-0001 -1.36493490963940E-0001 -1.36528101879541E-0001 +-1.36562170148474E-0001 -1.36595696495130E-0001 -1.36628681644434E-0001 -1.36661126321844E-0001 -1.36693031253352E-0001 +-1.36724397165486E-0001 -1.36755224785306E-0001 -1.36785514840408E-0001 -1.36815268058919E-0001 -1.36844485169503E-0001 +-1.36873166901357E-0001 -1.36901313984211E-0001 -1.36928927148331E-0001 -1.36956007124515E-0001 -1.36982554644097E-0001 +-1.37008570438944E-0001 -1.37034055241457E-0001 -1.37059009784571E-0001 -1.37083434801755E-0001 -1.37107331027012E-0001 +-1.37130699194881E-0001 -1.37153540040431E-0001 -1.37175854299268E-0001 -1.37197642707533E-0001 -1.37218906001898E-0001 +-1.37239644919570E-0001 -1.37259860198291E-0001 -1.37279552576337E-0001 -1.37298722792517E-0001 -1.37317371586175E-0001 +-1.37335499697189E-0001 -1.37353107865969E-0001 -1.37370196833462E-0001 -1.37386767341148E-0001 -1.37402820131041E-0001 +-1.37418355945687E-0001 -1.37433375528169E-0001 -1.37447879622104E-0001 -1.37461868971640E-0001 -1.37475344321462E-0001 +-1.37488306416787E-0001 -1.37500756003369E-0001 -1.37512693827492E-0001 -1.37524120635977E-0001 -1.37535037176179E-0001 +-1.37545444195985E-0001 -1.37555342443817E-0001 -1.37564732668632E-0001 -1.37573615619920E-0001 -1.37581992047706E-0001 +-1.37589862702547E-0001 -1.37597228335537E-0001 -1.37604089698301E-0001 -1.37610447543000E-0001 -1.37616302622329E-0001 +-1.37621655689516E-0001 -1.37626507498323E-0001 -1.37630858803048E-0001 -1.37634710358521E-0001 -1.37638062920107E-0001 +-1.37640917243704E-0001 -1.37643274085745E-0001 -1.37645134203197E-0001 -1.37646498353561E-0001 -1.37647367294871E-0001 +-1.37647741785697E-0001 -1.37647622585142E-0001 -1.37647010452842E-0001 -1.37645906148968E-0001 -1.37644310434226E-0001 +-1.37642224069855E-0001 -1.37639647817628E-0001 -1.37636582439851E-0001 -1.37633028699367E-0001 -1.37628987359550E-0001 +-1.37624459184309E-0001 -1.37619444938089E-0001 -1.37613945385866E-0001 -1.37607961293152E-0001 -1.37601493425991E-0001 +-1.37594542550965E-0001 -1.37587109435185E-0001 -1.37579194846300E-0001 -1.37570799552491E-0001 -1.37561924322474E-0001 +-1.37552569925498E-0001 -1.37542737131348E-0001 -1.37532426710340E-0001 -1.37521639433326E-0001 -1.37510376071693E-0001 +-1.37498637397360E-0001 -1.37486424182781E-0001 -1.37473737200944E-0001 -1.37460577225370E-0001 -1.37446945030116E-0001 +-1.37432841389772E-0001 -1.37418267079462E-0001 -1.37403222874844E-0001 -1.37387709552110E-0001 -1.37371727887986E-0001 +-1.37355278659732E-0001 -1.37338362645142E-0001 -1.37320980622546E-0001 -1.37303133370804E-0001 -1.37284821669314E-0001 +-1.37266046298006E-0001 -1.37246808037343E-0001 -1.37227107668326E-0001 -1.37206945972485E-0001 -1.37186323731888E-0001 +-1.37165241729135E-0001 -1.37143700747361E-0001 -1.37121701570235E-0001 -1.37099244981958E-0001 -1.37076331767268E-0001 +-1.37052962711435E-0001 -1.37029138600264E-0001 -1.37004860220095E-0001 -1.36980128357799E-0001 -1.36954943800784E-0001 +-1.36929307336991E-0001 -1.36903219754894E-0001 -1.36876681843502E-0001 -1.36849694392360E-0001 -1.36822258191543E-0001 +-1.36794374031662E-0001 -1.36766042703863E-0001 -1.36737264999826E-0001 -1.36708041711762E-0001 -1.36678373632420E-0001 +-1.36648261555081E-0001 -1.36617706273560E-0001 -1.36586708582206E-0001 -1.36555269275903E-0001 -1.36523389150068E-0001 +-1.36491069000652E-0001 -1.36458309624142E-0001 -1.36425111817557E-0001 -1.36391476378450E-0001 -1.36357404104908E-0001 +-1.36322895795554E-0001 -1.36287952249543E-0001 -1.36252574266565E-0001 -1.36216762646844E-0001 -1.36180518191137E-0001 +-1.36143841700736E-0001 -1.36106733977467E-0001 -1.36069195823691E-0001 -1.36031228042300E-0001 -1.35992831436723E-0001 +-1.35954006810922E-0001 -1.35914754969392E-0001 -1.35875076717165E-0001 -1.35834972859804E-0001 -1.35794444203407E-0001 +-1.35753491554607E-0001 -1.35712115720569E-0001 -1.35670317508994E-0001 -1.35628097728116E-0001 -1.35585457186704E-0001 +-1.35542396694060E-0001 -1.35498917060020E-0001 -1.35455019094954E-0001 -1.35410703609768E-0001 -1.35365971415900E-0001 +-1.35320823325322E-0001 -1.35275260150541E-0001 -1.35229282704597E-0001 -1.35182891801066E-0001 -1.35136088254055E-0001 +-1.35088872878208E-0001 -1.35041246488701E-0001 -1.34993209901245E-0001 -1.34944763932086E-0001 -1.34895909398001E-0001 +-1.34846647116304E-0001 -1.34796977904842E-0001 -1.34746902581995E-0001 -1.34696421966680E-0001 -1.34645536878344E-0001 +-1.34594248136971E-0001 -1.34542556563078E-0001 -1.34490462977716E-0001 -1.34437968202470E-0001 -1.34385073059460E-0001 +-1.34331778371340E-0001 -1.34278084961295E-0001 -1.34223993653048E-0001 -1.34169505270854E-0001 -1.34114620639502E-0001 +-1.34059340584316E-0001 -1.34003665931154E-0001 -1.33947597506406E-0001 -1.33891136136999E-0001 -1.33834282650392E-0001 +-1.33777037874578E-0001 -1.33719402638086E-0001 -1.33661377769977E-0001 -1.33602964099847E-0001 -1.33544162457826E-0001 +-1.33484973674576E-0001 -1.33425398581298E-0001 -1.33365438009721E-0001 -1.33305092792113E-0001 -1.33244363761273E-0001 +-1.33183251750534E-0001 -1.33121757593766E-0001 -1.33059882125371E-0001 -1.32997626180283E-0001 -1.32934990593974E-0001 +-1.32871976202448E-0001 -1.32808583842243E-0001 -1.32744814350431E-0001 -1.32680668564618E-0001 -1.32616147322945E-0001 +-1.32551251464087E-0001 -1.32485981827251E-0001 -1.32420339252180E-0001 -1.32354324579150E-0001 -1.32287938648973E-0001 +-1.32221182302992E-0001 -1.32154056383086E-0001 -1.32086561731668E-0001 -1.32018699191684E-0001 -1.31950469606616E-0001 +-1.31881873820478E-0001 -1.31812912677818E-0001 -1.31743587023719E-0001 -1.31673897703799E-0001 -1.31603845564208E-0001 +-1.31533431451632E-0001 -1.31462656213288E-0001 -1.31391520696930E-0001 -1.31320025750846E-0001 -1.31248172223855E-0001 +-1.31175960965314E-0001 -1.31103392825111E-0001 -1.31030468653670E-0001 -1.30957189301947E-0001 -1.30883555621434E-0001 +-1.30809568464157E-0001 -1.30735228682674E-0001 -1.30660537130079E-0001 -1.30585494660000E-0001 -1.30510102126597E-0001 +-1.30434360384566E-0001 -1.30358270289137E-0001 -1.30281832696074E-0001 -1.30205048461673E-0001 -1.30127918442766E-0001 +-1.30050443496720E-0001 -1.29972624481433E-0001 -1.29894462255340E-0001 -1.29815957677408E-0001 -1.29737111607140E-0001 +-1.29657924904569E-0001 -1.29578398430268E-0001 -1.29498533045339E-0001 -1.29418329611421E-0001 -1.29337788990685E-0001 +-1.29256912045838E-0001 -1.29175699640119E-0001 -1.29094152637303E-0001 -1.29012271901698E-0001 -1.28930058298146E-0001 +-1.28847512692023E-0001 -1.28764635949239E-0001 -1.28681428936238E-0001 -1.28597892520000E-0001 -1.28514027568036E-0001 +-1.28429834948392E-0001 -1.28345315529649E-0001 -1.28260470180922E-0001 -1.28175299771859E-0001 -1.28089805172642E-0001 +-1.28003987253989E-0001 -1.27917846887149E-0001 -1.27831384943907E-0001 -1.27744602296582E-0001 -1.27657499818026E-0001 +-1.27570078381627E-0001 -1.27482338861305E-0001 -1.27394282131515E-0001 -1.27305909067246E-0001 -1.27217220544020E-0001 +-1.27128217437895E-0001 -1.27038900625461E-0001 -1.26949270983844E-0001 -1.26859329390703E-0001 -1.26769076724230E-0001 +-1.26678513863152E-0001 -1.26587641686732E-0001 -1.26496461074764E-0001 -1.26404972907576E-0001 -1.26313178066034E-0001 +-1.26221077431533E-0001 -1.26128671886005E-0001 -1.26035962311915E-0001 -1.25942949592264E-0001 -1.25849634610583E-0001 +-1.25756018250941E-0001 -1.25662101397940E-0001 -1.25567884936714E-0001 -1.25473369752934E-0001 -1.25378556732802E-0001 +-1.25283446763057E-0001 -1.25188040730970E-0001 -1.25092339524348E-0001 -1.24996344031528E-0001 -1.24900055141387E-0001 +-1.24803473743331E-0001 -1.24706600727302E-0001 -1.24609436983776E-0001 -1.24511983403764E-0001 -1.24414240878808E-0001 +-1.24316210300987E-0001 -1.24217892562914E-0001 -1.24119288557734E-0001 -1.24020399179127E-0001 -1.23921225321307E-0001 +-1.23821767879023E-0001 -1.23722027747557E-0001 -1.23622005822726E-0001 -1.23521703000878E-0001 -1.23421120178900E-0001 +-1.23320258254208E-0001 -1.23219118124756E-0001 -1.23117700689031E-0001 -1.23016006846051E-0001 -1.22914037495373E-0001 +-1.22811793537084E-0001 -1.22709275871808E-0001 -1.22606485400700E-0001 -1.22503423025452E-0001 -1.22400089648288E-0001 +-1.22296486171967E-0001 -1.22192613499781E-0001 -1.22088472535558E-0001 -1.21984064183659E-0001 -1.21879389348977E-0001 +-1.21774448936943E-0001 -1.21669243853519E-0001 -1.21563775005202E-0001 -1.21458043299023E-0001 -1.21352049642547E-0001 +-1.21245794943874E-0001 -1.21139280111636E-0001 -1.21032506055001E-0001 -1.20925473683670E-0001 -1.20818183907877E-0001 +-1.20710637638394E-0001 -1.20602835786521E-0001 -1.20494779264098E-0001 -1.20386468983496E-0001 -1.20277905857619E-0001 +-1.20169090799907E-0001 -1.20060024724335E-0001 -1.19950708545408E-0001 -1.19841143178170E-0001 -1.19731329538195E-0001 +-1.19621268541594E-0001 -1.19510961105009E-0001 -1.19400408145620E-0001 -1.19289610581136E-0001 -1.19178569329805E-0001 +-1.19067285310405E-0001 -1.18955759442252E-0001 -1.18843992645193E-0001 -1.18731985839609E-0001 -1.18619739946417E-0001 +-1.18507255887066E-0001 -1.18394534583542E-0001 -1.18281576958361E-0001 -1.18168383934576E-0001 -1.18054956435773E-0001 +-1.17941295386073E-0001 -1.17827401710129E-0001 -1.17713276333131E-0001 -1.17598920180799E-0001 -1.17484334179391E-0001 +-1.17369519255696E-0001 -1.17254476337040E-0001 -1.17139206351281E-0001 -1.17023710226811E-0001 -1.16907988892557E-0001 +-1.16792043277978E-0001 -1.16675874313071E-0001 -1.16559482928364E-0001 -1.16442870054918E-0001 -1.16326036624332E-0001 +-1.16208983568735E-0001 -1.16091711820792E-0001 -1.15974222313703E-0001 -1.15856515981200E-0001 -1.15738593757550E-0001 +-1.15620456577554E-0001 -1.15502105376546E-0001 -1.15383541090397E-0001 -1.15264764655508E-0001 -1.15145777008818E-0001 +-1.15026579087796E-0001 -1.14907171830449E-0001 -1.14787556175315E-0001 -1.14667733061467E-0001 -1.14547703428514E-0001 +-1.14427468216595E-0001 -1.14307028366387E-0001 -1.14186384819099E-0001 -1.14065538516474E-0001 -1.13944490400790E-0001 +-1.13823241414858E-0001 -1.13701792502024E-0001 -1.13580144606167E-0001 -1.13458298671700E-0001 -1.13336255643572E-0001 +-1.13214016467264E-0001 -1.13091582088792E-0001 -1.12968953454705E-0001 -1.12846131512087E-0001 -1.12723117208556E-0001 +-1.12599911492264E-0001 -1.12476515311897E-0001 -1.12352929616674E-0001 -1.12229155356350E-0001 -1.12105193481213E-0001 +-1.11981044942084E-0001 -1.11856710690320E-0001 -1.11732191677810E-0001 -1.11607488856979E-0001 -1.11482603180785E-0001 +-1.11357535602720E-0001 -1.11232287076811E-0001 -1.11106858557618E-0001 -1.10981251000234E-0001 -1.10855465360289E-0001 +-1.10729502593944E-0001 -1.10603363657897E-0001 -1.10477049509377E-0001 -1.10350561106149E-0001 -1.10223899406512E-0001 +-1.10097065369298E-0001 -1.09970059953874E-0001 -1.09842884120140E-0001 -1.09715538828531E-0001 -1.09588025040016E-0001 +-1.09460343716097E-0001 -1.09332495818812E-0001 -1.09204482310731E-0001 -1.09076304154959E-0001 -1.08947962315135E-0001 +-1.08819457755431E-0001 -1.08690791440556E-0001 -1.08561964335749E-0001 -1.08432977406786E-0001 -1.08303831619975E-0001 +-1.08174527942161E-0001 -1.08045067340720E-0001 -1.07915450783563E-0001 -1.07785679239135E-0001 -1.07655753676417E-0001 +-1.07525675064920E-0001 -1.07395444374693E-0001 -1.07265062576316E-0001 -1.07134530640906E-0001 -1.07003849540111E-0001 +-1.06873020246116E-0001 -1.06742043731636E-0001 -1.06610920969925E-0001 -1.06479652934768E-0001 -1.06348240600484E-0001 +-1.06216684941927E-0001 -1.06084986934484E-0001 -1.05953147554078E-0001 -1.05821167777164E-0001 -1.05689048580732E-0001 +-1.05556790942306E-0001 -1.05424395839944E-0001 -1.05291864252237E-0001 -1.05159197158311E-0001 -1.05026395537827E-0001 +-1.04893460370979E-0001 -1.04760392638494E-0001 -1.04627193321635E-0001 -1.04493863402197E-0001 -1.04360403862512E-0001 +-1.04226815685442E-0001 -1.04093099854387E-0001 -1.03959257353279E-0001 -1.03825289166584E-0001 -1.03691196279302E-0001 +-1.03556979676967E-0001 -1.03422640345649E-0001 -1.03288179271950E-0001 -1.03153597443005E-0001 -1.03018895846486E-0001 +-1.02884075470597E-0001 -1.02749137304077E-0001 -1.02614082336199E-0001 -1.02478911556768E-0001 -1.02343625956126E-0001 +-1.02208226525148E-0001 -1.02072714255242E-0001 -1.01937090138351E-0001 -1.01801355166953E-0001 -1.01665510334057E-0001 +-1.01529556633209E-0001 -1.01393495058487E-0001 -1.01257326604506E-0001 -1.01121052266411E-0001 -1.00984673039884E-0001 +-1.00848189921140E-0001 -1.00711603906929E-0001 -1.00574915994532E-0001 -1.00438127181768E-0001 -1.00301238466989E-0001 +-1.00164250849078E-0001 -1.00027165327455E-0001 -9.98899829020751E-0002 -9.97527045734236E-0002 -9.96153313425229E-0002 +-9.94778642109282E-0002 -9.93403041807293E-0002 -9.92026522545493E-0002 -9.90649094355461E-0002 -9.89270767274115E-0002 +-9.87891551343707E-0002 -9.86511456611839E-0002 -9.85130493131443E-0002 -9.83748670960800E-0002 -9.82366000163529E-0002 +-9.80982490808585E-0002 -9.79598152970270E-0002 -9.78212996728219E-0002 -9.76827032167415E-0002 -9.75440269378179E-0002 +-9.74052718456166E-0002 -9.72664389502383E-0002 -9.71275292623165E-0002 -9.69885437930196E-0002 -9.68494835540500E-0002 +-9.67103495576434E-0002 -9.65711428165706E-0002 -9.64318643441353E-0002 -9.62925151541764E-0002 -9.61530962610656E-0002 +-9.60136086797097E-0002 -9.58740534255493E-0002 -9.57344315145583E-0002 -9.55947439632458E-0002 -9.54549917886538E-0002 +-9.53151760083591E-0002 -9.51752976404725E-0002 -9.50353577036382E-0002 -9.48953572170354E-0002 -9.47552972003763E-0002 +-9.46151786739079E-0002 -9.44750026584112E-0002 -9.43347701752005E-0002 -9.41944822461253E-0002 -9.40541398935678E-0002 +-9.39137441404456E-0002 -9.37732960102091E-0002 -9.36327965268435E-0002 -9.34922467148681E-0002 -9.33516475993357E-0002 +-9.32110002058335E-0002 -9.30703055604826E-0002 -9.29295646899381E-0002 -9.27887786213896E-0002 -9.26479483825599E-0002 +-9.25070750017067E-0002 -9.23661595076209E-0002 -9.22252029296281E-0002 -9.20842062975879E-0002 -9.19431706418934E-0002 +-9.18020969934724E-0002 -9.16609863837860E-0002 -9.15198398448299E-0002 -9.13786584091342E-0002 -9.12374431097617E-0002 +-9.10961949803108E-0002 -9.09549150549126E-0002 -9.08136043682333E-0002 -9.06722639554722E-0002 -9.05308948523634E-0002 +-9.03894980951749E-0002 -9.02480747207081E-0002 -9.01066257662995E-0002 -8.99651522698185E-0002 -8.98236552696693E-0002 +-8.96821358047903E-0002 -8.95405949146529E-0002 -8.93990336392637E-0002 -8.92574530191625E-0002 -8.91158540954236E-0002 +-8.89742379096554E-0002 -8.88326055039998E-0002 -8.86909579211335E-0002 -8.85492962042663E-0002 -8.84076213971427E-0002 +-8.82659345440416E-0002 -8.81242366897747E-0002 -8.79825288796890E-0002 -8.78408121596646E-0002 -8.76990875761164E-0002 +-8.75573561759926E-0002 -8.74156190067760E-0002 -8.72738771164834E-0002 -8.71321315536651E-0002 -8.69903833674063E-0002 +-8.68486336073252E-0002 -8.67068833235749E-0002 -8.65651335668425E-0002 -8.64233853883482E-0002 -8.62816398398475E-0002 +-8.61398979736289E-0002 -8.59981608425156E-0002 -8.58564294998647E-0002 -8.57147049995669E-0002 -8.55729883960478E-0002 +-8.54312807442659E-0002 -8.52895830997147E-0002 -8.51478965184215E-0002 -8.50062220569472E-0002 -8.48645607723875E-0002 +-8.47229137223711E-0002 -8.45812819650620E-0002 -8.44396665591570E-0002 -8.42980685638876E-0002 -8.41564890390198E-0002 +-8.40149290448524E-0002 -8.38733896422194E-0002 -8.37318718924878E-0002 -8.35903768575596E-0002 -8.34489055998707E-0002 +-8.33074591823900E-0002 -8.31660386686220E-0002 -8.30246451226037E-0002 -8.28832796089073E-0002 -8.27419431926388E-0002 +-8.26006369394374E-0002 -8.24593619154777E-0002 -8.23181191874670E-0002 -8.21769098226475E-0002 -8.20357348887955E-0002 +-8.18945954542205E-0002 -8.17534925877671E-0002 -8.16124273588128E-0002 -8.14714008372703E-0002 -8.13304140935852E-0002 +-8.11894681987381E-0002 -8.10485642242434E-0002 -8.09077032421489E-0002 -8.07668863250374E-0002 -8.06261145460248E-0002 +-8.04853889787616E-0002 -8.03447106974327E-0002 -8.02040807767559E-0002 -8.00635002919843E-0002 -7.99229703189038E-0002 +-7.97824919338354E-0002 -7.96420662136338E-0002 -7.95016942356873E-0002 -7.93613770779189E-0002 -7.92211158187850E-0002 +-7.90809115372764E-0002 -7.89407653129184E-0002 -7.88006782257691E-0002 -7.86606513564220E-0002 -7.85206857860034E-0002 +-7.83807825961748E-0002 -7.82409428691307E-0002 -7.81011676876002E-0002 -7.79614581348469E-0002 -7.78218152946671E-0002 +-7.76822402513925E-0002 -7.75427340898878E-0002 -7.74032978955524E-0002 -7.72639327543198E-0002 -7.71246397526567E-0002 +-7.69854199775650E-0002 -7.68462745165795E-0002 -7.67072044577699E-0002 -7.65682108897397E-0002 -7.64292949016259E-0002 +-7.62904575831005E-0002 -7.61517000243686E-0002 -7.60130233161699E-0002 -7.58744285497782E-0002 -7.57359168170008E-0002 +-7.55974892101798E-0002 -7.54591468221903E-0002 -7.53208907464426E-0002 -7.51827220768800E-0002 -7.50446419079805E-0002 +-7.49066513347563E-0002 -7.47687514527527E-0002 -7.46309433580501E-0002 -7.44932281472621E-0002 -7.43556069175367E-0002 +-7.42180807665564E-0002 -7.40806507925367E-0002 -7.39433180942282E-0002 -7.38060837709145E-0002 -7.36689489224140E-0002 +-7.35319146490793E-0002 -7.33949820517960E-0002 -7.32581522319849E-0002 -7.31214262916000E-0002 -7.29848053331297E-0002 +-7.28482904595966E-0002 -7.27118827745569E-0002 -7.25755833821013E-0002 -7.24393933868540E-0002 -7.23033138939739E-0002 +-7.21673460091531E-0002 -7.20314908386186E-0002 -7.18957494891311E-0002 -7.17601230679848E-0002 -7.16246126830091E-0002 +-7.14892194425661E-0002 -7.13539444555529E-0002 -7.12187888314006E-0002 -7.10837536800735E-0002 -7.09488401120710E-0002 +-7.08140492384256E-0002 -7.06793821707045E-0002 -7.05448400210091E-0002 -7.04104239019736E-0002 -7.02761349267679E-0002 +-7.01419742090946E-0002 -7.00079428631909E-0002 -6.98740420038284E-0002 -6.97402727463119E-0002 -6.96066362064810E-0002 +-6.94731335007086E-0002 -6.93397657459024E-0002 -6.92065340595035E-0002 -6.90734395594875E-0002 -6.89404833643639E-0002 +-6.88076665931760E-0002 -6.86749903655015E-0002 -6.85424558014517E-0002 -6.84100640216724E-0002 -6.82778161473434E-0002 +-6.81457133001779E-0002 -6.80137566024241E-0002 -6.78819471768633E-0002 -6.77502861468115E-0002 -6.76187746361187E-0002 +-6.74874137691683E-0002 -6.73562046708786E-0002 -6.72251484667012E-0002 -6.70942462826222E-0002 -6.69634992451619E-0002 +-6.68329084813737E-0002 -6.67024751188463E-0002 -6.65722002857012E-0002 -6.64420851105952E-0002 -6.63121307227178E-0002 +-6.61823382517936E-0002 -6.60527088280810E-0002 -6.59232435823718E-0002 -6.57939436459929E-0002 -6.56648101508041E-0002 +-6.55358442292001E-0002 -6.54070470141095E-0002 -6.52784196389943E-0002 -6.51499632378515E-0002 -6.50216789452112E-0002 +-6.48935678961381E-0002 -6.47656312262312E-0002 -6.46378700716226E-0002 -6.45102855689795E-0002 -6.43828788555021E-0002 +-6.42556510689254E-0002 -6.41286033475184E-0002 -6.40017368300836E-0002 -6.38750526559582E-0002 -6.37485519650127E-0002 +-6.36222358756351E-0002 -6.34961049260352E-0002 -6.33701590293675E-0002 -6.32443980677562E-0002 -6.31188219232235E-0002 +-6.29934304776914E-0002 -6.28682236129798E-0002 -6.27432012108076E-0002 -6.26183631527929E-0002 -6.24937093204515E-0002 +-6.23692395951991E-0002 -6.22449538583490E-0002 -6.21208519911140E-0002 -6.19969338746056E-0002 -6.18731993898335E-0002 +-6.17496484177068E-0002 -6.16262808390326E-0002 -6.15030965345174E-0002 -6.13800953847660E-0002 -6.12572772702820E-0002 +-6.11346420714681E-0002 -6.10121896686251E-0002 -6.08899199419532E-0002 -6.07678327715505E-0002 -6.06459280374146E-0002 +-6.05242056194416E-0002 -6.04026653974261E-0002 -6.02813072510618E-0002 -6.01601310599405E-0002 -6.00391367035535E-0002 +-5.99183240612906E-0002 -5.97976930124397E-0002 -5.96772434361885E-0002 -5.95569752116223E-0002 -5.94368882177260E-0002 +-5.93169823333830E-0002 -5.91972574373751E-0002 -5.90777134083833E-0002 -5.89583501249868E-0002 -5.88391674656641E-0002 +-5.87201653087919E-0002 -5.86013435326461E-0002 -5.84827020154011E-0002 -5.83642406351298E-0002 -5.82459592698044E-0002 +-5.81278577972952E-0002 -5.80099360953715E-0002 -5.78921940417017E-0002 -5.77746315138521E-0002 -5.76572483892887E-0002 +-5.75400445453753E-0002 -5.74230198593749E-0002 -5.73061742084496E-0002 -5.71895074696593E-0002 -5.70730195199635E-0002 +-5.69567102362197E-0002 -5.68405794951848E-0002 -5.67246271735142E-0002 -5.66088531477616E-0002 -5.64932572943801E-0002 +-5.63778394897209E-0002 -5.62625996100346E-0002 -5.61475375314697E-0002 -5.60326531300742E-0002 -5.59179462817947E-0002 +-5.58034168624758E-0002 -5.56890647478619E-0002 -5.55748898135952E-0002 -5.54608919352172E-0002 -5.53470709881682E-0002 +-5.52334268477865E-0002 -5.51199593893100E-0002 -5.50066684878747E-0002 -5.48935540185155E-0002 -5.47806158561666E-0002 +-5.46678538756598E-0002 -5.45552679517267E-0002 -5.44428579589967E-0002 -5.43306237719988E-0002 -5.42185652651604E-0002 +-5.41066823128072E-0002 -5.39949747891644E-0002 -5.38834425683550E-0002 -5.37720855244018E-0002 -5.36609035312253E-0002 +-5.35498964626454E-0002 -5.34390641923807E-0002 -5.33284065940480E-0002 -5.32179235411635E-0002 -5.31076149071415E-0002 +-5.29974805652955E-0002 -5.28875203888378E-0002 -5.27777342508788E-0002 -5.26681220244283E-0002 -5.25586835823943E-0002 +-5.24494187975838E-0002 -5.23403275427029E-0002 -5.22314096903555E-0002 -5.21226651130452E-0002 -5.20140936831735E-0002 +-5.19056952730413E-0002 -5.17974697548479E-0002 -5.16894170006912E-0002 -5.15815368825682E-0002 -5.14738292723742E-0002 +-5.13662940419038E-0002 -5.12589310628496E-0002 -5.11517402068034E-0002 -5.10447213452560E-0002 -5.09378743495960E-0002 +-5.08311990911118E-0002 -5.07246954409896E-0002 -5.06183632703149E-0002 -5.05122024500720E-0002 -5.04062128511434E-0002 +-5.03003943443109E-0002 -5.01947468002544E-0002 -5.00892700895530E-0002 -4.99839640826848E-0002 -4.98788286500257E-0002 +-4.97738636618514E-0002 -4.96690689883352E-0002 -4.95644444995501E-0002 -4.94599900654675E-0002 -4.93557055559572E-0002 +-4.92515908407884E-0002 -4.91476457896282E-0002 -4.90438702720433E-0002 -4.89402641574982E-0002 -4.88368273153569E-0002 +-4.87335596148821E-0002 -4.86304609252344E-0002 -4.85275311154742E-0002 -4.84247700545598E-0002 -4.83221776113487E-0002 +-4.82197536545971E-0002 -4.81174980529595E-0002 -4.80154106749899E-0002 -4.79134913891400E-0002 -4.78117400637612E-0002 +-4.77101565671032E-0002 -4.76087407673143E-0002 -4.75074925324419E-0002 -4.74064117304315E-0002 -4.73054982291280E-0002 +-4.72047518962750E-0002 -4.71041725995141E-0002 -4.70037602063865E-0002 -4.69035145843315E-0002 -4.68034356006877E-0002 +-4.67035231226916E-0002 -4.66037770174793E-0002 -4.65041971520853E-0002 -4.64047833934424E-0002 -4.63055356083830E-0002 +-4.62064536636374E-0002 -4.61075374258350E-0002 -4.60087867615041E-0002 -4.59102015370712E-0002 -4.58117816188623E-0002 +-4.57135268731012E-0002 -4.56154371659111E-0002 -4.55175123633140E-0002 -4.54197523312299E-0002 -4.53221569354784E-0002 +-4.52247260417770E-0002 -4.51274595157426E-0002 -4.50303572228908E-0002 -4.49334190286352E-0002 -4.48366447982890E-0002 +-4.47400343970635E-0002 -4.46435876900693E-0002 -4.45473045423150E-0002 -4.44511848187086E-0002 -4.43552283840567E-0002 +-4.42594351030641E-0002 -4.41638048403352E-0002 -4.40683374603722E-0002 -4.39730328275766E-0002 -4.38778908062488E-0002 +-4.37829112605873E-0002 -4.36880940546898E-0002 -4.35934390525525E-0002 -4.34989461180705E-0002 -4.34046151150376E-0002 +-4.33104459071461E-0002 -4.32164383579874E-0002 -4.31225923310512E-0002 -4.30289076897263E-0002 -4.29353842973002E-0002 +-4.28420220169587E-0002 -4.27488207117870E-0002 -4.26557802447682E-0002 -4.25629004787852E-0002 -4.24701812766184E-0002 +-4.23776225009479E-0002 -4.22852240143522E-0002 -4.21929856793083E-0002 -4.21009073581925E-0002 -4.20089889132790E-0002 +-4.19172302067413E-0002 -4.18256311006519E-0002 -4.17341914569812E-0002 -4.16429111375990E-0002 -4.15517900042735E-0002 +-4.14608279186716E-0002 -4.13700247423595E-0002 -4.12793803368012E-0002 -4.11888945633603E-0002 -4.10985672832983E-0002 +-4.10083983577761E-0002 -4.09183876478533E-0002 -4.08285350144877E-0002 -4.07388403185364E-0002 -4.06493034207547E-0002 +-4.05599241817972E-0002 -4.04707024622166E-0002 -4.03816381224649E-0002 -4.02927310228926E-0002 -4.02039810237487E-0002 +-4.01153879851815E-0002 -4.00269517672373E-0002 -3.99386722298616E-0002 -3.98505492328988E-0002 -3.97625826360913E-0002 +-3.96747722990812E-0002 -3.95871180814082E-0002 -3.94996198425118E-0002 -3.94122774417297E-0002 -3.93250907382982E-0002 +-3.92380595913528E-0002 -3.91511838599272E-0002 -3.90644634029540E-0002 -3.89778980792651E-0002 -3.88914877475900E-0002 +-3.88052322665581E-0002 -3.87191314946965E-0002 -3.86331852904320E-0002 -3.85473935120892E-0002 -3.84617560178921E-0002 +-3.83762726659633E-0002 -3.82909433143237E-0002 -3.82057678208936E-0002 -3.81207460434915E-0002 -3.80358778398347E-0002 +-3.79511630675397E-0002 -3.78666015841209E-0002 -3.77821932469923E-0002 -3.76979379134659E-0002 -3.76138354407529E-0002 +-3.75298856859633E-0002 -3.74460885061051E-0002 -3.73624437580860E-0002 -3.72789512987116E-0002 -3.71956109846869E-0002 +-3.71124226726150E-0002 -3.70293862189982E-0002 -3.69465014802375E-0002 -3.68637683126322E-0002 -3.67811865723810E-0002 +-3.66987561155806E-0002 -3.66164767982268E-0002 -3.65343484762145E-0002 -3.64523710053365E-0002 -3.63705442412850E-0002 +-3.62888680396506E-0002 -3.62073422559226E-0002 -3.61259667454895E-0002 -3.60447413636378E-0002 -3.59636659655534E-0002 +-3.58827404063203E-0002 -3.58019645409218E-0002 -3.57213382242398E-0002 -3.56408613110545E-0002 -3.55605336560454E-0002 +-3.54803551137902E-0002 -3.54003255387659E-0002 -3.53204447853476E-0002 -3.52407127078096E-0002 -3.51611291603250E-0002 +-3.50816939969651E-0002 -3.50024070717005E-0002 -3.49232682383999E-0002 -3.48442773508313E-0002 -3.47654342626614E-0002 +-3.46867388274551E-0002 -3.46081908986766E-0002 -3.45297903296885E-0002 -3.44515369737522E-0002 -3.43734306840281E-0002 +-3.42954713135748E-0002 -3.42176587153501E-0002 -3.41399927422101E-0002 -3.40624732469101E-0002 -3.39851000821039E-0002 +-3.39078731003438E-0002 -3.38307921540813E-0002 -3.37538570956662E-0002 -3.36770677773474E-0002 -3.36004240512721E-0002 +-3.35239257694866E-0002 -3.34475727839358E-0002 -3.33713649464632E-0002 -3.32953021088114E-0002 -3.32193841226211E-0002 +-3.31436108394323E-0002 -3.30679821106837E-0002 -3.29924977877122E-0002 -3.29171577217542E-0002 -3.28419617639439E-0002 +-3.27669097653151E-0002 -3.26920015768001E-0002 -3.26172370492293E-0002 -3.25426160333328E-0002 -3.24681383797386E-0002 +-3.23938039389740E-0002 -3.23196125614648E-0002 -3.22455640975353E-0002 -3.21716583974091E-0002 -3.20978953112079E-0002 +-3.20242746889526E-0002 -3.19507963805625E-0002 -3.18774602358559E-0002 -3.18042661045497E-0002 -3.17312138362594E-0002 +-3.16583032804995E-0002 -3.15855342866830E-0002 -3.15129067041216E-0002 -3.14404203820261E-0002 -3.13680751695056E-0002 +-3.12958709155682E-0002 -3.12238074691204E-0002 -3.11518846789678E-0002 -3.10801023938147E-0002 -3.10084604622638E-0002 +-3.09369587328168E-0002 -3.08655970538741E-0002 -3.07943752737347E-0002 -3.07232932405966E-0002 -3.06523508025560E-0002 +-3.05815478076086E-0002 -3.05108841036481E-0002 -3.04403595384674E-0002 -3.03699739597577E-0002 -3.02997272151094E-0002 +-3.02296191520115E-0002 -3.01596496178513E-0002 -3.00898184599155E-0002 -3.00201255253890E-0002 -2.99505706613556E-0002 +-2.98811537147981E-0002 -2.98118745325975E-0002 -2.97427329615340E-0002 -2.96737288482861E-0002 -2.96048620394314E-0002 +-2.95361323814462E-0002 -2.94675397207052E-0002 -2.93990839034822E-0002 -2.93307647759495E-0002 -2.92625821841781E-0002 +-2.91945359741381E-0002 -2.91266259916978E-0002 -2.90588520826247E-0002 -2.89912140925845E-0002 -2.89237118671423E-0002 +-2.88563452517612E-0002 -2.87891140918036E-0002 -2.87220182325305E-0002 -2.86550575191014E-0002 -2.85882317965747E-0002 +-2.85215409099075E-0002 -2.84549847039557E-0002 -2.83885630234738E-0002 -2.83222757131151E-0002 -2.82561226174316E-0002 +-2.81901035808741E-0002 -2.81242184477919E-0002 -2.80584670624335E-0002 -2.79928492689455E-0002 -2.79273649113738E-0002 +-2.78620138336626E-0002 -2.77967958796550E-0002 -2.77317108930931E-0002 -2.76667587176172E-0002 -2.76019391967668E-0002 +-2.75372521739797E-0002 -2.74726974925928E-0002 -2.74082749958414E-0002 -2.73439845268599E-0002 -2.72798259286812E-0002 +-2.72157990442368E-0002 -2.71519037163574E-0002 -2.70881397877717E-0002 -2.70245071011078E-0002 -2.69610054988923E-0002 +-2.68976348235503E-0002 -2.68343949174061E-0002 -2.67712856226822E-0002 -2.67083067815001E-0002 -2.66454582358803E-0002 +-2.65827398277413E-0002 -2.65201513989011E-0002 -2.64576927910759E-0002 -2.63953638458809E-0002 -2.63331644048301E-0002 +-2.62710943093357E-0002 -2.62091534007094E-0002 -2.61473415201609E-0002 -2.60856585087992E-0002 -2.60241042076315E-0002 +-2.59626784575643E-0002 -2.59013810994025E-0002 -2.58402119738497E-0002 -2.57791709215083E-0002 -2.57182577828794E-0002 +-2.56574723983628E-0002 -2.55968146082573E-0002 -2.55362842527600E-0002 -2.54758811719670E-0002 -2.54156052058731E-0002 +-2.53554561943716E-0002 -2.52954339772551E-0002 -2.52355383942141E-0002 -2.51757692848387E-0002 -2.51161264886169E-0002 +-2.50566098449361E-0002 -2.49972191930821E-0002 -2.49379543722394E-0002 -2.48788152214915E-0002 -2.48198015798201E-0002 +-2.47609132861064E-0002 -2.47021501791295E-0002 -2.46435120975678E-0002 -2.45849988799984E-0002 -2.45266103648967E-0002 +-2.44683463906374E-0002 -2.44102067954933E-0002 -2.43521914176364E-0002 -2.42943000951374E-0002 -2.42365326659655E-0002 +-2.41788889679889E-0002 -2.41213688389741E-0002 -2.40639721165868E-0002 -2.40066986383912E-0002 -2.39495482418502E-0002 +-2.38925207643256E-0002 -2.38356160430777E-0002 -2.37788339152656E-0002 -2.37221742179473E-0002 -2.36656367880793E-0002 +-2.36092214625170E-0002 -2.35529280780144E-0002 -2.34967564712243E-0002 -2.34407064786981E-0002 -2.33847779368862E-0002 +-2.33289706821375E-0002 -2.32732845506996E-0002 -2.32177193787190E-0002 -2.31622750022409E-0002 -2.31069512572090E-0002 +-2.30517479794661E-0002 -2.29966650047533E-0002 -2.29417021687109E-0002 -2.28868593068775E-0002 -2.28321362546907E-0002 +-2.27775328474868E-0002 -2.27230489205006E-0002 -2.26686843088659E-0002 -2.26144388476151E-0002 -2.25603123716793E-0002 +-2.25063047158885E-0002 -2.24524157149712E-0002 -2.23986452035548E-0002 -2.23449930161653E-0002 -2.22914589872275E-0002 +-2.22380429510649E-0002 -2.21847447418997E-0002 -2.21315641938531E-0002 -2.20785011409446E-0002 -2.20255554170927E-0002 +-2.19727268561144E-0002 -2.19200152917257E-0002 -2.18674205575414E-0002 -2.18149424870744E-0002 -2.17625809137372E-0002 +-2.17103356708404E-0002 -2.16582065915934E-0002 -2.16061935091047E-0002 -2.15542962563811E-0002 -2.15025146663284E-0002 +-2.14508485717510E-0002 -2.13992978053520E-0002 -2.13478621997333E-0002 -2.12965415873956E-0002 -2.12453358007383E-0002 +-2.11942446720592E-0002 -2.11432680335554E-0002 -2.10924057173222E-0002 -2.10416575553539E-0002 -2.09910233795436E-0002 +-2.09405030216829E-0002 -2.08900963134624E-0002 -2.08398030864710E-0002 -2.07896231721967E-0002 -2.07395564020262E-0002 +-2.06896026072448E-0002 -2.06397616190366E-0002 -2.05900332684843E-0002 -2.05404173865695E-0002 -2.04909138041726E-0002 +-2.04415223520724E-0002 -2.03922428609466E-0002 -2.03430751613717E-0002 -2.02940190838230E-0002 -2.02450744586742E-0002 +-2.01962411161979E-0002 -2.01475188865657E-0002 -2.00989075998474E-0002 -2.00504070860121E-0002 -2.00020171749271E-0002 +-1.99537376963587E-0002 -1.99055684799720E-0002 -1.98575093553306E-0002 -1.98095601518970E-0002 -1.97617206990324E-0002 +-1.97139908259966E-0002 -1.96663703619485E-0002 -1.96188591359451E-0002 -1.95714569769427E-0002 -1.95241637137960E-0002 +-1.94769791752587E-0002 -1.94299031899830E-0002 -1.93829355865197E-0002 -1.93360761933189E-0002 -1.92893248387287E-0002 +-1.92426813509966E-0002 -1.91961455582681E-0002 -1.91497172885882E-0002 -1.91033963699002E-0002 -1.90571826300460E-0002 +-1.90110758967666E-0002 -1.89650759977015E-0002 -1.89191827603889E-0002 -1.88733960122660E-0002 -1.88277155806683E-0002 +-1.87821412928304E-0002 -1.87366729758853E-0002 -1.86913104568652E-0002 -1.86460535627006E-0002 -1.86009021202207E-0002 +-1.85558559561539E-0002 -1.85109148971268E-0002 -1.84660787696651E-0002 -1.84213474001930E-0002 -1.83767206150335E-0002 +-1.83321982404084E-0002 -1.82877801024380E-0002 -1.82434660271417E-0002 -1.81992558404373E-0002 -1.81551493681414E-0002 +-1.81111464359696E-0002 -1.80672468695357E-0002 -1.80234504943527E-0002 -1.79797571358322E-0002 -1.79361666192843E-0002 +-1.78926787699182E-0002 -1.78492934128415E-0002 -1.78060103730608E-0002 -1.77628294754812E-0002 -1.77197505449066E-0002 +-1.76767734060398E-0002 -1.76338978834820E-0002 -1.75911238017335E-0002 -1.75484509851929E-0002 -1.75058792581579E-0002 +-1.74634084448248E-0002 -1.74210383692886E-0002 -1.73787688555430E-0002 -1.73365997274805E-0002 -1.72945308088923E-0002 +-1.72525619234684E-0002 -1.72106928947973E-0002 -1.71689235463665E-0002 -1.71272537015621E-0002 -1.70856831836690E-0002 +-1.70442118158705E-0002 -1.70028394212492E-0002 -1.69615658227860E-0002 -1.69203908433607E-0002 -1.68793143057517E-0002 +-1.68383360326362E-0002 -1.67974558465902E-0002 -1.67566735700884E-0002 -1.67159890255040E-0002 -1.66754020351094E-0002 +-1.66349124210751E-0002 -1.65945200054709E-0002 -1.65542246102652E-0002 -1.65140260573247E-0002 -1.64739241684155E-0002 +-1.64339187652018E-0002 -1.63940096692470E-0002 -1.63541967020129E-0002 -1.63144796848603E-0002 -1.62748584390485E-0002 +-1.62353327857356E-0002 -1.61959025459786E-0002 -1.61565675407329E-0002 -1.61173275908529E-0002 -1.60781825170917E-0002 +-1.60391321401009E-0002 -1.60001762804311E-0002 -1.59613147585314E-0002 -1.59225473947498E-0002 -1.58838740093331E-0002 +-1.58452944224265E-0002 -1.58068084540743E-0002 -1.57684159242193E-0002 -1.57301166527029E-0002 -1.56919104592657E-0002 +-1.56537971635466E-0002 -1.56157765850833E-0002 -1.55778485433124E-0002 -1.55400128575691E-0002 -1.55022693470872E-0002 +-1.54646178309996E-0002 -1.54270581283377E-0002 -1.53895900580314E-0002 -1.53522134389098E-0002 -1.53149280897004E-0002 +-1.52777338290294E-0002 -1.52406304754220E-0002 -1.52036178473019E-0002 -1.51666957629917E-0002 -1.51298640407124E-0002 +-1.50931224985842E-0002 -1.50564709546257E-0002 -1.50199092267542E-0002 -1.49834371327860E-0002 -1.49470544904358E-0002 +-1.49107611173173E-0002 -1.48745568309428E-0002 -1.48384414487234E-0002 -1.48024147879688E-0002 -1.47664766658875E-0002 +-1.47306268995868E-0002 -1.46948653060726E-0002 -1.46591917022495E-0002 -1.46236059049212E-0002 -1.45881077307895E-0002 +-1.45526969964556E-0002 -1.45173735184187E-0002 -1.44821371130775E-0002 -1.44469875967289E-0002 -1.44119247855686E-0002 +-1.43769484956913E-0002 -1.43420585430901E-0002 -1.43072547436569E-0002 -1.42725369131826E-0002 -1.42379048673564E-0002 +-1.42033584217667E-0002 -1.41688973919001E-0002 -1.41345215931423E-0002 -1.41002308407778E-0002 -1.40660249499894E-0002 +-1.40319037358591E-0002 -1.39978670133672E-0002 -1.39639145973932E-0002 -1.39300463027148E-0002 -1.38962619440088E-0002 +-1.38625613358508E-0002 -1.38289442927147E-0002 -1.37954106289735E-0002 -1.37619601588987E-0002 -1.37285926966608E-0002 +-1.36953080563288E-0002 -1.36621060518704E-0002 -1.36289864971523E-0002 -1.35959492059396E-0002 -1.35629939918963E-0002 +-1.35301206685851E-0002 -1.34973290494675E-0002 -1.34646189479036E-0002 -1.34319901771522E-0002 -1.33994425503711E-0002 +-1.33669758806165E-0002 -1.33345899808435E-0002 -1.33022846639060E-0002 -1.32700597425563E-0002 -1.32379150294459E-0002 +-1.32058503371246E-0002 -1.31738654780411E-0002 -1.31419602645430E-0002 -1.31101345088763E-0002 -1.30783880231861E-0002 +-1.30467206195157E-0002 -1.30151321098077E-0002 -1.29836223059031E-0002 -1.29521910195416E-0002 -1.29208380623619E-0002 +-1.28895632459012E-0002 -1.28583663815954E-0002 -1.28272472807793E-0002 -1.27962057546863E-0002 -1.27652416144487E-0002 +-1.27343546710971E-0002 -1.27035447355614E-0002 -1.26728116186698E-0002 -1.26421551311495E-0002 -1.26115750836262E-0002 +-1.25810712866244E-0002 -1.25506435505676E-0002 -1.25202916857775E-0002 -1.24900155024749E-0002 -1.24598148107794E-0002 +-1.24296894207089E-0002 -1.23996391421806E-0002 -1.23696637850099E-0002 -1.23397631589113E-0002 -1.23099370734978E-0002 +-1.22801853382812E-0002 -1.22505077626721E-0002 -1.22209041559798E-0002 -1.21913743274121E-0002 -1.21619180860760E-0002 +-1.21325352409767E-0002 -1.21032256010186E-0002 -1.20739889750044E-0002 -1.20448251716358E-0002 -1.20157339995132E-0002 +-1.19867152671357E-0002 -1.19577687829011E-0002 -1.19288943551060E-0002 -1.19000917919455E-0002 -1.18713609015137E-0002 +-1.18427014918034E-0002 -1.18141133707059E-0002 -1.17855963460116E-0002 -1.17571502254092E-0002 -1.17287748164864E-0002 +-1.17004699267296E-0002 -1.16722353635239E-0002 -1.16440709341531E-0002 -1.16159764457997E-0002 -1.15879517055451E-0002 +-1.15599965203692E-0002 -1.15321106971508E-0002 -1.15042940426672E-0002 -1.14765463635949E-0002 -1.14488674665085E-0002 +-1.14212571578818E-0002 -1.13937152440871E-0002 -1.13662415313956E-0002 -1.13388358259771E-0002 -1.13114979339000E-0002 +-1.12842276611319E-0002 -1.12570248135384E-0002 -1.12298891968846E-0002 -1.12028206168338E-0002 -1.11758188789481E-0002 +-1.11488837886886E-0002 -1.11220151514149E-0002 -1.10952127723853E-0002 -1.10684764567571E-0002 -1.10418060095859E-0002 +-1.10152012358263E-0002 -1.09886619403317E-0002 -1.09621879278540E-0002 -1.09357790030441E-0002 -1.09094349704513E-0002 +-1.08831556345239E-0002 -1.08569407996087E-0002 -1.08307902699515E-0002 -1.08047038496966E-0002 -1.07786813428872E-0002 +-1.07527225534651E-0002 -1.07268272852707E-0002 -1.07009953420435E-0002 -1.06752265274215E-0002 -1.06495206449413E-0002 +-1.06238774980385E-0002 -1.05982968900473E-0002 -1.05727786242006E-0002 -1.05473225036301E-0002 -1.05219283313661E-0002 +-1.04965959103378E-0002 -1.04713250433730E-0002 -1.04461155331983E-0002 -1.04209671824389E-0002 -1.03958797936189E-0002 +-1.03708531691611E-0002 -1.03458871113869E-0002 -1.03209814225166E-0002 -1.02961359046691E-0002 -1.02713503598620E-0002 +-1.02466245900117E-0002 -1.02219583969334E-0002 -1.01973515823409E-0002 -1.01728039478467E-0002 -1.01483152949623E-0002 +-1.01238854250975E-0002 -1.00995141395612E-0002 -1.00752012395608E-0002 -1.00509465262026E-0002 -1.00267498004916E-0002 +-1.00026108633313E-0002 -9.97852951552418E-0003 -9.95450555777137E-0003 -9.93053879067267E-0003 -9.90662901472674E-0003 +-9.88277603033080E-0003 -9.85897963778094E-0003 -9.83523963727196E-0003 -9.81155582889725E-0003 -9.78792801264913E-0003 +-9.76435598841846E-0003 -9.74083955599500E-0003 -9.71737851506706E-0003 -9.69397266522181E-0003 -9.67062180594517E-0003 +-9.64732573662162E-0003 -9.62408425653456E-0003 -9.60089716486595E-0003 -9.57776426069659E-0003 -9.55468534300604E-0003 +-9.53166021067243E-0003 -9.50868866247278E-0003 -9.48577049708271E-0003 -9.46290551307665E-0003 -9.44009350892778E-0003 +-9.41733428300789E-0003 -9.39462763358764E-0003 -9.37197335883627E-0003 -9.34937125682187E-0003 -9.32682112551125E-0003 +-9.30432276276984E-0003 -9.28187596636193E-0003 -9.25948053395041E-0003 -9.23713626309704E-0003 -9.21484295126216E-0003 +-9.19260039580494E-0003 -9.17040839398329E-0003 -9.14826674295372E-0003 -9.12617523977164E-0003 -9.10413368139103E-0003 +-9.08214186466469E-0003 -9.06019958634418E-0003 -9.03830664307965E-0003 -9.01646283142013E-0003 -8.99466794781324E-0003 +-8.97292178860545E-0003 -8.95122415004192E-0003 -8.92957482826645E-0003 -8.90797361932173E-0003 -8.88642031914901E-0003 +-8.86491472358837E-0003 -8.84345662837864E-0003 -8.82204582915726E-0003 -8.80068212146054E-0003 -8.77936530072336E-0003 +-8.75809516227951E-0003 -8.73687150136133E-0003 -8.71569411310000E-0003 -8.69456279252545E-0003 -8.67347733456619E-0003 +-8.65243753404965E-0003 -8.63144318570179E-0003 -8.61049408414746E-0003 -8.58959002391021E-0003 -8.56873079941220E-0003 +-8.54791620497449E-0003 -8.52714603481669E-0003 -8.50642008305726E-0003 -8.48573814371342E-0003 -8.46510001070096E-0003 +-8.44450547783455E-0003 -8.42395433882749E-0003 -8.40344638729186E-0003 -8.38298141673848E-0003 -8.36255922057683E-0003 +-8.34217959211521E-0003 -8.32184232456052E-0003 -8.30154721101855E-0003 -8.28129404449367E-0003 -8.26108261788904E-0003 +-8.24091272400663E-0003 -8.22078415554695E-0003 -8.20069670510942E-0003 -8.18065016519205E-0003 -8.16064432819167E-0003 +-8.14067898640384E-0003 -8.12075393202275E-0003 -8.10086895714144E-0003 -8.08102385375156E-0003 -8.06121841374359E-0003 +-8.04145242890671E-0003 -8.02172569092876E-0003 -8.00203799139642E-0003 -7.98238912179497E-0003 -7.96277887350853E-0003 +-7.94320703781993E-0003 -7.92367340591064E-0003 -7.90417776886098E-0003 -7.88471991764987E-0003 -7.86529964315510E-0003 +-7.84591673615304E-0003 -7.82657098731889E-0003 -7.80726218722659E-0003 -7.78799012634869E-0003 -7.76875459505662E-0003 +-7.74955538362039E-0003 -7.73039228220885E-0003 -7.71126508088955E-0003 -7.69217356962871E-0003 -7.67311753829138E-0003 +-7.65409677664121E-0003 -7.63511107434068E-0003 -7.61616022095101E-0003 -7.59724400593203E-0003 -7.57836221864243E-0003 +-7.55951464833951E-0003 -7.54070108417939E-0003 -7.52192131521693E-0003 -7.50317513040558E-0003 -7.48446231859769E-0003 +-7.46578266854419E-0003 -7.44713596889487E-0003 -7.42852200819812E-0003 -7.40994057490114E-0003 -7.39139145734990E-0003 +-7.37287444378894E-0003 -7.35438932236171E-0003 -7.33593588111022E-0003 -7.31751390797534E-0003 -7.29912319079663E-0003 +-7.28076351731232E-0003 -7.26243467515946E-0003 -7.24413645187373E-0003 -7.22586863488961E-0003 -7.20763101154032E-0003 +-7.18942336905771E-0003 -7.17124549457248E-0003 -7.15309717511395E-0003 -7.13497819762420E-0003 -7.11688838932227E-0003 +-7.09882770630972E-0003 -7.08079613035601E-0003 -7.06279364321717E-0003 -7.04482022663603E-0003 -7.02687586234200E-0003 +-7.00896053205126E-0003 -6.99107421746669E-0003 -6.97321690027774E-0003 -6.95538856216071E-0003 -6.93758918477842E-0003 +-6.91981874978051E-0003 -6.90207723880330E-0003 -6.88436463346968E-0003 -6.86668091538937E-0003 -6.84902606615866E-0003 +-6.83140006736061E-0003 -6.81380290056499E-0003 -6.79623454732813E-0003 -6.77869498919319E-0003 -6.76118420768990E-0003 +-6.74370218433477E-0003 -6.72624890063099E-0003 -6.70882433806834E-0003 -6.69142847812343E-0003 -6.67406130225943E-0003 +-6.65672279192630E-0003 -6.63941292856060E-0003 -6.62213169358564E-0003 -6.60487906841144E-0003 -6.58765503443460E-0003 +-6.57045957303853E-0003 -6.55329266559323E-0003 -6.53615429345545E-0003 -6.51904443796864E-0003 -6.50196308046286E-0003 +-6.48491020225495E-0003 -6.46788578464835E-0003 -6.45088980893325E-0003 -6.43392225638655E-0003 -6.41698310827174E-0003 +-6.40007234583911E-0003 -6.38318995032553E-0003 -6.36633590295466E-0003 -6.34951018493677E-0003 -6.33271277746885E-0003 +-6.31594366173463E-0003 -6.29920281890441E-0003 -6.28249023013529E-0003 -6.26580587657097E-0003 -6.24914973934190E-0003 +-6.23252179956524E-0003 -6.21592203834472E-0003 -6.19935043677091E-0003 -6.18280697592092E-0003 -6.16629163685866E-0003 +-6.14980440063472E-0003 -6.13334524828629E-0003 -6.11691416083735E-0003 -6.10051111929848E-0003 -6.08413610466701E-0003 +-6.06778909792697E-0003 -6.05147008004900E-0003 -6.03517903199053E-0003 -6.01891593469556E-0003 -6.00268076909490E-0003 +-5.98647351610595E-0003 -5.97029415663285E-0003 -5.95414267156644E-0003 -5.93801904178419E-0003 -5.92192324815034E-0003 +-5.90585527151570E-0003 -5.88981509271789E-0003 -5.87380269258119E-0003 -5.85781805191648E-0003 -5.84186115152145E-0003 +-5.82593197218037E-0003 -5.81003049466429E-0003 -5.79415669973092E-0003 -5.77831056812459E-0003 -5.76249208057644E-0003 +-5.74670121780418E-0003 -5.73093796051227E-0003 -5.71520228939189E-0003 -5.69949418512081E-0003 -5.68381362836360E-0003 +-5.66816059977141E-0003 -5.65253507998218E-0003 -5.63693704962044E-0003 -5.62136648929749E-0003 -5.60582337961130E-0003 +-5.59030770114646E-0003 -5.57481943447437E-0003 -5.55935856015299E-0003 -5.54392505872705E-0003 -5.52851891072798E-0003 +-5.51314009667381E-0003 -5.49778859706936E-0003 -5.48246439240604E-0003 -5.46716746316203E-0003 -5.45189778980219E-0003 +-5.43665535277800E-0003 -5.42144013252771E-0003 -5.40625210947618E-0003 -5.39109126403502E-0003 -5.37595757660255E-0003 +-5.36085102756366E-0003 -5.34577159729008E-0003 -5.33071926614008E-0003 -5.31569401445875E-0003 -5.30069582257776E-0003 +-5.28572467081553E-0003 -5.27078053947720E-0003 -5.25586340885449E-0003 -5.24097325922592E-0003 -5.22611007085661E-0003 +-5.21127382399841E-0003 -5.19646449888991E-0003 -5.18168207575626E-0003 -5.16692653480943E-0003 -5.15219785624797E-0003 +-5.13749602025719E-0003 -5.12282100700910E-0003 -5.10817279666230E-0003 -5.09355136936221E-0003 -5.07895670524081E-0003 +-5.06438878441684E-0003 -5.04984758699577E-0003 -5.03533309306964E-0003 -5.02084528271729E-0003 -5.00638413600415E-0003 +-4.99194963298245E-0003 -4.97754175369099E-0003 -4.96316047815534E-0003 -4.94880578638777E-0003 -4.93447765838713E-0003 +-4.92017607413910E-0003 -4.90590101361592E-0003 -4.89165245677660E-0003 -4.87743038356684E-0003 -4.86323477391896E-0003 +-4.84906560775205E-0003 -4.83492286497180E-0003 -4.82080652547067E-0003 -4.80671656912780E-0003 -4.79265297580893E-0003 +-4.77861572536661E-0003 -4.76460479763997E-0003 -4.75062017245490E-0003 -4.73666182962398E-0003 -4.72272974894641E-0003 +-4.70882391020816E-0003 -4.69494429318181E-0003 -4.68109087762672E-0003 -4.66726364328884E-0003 -4.65346256990086E-0003 +-4.63968763718219E-0003 -4.62593882483885E-0003 -4.61221611256362E-0003 -4.59851948003590E-0003 -4.58484890692183E-0003 +-4.57120437287426E-0003 -4.55758585753264E-0003 -4.54399334052320E-0003 -4.53042680145877E-0003 -4.51688621993895E-0003 +-4.50337157555002E-0003 -4.48988284786485E-0003 -4.47642001644315E-0003 -4.46298306083116E-0003 -4.44957196056193E-0003 +-4.43618669515518E-0003 -4.42282724411724E-0003 -4.40949358694122E-0003 -4.39618570310684E-0003 -4.38290357208060E-0003 +-4.36964717331557E-0003 -4.35641648625162E-0003 -4.34321149031527E-0003 -4.33003216491967E-0003 -4.31687848946477E-0003 +-4.30375044333709E-0003 -4.29064800590991E-0003 -4.27757115654322E-0003 -4.26451987458361E-0003 -4.25149413936444E-0003 +-4.23849393020570E-0003 -4.22551922641412E-0003 -4.21257000728309E-0003 -4.19964625209267E-0003 -4.18674794010967E-0003 +-4.17387505058749E-0003 -4.16102756276631E-0003 -4.14820545587298E-0003 -4.13540870912099E-0003 -4.12263730171057E-0003 +-4.10989121282860E-0003 -4.09717042164869E-0003 -4.08447490733108E-0003 -4.07180464902275E-0003 -4.05915962585737E-0003 +-4.04653981695525E-0003 -4.03394520142345E-0003 -4.02137575835563E-0003 -4.00883146683224E-0003 -3.99631230592037E-0003 +-3.98381825467377E-0003 -3.97134929213295E-0003 -3.95890539732501E-0003 -3.94648654926383E-0003 -3.93409272694995E-0003 +-3.92172390937056E-0003 -3.90938007549960E-0003 -3.89706120429764E-0003 -3.88476727471196E-0003 -3.87249826567658E-0003 +-3.86025415611210E-0003 -3.84803492492592E-0003 -3.83584055101203E-0003 -3.82367101325120E-0003 -3.81152629051081E-0003 +-3.79940636164496E-0003 -3.78731120549448E-0003 -3.77524080088680E-0003 -3.76319512663613E-0003 -3.75117416154327E-0003 +-3.73917788439580E-0003 -3.72720627396796E-0003 -3.71525930902063E-0003 -3.70333696830146E-0003 -3.69143923054469E-0003 +-3.67956607447134E-0003 -3.66771747878910E-0003 -3.65589342219228E-0003 -3.64409388336198E-0003 -3.63231884096587E-0003 +-3.62056827365842E-0003 -3.60884216008075E-0003 -3.59714047886062E-0003 -3.58546320861256E-0003 -3.57381032793770E-0003 +-3.56218181542395E-0003 -3.55057764964583E-0003 -3.53899780916458E-0003 -3.52744227252816E-0003 -3.51591101827115E-0003 +-3.50440402491489E-0003 -3.49292127096733E-0003 -3.48146273492318E-0003 -3.47002839526382E-0003 -3.45861823045727E-0003 +-3.44723221895832E-0003 -3.43587033920836E-0003 -3.42453256963553E-0003 -3.41321888865466E-0003 -3.40192927466721E-0003 +-3.39066370606140E-0003 -3.37942216121208E-0003 -3.36820461848081E-0003 -3.35701105621588E-0003 -3.34584145275218E-0003 +-3.33469578641137E-0003 -3.32357403550174E-0003 -3.31247617831833E-0003 -3.30140219314278E-0003 -3.29035205824349E-0003 +-3.27932575187556E-0003 -3.26832325228070E-0003 -3.25734453768739E-0003 -3.24638958631073E-0003 -3.23545837635255E-0003 +-3.22455088600138E-0003 -3.21366709343238E-0003 -3.20280697680747E-0003 -3.19197051427519E-0003 -3.18115768397081E-0003 +-3.17036846401631E-0003 -3.15960283252028E-0003 -3.14886076757808E-0003 -3.13814224727170E-0003 -3.12744724966986E-0003 +-3.11677575282793E-0003 -3.10612773478799E-0003 -3.09550317357884E-0003 -3.08490204721589E-0003 -3.07432433370131E-0003 +-3.06377001102390E-0003 -3.05323905715921E-0003 -3.04273145006944E-0003 -3.03224716770346E-0003 -3.02178618799690E-0003 +-3.01134848887197E-0003 -3.00093404823767E-0003 -2.99054284398965E-0003 -2.98017485401022E-0003 -2.96983005616843E-0003 +-2.95950842831997E-0003 -2.94920994830723E-0003 -2.93893459395935E-0003 -2.92868234309204E-0003 -2.91845317350782E-0003 +-2.90824706299579E-0003 -2.89806398933184E-0003 -2.88790393027846E-0003 -2.87776686358488E-0003 -2.86765276698703E-0003 +-2.85756161820745E-0003 -2.84749339495548E-0003 -2.83744807492703E-0003 -2.82742563580479E-0003 -2.81742605525812E-0003 +-2.80744931094302E-0003 -2.79749538050224E-0003 -2.78756424156517E-0003 -2.77765587174790E-0003 -2.76777024865326E-0003 +-2.75790734987067E-0003 -2.74806715297633E-0003 -2.73824963553306E-0003 -2.72845477509042E-0003 -2.71868254918465E-0003 +-2.70893293533863E-0003 -2.69920591106200E-0003 -2.68950145385101E-0003 -2.67981954118867E-0003 -2.67016015054463E-0003 +-2.66052325937525E-0003 -2.65090884512359E-0003 -2.64131688521936E-0003 -2.63174735707900E-0003 -2.62220023810558E-0003 +-2.61267550568893E-0003 -2.60317313720555E-0003 -2.59369311001857E-0003 -2.58423540147788E-0003 -2.57479998892000E-0003 +-2.56538684966819E-0003 -2.55599596103238E-0003 -2.54662730030917E-0003 -2.53728084478187E-0003 -2.52795657172044E-0003 +-2.51865445838159E-0003 -2.50937448200870E-0003 -2.50011661983177E-0003 -2.49088084906760E-0003 -2.48166714691957E-0003 +-2.47247549057783E-0003 -2.46330585721917E-0003 -2.45415822400709E-0003 -2.44503256809179E-0003 -2.43592886661010E-0003 +-2.42684709668563E-0003 -2.41778723542857E-0003 -2.40874925993590E-0003 -2.39973314729124E-0003 -2.39073887456487E-0003 +-2.38176641881382E-0003 -2.37281575708176E-0003 -2.36388686639907E-0003 -2.35497972378283E-0003 -2.34609430623677E-0003 +-2.33723059075134E-0003 -2.32838855430366E-0003 -2.31956817385756E-0003 -2.31076942636354E-0003 -2.30199228875878E-0003 +-2.29323673796719E-0003 -2.28450275089930E-0003 -2.27579030445241E-0003 -2.26709937551042E-0003 -2.25842994094399E-0003 +-2.24978197761045E-0003 -2.24115546235378E-0003 -2.23255037200472E-0003 -2.22396668338061E-0003 -2.21540437328554E-0003 +-2.20686341851030E-0003 -2.19834379583229E-0003 -2.18984548201570E-0003 -2.18136845381132E-0003 -2.17291268795667E-0003 +-2.16447816117598E-0003 -2.15606485018011E-0003 -2.14767273166665E-0003 -2.13930178231986E-0003 -2.13095197881071E-0003 +-2.12262329779684E-0003 -2.11431571592257E-0003 -2.10602920981894E-0003 -2.09776375610363E-0003 -2.08951933138107E-0003 +-2.08129591224231E-0003 -2.07309347526513E-0003 -2.06491199701402E-0003 -2.05675145404009E-0003 -2.04861182288121E-0003 +-2.04049308006188E-0003 -2.03239520209331E-0003 -2.02431816547344E-0003 -2.01626194668681E-0003 -2.00822652220473E-0003 +-2.00021186848515E-0003 -1.99221796197272E-0003 -1.98424477909881E-0003 -1.97629229628141E-0003 -1.96836048992528E-0003 +-1.96044933642179E-0003 -1.95255881214904E-0003 -1.94468889347185E-0003 -1.93683955674164E-0003 -1.92901077829660E-0003 +-1.92120253446156E-0003 -1.91341480154808E-0003 -1.90564755585434E-0003 -1.89790077366529E-0003 -1.89017443125252E-0003 +-1.88246850487431E-0003 -1.87478297077564E-0003 -1.86711780518817E-0003 -1.85947298433026E-0003 -1.85184848440695E-0003 +-1.84424428160995E-0003 -1.83666035211771E-0003 -1.82909667209530E-0003 -1.82155321769452E-0003 -1.81402996505388E-0003 +-1.80652689029851E-0003 -1.79904396954030E-0003 -1.79158117887776E-0003 -1.78413849439615E-0003 -1.77671589216739E-0003 +-1.76931334825007E-0003 -1.76193083868952E-0003 -1.75456833951769E-0003 -1.74722582675328E-0003 -1.73990327640164E-0003 +-1.73260066445482E-0003 -1.72531796689157E-0003 -1.71805515967729E-0003 -1.71081221876414E-0003 -1.70358912009087E-0003 +-1.69638583958300E-0003 -1.68920235315272E-0003 -1.68203863669887E-0003 -1.67489466610703E-0003 -1.66777041724942E-0003 +-1.66066586598499E-0003 -1.65358098815935E-0003 -1.64651575960481E-0003 -1.63947015614037E-0003 -1.63244415357170E-0003 +-1.62543772769119E-0003 -1.61845085427790E-0003 -1.61148350909756E-0003 -1.60453566790263E-0003 -1.59760730643220E-0003 +-1.59069840041213E-0003 -1.58380892555489E-0003 -1.57693885755967E-0003 -1.57008817211236E-0003 -1.56325684488551E-0003 +-1.55644485153840E-0003 -1.54965216771694E-0003 -1.54287876905378E-0003 -1.53612463116823E-0003 -1.52938972966630E-0003 +-1.52267404014069E-0003 -1.51597753817076E-0003 -1.50930019932260E-0003 -1.50264199914897E-0003 -1.49600291318930E-0003 +-1.48938291696975E-0003 -1.48278198600312E-0003 -1.47620009578893E-0003 -1.46963722181339E-0003 -1.46309333954936E-0003 +-1.45656842445645E-0003 -1.45006245198090E-0003 -1.44357539755567E-0003 -1.43710723660039E-0003 -1.43065794452139E-0003 +-1.42422749671171E-0003 -1.41781586855103E-0003 -1.41142303540576E-0003 -1.40504897262895E-0003 -1.39869365556040E-0003 +-1.39235705952656E-0003 -1.38603915984056E-0003 -1.37973993180226E-0003 -1.37345935069815E-0003 -1.36719739180146E-0003 +-1.36095403037209E-0003 -1.35472924165660E-0003 -1.34852300088831E-0003 -1.34233528328713E-0003 -1.33616606405974E-0003 +-1.33001531839948E-0003 -1.32388302148637E-0003 -1.31776914848712E-0003 -1.31167367455513E-0003 -1.30559657483051E-0003 +-1.29953782444002E-0003 -1.29349739849713E-0003 -1.28747527210201E-0003 -1.28147142034148E-0003 -1.27548581828909E-0003 +-1.26951844100505E-0003 -1.26356926353627E-0003 -1.25763826091635E-0003 -1.25172540816557E-0003 -1.24583068029091E-0003 +-1.23995405228601E-0003 -1.23409549913123E-0003 -1.22825499579363E-0003 -1.22243251722689E-0003 -1.21662803837146E-0003 +-1.21084153415442E-0003 -1.20507297948957E-0003 -1.19932234927738E-0003 -1.19358961840502E-0003 -1.18787476174634E-0003 +-1.18217775416189E-0003 -1.17649857049889E-0003 -1.17083718559126E-0003 -1.16519357425960E-0003 -1.15956771131123E-0003 +-1.15395957154010E-0003 -1.14836912972690E-0003 -1.14279636063898E-0003 -1.13724123903039E-0003 -1.13170373964187E-0003 +-1.12618383720083E-0003 -1.12068150642140E-0003 -1.11519672200436E-0003 -1.10972945863720E-0003 -1.10427969099411E-0003 +-1.09884739373594E-0003 -1.09343254151025E-0003 -1.08803510895127E-0003 -1.08265507067995E-0003 -1.07729240130387E-0003 +-1.07194707541736E-0003 -1.06661906760142E-0003 -1.06130835242371E-0003 -1.05601490443861E-0003 -1.05073869818717E-0003 +-1.04547970819713E-0003 -1.04023790898295E-0003 -1.03501327504572E-0003 -1.02980578087327E-0003 -1.02461540094008E-0003 +-1.01944210970735E-0003 -1.01428588162296E-0003 -1.00914669112145E-0003 -1.00402451262408E-0003 -9.98919320538800E-0004 +-9.93831089260216E-0004 -9.88759793169662E-0004 -9.83705406635123E-0004 -9.78667904011306E-0004 -9.73647259639573E-0004 +-9.68643447848008E-0004 -9.63656442951350E-0004 -9.58686219251051E-0004 -9.53732751035249E-0004 -9.48796012578749E-0004 +-9.43875978143074E-0004 -9.38972621976403E-0004 -9.34085918313629E-0004 -9.29215841376332E-0004 -9.24362365372756E-0004 +-9.19525464497865E-0004 -9.14705112933281E-0004 -9.09901284847335E-0004 -9.05113954395048E-0004 -9.00343095718106E-0004 +-8.95588682944912E-0004 -8.90850690190530E-0004 -8.86129091556731E-0004 -8.81423861131977E-0004 -8.76734972991394E-0004 +-8.72062401196828E-0004 -8.67406119796779E-0004 -8.62766102826471E-0004 -8.58142324307782E-0004 -8.53534758249301E-0004 +-8.48943378646307E-0004 -8.44368159480743E-0004 -8.39809074721270E-0004 -8.35266098323209E-0004 -8.30739204228590E-0004 +-8.26228366366131E-0004 -8.21733558651217E-0004 -8.17254754985950E-0004 -8.12791929259090E-0004 -8.08345055346109E-0004 +-8.03914107109165E-0004 -7.99499058397084E-0004 -7.95099883045409E-0004 -7.90716554876340E-0004 -7.86349047698790E-0004 +-7.81997335308357E-0004 -7.77661391487309E-0004 -7.73341190004628E-0004 -7.69036704615957E-0004 -7.64747909063655E-0004 +-7.60474777076740E-0004 -7.56217282370941E-0004 -7.51975398648675E-0004 -7.47749099599024E-0004 -7.43538358897789E-0004 +-7.39343150207429E-0004 -7.35163447177112E-0004 -7.30999223442697E-0004 -7.26850452626708E-0004 -7.22717108338383E-0004 +-7.18599164173624E-0004 -7.14496593715041E-0004 -7.10409370531931E-0004 -7.06337468180258E-0004 -7.02280860202705E-0004 +-6.98239520128611E-0004 -6.94213421474028E-0004 -6.90202537741692E-0004 -6.86206842421011E-0004 -6.82226308988105E-0004 +-6.78260910905757E-0004 -6.74310621623464E-0004 -6.70375414577384E-0004 -6.66455263190384E-0004 -6.62550140872020E-0004 +-6.58660021018514E-0004 -6.54784877012805E-0004 -6.50924682224491E-0004 -6.47079410009880E-0004 -6.43249033711968E-0004 +-6.39433526660419E-0004 -6.35632862171611E-0004 -6.31847013548584E-0004 -6.28075954081086E-0004 -6.24319657045553E-0004 +-6.20578095705091E-0004 -6.16851243309518E-0004 -6.13139073095315E-0004 -6.09441558285671E-0004 -6.05758672090462E-0004 +-6.02090387706234E-0004 -5.98436678316247E-0004 -5.94797517090423E-0004 -5.91172877185396E-0004 -5.87562731744466E-0004 +-5.83967053897637E-0004 -5.80385816761603E-0004 -5.76818993439728E-0004 -5.73266557022087E-0004 -5.69728480585419E-0004 +-5.66204737193170E-0004 -5.62695299895475E-0004 -5.59200141729137E-0004 -5.55719235717672E-0004 -5.52252554871261E-0004 +-5.48800072186790E-0004 -5.45361760647834E-0004 -5.41937593224638E-0004 -5.38527542874158E-0004 -5.35131582540015E-0004 +-5.31749685152537E-0004 -5.28381823628738E-0004 -5.25027970872305E-0004 -5.21688099773634E-0004 -5.18362183209788E-0004 +-5.15050194044539E-0004 -5.11752105128327E-0004 -5.08467889298295E-0004 -5.05197519378275E-0004 -5.01940968178770E-0004 +-4.98698208496994E-0004 -4.95469213116825E-0004 -4.92253954808850E-0004 -4.89052406330339E-0004 -4.85864540425236E-0004 +-4.82690329824197E-0004 -4.79529747244541E-0004 -4.76382765390293E-0004 -4.73249356952166E-0004 -4.70129494607546E-0004 +-4.67023151020525E-0004 -4.63930298841867E-0004 -4.60850910709035E-0004 -4.57784959246185E-0004 -4.54732417064140E-0004 +-4.51693256760438E-0004 -4.48667450919278E-0004 -4.45654972111574E-0004 -4.42655792894903E-0004 -4.39669885813547E-0004 +-4.36697223398478E-0004 -4.33737778167337E-0004 -4.30791522624476E-0004 -4.27858429260915E-0004 -4.24938470554377E-0004 +-4.22031618969272E-0004 -4.19137846956685E-0004 -4.16257126954407E-0004 -4.13389431386899E-0004 -4.10534732665324E-0004 +-4.07693003187533E-0004 -4.04864215338052E-0004 -4.02048341488112E-0004 -3.99245353995616E-0004 -3.96455225205166E-0004 +-3.93677927448055E-0004 -3.90913433042249E-0004 -3.88161714292421E-0004 -3.85422743489912E-0004 -3.82696492912771E-0004 +-3.79982934825718E-0004 -3.77282041480173E-0004 -3.74593785114244E-0004 -3.71918137952716E-0004 -3.69255072207076E-0004 +-3.66604560075485E-0004 -3.63966573742803E-0004 -3.61341085380581E-0004 -3.58728067147041E-0004 -3.56127491187115E-0004 +-3.53539329632402E-0004 -3.50963554601203E-0004 -3.48400138198510E-0004 -3.45849052515986E-0004 -3.43310269632003E-0004 +-3.40783761611600E-0004 -3.38269500506521E-0004 -3.35767458355197E-0004 -3.33277607182732E-0004 -3.30799919000937E-0004 +-3.28334365808296E-0004 -3.25880919589993E-0004 -3.23439552317890E-0004 -3.21010235950543E-0004 -3.18592942433201E-0004 +-3.16187643697786E-0004 -3.13794311662926E-0004 -3.11412918233921E-0004 -3.09043435302769E-0004 -3.06685834748160E-0004 +-3.04340088435455E-0004 -3.02006168216724E-0004 -2.99684045930707E-0004 -2.97373693402844E-0004 -2.95075082445263E-0004 +-2.92788184856769E-0004 -2.90512972422871E-0004 -2.88249416915749E-0004 -2.85997490094288E-0004 -2.83757163704046E-0004 +-2.81528409477279E-0004 -2.79311199132934E-0004 -2.77105504376630E-0004 -2.74911296900695E-0004 -2.72728548384126E-0004 +-2.70557230492620E-0004 -2.68397314878564E-0004 -2.66248773181019E-0004 -2.64111577025753E-0004 -2.61985698025204E-0004 +-2.59871107778509E-0004 -2.57767777871496E-0004 -2.55675679876668E-0004 -2.53594785353232E-0004 -2.51525065847066E-0004 +-2.49466492890750E-0004 -2.47419038003551E-0004 -2.45382672691414E-0004 -2.43357368446984E-0004 -2.41343096749583E-0004 +-2.39339829065233E-0004 -2.37347536846632E-0004 -2.35366191533175E-0004 -2.33395764550946E-0004 -2.31436227312707E-0004 +-2.29487551217921E-0004 -2.27549707652725E-0004 -2.25622667989957E-0004 -2.23706403589140E-0004 -2.21800885796477E-0004 +-2.19906085944871E-0004 -2.18021975353903E-0004 -2.16148525329847E-0004 -2.14285707165670E-0004 -2.12433492141014E-0004 +-2.10591851522224E-0004 -2.08760756562319E-0004 -2.06940178501017E-0004 -2.05130088564724E-0004 -2.03330457966523E-0004 +-2.01541257906199E-0004 -1.99762459570213E-0004 -1.97994034131726E-0004 -1.96235952750575E-0004 -1.94488186573294E-0004 +-1.92750706733105E-0004 -1.91023484349909E-0004 -1.89306490530308E-0004 -1.87599696367580E-0004 -1.85903072941700E-0004 +-1.84216591319330E-0004 -1.82540222553812E-0004 -1.80873937685190E-0004 -1.79217707740180E-0004 -1.77571503732199E-0004 +-1.75935296661349E-0004 -1.74309057514415E-0004 -1.72692757264878E-0004 -1.71086366872898E-0004 -1.69489857285331E-0004 +-1.67903199435721E-0004 -1.66326364244292E-0004 -1.64759322617966E-0004 -1.63202045450344E-0004 -1.61654503621725E-0004 +-1.60116667999087E-0004 -1.58588509436101E-0004 -1.57069998773128E-0004 -1.55561106837209E-0004 -1.54061804442085E-0004 +-1.52572062388173E-0004 -1.51091851462585E-0004 -1.49621142439124E-0004 -1.48159906078271E-0004 -1.46708113127206E-0004 +-1.45265734319789E-0004 -1.43832740376572E-0004 -1.42409102004797E-0004 -1.40994789898388E-0004 -1.39589774737966E-0004 +-1.38194027190828E-0004 -1.36807517910971E-0004 -1.35430217539076E-0004 -1.34062096702506E-0004 -1.32703126015324E-0004 +-1.31353276078270E-0004 -1.30012517478779E-0004 -1.28680820790970E-0004 -1.27358156575653E-0004 -1.26044495380328E-0004 +-1.24739807739174E-0004 -1.23444064173072E-0004 -1.22157235189576E-0004 -1.20879291282940E-0004 -1.19610202934103E-0004 +-1.18349940610688E-0004 -1.17098474767012E-0004 -1.15855775844073E-0004 -1.14621814269564E-0004 -1.13396560457866E-0004 +-1.12179984810040E-0004 -1.10972057713847E-0004 -1.09772749543724E-0004 -1.08582030660805E-0004 -1.07399871412911E-0004 +-1.06226242134545E-0004 -1.05061113146907E-0004 -1.03904454757876E-0004 -1.02756237262028E-0004 -1.01616430940619E-0004 +-1.00485006061599E-0004 -9.93619328796065E-0005 -9.82471816359607E-0005 -9.71407225586784E-0005 -9.60425258624564E-0005 +-9.49525617486852E-0005 -9.38708004054434E-0005 -9.27972120074923E-0005 -9.17317667162886E-0005 -9.06744346799699E-0005 +-8.96251860333673E-0005 -8.85839908980001E-0005 -8.75508193820702E-0005 -8.65256415804750E-0005 -8.55084275747928E-0005 +-8.44991474332954E-0005 -8.34977712109426E-0005 -8.25042689493773E-0005 -8.15186106769372E-0005 -8.05407664086416E-0005 +-7.95707061462043E-0005 -7.86083998780211E-0005 -7.76538175791804E-0005 -7.67069292114589E-0005 -7.57677047233166E-0005 +-7.48361140499080E-0005 -7.39121271130695E-0005 -7.29957138213303E-0005 -7.20868440699077E-0005 -7.11854877407023E-0005 +-7.02916147023094E-0005 -6.94051948100060E-0005 -6.85261979057619E-0005 -6.76545938182351E-0005 -6.67903523627671E-0005 +-6.59334433413935E-0005 -6.50838365428323E-0005 -6.42415017424938E-0005 -6.34064087024766E-0005 -6.25785271715631E-0005 +-6.17578268852294E-0005 -6.09442775656343E-0005 -6.01378489216300E-0005 -5.93385106487517E-0005 -5.85462324292267E-0005 +-5.77609839319702E-0005 -5.69827348125818E-0005 -5.62114547133544E-0005 -5.54471132632638E-0005 -5.46896800779780E-0005 +-5.39391247598528E-0005 -5.31954168979286E-0005 -5.24585260679388E-0005 -5.17284218323002E-0005 -5.10050737401211E-0005 +-5.02884513271981E-0005 -4.95785241160124E-0005 -4.88752616157379E-0005 -4.81786333222321E-0005 -4.74886087180441E-0005 +-4.68051572724110E-0005 -4.61282484412548E-0005 -4.54578516671900E-0005 -4.47939363795148E-0005 -4.41364719942200E-0005 +-4.34854279139802E-0005 -4.28407735281613E-0005 -4.22024782128174E-0005 -4.15705113306874E-0005 -4.09448422312027E-0005 +-4.03254402504786E-0005 -3.97122747113217E-0005 -3.91053149232266E-0005 -3.85045301823731E-0005 -3.79098897716331E-0005 +-3.73213629605627E-0005 -3.67389190054092E-0005 -3.61625271491077E-0005 -3.55921566212788E-0005 -3.50277766382351E-0005 +-3.44693564029733E-0005 -3.39168651051813E-0005 -3.33702719212350E-0005 -3.28295460141957E-0005 -3.22946565338164E-0005 +-3.17655726165349E-0005 -3.12422633854803E-0005 -3.07246979504666E-0005 -3.02128454079986E-0005 -2.97066748412689E-0005 +-2.92061553201560E-0005 -2.87112559012297E-0005 -2.82219456277447E-0005 -2.77381935296464E-0005 -2.72599686235681E-0005 +-2.67872399128290E-0005 -2.63199763874396E-0005 -2.58581470240953E-0005 -2.54017207861820E-0005 -2.49506666237737E-0005 +-2.45049534736305E-0005 -2.40645502592033E-0005 -2.36294258906283E-0005 -2.31995492647321E-0005 -2.27748892650293E-0005 +-2.23554147617207E-0005 -2.19410946116978E-0005 -2.15318976585377E-0005 -2.11277927325081E-0005 -2.07287486505624E-0005 +-2.03347342163440E-0005 -1.99457182201844E-0005 -1.95616694391014E-0005 -1.91825566368033E-0005 -1.88083485636844E-0005 +-1.84390139568285E-0005 -1.80745215400080E-0005 -1.77148400236811E-0005 -1.73599381049971E-0005 -1.70097844677907E-0005 +-1.66643477825866E-0005 -1.63235967065975E-0005 -1.59874998837228E-0005 -1.56560259445520E-0005 -1.53291435063607E-0005 +-1.50068211731148E-0005 -1.46890275354660E-0005 -1.43757311707560E-0005 -1.40669006430145E-0005 -1.37625045029577E-0005 +-1.34625112879921E-0005 -1.31668895222103E-0005 -1.28756077163945E-0005 -1.25886343680150E-0005 -1.23059379612289E-0005 +-1.20274869668832E-0005 -1.17532498425112E-0005 -1.14831950323358E-0005 -1.12172909672680E-0005 -1.09555060649055E-0005 +-1.06978087295360E-0005 -1.04441673521335E-0005 -1.01945503103616E-0005 -9.94892596857181E-0006 -9.70726267780266E-0006 +-9.46952877578242E-0006 -9.23569258692590E-0006 -9.00572242233761E-0006 -8.77958657980863E-0006 -8.55725334381937E-0006 +-8.33869098553831E-0006 -8.12386776282099E-0006 -7.91275192021253E-0006 -7.70531168894476E-0006 -7.50151528693870E-0006 +-7.30133091880349E-0006 -7.10472677583540E-0006 -6.91167103602017E-0006 -6.72213186403034E-0006 -6.53607741122760E-0006 +-6.35347581566171E-0006 -6.17429520206968E-0006 -5.99850368187785E-0006 -5.82606935319952E-0006 -5.65696030083698E-0006 +-5.49114459628067E-0006 -5.32859029770831E-0006 -5.16926544998686E-0006 -5.01313808467033E-0006 -4.86017622000195E-0006 +-4.71034786091200E-0006 -4.56362099901971E-0006 -4.41996361263240E-0006 -4.27934366674481E-0006 -4.14172911304077E-0006 +-4.00708788989130E-0006 -3.87538792235627E-0006 -3.74659712218365E-0006 -3.62068338780889E-0006 -3.49761460435646E-0006 +-3.37735864363809E-0006 -3.25988336415430E-0006 -3.14515661109371E-0006 -3.03314621633249E-0006 -2.92381999843571E-0006 +-2.81714576265586E-0006 -2.71309130093408E-0006 -2.61162439189963E-0006 -2.51271280086943E-0006 -2.41632427984916E-0006 +-2.32242656753202E-0006 -2.23098738929995E-0006 -2.14197445722243E-0006 -2.05535547005751E-0006 -1.97109811325138E-0006 +-1.88917005893794E-0006 -1.80953896593976E-0006 -1.73217247976703E-0006 -1.65703823261847E-0006 -1.58410384338089E-0006 +-1.51333691762892E-0006 -1.44470504762578E-0006 -1.37817581232234E-0006 -1.31371677735797E-0006 -1.25129549506017E-0006 +-1.19087950444424E-0006 -1.13243633121405E-0006 -1.07593348776118E-0006 -1.02133847316565E-0006 -9.68618773195624E-0007 +-9.17741860307096E-0007 -8.68675193644569E-0007 -8.21386219040339E-0007 -7.75842369015159E-0007 -7.32011062777606E-0007 +-6.89859706224620E-0007 -6.49355691941264E-0007 -6.10466399200536E-0007 -5.73159193963830E-0007 -5.37401428880423E-0007 +-5.03160443287912E-0007 -4.70403563212021E-0007 -4.39098101366442E-0007 -4.09211357153218E-0007 -3.80710616662321E-0007 +-3.53563152672009E-0007 -3.27736224648663E-0007 -3.03197078746672E-0007 -2.79912947808727E-0007 -2.57851051365495E-0007 +-2.36978595635891E-0007 -2.17262773526962E-0007 -1.98670764633786E-0007 -1.81169735239706E-0007 -1.64726838316080E-0007 +-1.49309213522512E-0007 -1.34883987206633E-0007 -1.21418272404288E-0007 -1.08879168839449E-0007 -9.72337629241613E-0008 +-8.64491277586844E-0008 -7.64923231313372E-0008 -6.73303955186281E-0008 -5.89303780851941E-0008 -5.12592906837653E-0008 +-4.42841398552597E-0008 -3.79719188286806E-0008 -3.22896075212014E-0008 -2.72041725381253E-0008 -2.26825671728650E-0008 +-1.86917314069995E-0008 -1.51985919102138E-0008 -1.21700620403475E-0008 -9.57304184337155E-0009 -7.37441805337830E-0009 +-5.54106409261077E-0009 -4.03984007143262E-0009 -2.83759278835309E-0009 -1.90115573000659E-0009 -1.19734907116809E-0009 +-6.92979674745304E-0010 -3.54841091777918E-0010 -1.49713561442834E-0010 -4.43640110493651E-0011 -5.54605604222702E-0012 diff --git a/examples/lauch_lammps_base.py b/examples/lauch_lammps_base.py new file mode 100644 index 0000000..a1720be --- /dev/null +++ b/examples/lauch_lammps_base.py @@ -0,0 +1,101 @@ +""" +Sets up an example for the calculation of bcc Fe using ``aiida-lammps``. +""" +import numpy as np +from aiida import orm +from aiida_lammps.data.lammps_potential import LammpsPotentialData + + +def generate_structure() -> orm.StructureData: + """ + Generates the structure for the calculation. + + It will create a bcc structure in a square lattice. + + :return: structure to be used in the calculation + :rtype: orm.StructureData + """ + + cell = [ + [2.848116, 0.000000, 0.000000], + [0.000000, 2.848116, 0.000000], + [0.000000, 0.000000, 2.848116], + ] + + positions = [ + (0.0000000, 0.0000000, 0.0000000), + (0.5000000, 0.5000000, 0.5000000), + ] + fractional = True + + symbols = ['Fe', 'Fe'] + names = ['Fe1', 'Fe2'] + + structure = orm.StructureData(cell=cell) + for position, symbol, name in zip(positions, symbols, names): + if fractional: + position = np.dot(position, cell).tolist() + structure.append_atom(position=position, symbols=symbol, name=name) + + return structure + + +def generate_potential() -> LammpsPotentialData: + """ + Generate the potential to be used in the calculation. + + Takes a potential form OpenKIM and stores it as a LammpsPotentialData object. + + :return: potential to do the calculation + :rtype: LammpsPotentialData + """ + + potential_parameters = { + 'species': ['Fe'], + 'atom_style': 'atomic', + 'pair_style': 'eam', + 'units': 'metal', + 'extra_tags': { + 'content_origin': + 'NIST IPRP: https: // www.ctcms.nist.gov/potentials/Fe.html', + 'content_other_locations': + None, + 'data_method': + 'unknown', + 'description': + "This Fe EAM potential parameter file is from the NIST repository, \"Fe_2.eam.fs\" as of the March 9, 2009 update. It is similar to \"Fe_mm.eam.fs\" in the LAMMPS distribution dated 2007-06-11, but gives different results for very small interatomic distances (The LAMMPS potential is in fact the deprecated potential referred to in the March 9, 2009 update on the NIST repository). The file header includes a note from the NIST contributor: \"The potential was taken from v9_4_bcc (in C:\\SIMULATION.MD\\Fe\\Results\\ab_initio+Interstitials)\"", + 'developer': ['Ronald E. Miller'], + 'disclaimer': + 'According to the developer Giovanni Bonny (as reported by the NIST IPRP), this potential was not stiffened and cannot be used in its present form for collision cascades.', + 'properties': + None, + 'publication_year': + 2018, + 'source_citations': [{ + 'abstract': None, + 'author': + 'Mendelev, MI and Han, S and Srolovitz, DJ and Ackland, GJ and Sun, DY and Asta, M', + 'doi': '10.1080/14786430310001613264', + 'journal': '{Phil. Mag.}', + 'number': '{35}', + 'pages': '{3977-3994}', + 'recordkey': 'MO_546673549085_000a', + 'recordprimary': 'recordprimary', + 'recordtype': 'article', + 'title': + '{Development of new interatomic potentials appropriate for crystalline and liquid iron}', + 'volume': '{83}', + 'year': '{2003}' + }], + 'title': + 'EAM potential (LAMMPS cubic hermite tabulation) for Fe developed by Mendelev et al. (2003) v000' + } + } + + potential = LammpsPotentialData.get_or_create( + source='./Fe_2.eam.fs', + filename='./Fe_2.eam.fs', + **potential_parameters, + ) + + return potential diff --git a/setup.json b/setup.json index d6ae675..fe02813 100644 --- a/setup.json +++ b/setup.json @@ -31,6 +31,7 @@ "include_package_data": true, "entry_points": { "aiida.calculations": [ + "lammps.base = aiida_lammps.calculations.lammps.base:BaseLammpsCalculation", "lammps.combinate = aiida_lammps.calculations.lammps.combinate:CombinateCalculation", "lammps.force = aiida_lammps.calculations.lammps.force:ForceCalculation", "lammps.md = aiida_lammps.calculations.lammps.md:MdCalculation", From 883a8d958cd76b0b35574da0cc11fdc4f5535ce6 Mon Sep 17 00:00:00 2001 From: Jonathan Chico Date: Tue, 14 Dec 2021 18:27:04 +0100 Subject: [PATCH 58/70] Fixed issues with respect to the parsing of for the new base calculation. Fixing small formatting issue Updating the values of the potential lines for the tests. Fixing name of the potential used in the tests --- aiida_lammps/calculations/lammps/base.py | 38 ++- aiida_lammps/common/input_generator.py | 2 +- aiida_lammps/common/raw_parsers.py | 50 ++-- aiida_lammps/parsers/lammps/lammps_parser.py | 23 +- .../test_init_eam_alloy_block.txt | 2 +- .../test_init_meam_block.txt | 2 +- .../test_init_tersoff_block.txt | 2 +- examples/lauch_lammps_base.py | 101 -------- examples/launch_lammps_base.py | 234 ++++++++++++++++++ setup.json | 2 +- 10 files changed, 317 insertions(+), 139 deletions(-) delete mode 100644 examples/lauch_lammps_base.py create mode 100644 examples/launch_lammps_base.py diff --git a/aiida_lammps/calculations/lammps/base.py b/aiida_lammps/calculations/lammps/base.py index c5f628c..c471381 100644 --- a/aiida_lammps/calculations/lammps/base.py +++ b/aiida_lammps/calculations/lammps/base.py @@ -12,6 +12,7 @@ from aiida_lammps.data.lammps_potential import LammpsPotentialData from aiida_lammps.common.generate_structure import generate_lammps_structure from aiida_lammps.common.input_generator import generate_input_file +from aiida_lammps.data.trajectory import LammpsTrajectory class BaseLammpsCalculation(CalcJob): @@ -27,13 +28,16 @@ class BaseLammpsCalculation(CalcJob): _INPUT_FILENAME = 'input.in' _STRUCTURE_FILENAME = 'structure.dat' - _DEFAULT_OUTPUT_FILENAME = 'log.lammps' + _DEFAULT_LOGFILE_FILENAME = 'log.lammps' + _DEFAULT_OUTPUT_FILENAME = 'lammps_output' _DEFAULT_TRAJECTORY_FILENAME = 'aiida_lampps.trajectory.dump' _DEFAULT_VARIABLES_FILENAME = 'aiida_lammps.yaml' _DEFAULT_RESTART_FILENAME = 'lammps.restart' _DEFAULT_POTENTIAL_FILENAME = 'potential.dat' _DEFAULT_READ_RESTART_FILENAME = 'aiida_lammps.restart' + _DEFAULT_PARSER = 'lammps.base' + @classmethod def define(cls, spec): super(BaseLammpsCalculation, cls).define(spec) @@ -77,6 +81,11 @@ def define(cls, spec): valid_type=str, default=cls._DEFAULT_OUTPUT_FILENAME, ) + spec.input( + 'metadata.options.logfile_filename', + valid_type=str, + default=cls._DEFAULT_LOGFILE_FILENAME, + ) spec.input( 'metadata.options.variables_filename', valid_type=str, @@ -92,6 +101,11 @@ def define(cls, spec): valid_type=str, default=cls._DEFAULT_RESTART_FILENAME, ) + spec.input( + 'metadata.options.parser_name', + valid_type=str, + default=cls._DEFAULT_PARSER, + ) spec.output( 'results', valid_type=orm.Dict, @@ -100,13 +114,13 @@ def define(cls, spec): ) spec.output( 'trajectories', - valid_type=LammpsPotentialData, + valid_type=LammpsTrajectory, required=True, help='The data extracted from the lammps trajectory file', ) spec.output( 'time_dependent_computes', - valid_types=orm.Dict, + valid_type=orm.Dict, required=True, help= 'The data with the time dependent computes parsed from the lammps.log', @@ -132,19 +146,19 @@ def define(cls, spec): spec.exit_code( 351, 'ERROR_LOG_FILE_MISSING', - mesage='the file with the lammps log was not found', + message='the file with the lammps log was not found', invalidates_cache=True, ) spec.exit_code( 352, 'ERROR_FINAL_VARIABLE_FILE_MISSING', - mesage='the file with the final variables was not found', + message='the file with the final variables was not found', invalidates_cache=True, ) spec.exit_code( 353, 'ERROR_TRAJECTORY_FILE_MISSING', - mesage='the file with the trajectories was not found', + message='the file with the trajectories was not found', invalidates_cache=True, ) spec.exit_code( @@ -192,7 +206,7 @@ def prepare_for_submission(self, folder): _parameters = self.inputs.parameters.get_dict() # Get the name of the trajectory file - _trajectory_filename = self.inputs.metadata.options.restart_filename + _trajectory_filename = self.inputs.metadata.options.trajectory_filename # Get the name of the variables file _variables_filename = self.inputs.metadata.options.variables_filename @@ -203,6 +217,9 @@ def prepare_for_submission(self, folder): # Get the name of the output file _output_filename = self.inputs.metadata.options.output_filename + # Get the name of the logfile file + _logfile_filename = self.inputs.metadata.options.logfile_filename + # If there is a restartfile set its name to the input variables and # write it in the remote folder if 'input_restartfile' in self.inputs: @@ -216,7 +233,7 @@ def prepare_for_submission(self, folder): # sanity of the passed paremters when comparing it to a schema input_filecontent = generate_input_file( potential=self.inputs.potential, - structure=self.inputs.strutcure, + structure=self.inputs.structure, parameters=_parameters, restart_filename=_restart_filename, trajectory_filename=_trajectory_filename, @@ -237,7 +254,9 @@ def prepare_for_submission(self, folder): codeinfo = datastructures.CodeInfo() # Command line variables to ensure that the input file from LAMMPS can # be read - codeinfo.cmdline_params = ['-in', _input_filename] + codeinfo.cmdline_params = [ + '-in', _input_filename, '-log', _logfile_filename + ] # Set the code uuid codeinfo.code_uuid = self.inputs.code.uuid # Set the name of the stdout @@ -251,6 +270,7 @@ def prepare_for_submission(self, folder): # Set the files that must be retrieved calcinfo.retrieve_list = [] calcinfo.retrieve_list.append(_output_filename) + calcinfo.retrieve_list.append(_logfile_filename) calcinfo.retrieve_list.append(_restart_filename) calcinfo.retrieve_list.append(_variables_filename) calcinfo.retrieve_list.append(_trajectory_filename) diff --git a/aiida_lammps/common/input_generator.py b/aiida_lammps/common/input_generator.py index 379a8db..a57d6c3 100644 --- a/aiida_lammps/common/input_generator.py +++ b/aiida_lammps/common/input_generator.py @@ -229,7 +229,7 @@ def write_potential_block( default_potential = LammpsPotentialData.default_potential_info - kind_symbols = np.unique([kind.symbol for kind in structure.kinds]) + kind_symbols = [kind.symbol for kind in structure.kinds] potential_block = generate_header('Start of Potential information') potential_block += f'pair_style {potential.pair_style}' diff --git a/aiida_lammps/common/raw_parsers.py b/aiida_lammps/common/raw_parsers.py index 204d99c..3eb64e5 100644 --- a/aiida_lammps/common/raw_parsers.py +++ b/aiida_lammps/common/raw_parsers.py @@ -9,7 +9,8 @@ import numpy as np -def parse_logfile(filename: str = 'log.lammps') -> Union[dict, dict]: +def parse_logfile(filename: str = None, + file_contents: str = None) -> Union[dict, dict]: """ Parse the log.lammps file. @@ -17,20 +18,30 @@ def parse_logfile(filename: str = 'log.lammps') -> Union[dict, dict]: stores it as a dictionary. It will also gather single quantities and stores them into a different dictionary. - :param filename: name of the lammps log file, defaults to 'log.lammps' + :param filename: name of the lammps log file, defaults to None :type filename: str, optional + :param file_contents: contents of the lammps log file, defaults to None + :type file_contents: str, optional :return: dictionary with the time dependent data, dictionary with the global data :rtype: Union[dict, dict] """ - # pylint: disable=too-many-branches + # pylint: disable=too-many-branches, too-many-locals - try: - with io.open(filename, 'r') as handler: - data = handler.read() - data = data.split('\n') - except (IOError, OSError): + if filename is None and file_contents is None: return None + if filename is not None: + + try: + with io.open(filename, 'r') as handler: + data = handler.read() + data = data.split('\n') + except (IOError, OSError): + return None + + if file_contents is not None: + data = file_contents.split('\n') + header_line_position = -1 header_line = '' _data = [] @@ -81,7 +92,7 @@ def parse_logfile(filename: str = 'log.lammps') -> Union[dict, dict]: return {'time_dependent': parsed_data, 'global': global_parsed_data} -def parse_final_data(filename: str = 'aiida_lammps.yaml') -> dict: +def parse_final_data(filename: str = None, file_contents: str = None) -> dict: """ Read the yaml file with the global final data. @@ -89,16 +100,25 @@ def parse_final_data(filename: str = 'aiida_lammps.yaml') -> dict: file which is then read and stored as a dictionary. :param filename: name of the yaml file where the variables are stored, - defaults to 'aiida_lammps.yaml' + defaults to None :type filename: str, optional + :param file_contents: contents of the yaml file where the variables are stored, + defaults to None + :type file_contents: str, optional :return: dictionary with the final compute variables :rtype: dict """ - try: - with io.open(filename, 'r') as handle: - data = yaml.load(handle, Loader=yaml.Loader) - except (IOError, OSError): - data = None + + if filename is None and file_contents is None: + return None + if filename is not None: + try: + with io.open(filename, 'r') as handle: + data = yaml.load(handle, Loader=yaml.Loader) + except (IOError, OSError): + data = None + if file_contents is not None: + data = yaml.load(file_contents) return data diff --git a/aiida_lammps/parsers/lammps/lammps_parser.py b/aiida_lammps/parsers/lammps/lammps_parser.py index 6e87689..3131e2f 100644 --- a/aiida_lammps/parsers/lammps/lammps_parser.py +++ b/aiida_lammps/parsers/lammps/lammps_parser.py @@ -8,7 +8,7 @@ from aiida.common import exceptions from aiida.parsers.parser import Parser from aiida_lammps.common.raw_parsers import parse_final_data, parse_logfile -from aiida_lammps.data.lammps_potential import LammpsPotentialData +from aiida_lammps.data.trajectory import LammpsTrajectory class LAMMPSBaseParser(Parser): @@ -42,22 +42,24 @@ def parse(self, **kwargs): list_of_files = out_folder.list_object_names() # check log file - if self.node.get_option('output_filename') not in list_of_files: + if self.node.get_option('logfile_filename') not in list_of_files: return self.exit_codes.ERROR_LOG_FILE_MISSING - parsed_data = parse_logfile( - filename=self.node.get_option('output_filename')) + filename = self.node.get_option('logfile_filename') + parsed_data = parse_logfile(file_contents=self.node.outputs.retrieved. + get_object_content(filename)) if parsed_data is None: return self.exit_codes.ERROR_PARSING_LOGFILE global_data = parsed_data['global'] arrays = parsed_data['time_dependent'] # check final variable file - if self.node.get_option( - 'final_variable_filename') not in list_of_files: + if self.node.get_option('variables_filename') not in list_of_files: return self.exit_codes.ERROR_FINAL_VARIABLE_FILE_MISSING + filename = self.node.get_option('variables_filename') final_variables = parse_final_data( - filename=self.node.get_option('final_variable_filename')) + file_contents=self.node.outputs.retrieved.get_object_content( + filename)) if final_variables is None: return self.exit_codes.ERROR_PARSING_FINAL_VARIABLES @@ -76,10 +78,13 @@ def parse(self, **kwargs): if self.node.get_option('trajectory_filename') not in list_of_files: return self.exit_codes.ERROR_TRAJECTORY_FILE_MISSING # Gather the lammps trajectory data - lammps_trajectory = LammpsPotentialData( - self.node.get_option('trajectory_filename')) + filename = self.node.get_option('trajectory_filename') + with self.node.outputs.retrieved.open(filename) as handle: + lammps_trajectory = LammpsTrajectory(handle) self.out('trajectories', lammps_trajectory) + self.out('structure', lammps_trajectory.get_step_structure(-1)) + # check stdout if self.node.get_option('scheduler_stdout') not in list_of_files: return self.exit_codes.ERROR_STDOUT_FILE_MISSING diff --git a/aiida_lammps/tests/test_lammps_potential_data/test_init_eam_alloy_block.txt b/aiida_lammps/tests/test_lammps_potential_data/test_init_eam_alloy_block.txt index d9fa212..5230ea1 100644 --- a/aiida_lammps/tests/test_lammps_potential_data/test_init_eam_alloy_block.txt +++ b/aiida_lammps/tests/test_lammps_potential_data/test_init_eam_alloy_block.txt @@ -1,4 +1,4 @@ #-------------------------Start of Potential information-------------------------# pair_style eam/alloy -pair_coeff * * temp.pot Fe +pair_coeff * * potential.dat Fe Fe #--------------------------End of Potential information--------------------------# diff --git a/aiida_lammps/tests/test_lammps_potential_data/test_init_meam_block.txt b/aiida_lammps/tests/test_lammps_potential_data/test_init_meam_block.txt index a9c3ad5..212c32a 100644 --- a/aiida_lammps/tests/test_lammps_potential_data/test_init_meam_block.txt +++ b/aiida_lammps/tests/test_lammps_potential_data/test_init_meam_block.txt @@ -1,4 +1,4 @@ #-------------------------Start of Potential information-------------------------# pair_style meam -pair_coeff * * temp.pot Fe +pair_coeff * * potential.dat Fe Fe #--------------------------End of Potential information--------------------------# diff --git a/aiida_lammps/tests/test_lammps_potential_data/test_init_tersoff_block.txt b/aiida_lammps/tests/test_lammps_potential_data/test_init_tersoff_block.txt index 0a40b14..22826c6 100644 --- a/aiida_lammps/tests/test_lammps_potential_data/test_init_tersoff_block.txt +++ b/aiida_lammps/tests/test_lammps_potential_data/test_init_tersoff_block.txt @@ -1,4 +1,4 @@ #-------------------------Start of Potential information-------------------------# pair_style tersoff -pair_coeff * * temp.pot Fe +pair_coeff * * potential.dat Fe Fe #--------------------------End of Potential information--------------------------# diff --git a/examples/lauch_lammps_base.py b/examples/lauch_lammps_base.py deleted file mode 100644 index a1720be..0000000 --- a/examples/lauch_lammps_base.py +++ /dev/null @@ -1,101 +0,0 @@ -""" -Sets up an example for the calculation of bcc Fe using ``aiida-lammps``. -""" -import numpy as np -from aiida import orm -from aiida_lammps.data.lammps_potential import LammpsPotentialData - - -def generate_structure() -> orm.StructureData: - """ - Generates the structure for the calculation. - - It will create a bcc structure in a square lattice. - - :return: structure to be used in the calculation - :rtype: orm.StructureData - """ - - cell = [ - [2.848116, 0.000000, 0.000000], - [0.000000, 2.848116, 0.000000], - [0.000000, 0.000000, 2.848116], - ] - - positions = [ - (0.0000000, 0.0000000, 0.0000000), - (0.5000000, 0.5000000, 0.5000000), - ] - fractional = True - - symbols = ['Fe', 'Fe'] - names = ['Fe1', 'Fe2'] - - structure = orm.StructureData(cell=cell) - for position, symbol, name in zip(positions, symbols, names): - if fractional: - position = np.dot(position, cell).tolist() - structure.append_atom(position=position, symbols=symbol, name=name) - - return structure - - -def generate_potential() -> LammpsPotentialData: - """ - Generate the potential to be used in the calculation. - - Takes a potential form OpenKIM and stores it as a LammpsPotentialData object. - - :return: potential to do the calculation - :rtype: LammpsPotentialData - """ - - potential_parameters = { - 'species': ['Fe'], - 'atom_style': 'atomic', - 'pair_style': 'eam', - 'units': 'metal', - 'extra_tags': { - 'content_origin': - 'NIST IPRP: https: // www.ctcms.nist.gov/potentials/Fe.html', - 'content_other_locations': - None, - 'data_method': - 'unknown', - 'description': - "This Fe EAM potential parameter file is from the NIST repository, \"Fe_2.eam.fs\" as of the March 9, 2009 update. It is similar to \"Fe_mm.eam.fs\" in the LAMMPS distribution dated 2007-06-11, but gives different results for very small interatomic distances (The LAMMPS potential is in fact the deprecated potential referred to in the March 9, 2009 update on the NIST repository). The file header includes a note from the NIST contributor: \"The potential was taken from v9_4_bcc (in C:\\SIMULATION.MD\\Fe\\Results\\ab_initio+Interstitials)\"", - 'developer': ['Ronald E. Miller'], - 'disclaimer': - 'According to the developer Giovanni Bonny (as reported by the NIST IPRP), this potential was not stiffened and cannot be used in its present form for collision cascades.', - 'properties': - None, - 'publication_year': - 2018, - 'source_citations': [{ - 'abstract': None, - 'author': - 'Mendelev, MI and Han, S and Srolovitz, DJ and Ackland, GJ and Sun, DY and Asta, M', - 'doi': '10.1080/14786430310001613264', - 'journal': '{Phil. Mag.}', - 'number': '{35}', - 'pages': '{3977-3994}', - 'recordkey': 'MO_546673549085_000a', - 'recordprimary': 'recordprimary', - 'recordtype': 'article', - 'title': - '{Development of new interatomic potentials appropriate for crystalline and liquid iron}', - 'volume': '{83}', - 'year': '{2003}' - }], - 'title': - 'EAM potential (LAMMPS cubic hermite tabulation) for Fe developed by Mendelev et al. (2003) v000' - } - } - - potential = LammpsPotentialData.get_or_create( - source='./Fe_2.eam.fs', - filename='./Fe_2.eam.fs', - **potential_parameters, - ) - - return potential diff --git a/examples/launch_lammps_base.py b/examples/launch_lammps_base.py new file mode 100644 index 0000000..0879ebe --- /dev/null +++ b/examples/launch_lammps_base.py @@ -0,0 +1,234 @@ +""" +Sets up an example for the calculation of bcc Fe using ``aiida-lammps``. +""" +import numpy as np +from aiida import orm +from aiida.engine import submit +from aiida.plugins import CalculationFactory +from aiida.common.extendeddicts import AttributeDict +from aiida_lammps.data.lammps_potential import LammpsPotentialData + + +def generate_structure() -> orm.StructureData: + """ + Generates the structure for the calculation. + + It will create a bcc structure in a square lattice. + + :return: structure to be used in the calculation + :rtype: orm.StructureData + """ + + cell = [ + [2.848116, 0.000000, 0.000000], + [0.000000, 2.848116, 0.000000], + [0.000000, 0.000000, 2.848116], + ] + + positions = [ + (0.0000000, 0.0000000, 0.0000000), + (0.5000000, 0.5000000, 0.5000000), + ] + fractional = True + + symbols = ['Fe', 'Fe'] + names = ['Fe1', 'Fe2'] + + structure = orm.StructureData(cell=cell) + for position, symbol, name in zip(positions, symbols, names): + if fractional: + position = np.dot(position, cell).tolist() + structure.append_atom(position=position, symbols=symbol, name=name) + + return structure + + +def generate_potential() -> LammpsPotentialData: + """ + Generate the potential to be used in the calculation. + + Takes a potential form OpenKIM and stores it as a LammpsPotentialData object. + + :return: potential to do the calculation + :rtype: LammpsPotentialData + """ + + potential_parameters = { + 'species': ['Fe'], + 'atom_style': 'atomic', + 'pair_style': 'eam/fs', + 'units': 'metal', + 'extra_tags': { + 'content_origin': + 'NIST IPRP: https: // www.ctcms.nist.gov/potentials/Fe.html', + 'content_other_locations': + None, + 'data_method': + 'unknown', + 'description': + "This Fe EAM potential parameter file is from the NIST repository, \"Fe_2.eam.fs\" as of the March 9, 2009 update. It is similar to \"Fe_mm.eam.fs\" in the LAMMPS distribution dated 2007-06-11, but gives different results for very small interatomic distances (The LAMMPS potential is in fact the deprecated potential referred to in the March 9, 2009 update on the NIST repository). The file header includes a note from the NIST contributor: \"The potential was taken from v9_4_bcc (in C:\\SIMULATION.MD\\Fe\\Results\\ab_initio+Interstitials)\"", + 'developer': ['Ronald E. Miller'], + 'disclaimer': + 'According to the developer Giovanni Bonny (as reported by the NIST IPRP), this potential was not stiffened and cannot be used in its present form for collision cascades.', + 'properties': + None, + 'publication_year': + 2018, + 'source_citations': [{ + 'abstract': None, + 'author': + 'Mendelev, MI and Han, S and Srolovitz, DJ and Ackland, GJ and Sun, DY and Asta, M', + 'doi': '10.1080/14786430310001613264', + 'journal': '{Phil. Mag.}', + 'number': '{35}', + 'pages': '{3977-3994}', + 'recordkey': 'MO_546673549085_000a', + 'recordprimary': 'recordprimary', + 'recordtype': 'article', + 'title': + '{Development of new interatomic potentials appropriate for crystalline and liquid iron}', + 'volume': '{83}', + 'year': '{2003}' + }], + 'title': + 'EAM potential (LAMMPS cubic hermite tabulation) for Fe developed by Mendelev et al. (2003) v000' + } + } + + potential = LammpsPotentialData.get_or_create( + source='Fe_2.eam.fs', + filename='Fe_2.eam.fs', + **potential_parameters, + ) + + return potential + + +def main( + parameters: orm.Dict, + structure: orm.StructureData, + potential: LammpsPotentialData, + options: AttributeDict, + code: orm.Code, +) -> orm.Node: + """ + Submission of the calculation for an MD run in ``LAMMPS``. + + :param parameters: calculation parameters to control the ``LAMMPS`` calculation + :type parameters: orm.Dict + :param structure: structure to be used in the calculation + :type structure: orm.StructureData + :param potential: potential to be used in the calculation + :type potential: LammpsPotentialData + :param options: options to control the submission parameters + :type options: AttributeDict + :param code: code describing the ``LAMMPS`` calculation + :type code: orm.Code + :return: node containing the ``LAMMPS`` calculation + :rtype: orm.Node + """ + + calculation = CalculationFactory('lammps.base') + + builder = calculation.get_builder() + builder.code = code + builder.structure = structure + builder.parameters = parameters + builder.potential = potential + builder.metadata.options = options + + node = submit(calculation, **builder) + + return node + + +if __name__ == '__main__': + + STRUCTURE = generate_structure() + POTENTIAL = generate_potential() + CODE = orm.load_code( + 'lammps_base-19Jul2019-intel-19.0.4-openmpi-4.0.1@moggie') + OPTIONS = AttributeDict() + OPTIONS.resources = AttributeDict() + # Total number of mpi processes + OPTIONS.resources.tot_num_mpiprocs = 2 + # Name of the parallel environment + OPTIONS.resources.parallel_env = 'mpi' + # Maximum allowed execution time in seconds + OPTIONS.max_wallclock_seconds = 18000 + # Whether to run in parallel + OPTIONS.withmpi = True + # Set the slot type for the calculation + OPTIONS.custom_scheduler_commands = '#$ -l slot_type=execute\n#$ -l exclusive=true' + + _parameters = AttributeDict() + _parameters.control = AttributeDict() + _parameters.control.units = 'metal' + _parameters.control.timestep = 1e-5 + _parameters.compute = { + 'pe/atom': [{ + 'type': [{ + 'keyword': ' ', + 'value': ' ' + }], + 'group': 'all' + }], + 'ke/atom': [{ + 'type': [{ + 'keyword': ' ', + 'value': ' ' + }], + 'group': 'all' + }], + 'stress/atom': [{ + 'type': ['NULL'], + 'group': 'all' + }], + 'pressure': [{ + 'type': ['thermo_temp'], + 'group': 'all' + }], + } + _parameters.md = { + 'integration': { + 'style': 'npt', + 'constraints': { + 'temp': [300, 300, 100], + 'iso': [0.0, 0.0, 1000.0], + } + }, + 'max_number_steps': 5000, + 'velocity': [{ + 'create': { + 'temp': 300 + }, + 'group': 'all' + }] + } + _parameters.structure = {'atom_style': 'atomic'} + _parameters.potential = {} + _parameters.thermo = { + 'printing_rate': 100, + 'thermo_printing': { + 'step': True, + 'pe': True, + 'ke': True, + 'press': True, + 'pxx': True, + 'pyy': True, + 'pzz': True, + } + } + _parameters.dump = {'dump_rate': 1000} + + PARAMETERS = orm.Dict(dict=_parameters) + + submission_node = main( + structure=STRUCTURE, + potential=POTENTIAL, + parameters=PARAMETERS, + options=OPTIONS, + code=CODE, + ) + + print(f'Calculation node: {submission_node}') diff --git a/setup.json b/setup.json index fe02813..cf766e7 100644 --- a/setup.json +++ b/setup.json @@ -40,7 +40,7 @@ "dynaphopy = aiida_lammps.calculations.dynaphopy: DynaphopyCalculation" ], "aiida.parsers": [ - "lammps.base = aiida_lammps.parsers.lammps_parser:LAMMPSBaseParser", + "lammps.base = aiida_lammps.parsers.lammps.lammps_parser:LAMMPSBaseParser", "lammps.force = aiida_lammps.parsers.lammps.force:ForceParser", "lammps.md = aiida_lammps.parsers.lammps.md:MdParser", "lammps.md.multi = aiida_lammps.parsers.lammps.md_multi:MdMultiParser", From 8276360be9aef9852e894caa1313425daa0c7aa5 Mon Sep 17 00:00:00 2001 From: Jonathan Chico Date: Tue, 14 Dec 2021 21:17:37 +0100 Subject: [PATCH 59/70] Fixing issues with potential tests after reverting behaviour of potential lines. Fixing issue in the reference value of input generation of potential lines --- .../test_generate_inputs/test_generate_input_eam_alloy_md.txt | 2 +- .../test_generate_input_eam_alloy_minimize.txt | 2 +- aiida_lammps/tests/test_potential_data.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/aiida_lammps/tests/test_generate_inputs/test_generate_input_eam_alloy_md.txt b/aiida_lammps/tests/test_generate_inputs/test_generate_input_eam_alloy_md.txt index ff65af1..751438a 100644 --- a/aiida_lammps/tests/test_generate_inputs/test_generate_input_eam_alloy_md.txt +++ b/aiida_lammps/tests/test_generate_inputs/test_generate_input_eam_alloy_md.txt @@ -13,7 +13,7 @@ read_data structure.dat #------------------------End of the Structure information------------------------# #-------------------------Start of Potential information-------------------------# pair_style eam/alloy -pair_coeff * * potential.dat Fe +pair_coeff * * potential.dat Fe Fe #--------------------------End of Potential information--------------------------# #--------------------------Start of the Fix information--------------------------# fix box_relax_all_aiida all box/relax iso 0.0 vmax 0.001 diff --git a/aiida_lammps/tests/test_generate_inputs/test_generate_input_eam_alloy_minimize.txt b/aiida_lammps/tests/test_generate_inputs/test_generate_input_eam_alloy_minimize.txt index 64c1066..1f2aec1 100644 --- a/aiida_lammps/tests/test_generate_inputs/test_generate_input_eam_alloy_minimize.txt +++ b/aiida_lammps/tests/test_generate_inputs/test_generate_input_eam_alloy_minimize.txt @@ -13,7 +13,7 @@ read_data structure.dat #------------------------End of the Structure information------------------------# #-------------------------Start of Potential information-------------------------# pair_style eam/alloy -pair_coeff * * potential.dat Fe +pair_coeff * * potential.dat Fe Fe #--------------------------End of Potential information--------------------------# #--------------------------Start of the Fix information--------------------------# fix box_relax_all_aiida all box/relax iso 0.0 vmax 0.001 diff --git a/aiida_lammps/tests/test_potential_data.py b/aiida_lammps/tests/test_potential_data.py index 1301e78..c223534 100644 --- a/aiida_lammps/tests/test_potential_data.py +++ b/aiida_lammps/tests/test_potential_data.py @@ -156,7 +156,7 @@ def test_lammps_potentials_input_block( potential_block = input_generator.write_potential_block( parameters_potential={}, - potential_file='temp.pot', + potential_file='potential.dat', potential=node, structure=potential_information['structure'], ) From feee651f950c572ff33704378dac21de8a72f7b0 Mon Sep 17 00:00:00 2001 From: Jonathan Chico Date: Fri, 28 Jan 2022 16:19:59 +0100 Subject: [PATCH 60/70] (WIP) Working in the documentation of the package. --- aiida_lammps/calculations/lammps/base.py | 2 +- aiida_lammps/calculations/lammps/md_multi.py | 28 +++---- aiida_lammps/common/reaxff_convert.py | 56 +++++-------- aiida_lammps/data/lammps_potential.py | 11 ++- aiida_lammps/data/pot_plugins/base_plugin.py | 21 ++--- aiida_lammps/data/pot_plugins/eam.py | 2 +- aiida_lammps/data/potential.py | 9 +-- aiida_lammps/parsers/lammps/lammps_parser.py | 13 ++- aiida_lammps/tests/utils.py | 83 +++++--------------- aiida_lammps/validation/utils.py | 42 +++------- docs/source/_toc.yml | 2 + docs/source/conf.py | 74 +++++++++++++++++ docs/source/developers/intro.md | 2 +- docs/source/index.md | 32 +++++--- docs/source/users/get_started.md | 77 ++++++++++++++++++ 15 files changed, 264 insertions(+), 190 deletions(-) create mode 100644 docs/source/users/get_started.md diff --git a/aiida_lammps/calculations/lammps/base.py b/aiida_lammps/calculations/lammps/base.py index c471381..aab89d8 100644 --- a/aiida_lammps/calculations/lammps/base.py +++ b/aiida_lammps/calculations/lammps/base.py @@ -120,7 +120,7 @@ def define(cls, spec): ) spec.output( 'time_dependent_computes', - valid_type=orm.Dict, + valid_type=orm.ArrayData, required=True, help= 'The data with the time dependent computes parsed from the lammps.log', diff --git a/aiida_lammps/calculations/lammps/md_multi.py b/aiida_lammps/calculations/lammps/md_multi.py index 5bbb2fc..0d61132 100644 --- a/aiida_lammps/calculations/lammps/md_multi.py +++ b/aiida_lammps/calculations/lammps/md_multi.py @@ -352,24 +352,16 @@ def atom_info_commands( ): """Create commands to output required atom variables to a file. - Parameters - ---------- - variables : list[str] - kind_symbols : list[str] - atom symbols per type - atom_style : str - style of atoms e.g. charge - dump_rate : int - filename : str - version_date : timedate - dump_name : str - append : bool - Dump snapshots to the end of the dump file (if it exists). - - Returns - ------- - list[str] - + :param variables: list[str] + :param kind_symbols: list[str] atom symbols per type + :param atom_style: str style of atoms e.g. charge + :param dump_rate: int + :param filename: str + :param version_date: timedate + :param dump_name: str + :param append: bool Dump snapshots to the end of the dump file (if it exists). + + :return: list[str] """ # pylint: disable=too-many-arguments, too-many-locals, too-many-branches, unused-argument commands, computes, fixes = [], [], [] diff --git a/aiida_lammps/common/reaxff_convert.py b/aiida_lammps/common/reaxff_convert.py index 1617edf..06e6717 100644 --- a/aiida_lammps/common/reaxff_convert.py +++ b/aiida_lammps/common/reaxff_convert.py @@ -208,28 +208,21 @@ def split_numbers(string): def read_lammps_format(lines, tolerances=None): - """Read a reaxff file, in lammps format, to a standardised potential dictionary. + """Read a reaxff file, in lammps format, to a standardized potential dictionary. - Parameters - ---------- - lines : list[str] - tolerances : dict or None - tolerances to set, that are not specified in the file. + :param lines: list[str] + :param tolerances: dict or None tolerances to set, that are not specified in the file. - Returns - ------- - dict + :return: dict - Notes - ----- - Default tolerances: - - - anglemin: 0.001 - - angleprod: 0.001 - - hbondmin: 0.01 - - hbonddist: 7.5 - - torsionprod: 1e-05 + .. note:: + Default tolerances: + - anglemin: 0.001 + - angleprod: 0.001 + - hbondmin: 0.01 + - hbonddist: 7.5 + - torsionprod: 1e-05 """ # pylint: disable=too-many-locals, too-many-branches, too-many-statements output = { @@ -414,7 +407,7 @@ def format_lammps_value(value): def write_lammps_format(data): - """Write a reaxff file, in lammps format, from a standardised potential dictionary.""" + """Write a reaxff file, in lammps format, from a standardized potential dictionary.""" # pylint: disable=too-many-branches, too-many-statements # validate dictionary validate_against_schema(data, 'reaxff.schema.json') @@ -576,24 +569,13 @@ def write_lammps_format(data): def filter_by_species(data, species): """filter a potential dict by a subset of species - Parameters - ---------- - data : dict - a potential or fitting dict - species : list[str] - the species to filter by - - Returns - ------- - dict - data filtered by species and with all species index keys re-indexed - - Raises - ------ - KeyError - if the data does not adhere to the potential or fitting jsonschema - AssertionError - if the filter set is not a subset of the available species + :param data: dict a potential or fitting dict + :param species: list[str] the species to filter by + + :raturn: dict data filtered by species and with all species index keys re-indexed + + :raises KeyError: if the data does not adhere to the potential or fitting jsonschema + :raises AssertionError: if the filter set is not a subset of the available species """ species = sorted(list(set(species))) diff --git a/aiida_lammps/data/lammps_potential.py b/aiida_lammps/data/lammps_potential.py index b1e8c79..341f27a 100644 --- a/aiida_lammps/data/lammps_potential.py +++ b/aiida_lammps/data/lammps_potential.py @@ -113,7 +113,8 @@ def get_or_create( units: str = None, extra_tags: dict = None, ): - """Get lammps potential data node from database or create a new one. + """ + Get lammps potential data node from database or create a new one. This will check if there is a potential data node with matching md5 checksum and use that or create a new one if not existent. @@ -178,6 +179,7 @@ def get_entry_point_name(cls): @staticmethod def is_readable_byte_stream(stream) -> bool: """Return if object is a readable filelike object in binary mode or stream of bytes. + :param stream: the object to analyse. :returns: True if ``stream`` appears to be a readable filelike object in binary mode, False otherwise. @@ -191,10 +193,12 @@ def prepare_source( cls, source: typing.Union[str, pathlib.Path, typing.BinaryIO] ) -> typing.BinaryIO: """Validate the ``source`` representing a file on disk or a byte stream. + .. note:: if the ``source`` is a valid file on disk, its content is read and returned as a stream of bytes. + :raises TypeError: if the source is not a ``str``, ``pathlib.Path`` - instance or binary stream. + instance or binary stream. :raises FileNotFoundError: if the source is a filepath but does not exist. """ if not isinstance( @@ -214,6 +218,7 @@ def prepare_source( def validate_md5(self, md5: str): """Validate that the md5 checksum matches that of the currently stored file. + :param value: the md5 checksum. :raises ValueError: if the md5 does not match that of the currently stored file. """ @@ -282,6 +287,7 @@ def validate_atom_style(self, atom_style: str, pair_style: str): @classmethod def validate_element(cls, element: str): """Validate the given element symbol. + :param element: the symbol of the element following the IUPAC naming standard. :raises ValueError: if the element symbol is invalid. """ @@ -317,6 +323,7 @@ def validate_extra_tags(self, extra_tags: dict): correspond to the ones accepted by the class. It will also check that the type of the entries are of the appropriate python type. If the entries can take only a subset of values they are checked against them. + :param extra_tags: dictionary with the extra tags that can be used to tag the potential :type extra_tags: dict :raises ValueError: If the type of the entry does not matches the expected diff --git a/aiida_lammps/data/pot_plugins/base_plugin.py b/aiida_lammps/data/pot_plugins/base_plugin.py index 7a9884e..bdda3c9 100644 --- a/aiida_lammps/data/pot_plugins/base_plugin.py +++ b/aiida_lammps/data/pot_plugins/base_plugin.py @@ -18,13 +18,8 @@ def validate_data(self, data): def get_external_content(self): """Return the mapping of external filenames to content. - Parameters - ---------- - data : dict - - Returns - ------- - None or dict + :param data: dict + :return: None or dict """ # pylint: disable=unnecessary-pass @@ -34,16 +29,10 @@ def get_external_content(self): def get_input_potential_lines(self, kind_elements=None): """Return the potential section of the main input file. - Parameters - ---------- - data : dict - kind_elements : None or list[str] - potential_filename : str - - Returns - ------- - str + :param kind_elements: None or list[str] + :param potential_filename: str + :return: str """ # pylint: disable=unnecessary-pass pass diff --git a/aiida_lammps/data/pot_plugins/eam.py b/aiida_lammps/data/pot_plugins/eam.py index e5aa558..62ed22d 100644 --- a/aiida_lammps/data/pot_plugins/eam.py +++ b/aiida_lammps/data/pot_plugins/eam.py @@ -17,7 +17,7 @@ def validate_data(self, data): def get_external_content(self): # potential_file = ( # "# Potential file generated by aiida plugin " - # "(please check citation in the orignal file)\n" + # "(please check citation in the original file)\n" # ) potential_file = '' for line in self.data['file_contents']: diff --git a/aiida_lammps/data/potential.py b/aiida_lammps/data/potential.py index 73456eb..958fb1b 100644 --- a/aiida_lammps/data/potential.py +++ b/aiida_lammps/data/potential.py @@ -36,12 +36,9 @@ def load_type(cls, entry_name): def __init__(self, potential_type, data=None, **kwargs): """Empirical potential data, used to create LAMMPS input files. - Parameters - ---------- - type: str - the type of potential (should map to a `lammps.potential` entry point) - data: dict - data required to create the potential file and input lines + :param potential_type: the type of potential + (should map to a `lammps.potential` entry point) + :param data: dict data required to create the potential file and input lines """ super().__init__(**kwargs) diff --git a/aiida_lammps/parsers/lammps/lammps_parser.py b/aiida_lammps/parsers/lammps/lammps_parser.py index 3131e2f..fb4e270 100644 --- a/aiida_lammps/parsers/lammps/lammps_parser.py +++ b/aiida_lammps/parsers/lammps/lammps_parser.py @@ -4,6 +4,7 @@ It takes care of parsing the log.lammps file, the trajectory file and the yaml file with the final value of the variables printed in the ``thermo_style``. """ +import numpy as np from aiida import orm from aiida.common import exceptions from aiida.parsers.parser import Parser @@ -32,7 +33,7 @@ def parse(self, **kwargs): yaml file with the final value of the variables printed in the ``thermo_style``. """ - # pylint: disable=too-many-return-statements + # pylint: disable=too-many-return-statements, too-many-locals try: out_folder = self.retrieved @@ -70,8 +71,14 @@ def parse(self, **kwargs): # Expose the results from the log.lammps outputs self.out('results', results) - # Get the time-dependent outputs exposed as a dictionary - time_dependent_computes = orm.Dict(dict=arrays) + # Get the time-dependent outputs exposed as an ArrayData + + time_dependent_computes = orm.ArrayData() + + for key, value in arrays.items(): + _data = [val if val is not None else np.nan for val in value] + time_dependent_computes.set_array(key, np.array(_data)) + self.out('time_dependent_computes', time_dependent_computes) # check trajectory file diff --git a/aiida_lammps/tests/utils.py b/aiida_lammps/tests/utils.py index 5c31ae8..cdcdc5c 100644 --- a/aiida_lammps/tests/utils.py +++ b/aiida_lammps/tests/utils.py @@ -68,16 +68,10 @@ def get_path_to_executable(executable): def get_or_create_local_computer(work_directory, name='localhost'): """Retrieve or setup a local computer - Parameters - ---------- - work_directory : str - path to a local directory for running computations in - name : str - name of the computer + :param work_directory: str path to a local directory for running computations in + :param name: str name of the computer - Returns - ------- - aiida.orm.computers.Computer + :return: aiida.orm.computers.Computer """ @@ -171,14 +165,10 @@ class AiidaTestApp(object): def __init__(self, work_directory, executable_map, environment=None): """a class providing methods for testing purposes - Parameters - ---------- - work_directory : str - path to a local work directory (used when creating computers) - executable_map : dict - mapping of computation entry points to the executable name - environment : None or aiida.manage.fixtures.FixtureManager - manager of a temporary AiiDA environment + :param work_directory: str path to a local work directory (used when creating computers) + :param executable_map: dict mapping of computation entry points to the executable name + :param environment: None or aiida.manage.fixtures.FixtureManager manager + of a temporary AiiDA environment """ self._environment = environment @@ -230,15 +220,9 @@ def get_default_metadata( def get_parser_cls(entry_point_name): """load a parser class - Parameters - ---------- - entry_point_name : str - entry point name of the parser class - - Returns - ------- - aiida.parsers.parser.Parser + :param entry_point_name: str entry point name of the parser class + :return: aiida.parsers.parser.Parser """ return ParserFactory(entry_point_name) @@ -247,15 +231,9 @@ def get_parser_cls(entry_point_name): def get_data_node(entry_point_name, **kwargs): """load a data node instance - Parameters - ---------- - entry_point_name : str - entry point name of the data node class - - Returns - ------- - aiida.orm.nodes.data.Data + :param entry_point_name: str entry point name of the data node class + :return: aiida.orm.nodes.data.Data """ return DataFactory(entry_point_name)(**kwargs) @@ -264,10 +242,7 @@ def get_data_node(entry_point_name, **kwargs): def get_calc_cls(entry_point_name): """load a data node class - Parameters - ---------- - entry_point_name : str - entry point name of the data node class + :param entry_point_name: str entry point name of the data node class """ @@ -282,22 +257,12 @@ def generate_calcjob_node( ): """Fixture to generate a mock `CalcJobNode` for testing parsers. - Parameters - ---------- - entry_point_name : str - entry point name of the calculation class - retrieved : aiida.orm.FolderData - containing the file(s) to be parsed - computer_name : str - used to get or create a ``Computer``, by default 'localhost' - attributes : None or dict - any additional attributes to set on the node - - Returns - ------- - aiida.orm.CalcJobNode - instance with the `retrieved` node linked as outgoing + :param entry_point_name: str entry point name of the calculation class + :param retrieved: aiida.orm.FolderData containing the file(s) to be parsed + :param computer_name: str used to get or create a ``Computer``, by default 'localhost' + :param attributes: None or dict any additional attributes to set on the node + :return: aiida.orm.CalcJobNode instance with the `retrieved` node linked as outgoing """ process = self.get_calc_cls(entry_point_name) @@ -334,10 +299,7 @@ def generate_calcjob_node( def sandbox_folder(self): # pylint: disable=no-self-use """AiiDA folder object context. - Yields - ------ - aiida.common.folders.SandboxFolder - + :return: aiida.common.folders.SandboxFolder """ with SandboxFolder() as folder: @@ -351,12 +313,9 @@ def generate_calcinfo(entry_point_name, folder, inputs=None): and `prepare_for_submission` is called to populate the supplied folder, with raw inputs. - Parameters - ---------- - entry_point_name: str - folder: aiida.common.folders.Folder - inputs: dict or None - + :param entry_point_name: str + :param folder: aiida.common.folders.Folder + :param inputs: dict or None """ manager = get_manager() diff --git a/aiida_lammps/validation/utils.py b/aiida_lammps/validation/utils.py index 54884a1..56f4a7f 100644 --- a/aiida_lammps/validation/utils.py +++ b/aiida_lammps/validation/utils.py @@ -17,14 +17,9 @@ def load_schema(name): If the name is an absolute path, it will be used as is, otherwise it will be loaded as resource from the internal json schema module. - Parameters - ---------- - name: str - - Returns - ------- - dict + :param name: str + :return: dict """ if os.path.isabs(name): with io.open(name) as jfile: @@ -38,16 +33,9 @@ def load_schema(name): def load_validator(schema): """Create a validator for a schema. - Parameters - ---------- - schema : str or dict - schema or path to schema - - Returns - ------- - jsonschema.IValidator - the validator to use + :param schema: str or dict schema or path to schema + :return: jsonschema.IValidator the validator to use """ if isinstance(schema, str): schema = load_schema(schema) @@ -70,25 +58,13 @@ def is_array(checker, instance): # pylint: disable=unused-argument def validate_against_schema(data, schema): """Validate json-type data against a schema. - Parameters - ---------- - data: dict - schema: dict or str - schema, name of schema resource, or absolute path to a schema - - Raises - ------ - jsonschema.exceptions.SchemaError - if the schema is invalid - jsonschema.exceptions.ValidationError - if the instance is invalid - - Returns - ------- - bool - return True if validated + :param data: dict + :param schema: dict or str schema, name of schema resource, or absolute path to a schema + :raises jsonschema.exceptions.SchemaError: if the schema is invalid + :raises jsonschema.exceptions.ValidationError: if the instance is invalid + :return: return True if validated """ validator = load_validator(schema) # validator.validate(data) diff --git a/docs/source/_toc.yml b/docs/source/_toc.yml index 4411567..ba458b7 100644 --- a/docs/source/_toc.yml +++ b/docs/source/_toc.yml @@ -1,7 +1,9 @@ # see https://github.com/executablebooks/sphinx-external-toc root: index entries: +- file: users/get_started - file: users/example - file: developers/intro +- file: reference/apidoc/aiida_lammps.rst - url: https://github.com/aiidaplugins/aiida-lammps title: "GitHub Repository" diff --git a/docs/source/conf.py b/docs/source/conf.py index bb8cc60..04f9297 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -4,6 +4,9 @@ `tox -e docs-clean` and `tox -e docs-update`, or directly: `sphinx-build -n -W --keep-going docs/source docs/_build` """ +import os +import sys +import subprocess from aiida_lammps import __version__ PROJECT = 'AiiDA LAMMPS' @@ -16,11 +19,82 @@ 'myst_parser', # specify sitemap in single file (not toctrees) 'sphinx_external_toc', + 'sphinx.ext.intersphinx', + 'sphinx.ext.autodoc', + 'sphinx.ext.doctest', + 'sphinx.ext.viewcode', + 'sphinx.ext.coverage', ] +intersphinx_mapping = { + 'python': ('https://docs.python.org/3', None), + 'aiida': ('https://aiida-core.readthedocs.io/en/latest', None), + 'click': ('https://click.palletsprojects.com/', None), + 'flask': ('http://flask.pocoo.org/docs/latest/', None), + 'flask_restful': ('https://flask-restful.readthedocs.io/en/latest/', None), + 'kiwipy': ('https://kiwipy.readthedocs.io/en/latest/', None), + 'pandas': ('https://pandas.pydata.org/docs/', None), + 'plumpy': ('https://plumpy.readthedocs.io/en/latest/', None), + 'pymatgen': ('https://pymatgen.org/', None), +} + HTML_THEME = 'furo' HTML_TITLE = f'v{__version__}' HTML_LOGO = 'static/logo.png' html_theme_options = { 'announcement': 'This documentation is in development!', } + + +def run_apidoc(_): + """Runs sphinx-apidoc when building the documentation. + + Needs to be done in conf.py in order to include the APIdoc in the + build on readthedocs. + + See also https://github.com/rtfd/readthedocs.org/issues/1139 + """ + source_dir = os.path.abspath(os.path.dirname(__file__)) + apidoc_dir = os.path.join(source_dir, 'reference', 'apidoc') + package_dir = os.path.join(source_dir, os.pardir, os.pardir, + 'aiida_lammps') + + # In #1139, they suggest the route below, but this ended up + # calling sphinx-build, not sphinx-apidoc + #from sphinx.apidoc import main + #main([None, '-e', '-o', apidoc_dir, package_dir, '--force']) + + cmd_path = 'sphinx-apidoc' + if hasattr(sys, 'real_prefix'): # Check to see if we are in a virtualenv + # If we are, assemble the path manually + cmd_path = os.path.abspath( + os.path.join( + sys.prefix, + 'bin', + 'sphinx-apidoc', + )) + + options = [ + '-o', + apidoc_dir, + package_dir, + '--private', + '--force', + '--no-headings', + '--module-first', + '--no-toc', + '--maxdepth', + '4', + ] + + # See https://stackoverflow.com/a/30144019 + env = os.environ.copy() + env['SPHINX_APIDOC_OPTIONS'] = \ + 'members,special-members,private-members,undoc-members,show-inheritance' + subprocess.check_call([cmd_path] + options, env=env) + + +def setup(app): + """Run the apidoc.""" + if os.environ.get('RUN_APIDOC', None) != 'False': + app.connect('builder-inited', run_apidoc) diff --git a/docs/source/developers/intro.md b/docs/source/developers/intro.md index 5b7e82b..581d01d 100644 --- a/docs/source/developers/intro.md +++ b/docs/source/developers/intro.md @@ -1,6 +1,6 @@ # Developer Guide -This is a guide for internal develoment of `aiida-lammps` +This is a guide for internal development of `aiida-lammps` ## Coding Style Requirements diff --git a/docs/source/index.md b/docs/source/index.md index 2621a5b..c5e37e5 100644 --- a/docs/source/index.md +++ b/docs/source/index.md @@ -1,18 +1,30 @@ # AiiDA LAMMPS Plugin -A [LAMMPS](https://www.lammps.org/) plugin for the [AiiDA](http://aiida-core.readthedocs.io/) framework. +``aiida-lammps`` is a Python package that allows the workflow management and data provenance tracking framework [AiiDA](http://aiida-core.readthedocs.io/) run [LAMMPS](https://www.lammps.org/) calculations. +``LAMMPS`` is a classical molecular dynamics (MD) code with a focus on materials modeling, it is used broadly inside the MD community due to its flexibility, and in-built capability to generate complex workflows in its input script. -This plugin currently contains 4 code types: +## Installation -- `lammps.forces`: Atomic single-point forces calculation -- `lammps.optimize`: Crystal structure optimization -- `lammps.md`: Molecular dynamics calculation -- `lammps.combinate`: DynaPhoPy calculation using LAMMPS MD trajectory (currently untested) +One can install ``aiida-lammps`` in a Python environment using ``pip``: + +```{code-block} console +pip install aiida-lammps +``` + +``aiida-lammps`` will install ``aiida-core`` if it is not already installed in your system, as it is a pre-requisite of the package. Information on the requirements of ``aiida-core``, and steps needed to configure it to be able to perform calculations can be found in the [AiiDA documentation](http://aiida-core.readthedocs.io/). + +## Compatibility + +``aiida-lammps`` has been developed to work with [aiida-core v1.6.5](https://github.com/aiidateam/aiida-core/releases/tag/v1.6.5) and tested with the ``LAMMPS`` releases [19Jul2019](https://github.com/lammps/lammps/releases/tag/patch_19Jul2019) and [29Oct2020](https://github.com/lammps/lammps/releases/tag/stable_29Oct2020). It is important to notice that older versions of ``LAMMPS`` can have different formats which means that the plugin is not guaranteed to be able to properly produce input files and/or parse the output generated by the program. If there are any compatibility problems with the plugin, please open an [issue](https://github.com/aiidaplugins/aiida-lammps/issues) so that it can be addressed. ## Getting Started -To install from PyPI: +The ``aiida-lammps`` package includes a series of examples in the ``examples/`` folder, with those a user can learn how to perform simple ``LAMMPS`` calculations using ``aiida-lammps``. -```shell -pip install aiida-lammps -``` +## Capabilities + +``aiida-lammps`` has been designed in such a way that the base ``Calculation`` method can run a single-phase ``LAMMPS`` calculation with as much flexibility as possible, with multi-stage runs being handled by specially designed ``WorkChains`` instead. + +### What does this implies? + +Instead of relying on the internal ``LAMMPS`` scripting language to treat loops, multiple phases, definition of custom variables, etc., those tasks are off loaded to the AiiDA worchains, allowing one to make use of the provenance tracking, automated data storage and caching capabilities of AiiDA. diff --git a/docs/source/users/get_started.md b/docs/source/users/get_started.md new file mode 100644 index 0000000..a37cc2b --- /dev/null +++ b/docs/source/users/get_started.md @@ -0,0 +1,77 @@ +# Getting started + +In a traditional ``LAMMPS`` calculation a user has an input file which is sequentially read by the executable, each line has a command specifying what actions will be taken, usually the potential is kept as a separate file which is then referred to in the input file. + +``aiida-lammps`` generates the necessary inputs by taking three principal data types, namely the ``structure``, the ``parameters`` and the ``potential``. + +## Potential + +The potential is one of the most important pieces of data in a MD simulation, since it controls how the atoms interact with each other. +In ``aiida-lammps`` the potential file is stored in the `LammpsPotentialData` data type, which will store the entire potential file in the database, and add certain attributes so that the data node is easily queriable for later usage, these attributes have been chosen so that they resemble the [OpenKIM](https://openkim.org/doc/schema/kimspec/) standard as much as possible. + +To demonstrate how this works one can [download](https://openkim.org/id/EAM_Dynamo_Mendelev_2003_Fe__MO_546673549085_000) a potential from the OpenKIM database, after the file has been downloaded one can generate a dictionary with the metadata of the potential to tag it in the AiiDA database. + +```{code-block} python + potential_parameters = { + 'species': ['Fe'], # Which species can be treated by this potential (required) + 'atom_style': 'atomic', # Which kind of atomic style is associated with this potential (required) + 'pair_style': 'eam/fs', # LAMMPS pair style (required) + 'units': 'metal', # Default units of this potential (required) + 'extra_tags': { + 'content_origin': 'NIST IPRP: https: // www.ctcms.nist.gov/potentials/Fe.html', # Where the file was original found + 'content_other_locations': None, # If the file can be found somewhere else + 'data_method': 'unknown', # How was the data generated + 'description': """ + This Fe EAM potential parameter file is from the NIST repository, \"Fe_2.eam.fs\" as of the March 9, 2009 update. + It is similar to \"Fe_mm.eam.fs\" in the LAMMPS distribution dated 2007-06-11, + but gives different results for very small interatomic distances + (The LAMMPS potential is in fact the deprecated potential referred to in the March 9, 2009 update on the NIST repository). + The file header includes a note from the NIST contributor: + \"The potential was taken from v9_4_bcc (in C:\\SIMULATION.MD\\Fe\\Results\\ab_initio+Interstitials)\" + """, # Short description of the potential + 'developer': ['Ronald E. Miller'], # Name of the developer that uploaded it to OpenKIM + 'disclaimer': """ + According to the developer Giovanni Bonny (as reported by the NIST IPRP), + this potential was not stiffened and cannot be used in its present form for collision cascades. + """, # Any known issues with the potential + 'properties': None, # If any specific properties are associated to the potential + 'publication_year': 2018, # Year of publication to OpenKIM + 'source_citations': [{ + 'abstract': None, + 'author': + 'Mendelev, MI and Han, S and Srolovitz, DJ and Ackland, GJ and Sun, DY and Asta, M', + 'doi': '10.1080/14786430310001613264', + 'journal': '{Phil. Mag.}', + 'number': '{35}', + 'pages': '{3977-3994}', + 'recordkey': 'MO_546673549085_000a', + 'recordprimary': 'recordprimary', + 'recordtype': 'article', + 'title': + '{Development of new interatomic potentials appropriate for crystalline and liquid iron}', + 'volume': '{83}', + 'year': '{2003}' + }], + 'title': # Title of the potential + 'EAM potential (LAMMPS cubic hermite tabulation) for Fe developed by Mendelev et al. (2003) v000' + } + } +``` +Certain tags are required, and must be provided to be able to upload the potential to the database. This is because they identify which ``pair_style`` is associated with the potential, which atomic species can be treated with it, etc. The rest of the tags, in this example are filled so that they follow the OpenKIM standard as that is the place where the potential was obtained, if another database is used or if it is a home made potential, these tags can be used to facilitate the querying of the potential. + +Then the potential can be uploaded to the database +```{code-block} python +from aiida_lamps.data.lammps_potential import LammpsPotentialData + +potential = LammpsPotentialData.get_or_create( + source='Fe_2.eam.fs', # Relative path to the potential file + filename='Fe_2.eam.fs', # Name of the file + **potential_parameters, # Parameters to tag the potential +) + +``` + +The ``get_or_create`` method is based on the one by [aiida-pseudo](https://github.com/aiidateam/aiida-pseudo/blob/master/aiida_pseudo/data/pseudo/pseudo.py), which will calculate the md5 sum of the file and check the database for another file with the same md5 sum, if such entry is found, that potential is used instead. This avoids the unnecessary replication of potential data nodes whenever one tries to upload a previously uploaded potential. + +### Potentials without files +In ``LAMMPS`` certain ``pair_style`` such as the Lenard-Johns potential do not read their parameters from an auxiliary file, if not they are directly written to file. In ``aiida-lammps`` to standardize the potential storage in the database these kinds of potentials are expected to be also be stored as a file. The format expected for these kinds of potentials is simply the coefficients that one would normally write the in the ``LAMMPS`` input file. The input file generator will then generate the necessary lines for the input file depending on the potential ``pair_style``. From a49a0ec172bdf01138eefbabb07a4d60f3790c65 Mon Sep 17 00:00:00 2001 From: Jonathan Chico Date: Wed, 9 Feb 2022 12:44:55 +0100 Subject: [PATCH 61/70] Improving the documentation of the package, specifically adding examples for MD and minimize types of runs. --- aiida_lammps/calculations/lammps/__init__.py | 16 +- aiida_lammps/calculations/lammps/combinate.py | 2 +- aiida_lammps/calculations/lammps/md_multi.py | 4 +- aiida_lammps/data/trajectory.py | 14 +- docs/source/_toc.yml | 6 +- docs/source/conf.py | 33 +- docs/source/nitpick-exceptions | 164 ++++++++ docs/source/users/example.md | 373 ------------------ docs/source/users/example_md.md | 188 +++++++++ docs/source/users/example_minimize.md | 178 +++++++++ docs/source/users/get_started.md | 172 +++++--- examples/launch_lammps_base.py | 19 +- setup.json | 10 +- 13 files changed, 725 insertions(+), 454 deletions(-) create mode 100644 docs/source/nitpick-exceptions delete mode 100644 docs/source/users/example.md create mode 100644 docs/source/users/example_md.md create mode 100644 docs/source/users/example_minimize.md diff --git a/aiida_lammps/calculations/lammps/__init__.py b/aiida_lammps/calculations/lammps/__init__.py index 3fa8cb4..430d798 100644 --- a/aiida_lammps/calculations/lammps/__init__.py +++ b/aiida_lammps/calculations/lammps/__init__.py @@ -320,26 +320,26 @@ def create_main_input_content( ): """Generate the main input file for the lammps simulation. - :param parameter_data: [description] + :param parameter_data: Data needed to describe the simulation :type parameter_data: [type] - :param potential_data: [description] + :param potential_data: Data that describes the potential :type potential_data: [type] - :param kind_symbols: [description] + :param kind_symbols: Symbols of the atoms present in the simulation box :type kind_symbols: [type] - :param structure_filename: [description] + :param structure_filename: Name of the structure file :type structure_filename: [type] - :param trajectory_filename: [description] + :param trajectory_filename: Name of the trajectory file :type trajectory_filename: [type] - :param system_filename: [description] + :param system_filename: Name of the system file :type system_filename: [type] - :param restart_filename: [description] + :param restart_filename: Name of the restart file :type restart_filename: [type] :raises NotImplementedError: [description] """ # pylint: disable=no-self-use, too-many-arguments, unused-argument, duplicate-code, arguments-differ raise NotImplementedError - def prepare_for_submission(self, tempfolder): # pylint: disable=arguments-differ + def prepare_for_submission(self, tempfolder): # pylint: disable=arguments-differ, arguments-renamed """Create the input files from the input nodes passed to this instance of the `CalcJob`. :param tempfolder: an `aiida.common.folders.Folder` to temporarily write files on disk diff --git a/aiida_lammps/calculations/lammps/combinate.py b/aiida_lammps/calculations/lammps/combinate.py index c8e8ae7..8fa4afa 100644 --- a/aiida_lammps/calculations/lammps/combinate.py +++ b/aiida_lammps/calculations/lammps/combinate.py @@ -119,7 +119,7 @@ def create_main_input_content( system_filename, restart_filename, ): - # pylint: disable=too-many-arguments, arguments-differ + # pylint: disable=too-many-arguments, arguments-differ, arguments-renamed random_number = np.random.randint(10000000) lammps_input_file = f'units {potential_data.default_units}\n' diff --git a/aiida_lammps/calculations/lammps/md_multi.py b/aiida_lammps/calculations/lammps/md_multi.py index 0d61132..39f2f98 100644 --- a/aiida_lammps/calculations/lammps/md_multi.py +++ b/aiida_lammps/calculations/lammps/md_multi.py @@ -386,12 +386,12 @@ def atom_info_commands( # work out which variables need to be computed avar_props = [ v for v in ave_variables - if not any([v.startswith(s) for s in ['c_', 'f_', 'v_']]) + if not any([v.startswith(s) for s in ['c_', 'f_', 'v_']]) # pylint: disable=use-a-generator ] avar_names = [] c_at_vars = 1 for ave_var in ave_variables: - if any([ave_var.startswith(s) for s in ['c_', 'f_', 'v_']]): + if any([ave_var.startswith(s) for s in ['c_', 'f_', 'v_']]): # pylint: disable=use-a-generator avar_names.append(ave_var) else: if len(avar_props) > 1: diff --git a/aiida_lammps/data/trajectory.py b/aiida_lammps/data/trajectory.py index 66165d7..48e147b 100644 --- a/aiida_lammps/data/trajectory.py +++ b/aiida_lammps/data/trajectory.py @@ -7,6 +7,7 @@ # pylint: disable=too-many-ancestors import io import tempfile +import pathlib from zipfile import ZIP_DEFLATED, ZipFile from aiida import orm @@ -124,21 +125,24 @@ def set_from_fileobj(self, fileobj, aliases=None): temp_handle.flush() temp_handle.seek(0) - try: + if isinstance(temp_handle, (str, pathlib.Path)): + is_filelike = False + else: + is_filelike = True + + if is_filelike: self.put_object_from_filelike( temp_handle, self._trajectory_filename, - mode='wb', - encoding=None, ) - except TypeError: + else: self.put_object_from_filelike( temp_handle, self._trajectory_filename, ) self.put_object_from_filelike( - io.StringIO(' '.join([str(t) for t in time_steps])), + io.StringIO(' '.join([str(entry) for entry in time_steps])), self._timestep_filename, ) diff --git a/docs/source/_toc.yml b/docs/source/_toc.yml index ba458b7..cb4aee1 100644 --- a/docs/source/_toc.yml +++ b/docs/source/_toc.yml @@ -2,7 +2,11 @@ root: index entries: - file: users/get_started -- file: users/example + subtrees: + - titlesonly: True + entries: + - file: users/example_md + - file: users/example_minimize - file: developers/intro - file: reference/apidoc/aiida_lammps.rst - url: https://github.com/aiidaplugins/aiida-lammps diff --git a/docs/source/conf.py b/docs/source/conf.py index 04f9297..80b10be 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -8,6 +8,14 @@ import sys import subprocess from aiida_lammps import __version__ +from aiida.manage.configuration import load_documentation_profile + +# -- AiiDA-related setup -------------------------------------------------- + +# Load the dummy profile even if we are running locally, this way the +# documentation will succeed even if the current +# default profile of the AiiDA installation does not use a Django backend. +load_documentation_profile() PROJECT = 'AiiDA LAMMPS' COPYRIGHT = '2021, AiiDA Team' @@ -24,6 +32,16 @@ 'sphinx.ext.doctest', 'sphinx.ext.viewcode', 'sphinx.ext.coverage', + 'sphinx.ext.mathjax', + 'sphinx.ext.ifconfig', + 'sphinx.ext.todo', + 'IPython.sphinxext.ipython_console_highlighting', + 'IPython.sphinxext.ipython_directive', + 'aiida.sphinxext', + 'sphinx_panels', + 'sphinx_copybutton', + 'sphinxext.rediraffe', + 'notfound.extension', ] intersphinx_mapping = { @@ -38,9 +56,9 @@ 'pymatgen': ('https://pymatgen.org/', None), } -HTML_THEME = 'furo' -HTML_TITLE = f'v{__version__}' -HTML_LOGO = 'static/logo.png' +html_theme = 'furo' # pylint: disable=invalid-name +html_title = f'v{__version__}' # pylint: disable=invalid-name +html_logo = 'static/logo.png' # pylint: disable=invalid-name html_theme_options = { 'announcement': 'This documentation is in development!', } @@ -98,3 +116,12 @@ def setup(app): """Run the apidoc.""" if os.environ.get('RUN_APIDOC', None) != 'False': app.connect('builder-inited', run_apidoc) + + +# We should ignore any python built-in exception, for instance +# Warnings to ignore when using the -n (nitpicky) option +with open('nitpick-exceptions', 'r') as handle: + nitpick_ignore = [ + tuple(line.strip().split(None, 1)) for line in handle.readlines() + if line.strip() and not line.startswith('#') + ] diff --git a/docs/source/nitpick-exceptions b/docs/source/nitpick-exceptions new file mode 100644 index 0000000..9ad0432 --- /dev/null +++ b/docs/source/nitpick-exceptions @@ -0,0 +1,164 @@ +### python builtins + +# note: there doesn't seem to be a standard way of indicating a callable in python3 +# https://stackoverflow.com/questions/23571253/how-to-define-a-callable-parameter-in-a-python-docstring +py:class callable + +# For some reason, "filter" does not seem to be found +py:class filter + +py:class optional + +py:class unittest.case.TestCase +py:class unittest.runner.TextTestRunner + +# required for metaclasses(?) +py:class builtins.bool +py:class builtins.float +py:class builtins.int +py:class builtins.object +py:class builtins.str +py:class builtins.dict + +# typing +py:class asyncio.events.AbstractEventLoop +py:class EntityType +py:class function +py:class IO +py:class traceback + +### AiiDA + +# issues with order of object processing and type hinting +py:class aiida.engine.runners.ResultAndNode +py:class aiida.engine.runners.ResultAndPk +py:class aiida.engine.processes.workchains.workchain.WorkChainSpec +py:class aiida.manage.manager.Manager +py:class aiida.orm.nodes.node.WarnWhenNotEntered +py:class aiida.orm.utils.links.LinkQuadruple +py:class aiida.tools.importexport.dbexport.ExportReport +py:class aiida.tools.importexport.dbexport.ArchiveData +py:class aiida.tools.groups.paths.WalkNodeResult +py:class aiida.orm.Float +py:class aiida.orm.Dict +py:class aiida.orm.StructureData + +py:class Backend +py:class BackendEntity +py:class BackendNode +py:class AuthInfo +py:class CalcJob +py:class CalcJobNode +py:class Data +py:class ExitCode +py:class File +py:class FolderData +py:class JobInfo +py:class JobState +py:class Node +py:class Parser +py:class PersistenceError +py:class Process +py:class ProcessBuilder +py:class ProcessNode +py:class ProcessSpec +py:class Port +py:class PortNamespace +py:class Runner +py:class Transport +py:class TransportQueue +py:class WorkChainSpec + +py:class kiwipy.communications.Communicator +py:class plumpy.process_states.State +py:class plumpy.workchains._If +py:class plumpy.workchains._While + +### python packages +# Note: These exceptions are needed if +# * the objects are referenced e.g. as param/return types types in method docstrings (without intersphinx mapping) +# * the documentation linked via intersphinx lists the objects at a different (usually lower) import hierarchy +py:class click.core.Group +py:class click.core.Option +py:class click.types.ParamType +py:class click.types.Choice +py:class click.types.IntParamType +py:class click.types.StringParamType +py:class click.types.Path +py:class click.types.File +py:meth click.Option.get_default + +py:class concurrent.futures._base.TimeoutError + +py:class sphinx.util.docutils.SphinxDirective + +py:class frozenset + +py:class numpy.bool_ + +py:class paramiko.proxy.ProxyCommand + +# These can be removed once they are properly included in the `__all__` in `plumpy` +py:class plumpy.ports.PortNamespace +py:class plumpy.utils.AttributesDict + +py:class _asyncio.Future + +py:class tqdm.std.tqdm + +py:class IPython.core.magic.Magics + +py:class HTMLParser.HTMLParser +py:class html.parser.HTMLParser + +py:class django.contrib.auth.base_user.AbstractBaseUser +py:class django.contrib.auth.base_user.BaseUserManager +py:class django.contrib.auth.models.AbstractBaseUser +py:class django.contrib.auth.models.BaseUserManager +py:class django.contrib.auth.models.PermissionsMixin +py:class django.core.exceptions.MultipleObjectsReturned +py:class django.core.exceptions.ObjectDoesNotExist +py:class django.db.models.base.Model +py:class django.db.models.manager.Manager +py:class django.db.models.query.QuerySet +py:class django.db.migrations.migration.Migration + +py:class flask.app.Flask + +py:class sqlalchemy.ext.declarative.api.Base +py:class sqlalchemy.ext.declarative.api.Model +py:class sqlalchemy.sql.functions.FunctionElement +py:class sqlalchemy.orm.query.Query +py:class sqlalchemy.orm.util.AliasedClass +py:class sqlalchemy.orm.session.Session +py:exc sqlalchemy.orm.exc.MultipleResultsFound + +py:class sphinx.ext.autodoc.ClassDocumenter + +py:class yaml.Dumper +py:class yaml.Loader +py:class yaml.dumper.Dumper +py:class yaml.loader.Loader +py:class yaml.FullLoader +py:class yaml.loader.FullLoader +py:class uuid.UUID + +py:class psycopg2.extensions.cursor + +py:class aldjemy.orm.DbNode +py:class aldjemy.orm.DbLink +py:class aldjemy.orm.DbComputer +py:class aldjemy.orm.DbUser +py:class aldjemy.orm.DbGroup +py:class aldjemy.orm.DbAuthInfo +py:class aldjemy.orm.DbComment +py:class aldjemy.orm.DbLog +py:class aldjemy.orm.DbSetting + +py:class alembic.config.Config + +py:class pgsu.PGSU +py:meth pgsu.PGSU.__init__ + +py:class jsonschema.exceptions._Error + diff --git a/docs/source/users/example.md b/docs/source/users/example.md deleted file mode 100644 index b94f20a..0000000 --- a/docs/source/users/example.md +++ /dev/null @@ -1,373 +0,0 @@ -# User Example - -## Code Setup - -```python -from aiida_lammps.tests.utils import ( - get_or_create_local_computer, get_or_create_code) -from aiida_lammps.tests.utils import lammps_version - -computer_local = get_or_create_local_computer('work_directory', 'localhost') -code_lammps_force = get_or_create_code('lammps.force', computer_local, 'lammps') -code_lammps_opt = get_or_create_code('lammps.optimize', computer_local, 'lammps') -code_lammps_md = get_or_create_code('lammps.md', computer_local, 'lammps') - -meta_options = { - "resources": { - "num_machines": 1, - "num_mpiprocs_per_machine": 1} -} -``` - -## Structure Setup - -```python -from aiida.plugins import DataFactory -import numpy as np - -cell = [[3.1900000572, 0, 0], - [-1.5950000286, 2.762621076, 0], - [0.0, 0, 5.1890001297]] - -positions = [(0.6666669, 0.3333334, 0.0000000), - (0.3333331, 0.6666663, 0.5000000), - (0.6666669, 0.3333334, 0.3750000), - (0.3333331, 0.6666663, 0.8750000)] - -symbols = names = ['Ga', 'Ga', 'N', 'N'] - -structure = DataFactory('structure')(cell=cell) -for position, symbol, name in zip(positions, symbols, names): - position = np.dot(position, cell).tolist() - structure.append_atom( - position=position, symbols=symbol, name=name) - -structure -``` - -```console - -``` - -## Potential Setup - -```python -pair_style = 'tersoff' -potential_dict = { - 'Ga Ga Ga': '1.0 0.007874 1.846 1.918000 0.75000 -0.301300 1.0 1.0 1.44970 410.132 2.87 0.15 1.60916 535.199', - 'N N N': '1.0 0.766120 0.000 0.178493 0.20172 -0.045238 1.0 1.0 2.38426 423.769 2.20 0.20 3.55779 1044.77', - 'Ga Ga N': '1.0 0.001632 0.000 65.20700 2.82100 -0.518000 1.0 0.0 0.00000 0.00000 2.90 0.20 0.00000 0.00000', - 'Ga N N': '1.0 0.001632 0.000 65.20700 2.82100 -0.518000 1.0 1.0 2.63906 3864.27 2.90 0.20 2.93516 6136.44', - 'N Ga Ga': '1.0 0.001632 0.000 65.20700 2.82100 -0.518000 1.0 1.0 2.63906 3864.27 2.90 0.20 2.93516 6136.44', - 'N Ga N ': '1.0 0.766120 0.000 0.178493 0.20172 -0.045238 1.0 0.0 0.00000 0.00000 2.20 0.20 0.00000 0.00000', - 'N N Ga': '1.0 0.001632 0.000 65.20700 2.82100 -0.518000 1.0 0.0 0.00000 0.00000 2.90 0.20 0.00000 0.00000', - 'Ga N Ga': '1.0 0.007874 1.846 1.918000 0.75000 -0.301300 1.0 0.0 0.00000 0.00000 2.87 0.15 0.00000 0.00000'} -potential = DataFactory("lammps.potential")( - type=pair_style, data=potential_dict -) -potential.attributes -``` - -```python -{'kind_elements': ['Ga', 'N'], - 'potential_type': 'tersoff', - 'atom_style': 'atomic', - 'default_units': 'metal', - 'potential_md5': 'b3b7d45ae7b92eba05ed99ffe69810d0', - 'input_lines_md5': '3145644a408a6d464e80866b833115a2'} -``` - -## Force Calculation - -```python -from aiida.engine import run_get_node -parameters = DataFactory('dict')(dict={ - 'lammps_version': lammps_version(), - 'output_variables': ["temp", "etotal", "pe", "ke"], - 'thermo_keywords': [] -}) -builder = code_lammps_force.get_builder() -builder.metadata.options = meta_options -builder.structure = structure -builder.potential = potential -builder.parameters = parameters -result, calc_node = run_get_node(builder) -``` - -```console -$ verdi process list -D desc -a -l 1 - PK Created Process label Process State Process status ----- --------- ---------------- --------------- ---------------- -2480 32s ago ForceCalculation Finished [0] - -Total results: 1 - -Info: last time an entry changed state: 28s ago (at 02:02:36 on 2019-06-21) - -$ verdi process show 2480 -Property Value -------------- ------------------------------------ -type CalcJobNode -pk 2480 -uuid c754f044-b190-4505-b121-776b79d2d1c8 -label -description -ctime 2019-06-21 02:02:32.894858+00:00 -mtime 2019-06-21 02:02:33.297377+00:00 -process state Finished -exit status 0 -computer [2] localhost - -Inputs PK Type ----------- ---- ------------------ -code 1351 Code -parameters 2479 Dict -potential 2478 EmpiricalPotential -structure 2477 StructureData - -Outputs PK Type -------------- ---- ---------- -arrays 2483 ArrayData -remote_folder 2481 RemoteData -results 2484 Dict -retrieved 2482 FolderData -``` - -```python -calc_node.outputs.results.attributes -``` - -```python -{'parser_version': '0.4.0b3', - 'parser_class': 'ForceParser', - 'errors': [], - 'warnings': '', - 'distance_units': 'Angstroms', - 'force_units': 'eV/Angstrom', - 'energy_units': 'eV', - 'energy': -18.1098859130104, - 'final_variables': {'ke': 0.0, - 'pe': -18.1098859130104, - 'etotal': -18.1098859130104, - 'temp': 0.0}, - 'units_style': 'metal'} -``` - -```python -calc_node.outputs.arrays.attributes -``` - -```python -{'array|forces': [1, 4, 3]} -``` - -## Optimisation Calculation - -```python -from aiida.engine import run_get_node -parameters = DataFactory('dict')(dict={ - 'lammps_version': lammps_version(), - 'output_variables': ["temp", "etotal", "pe", "ke"], - 'thermo_keywords': [], - 'units': 'metal', - 'relax': { - 'type': 'iso', - 'pressure': 0.0, - 'vmax': 0.001, - }, - "minimize": { - 'style': 'cg', - 'energy_tolerance': 1.0e-25, - 'force_tolerance': 1.0e-25, - 'max_evaluations': 100000, - 'max_iterations': 50000} -}) -builder = code_lammps_opt.get_builder() -builder.metadata.options = meta_options -builder.structure = structure -builder.potential = potential -builder.parameters = parameters -result, calc_node = run_get_node(builder) -``` - -```console -$ verdi process list -D desc -a -l 1 - PK Created Process label Process State Process status ----- --------- ------------------- --------------- ---------------- -2486 1m ago OptimizeCalculation ⏹ Finished [0] - -Total results: 1 - -Info: last time an entry changed state: 1m ago (at 02:09:54 on 2019-06-21) - -$ verdi process show 2486 -Property Value -------------- ------------------------------------ -type CalcJobNode -pk 2486 -uuid 5c64433d-6337-4352-a0a8-0acb4083a0c3 -label -description -ctime 2019-06-21 02:09:50.872336+00:00 -mtime 2019-06-21 02:09:51.128639+00:00 -process state Finished -exit status 0 -computer [2] localhost - -Inputs PK Type ----------- ---- ------------------ -code 1344 Code -parameters 2485 Dict -potential 2478 EmpiricalPotential -structure 2477 StructureData - -Outputs PK Type -------------- ---- ------------- -arrays 2490 ArrayData -remote_folder 2487 RemoteData -results 2491 Dict -retrieved 2488 FolderData -structure 2489 StructureData -``` - -```python -calc_node.outputs.results.attributes -``` - -```python -{'parser_version': '0.4.0b3', - 'parser_class': 'OptimizeParser', - 'errors': [], - 'warnings': '', - 'stress_units': 'bars', - 'distance_units': 'Angstroms', - 'force_units': 'eV/Angstrom', - 'energy_units': 'eV', - 'energy': -18.1108516231423, - 'final_variables': {'ke': 0.0, - 'pe': -18.1108516231423, - 'etotal': -18.1108516231423, - 'temp': 0.0}, - 'units_style': 'metal'} -``` - -```python -calc_node.outputs.arrays.attributes -``` - -```python -{'array|positions': [56, 4, 3], - 'array|stress': [3, 3], - 'array|forces': [56, 4, 3]} -``` - -## MD Calculation - -```python -from aiida.engine import submit -parameters = DataFactory('dict')(dict={ - 'lammps_version': lammps_version(), - 'output_variables': ["temp", "etotal", "pe", "ke"], - 'thermo_keywords': [], - 'units': 'metal', - 'timestep': 0.001, - 'integration': { - 'style': 'nvt', - 'constraints': { - 'temp': [300, 300, 0.5] - } - }, - "neighbor": [0.3, "bin"], - "neigh_modify": {"every": 1, "delay": 0, "check": False}, - 'equilibrium_steps': 100, - 'total_steps': 1000, - 'dump_rate': 10, - 'restart': 100 -}) -builder = code_lammps_md.get_builder() -builder.metadata.options = meta_options -builder.structure = structure -builder.potential = potential -builder.parameters = parameters -result, calc_node = run_get_node(builder) -``` - -```console -$ verdi process list -D desc -a -l 1 - PK Created Process label Process State Process status ----- --------- --------------- --------------- ---------------- -2493 12s ago MdCalculation ⏹ Finished [0] - -Total results: 1 - -Info: last time an entry changed state: 4s ago (at 02:15:02 on 2019-06-21) - -$ verdi process show 2493 -Property Value -------------- ------------------------------------ -type CalcJobNode -pk 2493 -uuid 351b4721-10ff-406c-8f1c-951317091524 -label -description -ctime 2019-06-21 02:14:54.986384+00:00 -mtime 2019-06-21 02:14:55.282272+00:00 -process state Finished -exit status 0 -computer [2] localhost - -Inputs PK Type ----------- ---- ------------------ -code 1540 Code -parameters 2492 Dict -potential 2478 EmpiricalPotential -structure 2477 StructureData - -Outputs PK Type ---------------- ---- -------------- -remote_folder 2494 RemoteData -results 2496 Dict -retrieved 2495 FolderData -system_data 2498 ArrayData -trajectory_data 2497 TrajectoryData -``` - -```python -calc_node.outputs.results.attributes -``` - -```python -{'parser_version': '0.4.0b3', - 'parser_class': 'MdParser', - 'errors': [], - 'warnings': '', - 'time_units': 'picoseconds', - 'distance_units': 'Angstroms', - 'energy': -17.8464193488116, - 'units_style': 'metal'} -``` - -```python -calc_node.outputs.system_data.attributes -``` - -```python -{'units_style': 'metal', - 'array|step': [100], - 'array|ke': [100], - 'array|pe': [100], - 'array|etotal': [100], - 'array|temp': [100]} -``` - -```python -calc_node.outputs.trajectory_data.attributes -``` - -```python -{'array|times': [101], - 'array|cells': [101, 3, 3], - 'array|steps': [101], - 'array|positions': [101, 4, 3], - 'symbols': ['Ga', 'Ga', 'N', 'N']} -``` diff --git a/docs/source/users/example_md.md b/docs/source/users/example_md.md new file mode 100644 index 0000000..ae25eec --- /dev/null +++ b/docs/source/users/example_md.md @@ -0,0 +1,188 @@ +# Molecular dynamics simulations + +``LAMMPS`` is widely used to perform molecular dynamics simulations, these can be codified in an ``aiida-lammps`` process by submitting a ``Calculation`` with the correct ``parameters``. + +## Parameters setup +To run a MD simulation, one needs to define a dictionary named ``md`` inside the parameters dictionary (which controls the ``LAMMPS`` simulation). The ``md`` dictionary defines the options that control how the molecular dynamics simulations are performed, several entries are needed to fully control its behavior: +* ``max_number_steps``: maximum number of steps for the molecular dynamics simulation (default: 100) +* ``run_style``: type of molecular dynamics algorithm (default: ``verlet``). +* ``velocity``: set of variables needed to define the [velocity](https://docs.lammps.org/velocity.html) of the system. +* ``integration``: parameters relating to the integrators of the molecular dynamics simulation: + - ``style``: Type of [integrator](https://docs.lammps.org/fixes.html) used for the molecular dynamics simulation. In this example the chosen integrator is [npt](https://docs.lammps.org/fix_nh.html#fix-npt-command), which requires that one at leasts sets the temperature of the simulation box, one can also setup the pressure which acts over the simulation box. These parameters called ``constraints`` are set in another entry of the ``integration`` dictionary. + - ``constraints``: set of options for each integrator, the values depend on the type of integrator. This dictionary takes as keys the options available for the ``npt`` integrator, in this case the values ``temp`` for the temperature and ``iso`` for the barostat. The values for each key in the dictionary are lists which contain each one of the values that one would normally add besides these commands in the ``LAMMPS`` input. + +```{code-block} python +from aiida import orm +from aiida.common.extendeddicts import AttributeDict + +parameters = AttributeDict() +parameters.control = AttributeDict() +parameters.control.units = 'metal' +parameters.control.timestep = 1e-5 +parameters.compute = { + 'pe/atom': [{ + 'type': [{ + 'keyword': ' ', + 'value': ' ' + }], + 'group': 'all' + }], + 'ke/atom': [{ + 'type': [{ + 'keyword': ' ', + 'value': ' ' + }], + 'group': 'all' + }], + 'stress/atom': [{ + 'type': ['NULL'], + 'group': 'all' + }], + 'pressure': [{ + 'type': ['thermo_temp'], + 'group': 'all' + }], +} +parameters.md = { + 'integration': { + 'style': 'npt', + 'constraints': { + 'temp': [300, 300, 100], + 'iso': [0.0, 0.0, 1000.0], + } + }, + 'max_number_steps': 5000, + 'velocity': [{ + 'create': { + 'temp': 300 + }, + 'group': 'all' + }] +} +parameters.structure = {'atom_style': 'atomic'} +parameters.thermo = { + 'printing_rate': 100, + 'thermo_printing': { + 'step': True, + 'pe': True, + 'ke': True, + 'press': True, + 'pxx': True, + 'pyy': True, + 'pzz': True, + } +} +parameters.dump = {'dump_rate': 1000} + +PARAMETERS = orm.Dict(dict=parameters) +``` + +## Structure setup +In this case the structure to be used is bcc Fe, with a basis of two atoms, one can use the ``kind_name`` property for each site in the ``orm.StructureData`` to differentiate the two Fe atoms, that will allow ``aiida-lammps`` to define two possible ``groups`` so that computes, fixes, etc. can be applied individually to each of the atoms. + +```{code-block} python +import numpy as np +from aiida import orm + +def generate_structure() -> orm.StructureData: + """ + Generates the structure for the calculation. + + It will create a bcc structure in a square lattice. + + :return: structure to be used in the calculation + :rtype: orm.StructureData + """ + + cell = [ + [2.848116, 0.000000, 0.000000], + [0.000000, 2.848116, 0.000000], + [0.000000, 0.000000, 2.848116], + ] + + positions = [ + (0.0000000, 0.0000000, 0.0000000), + (0.5000000, 0.5000000, 0.5000000), + ] + fractional = True + + symbols = ['Fe', 'Fe'] + names = ['Fe1', 'Fe2'] + + structure = orm.StructureData(cell=cell) + for position, symbol, name in zip(positions, symbols, names): + if fractional: + position = np.dot(position, cell).tolist() + structure.append_atom(position=position, symbols=symbol, name=name) + + return structure +``` + + +## Potential setup +When dealing with a new potential that one wishes to use for a simulation one can upload a potential by using the ``get_or_create`` method in the ``LammpsPotentialData``, this method will calculate the ``md5`` checksum of the file and check if exists in the database, if it does that database entry is used, otherwise the file it is uploaded into the database and the used in the simulation. To make the potential easy to find and reuse one can pass a series of optional tags based of the [OpenKIM schema](https://openkim.org/doc/schema/kimspec/), which will provide a systematic way of tagging and finding potentials. + +```{code-block} python +from aiida_lammps.data.lammps_potential import LammpsPotentialData + +def generate_potential() -> LammpsPotentialData: + """ + Generate the potential to be used in the calculation. + + Takes a potential form OpenKIM and stores it as a LammpsPotentialData object. + + :return: potential to do the calculation + :rtype: LammpsPotentialData + """ + + potential_parameters = { + 'species': ['Fe'], + 'atom_style': 'atomic', + 'pair_style': 'eam/fs', + 'units': 'metal', + 'extra_tags': { + 'content_origin': + 'NIST IPRP: https: // www.ctcms.nist.gov/potentials/Fe.html', + 'content_other_locations': + None, + 'data_method': + 'unknown', + 'description': """ + This Fe EAM potential parameter file is from the NIST repository, \"Fe_2.eam.fs\" as of the March 9, 2009 update. It is similar to \"Fe_mm.eam.fs\" in the LAMMPS distribution dated 2007-06-11, but gives different results for very small interatomic distances (The LAMMPS potential is in fact the deprecated potential referred to in the March 9, 2009 update on the NIST repository). The file header includes a note from the NIST contributor: \"The potential was taken from v9_4_bcc (in C:\\SIMULATION.MD\\Fe\\Results\\ab_initio+Interstitials)\" + """, + 'developer': ['Ronald E. Miller'], + 'disclaimer':""" + According to the developer Giovanni Bonny (as reported by the NIST IPRP), this potential was not stiffened and cannot be used in its present form for collision cascades. + """, + 'properties': + None, + 'publication_year': + 2018, + 'source_citations': [{ + 'abstract': None, + 'author': + 'Mendelev, MI and Han, S and Srolovitz, DJ and Ackland, GJ and Sun, DY and Asta, M', + 'doi': '10.1080/14786430310001613264', + 'journal': '{Phil. Mag.}', + 'number': '{35}', + 'pages': '{3977-3994}', + 'recordkey': 'MO_546673549085_000a', + 'recordprimary': 'recordprimary', + 'recordtype': 'article', + 'title': + '{Development of new interatomic potentials appropriate for crystalline and liquid iron}', + 'volume': '{83}', + 'year': '{2003}' + }], + 'title': + 'EAM potential (LAMMPS cubic hermite tabulation) for Fe developed by Mendelev et al. (2003) v000' + } + } + + potential = LammpsPotentialData.get_or_create( + source='Fe_2.eam.fs', + **potential_parameters, + ) + + return potential +``` diff --git a/docs/source/users/example_minimize.md b/docs/source/users/example_minimize.md new file mode 100644 index 0000000..c3098f7 --- /dev/null +++ b/docs/source/users/example_minimize.md @@ -0,0 +1,178 @@ +# Minimization simulations + +``LAMMPS`` is widely used to perform minimization simulations, these can be codified in an ``aiida-lammps`` process by submitting a ``Calculation`` with the correct ``parameters``. + +## Parameters setup +To run a minimization simulation, one needs to define a dictionary named ``minimization`` inside the parameters dictionary (which controls the ``LAMMPS`` simulation). The ``minimize`` dictionary defines the options that control how the minimization simulations are performed, several entries are needed to fully control its behavior: +* ``style``: [Algorithm](https://docs.lammps.org/min_style.html) used for the minimization (default: ``cg``). +* ``energy_tolerance``: energy tolerance used to determine if the minimization is successful. +* ``force_tolerance``: force tolerance used to determine if the minimization is successful. +* ``max_iterations``: maximum number of iterations of the minimizer. +* ``max_evaluations``: maximum number of evaluations of the force/energy. + +```{code-block} python +from aiida import orm +from aiida.common.extendeddicts import AttributeDict + +parameters = AttributeDict() +parameters.control = AttributeDict() +parameters.control.units = 'metal' +parameters.control.timestep = 1e-5 +parameters.compute = { + 'pe/atom': [{ + 'type': [{ + 'keyword': ' ', + 'value': ' ' + }], + 'group': 'all' + }], + 'ke/atom': [{ + 'type': [{ + 'keyword': ' ', + 'value': ' ' + }], + 'group': 'all' + }], + 'stress/atom': [{ + 'type': ['NULL'], + 'group': 'all' + }], + 'pressure': [{ + 'type': ['thermo_temp'], + 'group': 'all' + }], +} +parameters.minimize = { + 'style': 'cg', + 'energy_tolerance': 1e-4, + 'force_tolerance': 1e-4, + 'max_iterations': 1000, + 'max_evaluations': 1000, +} +parameters.structure = {'atom_style': 'atomic'} +parameters.thermo = { + 'printing_rate': 100, + 'thermo_printing': { + 'step': True, + 'pe': True, + 'ke': True, + 'press': True, + 'pxx': True, + 'pyy': True, + 'pzz': True, + } +} +parameters.dump = {'dump_rate': 1000} + +PARAMETERS = orm.Dict(dict=parameters) +``` + +## Structure setup +In this case the structure to be used is bcc Fe, with a basis of two atoms, one can use the ``kind_name`` property for each site in the ``orm.StructureData`` to differentiate the two Fe atoms, that will allow ``aiida-lammps`` to define two possible ``groups`` so that computes, fixes, etc. can be applied individually to each of the atoms. + +```{code-block} python +import numpy as np +from aiida import orm + +def generate_structure() -> orm.StructureData: + """ + Generates the structure for the calculation. + + It will create a bcc structure in a square lattice. + + :return: structure to be used in the calculation + :rtype: orm.StructureData + """ + + cell = [ + [2.848116, 0.000000, 0.000000], + [0.000000, 2.848116, 0.000000], + [0.000000, 0.000000, 2.848116], + ] + + positions = [ + (0.0000000, 0.0000000, 0.0000000), + (0.5000000, 0.5000000, 0.5000000), + ] + fractional = True + + symbols = ['Fe', 'Fe'] + names = ['Fe1', 'Fe2'] + + structure = orm.StructureData(cell=cell) + for position, symbol, name in zip(positions, symbols, names): + if fractional: + position = np.dot(position, cell).tolist() + structure.append_atom(position=position, symbols=symbol, name=name) + + return structure +``` + + +## Potential setup +When dealing with a new potential that one wishes to use for a simulation one can upload a potential by using the ``get_or_create`` method in the ``LammpsPotentialData``, this method will calculate the ``md5`` checksum of the file and check if exists in the database, if it does that database entry is used, otherwise the file it is uploaded into the database and the used in the simulation. To make the potential easy to find and reuse one can pass a series of optional tags based of the [OpenKIM schema](https://openkim.org/doc/schema/kimspec/), which will provide a systematic way of tagging and finding potentials. + +```{code-block} python +from aiida_lammps.data.lammps_potential import LammpsPotentialData + +def generate_potential() -> LammpsPotentialData: + """ + Generate the potential to be used in the calculation. + + Takes a potential form OpenKIM and stores it as a LammpsPotentialData object. + + :return: potential to do the calculation + :rtype: LammpsPotentialData + """ + + potential_parameters = { + 'species': ['Fe'], + 'atom_style': 'atomic', + 'pair_style': 'eam/fs', + 'units': 'metal', + 'extra_tags': { + 'content_origin': + 'NIST IPRP: https: // www.ctcms.nist.gov/potentials/Fe.html', + 'content_other_locations': + None, + 'data_method': + 'unknown', + 'description': """ + This Fe EAM potential parameter file is from the NIST repository, \"Fe_2.eam.fs\" as of the March 9, 2009 update. It is similar to \"Fe_mm.eam.fs\" in the LAMMPS distribution dated 2007-06-11, but gives different results for very small interatomic distances (The LAMMPS potential is in fact the deprecated potential referred to in the March 9, 2009 update on the NIST repository). The file header includes a note from the NIST contributor: \"The potential was taken from v9_4_bcc (in C:\\SIMULATION.MD\\Fe\\Results\\ab_initio+Interstitials)\" + """, + 'developer': ['Ronald E. Miller'], + 'disclaimer':""" + According to the developer Giovanni Bonny (as reported by the NIST IPRP), this potential was not stiffened and cannot be used in its present form for collision cascades. + """, + 'properties': + None, + 'publication_year': + 2018, + 'source_citations': [{ + 'abstract': None, + 'author': + 'Mendelev, MI and Han, S and Srolovitz, DJ and Ackland, GJ and Sun, DY and Asta, M', + 'doi': '10.1080/14786430310001613264', + 'journal': '{Phil. Mag.}', + 'number': '{35}', + 'pages': '{3977-3994}', + 'recordkey': 'MO_546673549085_000a', + 'recordprimary': 'recordprimary', + 'recordtype': 'article', + 'title': + '{Development of new interatomic potentials appropriate for crystalline and liquid iron}', + 'volume': '{83}', + 'year': '{2003}' + }], + 'title': + 'EAM potential (LAMMPS cubic hermite tabulation) for Fe developed by Mendelev et al. (2003) v000' + } + } + + potential = LammpsPotentialData.get_or_create( + source='Fe_2.eam.fs', + **potential_parameters, + ) + + return potential +``` diff --git a/docs/source/users/get_started.md b/docs/source/users/get_started.md index a37cc2b..479c079 100644 --- a/docs/source/users/get_started.md +++ b/docs/source/users/get_started.md @@ -7,57 +7,56 @@ In a traditional ``LAMMPS`` calculation a user has an input file which is sequen ## Potential The potential is one of the most important pieces of data in a MD simulation, since it controls how the atoms interact with each other. -In ``aiida-lammps`` the potential file is stored in the `LammpsPotentialData` data type, which will store the entire potential file in the database, and add certain attributes so that the data node is easily queriable for later usage, these attributes have been chosen so that they resemble the [OpenKIM](https://openkim.org/doc/schema/kimspec/) standard as much as possible. +In ``aiida-lammps`` the potential file is stored in the `LammpsPotentialData` data type, which will store the entire potential file in the database, and add certain attributes so that the data node is easily queryable for later usage, these attributes have been chosen so that they resemble the [OpenKIM](https://openkim.org/doc/schema/kimspec/) standard as much as possible. -To demonstrate how this works one can [download](https://openkim.org/id/EAM_Dynamo_Mendelev_2003_Fe__MO_546673549085_000) a potential from the OpenKIM database, after the file has been downloaded one can generate a dictionary with the metadata of the potential to tag it in the AiiDA database. +To demonstrate how this works one can [download](https://openkim.org/id/EAM_Dynamo_Mendelev_2003_Fe__MO_546673549085_000) a potential from the OpenKIM database, after the file has been downloaded one can generate a dictionary with the metadata of the potential to tag it in the AiiDA database. ```{code-block} python - potential_parameters = { - 'species': ['Fe'], # Which species can be treated by this potential (required) - 'atom_style': 'atomic', # Which kind of atomic style is associated with this potential (required) - 'pair_style': 'eam/fs', # LAMMPS pair style (required) - 'units': 'metal', # Default units of this potential (required) - 'extra_tags': { - 'content_origin': 'NIST IPRP: https: // www.ctcms.nist.gov/potentials/Fe.html', # Where the file was original found - 'content_other_locations': None, # If the file can be found somewhere else - 'data_method': 'unknown', # How was the data generated - 'description': """ - This Fe EAM potential parameter file is from the NIST repository, \"Fe_2.eam.fs\" as of the March 9, 2009 update. - It is similar to \"Fe_mm.eam.fs\" in the LAMMPS distribution dated 2007-06-11, - but gives different results for very small interatomic distances - (The LAMMPS potential is in fact the deprecated potential referred to in the March 9, 2009 update on the NIST repository). - The file header includes a note from the NIST contributor: - \"The potential was taken from v9_4_bcc (in C:\\SIMULATION.MD\\Fe\\Results\\ab_initio+Interstitials)\" - """, # Short description of the potential - 'developer': ['Ronald E. Miller'], # Name of the developer that uploaded it to OpenKIM - 'disclaimer': """ - According to the developer Giovanni Bonny (as reported by the NIST IPRP), - this potential was not stiffened and cannot be used in its present form for collision cascades. - """, # Any known issues with the potential - 'properties': None, # If any specific properties are associated to the potential - 'publication_year': 2018, # Year of publication to OpenKIM - 'source_citations': [{ - 'abstract': None, - 'author': - 'Mendelev, MI and Han, S and Srolovitz, DJ and Ackland, GJ and Sun, DY and Asta, M', - 'doi': '10.1080/14786430310001613264', - 'journal': '{Phil. Mag.}', - 'number': '{35}', - 'pages': '{3977-3994}', - 'recordkey': 'MO_546673549085_000a', - 'recordprimary': 'recordprimary', - 'recordtype': 'article', - 'title': - '{Development of new interatomic potentials appropriate for crystalline and liquid iron}', - 'volume': '{83}', - 'year': '{2003}' - }], - 'title': # Title of the potential - 'EAM potential (LAMMPS cubic hermite tabulation) for Fe developed by Mendelev et al. (2003) v000' - } +potential_parameters = { + 'species': ['Fe'], # Which species can be treated by this potential (required) + 'atom_style': 'atomic', # Which kind of atomic style is associated with this potential (required) + 'pair_style': 'eam/fs', # LAMMPS pair style (required) + 'units': 'metal', # Default units of this potential (required) + 'extra_tags': { + 'content_origin': 'NIST IPRP: https: // www.ctcms.nist.gov/potentials/Fe.html', # Where the file was original found + 'content_other_locations': None, # If the file can be found somewhere else + 'data_method': 'unknown', # How was the data generated + 'description': """ + This Fe EAM potential parameter file is from the NIST repository, \"Fe_2.eam.fs\" as of the March 9, 2009 update. + It is similar to \"Fe_mm.eam.fs\" in the LAMMPS distribution dated 2007-06-11, + but gives different results for very small interatomic distances + (The LAMMPS potential is in fact the deprecated potential referred to in the March 9, 2009 update on the NIST repository). + The file header includes a note from the NIST contributor: + \"The potential was taken from v9_4_bcc (in C:\\SIMULATION.MD\\Fe\\Results\\ab_initio+Interstitials)\" + """, # Short description of the potential + 'developer': ['Ronald E. Miller'], # Name of the developer that uploaded it to OpenKIM + 'disclaimer': """ + According to the developer Giovanni Bonny (as reported by the NIST IPRP), + this potential was not stiffened and cannot be used in its present form for collision cascades. + """, # Any known issues with the potential + 'properties': None, # If any specific properties are associated to the potential + 'publication_year': 2018, # Year of publication to OpenKIM + 'source_citations': [{ + 'abstract': None, + 'author': + 'Mendelev, MI and Han, S and Srolovitz, DJ and Ackland, GJ and Sun, DY and Asta, M', + 'doi': '10.1080/14786430310001613264', + 'journal': '{Phil. Mag.}', + 'number': '{35}', + 'pages': '{3977-3994}', + 'recordkey': 'MO_546673549085_000a', + 'recordprimary': 'recordprimary', + 'recordtype': 'article', + 'title': + '{Development of new interatomic potentials appropriate for crystalline and liquid iron}', + 'volume': '{83}', + 'year': '{2003}' + }], + 'title': 'EAM potential (LAMMPS cubic hermite tabulation) for Fe developed by Mendelev et al. (2003) v000' # Title of the potential } +} ``` -Certain tags are required, and must be provided to be able to upload the potential to the database. This is because they identify which ``pair_style`` is associated with the potential, which atomic species can be treated with it, etc. The rest of the tags, in this example are filled so that they follow the OpenKIM standard as that is the place where the potential was obtained, if another database is used or if it is a home made potential, these tags can be used to facilitate the querying of the potential. +Certain tags are required, and must be provided to be able to upload the potential to the database. This is because they identify which ``pair_style`` is associated with the potential, which atomic species can be treated with it, etc. The rest of the tags, in this example are filled so that they follow the OpenKIM standard as that is the place where the potential was obtained, if another database is used or if it is a homemade potential, these tags can be used to facilitate the querying of the potential. Then the potential can be uploaded to the database ```{code-block} python @@ -65,7 +64,6 @@ from aiida_lamps.data.lammps_potential import LammpsPotentialData potential = LammpsPotentialData.get_or_create( source='Fe_2.eam.fs', # Relative path to the potential file - filename='Fe_2.eam.fs', # Name of the file **potential_parameters, # Parameters to tag the potential ) @@ -74,4 +72,82 @@ potential = LammpsPotentialData.get_or_create( The ``get_or_create`` method is based on the one by [aiida-pseudo](https://github.com/aiidateam/aiida-pseudo/blob/master/aiida_pseudo/data/pseudo/pseudo.py), which will calculate the md5 sum of the file and check the database for another file with the same md5 sum, if such entry is found, that potential is used instead. This avoids the unnecessary replication of potential data nodes whenever one tries to upload a previously uploaded potential. ### Potentials without files -In ``LAMMPS`` certain ``pair_style`` such as the Lenard-Johns potential do not read their parameters from an auxiliary file, if not they are directly written to file. In ``aiida-lammps`` to standardize the potential storage in the database these kinds of potentials are expected to be also be stored as a file. The format expected for these kinds of potentials is simply the coefficients that one would normally write the in the ``LAMMPS`` input file. The input file generator will then generate the necessary lines for the input file depending on the potential ``pair_style``. +In ``LAMMPS`` certain [pair_style](https://docs.lammps.org/pair_style.html) such as the Lenard-Johns potential do not read their parameters from an auxiliary file, if not they are directly written to the main input file. In ``aiida-lammps`` to standardize the potential storage in the database these kinds of potentials are expected to be also be stored as a file. The format expected for these kinds of potentials is simply the coefficients that one would normally write the in the ``LAMMPS`` input file. The input file generator will then generate the necessary lines for the input file depending on the potential ``pair_style``. + +## Parameters +The behavior of the ``aiida-lammps`` calculation can be controlled by collecting ``LAMMPS`` simulation parameters in a dictionary + +```{code-block} python +parameters = { + 'md': { + 'velocity': [{'group': 'all', 'create': {'temp': 300}}], + 'integration': { + 'style': 'npt', + 'constraints': {'iso': [0.0, 0.0, 1000.0], 'temp': [300, 300, 100]} + }, + 'max_number_steps': 5000 + }, + 'dump': {'dump_rate': 1000}, + 'thermo': { + 'printing_rate': 100, + 'thermo_printing': { + 'ke': True, + 'pe': True, + 'pxx': True, + 'pyy': True, + 'pzz': True, + 'step': True, + 'press': True + } + }, + 'compute': { + 'ke/atom': [{'type': [{'value': ' ', 'keyword': ' '}], 'group': 'all'}], + 'pe/atom': [{'type': [{'value': ' ', 'keyword': ' '}], 'group': 'all'}], + 'pressure': [{'type': ['thermo_temp'], 'group': 'all'}], + 'stress/atom': [{'type': ['NULL'], 'group': 'all'}] + }, + 'control': {'units': 'metal', 'timestep': 1e-05}, + 'structure': {'atom_style': 'atomic'} +} +``` + +The dictionary is separated into several nested dictionaries that control different behaviors of the ``LAMMPS`` simulation: +- ``control``: takes keywords specifying global simulation parameters: + * ``units``: ``LAMMPS`` [units](https://docs.lammps.org/units.html) used in the calculation (default: ``si``). + * ``timestep``: [time step](https://docs.lammps.org/timestep.html) used in the simulation, it depends on the units used (default: ``LAMMPS`` default dependent on units parameter). + * ``newton``: it controls whether the Newton's third law is [turned on or off](https://docs.lammps.org/newton.html) for the calculation (default: ``on``). + * ``processors``: specifies how [processors](https://docs.lammps.org/processors.html) are mapped to the simulation box (default: ignore the command). +- ``structure``: variables controlling structure options: + * ``box_tilt``: determines how [skewed the cell](https://docs.lammps.org/box.html) is, of great importance for triclinic systems (default: ``small``). + * ``groups``: list with the names of the groups to be added. The names of the possible groups are generated by the list of possible kind names generated by the structure (default: skip parameter). + * ``atom_style``: how the [atoms](https://docs.lammps.org/atom_style.html) are treated by the ``LAMMPS`` simulation. +- ``potential``: parameters related to the potential describing the system: + * ``potential_style_options``: extra parameters related to each of the possible pair styles (default: skip parameter). + * ``neighbor``: sets the parameters affecting the construction of the [neighbor list](https://docs.lammps.org/neighbor.html) (default: skip parameter). + * ``neighbor_modify``: set of options that [modify](https://docs.lammps.org/neigh_modify.html) the pairwise neighbor list generation (default: skip parameter). +- ``dump``: controls parameters regarding the printing of the site dependent quantities: + * ``dump_rate``: how often are the site dependent quantities printed to file (default: 10). +- ``compute``: set of lists containing information about which ``LAMMPS`` [computes](https://docs.lammps.org/compute.html) should be calculated. For each ``LAMMPS`` command one passes a list of dictionaries, each dictionary has a ``type`` key containing the options of the compute and ``group`` a key specifying over which group the compute is acting on. +- ``fix``: set of list containing information about which ``LAMMPS`` [fixes](https://docs.lammps.org/fix.html) should be calculated. For each ``LAMMPS`` command one passes a list of dictionaries, each dictionary has a ``type`` key containing the options of the fixes and ``group`` a key specifying over which group the fix is acting on. +- ``thermo``: set of variables indicating which global parameters (printed in the ``lammps.log``) should be printed: + * ``printing_rate``: how often should the parameters be written to the ``lammps.log`` (default: 1000) + * ``thermo_printing``: dictionary containing which ``LAMMPS`` internal [variables](https://docs.lammps.org/thermo_style.html) are printed to the ``lammps.log``. The keys are the names of ``LAMMPS`` parameters and the value is a boolean on whether to print it or not. +- ``md``: set of variables controlling a molecular dynamics simulation (exclusionary with ``minimize`` key word): + * ``max_number_steps``: maximum number of steps for the molecular dynamics simulation (default: 100) + * ``run_style``: type of molecular dynamics algorithm (default: ``verlet``). + * ``velocity``: set of variables needed to define the [velocity](https://docs.lammps.org/velocity.html) of the system. + * ``integration``: parameters relating to the integrators of the molecular dynamics simulation: + - ``style``: Type of [integrator](https://docs.lammps.org/fixes.html) used for the molecular dynamics simulation. + - ``constraints``: set of options for each integrator, the values depend on the type of integrator. +- ``minimize``: set of variables controlling a minimization simulation (exclusionary with ``md`` key word): + * ``style``: [type of minimization](https://docs.lammps.org/min_style.html) algorithm (default: ``cg``). + * ``energy_tolerance``: tolerance for the energy minimization (default: 1e-4). + * ``force_tolerance``: tolerance for the force minimization (default: 1e-4). + * ``max_iterations``: maximum number of iterations (default: 1000). + * ``max_evaluations``: maximum number of evaluations (default: 1000). + +### Compute parameters +When asking ``aiida-lammps`` to calculate a certain ``compute`` its ``LAMMPS`` name will be automatically generated following the pattern ``compute_name_group_name_aiida`` where ``compute_name`` is the ``LAMMPS`` name of the compute, e.g. ``pe/atom`` with the difference than the ``/`` character is replaced by ``_`` and ``group_name`` is the name of the group to which the compute is applied. All global computes are printed to the ``lammps.log`` and all site dependent quantities are printed to the trajectory file. These computes can then be accessed as outputs of the simulation. + +### Input validation +``LAMMPS`` has a quite large amount of possible parameters which can be passed into it to control its behavior. Many of these options are incompatible which can cause the ``LAMMPS`` simulation to fail. To try to catch as many as possible of these possible conflicts the ``aiida-lammps`` input is validated against a [JSON schema](https://json-schema.org/understanding-json-schema/index.html), that checks that the provided input parameters fulfill this schema as much as possible, e.g. it checks that only ``LAMMPS`` computes can be passed to the ``compute`` block, etc. Due to the large amount and variety of options for each compute/fixes these options are not thoroughly checked, only the name of the compute itself is checked. diff --git a/examples/launch_lammps_base.py b/examples/launch_lammps_base.py index 0879ebe..fc12baa 100644 --- a/examples/launch_lammps_base.py +++ b/examples/launch_lammps_base.py @@ -66,10 +66,21 @@ def generate_potential() -> LammpsPotentialData: 'data_method': 'unknown', 'description': - "This Fe EAM potential parameter file is from the NIST repository, \"Fe_2.eam.fs\" as of the March 9, 2009 update. It is similar to \"Fe_mm.eam.fs\" in the LAMMPS distribution dated 2007-06-11, but gives different results for very small interatomic distances (The LAMMPS potential is in fact the deprecated potential referred to in the March 9, 2009 update on the NIST repository). The file header includes a note from the NIST contributor: \"The potential was taken from v9_4_bcc (in C:\\SIMULATION.MD\\Fe\\Results\\ab_initio+Interstitials)\"", + """This Fe EAM potential parameter file is from the NIST repository, + \"Fe_2.eam.fs\" as of the March 9, 2009 update. + It is similar to \"Fe_mm.eam.fs\" in the LAMMPS distribution dated 2007-06-11, + but gives different results for very small interatomic distances + (The LAMMPS potential is in fact the deprecated potential referred to in the March 9, + 2009 update on the NIST repository). + The file header includes a note from the NIST contributor: + \"The potential was taken from v9_4_bcc (in C:\\SIMULATION.MD\\Fe\\Results\\ab_initio+Interstitials)\" + """, 'developer': ['Ronald E. Miller'], 'disclaimer': - 'According to the developer Giovanni Bonny (as reported by the NIST IPRP), this potential was not stiffened and cannot be used in its present form for collision cascades.', + """According to the developer Giovanni Bonny + (as reported by the NIST IPRP), this potential was not stiffened and cannot + be used in its present form for collision cascades. + """, 'properties': None, 'publication_year': @@ -97,7 +108,6 @@ def generate_potential() -> LammpsPotentialData: potential = LammpsPotentialData.get_or_create( source='Fe_2.eam.fs', - filename='Fe_2.eam.fs', **potential_parameters, ) @@ -146,8 +156,7 @@ def main( STRUCTURE = generate_structure() POTENTIAL = generate_potential() - CODE = orm.load_code( - 'lammps_base-19Jul2019-intel-19.0.4-openmpi-4.0.1@moggie') + CODE = orm.load_code('my_lammps_code') OPTIONS = AttributeDict() OPTIONS.resources = AttributeDict() # Total number of mpi processes diff --git a/setup.json b/setup.json index cf766e7..dc113ed 100644 --- a/setup.json +++ b/setup.json @@ -18,7 +18,7 @@ ], "python_requires": ">=3.6", "install_requires": [ - "aiida-core>=1.4.0,<2.0.0", + "aiida-core[atomic-tools]>=1.4.0,<2.0.0", "psycopg2-binary<2.9", "ase>=3.12.0,<4.0.0", "importlib_resources", @@ -70,13 +70,7 @@ "pytest-regressions" ], "pre-commit": [ - "mypy==0.910", - "packaging==20.3", - "pre-commit~=2.2", - "pylint~=2.6.0", - "pylint-aiida~=0.1.1", - "pylint-django", - "sqlalchemy2-stubs" + "aiida-core[pre-commit]>=1.4.0,<2.0.0" ], "docs": [ "myst-parser~=0.15.0", From 45385d4d6ca59b93f84cc46a959c217a3dbf1063 Mon Sep 17 00:00:00 2001 From: Jonathan Chico Date: Wed, 9 Feb 2022 16:19:10 +0100 Subject: [PATCH 62/70] Fixing pre-commit issues arising from pinning the pylint version to the one in aiida-core. --- .github/workflows/{tests.yml => cd.yml} | 0 .github/workflows/ci.yml | 121 ++++++++++++++++++ .pre-commit-config.yaml | 2 +- aiida_lammps/calculations/dynaphopy.py | 2 +- aiida_lammps/calculations/lammps/__init__.py | 4 +- aiida_lammps/calculations/lammps/combinate.py | 4 +- aiida_lammps/calculations/lammps/force.py | 2 +- aiida_lammps/calculations/lammps/md.py | 2 +- aiida_lammps/calculations/lammps/md_multi.py | 6 +- aiida_lammps/calculations/lammps/optimize.py | 2 +- aiida_lammps/data/trajectory.py | 2 + aiida_lammps/parsers/dynaphopy.py | 2 +- aiida_lammps/parsers/lammps/base.py | 2 +- aiida_lammps/parsers/lammps/force.py | 2 +- aiida_lammps/parsers/lammps/lammps_parser.py | 2 +- aiida_lammps/parsers/lammps/md.py | 2 +- aiida_lammps/parsers/lammps/md_multi.py | 2 +- aiida_lammps/parsers/lammps/optimize.py | 2 +- docs/source/conf.py | 2 +- docs/source/nitpick-exceptions | 1 - 20 files changed, 143 insertions(+), 21 deletions(-) rename .github/workflows/{tests.yml => cd.yml} (100%) create mode 100644 .github/workflows/ci.yml diff --git a/.github/workflows/tests.yml b/.github/workflows/cd.yml similarity index 100% rename from .github/workflows/tests.yml rename to .github/workflows/cd.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..ac133f5 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,121 @@ +name: CI + +on: + push: + branches: [develop, refactoring] + tags: + - 'v*' + pull_request: + +jobs: + + pre-commit: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + - name: Set up Python + uses: actions/setup-python@v1 + with: + python-version: 3.8 + id: cache-pip + - uses: actions/cache@v1 + with: + path: ~/.cache/pip + key: pip-${{ matrix.python-version }}-tests-${{ hashFiles('**/setup.json') }} + restore-keys: + pip-${{ matrix.python-version }}-tests + - name: Set up Python + uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python }} + - name: Upgrade pip + run: | + pip install --upgrade pip + pip --version + - name: Install wheel + run: pip install wheel + - name: Install AiiDA-LAMMPS + run: | + pip install -e .[testing,pre-commit] + pip freeze + - name: Run pre-commit + run: pre-commit run --all-files || ( git diff; git status; exit 1; ) + + tests: + + timeout-minutes: 30 + + strategy: + fail-fast: false + matrix: + include: + - python-version: 3.7 + lammps-version: "2019.06.05" + backend: django + - python-version: 3.7 + lammps-version: "2019.06.05" + backend: sqlalchemy + - python-version: 3.8 + lammps-version: "2020.12.24" + backend: django + - python-version: 3.9 + lammps-version: "2020.12.24" + backend: django + + runs-on: ubuntu-latest + + services: + postgres: + image: postgres:10 + env: + POSTGRES_DB: test_${{ matrix.backend }} + POSTGRES_PASSWORD: '' + POSTGRES_HOST_AUTH_METHOD: trust + options: >- + --health-cmd pg_isready + --health-interval 10s + --health-timeout 5s + --health-retries 5 + ports: + - 5432:5432 + rabbitmq: + image: rabbitmq:latest + ports: + - 5672:5672 + + steps: + - uses: actions/checkout@v2 + + - name: Setup conda + uses: s-weigand/setup-conda@v1 + with: + # update-conda: true + python-version: ${{ matrix.python-version }} + conda-channels: conda-forge + + - name: install lammps + run: conda install -y lammps==${{ matrix.lammps-version }} + + - name: Upgrade pip + run: | + pip install --upgrade pip + pip --version + + - name: Installation + run: | + pip install -e .[testing,pre-commit] + reentry scan + + - name: Run pytest + run: | + pytest --lammps-exec lmp_serial --cov=aiida_lammps --cov-report=xml --cov-report=term-missing + + - name: Upload to Codecov + if: matrix.python-version == 3.8 + uses: codecov/codecov-action@v1 + with: + name: pytests-lammps + flags: pytests + file: ./coverage.xml + fail_ci_if_error: true diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 17c5972..075edd1 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -36,7 +36,7 @@ repos: name: pylint entry: pylint types: [python] - args: ['-d duplicate-code'] + args: ['-d duplicate-code', '-d bad-continuation'] language: system exclude: | (?x)( diff --git a/aiida_lammps/calculations/dynaphopy.py b/aiida_lammps/calculations/dynaphopy.py index 4d81050..3dc361a 100644 --- a/aiida_lammps/calculations/dynaphopy.py +++ b/aiida_lammps/calculations/dynaphopy.py @@ -1,5 +1,5 @@ """Base dynaphopy calculation""" -# pylint: disable=too-many-instance-attributes, abstract-method, super-with-arguments +# pylint: disable=too-many-instance-attributes, abstract-method from aiida.common.datastructures import CalcInfo, CodeInfo from aiida.common.exceptions import InputValidationError from aiida.common.utils import classproperty diff --git a/aiida_lammps/calculations/lammps/__init__.py b/aiida_lammps/calculations/lammps/__init__.py index 430d798..bf1111d 100644 --- a/aiida_lammps/calculations/lammps/__init__.py +++ b/aiida_lammps/calculations/lammps/__init__.py @@ -1,5 +1,5 @@ """Base LAMMPS calculation for AiiDA.""" -# pylint: disable=duplicate-code, super-with-arguments, duplicate-code +# pylint: disable=duplicate-code, duplicate-code import itertools import numpy as np from aiida.common import CalcInfo, CodeInfo @@ -339,7 +339,7 @@ def create_main_input_content( # pylint: disable=no-self-use, too-many-arguments, unused-argument, duplicate-code, arguments-differ raise NotImplementedError - def prepare_for_submission(self, tempfolder): # pylint: disable=arguments-differ, arguments-renamed + def prepare_for_submission(self, tempfolder): # pylint: disable=arguments-differ """Create the input files from the input nodes passed to this instance of the `CalcJob`. :param tempfolder: an `aiida.common.folders.Folder` to temporarily write files on disk diff --git a/aiida_lammps/calculations/lammps/combinate.py b/aiida_lammps/calculations/lammps/combinate.py index 8fa4afa..85f9046 100644 --- a/aiida_lammps/calculations/lammps/combinate.py +++ b/aiida_lammps/calculations/lammps/combinate.py @@ -1,6 +1,6 @@ """Combined MD and Phonopy calculation""" # Not working with Aiida 1.0 -# pylint: disable=no-name-in-module, super-with-arguments, duplicate-code +# pylint: disable=no-name-in-module, duplicate-code import numpy as np from aiida.common.exceptions import InputValidationError from aiida import orm @@ -119,7 +119,7 @@ def create_main_input_content( system_filename, restart_filename, ): - # pylint: disable=too-many-arguments, arguments-differ, arguments-renamed + # pylint: disable=too-many-arguments, arguments-differ random_number = np.random.randint(10000000) lammps_input_file = f'units {potential_data.default_units}\n' diff --git a/aiida_lammps/calculations/lammps/force.py b/aiida_lammps/calculations/lammps/force.py index 368eacb..3dffbb3 100644 --- a/aiida_lammps/calculations/lammps/force.py +++ b/aiida_lammps/calculations/lammps/force.py @@ -1,5 +1,5 @@ """Single point calculation of the energy in LAMMPS.""" -# pylint: disable=fixme, duplicate-code, useless-super-delegation, super-with-arguments +# pylint: disable=fixme, duplicate-code, useless-super-delegation from aiida.plugins import DataFactory from aiida_lammps.calculations.lammps import BaseLammpsCalculation diff --git a/aiida_lammps/calculations/lammps/md.py b/aiida_lammps/calculations/lammps/md.py index 9dbd6dc..632d467 100644 --- a/aiida_lammps/calculations/lammps/md.py +++ b/aiida_lammps/calculations/lammps/md.py @@ -1,5 +1,5 @@ """Single stage MD calculation in LAMMPS.""" -# pylint: disable=fixme, useless-super-delegation, super-with-arguments, duplicate-code +# pylint: disable=fixme, useless-super-delegation, duplicate-code import numpy as np from aiida.common.exceptions import InputValidationError from aiida.plugins import DataFactory diff --git a/aiida_lammps/calculations/lammps/md_multi.py b/aiida_lammps/calculations/lammps/md_multi.py index 39f2f98..80c4419 100644 --- a/aiida_lammps/calculations/lammps/md_multi.py +++ b/aiida_lammps/calculations/lammps/md_multi.py @@ -1,5 +1,5 @@ """Run a multi-stage molecular dynamic simulation.""" -# pylint: disable=fixme, super-with-arguments +# pylint: disable=fixme from aiida.common.exceptions import InputValidationError from aiida.plugins import DataFactory @@ -386,12 +386,12 @@ def atom_info_commands( # work out which variables need to be computed avar_props = [ v for v in ave_variables - if not any([v.startswith(s) for s in ['c_', 'f_', 'v_']]) # pylint: disable=use-a-generator + if not any([v.startswith(s) for s in ['c_', 'f_', 'v_']]) ] avar_names = [] c_at_vars = 1 for ave_var in ave_variables: - if any([ave_var.startswith(s) for s in ['c_', 'f_', 'v_']]): # pylint: disable=use-a-generator + if any([ave_var.startswith(s) for s in ['c_', 'f_', 'v_']]): avar_names.append(ave_var) else: if len(avar_props) > 1: diff --git a/aiida_lammps/calculations/lammps/optimize.py b/aiida_lammps/calculations/lammps/optimize.py index f1244d8..ab1ec0a 100644 --- a/aiida_lammps/calculations/lammps/optimize.py +++ b/aiida_lammps/calculations/lammps/optimize.py @@ -1,7 +1,7 @@ """Class describing the calculation of the optimization of a structure using LAMMPS (minimize method). """ -# pylint: disable=fixme, duplicate-code, useless-super-delegation, super-with-arguments +# pylint: disable=fixme, duplicate-code, useless-super-delegation from aiida.common.exceptions import InputValidationError from aiida.plugins import DataFactory diff --git a/aiida_lammps/data/trajectory.py b/aiida_lammps/data/trajectory.py index 48e147b..34c26ee 100644 --- a/aiida_lammps/data/trajectory.py +++ b/aiida_lammps/data/trajectory.py @@ -134,6 +134,8 @@ def set_from_fileobj(self, fileobj, aliases=None): self.put_object_from_filelike( temp_handle, self._trajectory_filename, + mode='wb', + encoding=None, ) else: self.put_object_from_filelike( diff --git a/aiida_lammps/parsers/dynaphopy.py b/aiida_lammps/parsers/dynaphopy.py index 8e95933..a8bd1bb 100644 --- a/aiida_lammps/parsers/dynaphopy.py +++ b/aiida_lammps/parsers/dynaphopy.py @@ -1,6 +1,6 @@ """Parser for dynaphopy calculations.""" # Not working with Aiida 1.0 -# pylint: disable=useless-super-delegation, super-with-arguments +# pylint: disable=useless-super-delegation from aiida.orm.data.parameter import ParameterData # pylint: disable=no-name-in-module, import-error from aiida.parsers.parser import Parser from aiida_phonopy.common.raw_parsers import parse_FORCE_CONSTANTS # pylint: disable=import-error diff --git a/aiida_lammps/parsers/lammps/base.py b/aiida_lammps/parsers/lammps/base.py index 50fd427..7d7ecce 100644 --- a/aiida_lammps/parsers/lammps/base.py +++ b/aiida_lammps/parsers/lammps/base.py @@ -20,7 +20,7 @@ class LAMMPSBaseParser(Parser): """Abstract Base Parser for LAMMPS, supplying common methods.""" def __init__(self, node): """Initialize the parser.""" - # pylint: disable=useless-super-delegation, super-with-arguments + # pylint: disable=useless-super-delegation super(LAMMPSBaseParser, self).__init__(node) def get_parsing_resources( diff --git a/aiida_lammps/parsers/lammps/force.py b/aiida_lammps/parsers/lammps/force.py index 2ed3138..1df2083 100644 --- a/aiida_lammps/parsers/lammps/force.py +++ b/aiida_lammps/parsers/lammps/force.py @@ -11,7 +11,7 @@ class ForceParser(LAMMPSBaseParser): """Parser for LAMMPS single point energy calculation.""" def __init__(self, node): """Initialize the instance of Force Lammps Parser.""" - # pylint: disable=useless-super-delegation, super-with-arguments + # pylint: disable=useless-super-delegation super(ForceParser, self).__init__(node) def parse(self, **kwargs): diff --git a/aiida_lammps/parsers/lammps/lammps_parser.py b/aiida_lammps/parsers/lammps/lammps_parser.py index fb4e270..2963cd2 100644 --- a/aiida_lammps/parsers/lammps/lammps_parser.py +++ b/aiida_lammps/parsers/lammps/lammps_parser.py @@ -22,7 +22,7 @@ class LAMMPSBaseParser(Parser): """ def __init__(self, node): """Initialize the parser""" - # pylint: disable=useless-super-delegation, super-with-arguments + # pylint: disable=useless-super-delegation super(LAMMPSBaseParser, self).__init__(node) def parse(self, **kwargs): diff --git a/aiida_lammps/parsers/lammps/md.py b/aiida_lammps/parsers/lammps/md.py index 0a1ff4f..9770010 100644 --- a/aiida_lammps/parsers/lammps/md.py +++ b/aiida_lammps/parsers/lammps/md.py @@ -13,7 +13,7 @@ class MdParser(LAMMPSBaseParser): """Parser for LAMMPS MD calculations.""" def __init__(self, node): """Initialize the instance of Lammps MD Parser.""" - # pylint: disable=useless-super-delegation, super-with-arguments + # pylint: disable=useless-super-delegation super(MdParser, self).__init__(node) def parse(self, **kwargs): diff --git a/aiida_lammps/parsers/lammps/md_multi.py b/aiida_lammps/parsers/lammps/md_multi.py index 4d311b3..b936929 100644 --- a/aiida_lammps/parsers/lammps/md_multi.py +++ b/aiida_lammps/parsers/lammps/md_multi.py @@ -14,7 +14,7 @@ class MdMultiParser(LAMMPSBaseParser): """Parser for LAMMPS MDMulti calculations.""" def __init__(self, node): """Initialize the instance of Lammps MD Parser.""" - # pylint: disable=useless-super-delegation, super-with-arguments + # pylint: disable=useless-super-delegation super(MdMultiParser, self).__init__(node) def parse(self, **kwargs): diff --git a/aiida_lammps/parsers/lammps/optimize.py b/aiida_lammps/parsers/lammps/optimize.py index 7b695cd..0e6941a 100644 --- a/aiida_lammps/parsers/lammps/optimize.py +++ b/aiida_lammps/parsers/lammps/optimize.py @@ -16,7 +16,7 @@ class OptimizeParser(LAMMPSBaseParser): """Parser for LAMMPS optimization calculation.""" def __init__(self, node): """Initialize the instance of Optimize Lammps Parser.""" - # pylint: disable=useless-super-delegation, super-with-arguments + # pylint: disable=useless-super-delegation super(OptimizeParser, self).__init__(node) def parse(self, **kwargs): diff --git a/docs/source/conf.py b/docs/source/conf.py index 80b10be..6deb51c 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -7,8 +7,8 @@ import os import sys import subprocess -from aiida_lammps import __version__ from aiida.manage.configuration import load_documentation_profile +from aiida_lammps import __version__ # -- AiiDA-related setup -------------------------------------------------- diff --git a/docs/source/nitpick-exceptions b/docs/source/nitpick-exceptions index 9ad0432..9138c58 100644 --- a/docs/source/nitpick-exceptions +++ b/docs/source/nitpick-exceptions @@ -161,4 +161,3 @@ py:class pgsu.PGSU py:meth pgsu.PGSU.__init__ py:class jsonschema.exceptions._Error - From 4eee307cff71d59ce08acd430595d45fceacf390 Mon Sep 17 00:00:00 2001 From: Chris Sewell Date: Tue, 5 Apr 2022 21:02:18 +0200 Subject: [PATCH 63/70] Re-establish upstream formatting --- .pre-commit-config.yaml | 63 +- .pre-commit/check_version.py | 37 +- aiida_lammps/__init__.py | 2 +- aiida_lammps/calculations/dynaphopy.py | 181 ++--- aiida_lammps/calculations/lammps/__init__.py | 179 ++--- aiida_lammps/calculations/lammps/base.py | 125 ++-- aiida_lammps/calculations/lammps/combinate.py | 158 ++--- aiida_lammps/calculations/lammps/force.py | 73 +- aiida_lammps/calculations/lammps/md.py | 149 ++-- aiida_lammps/calculations/lammps/md_multi.py | 325 ++++----- aiida_lammps/calculations/lammps/optimize.py | 120 ++-- aiida_lammps/common/generate_input_files.py | 37 +- aiida_lammps/common/generate_structure.py | 55 +- aiida_lammps/common/input_generator.py | 536 ++++++++------- aiida_lammps/common/parse_trajectory.py | 65 +- aiida_lammps/common/raw_parsers.py | 391 ++++++----- aiida_lammps/common/reaxff_convert.py | 634 ++++++++++-------- aiida_lammps/common/utils.py | 25 +- aiida_lammps/data/lammps_potential.py | 153 ++--- aiida_lammps/data/pot_plugins/base_plugin.py | 1 + aiida_lammps/data/pot_plugins/eam.py | 22 +- .../data/pot_plugins/lennard_jones.py | 10 +- aiida_lammps/data/pot_plugins/reaxff.py | 84 +-- aiida_lammps/data/pot_plugins/tersoff.py | 20 +- aiida_lammps/data/potential.py | 46 +- aiida_lammps/data/trajectory.py | 109 ++- aiida_lammps/parsers/dynaphopy.py | 48 +- aiida_lammps/parsers/lammps/base.py | 99 +-- aiida_lammps/parsers/lammps/force.py | 50 +- aiida_lammps/parsers/lammps/lammps_parser.py | 45 +- aiida_lammps/parsers/lammps/md.py | 44 +- aiida_lammps/parsers/lammps/md_multi.py | 62 +- aiida_lammps/parsers/lammps/optimize.py | 33 +- aiida_lammps/tests/test_calculations.py | 515 +++++++------- aiida_lammps/tests/test_generate_inputs.py | 72 +- aiida_lammps/tests/test_generate_structure.py | 9 +- aiida_lammps/tests/test_parsers.py | 170 +++-- aiida_lammps/tests/test_potential_data.py | 86 +-- aiida_lammps/tests/test_reaxff_parse.py | 12 +- aiida_lammps/tests/test_trajectory.py | 44 +- aiida_lammps/tests/utils.py | 91 ++- aiida_lammps/utils.py | 2 +- aiida_lammps/validation/__init__.py | 4 +- aiida_lammps/validation/utils.py | 19 +- conftest.py | 359 +++++----- docs/source/conf.py | 122 ++-- examples/launch_dynaphopy_si.py | 57 +- examples/launch_lammps_base.py | 166 ++--- examples/launch_lammps_combinate.py | 62 +- examples/launch_lammps_force_gan.py | 60 +- examples/launch_lammps_md_si.py | 70 +- examples/launch_lammps_optimization_fe.py | 68 +- examples/launch_lammps_optimization_gan.py | 88 ++- examples/launch_lammps_optimization_lj.py | 71 +- setup.py | 12 +- 55 files changed, 3139 insertions(+), 3001 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 6861b4e..4191fd6 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -4,9 +4,7 @@ exclude: > (?x)^( aiida_lammps/tests/input_files/.*| - aiida_lammps/tests/.*txt| - aiida_lammps/tests/| - .pre-commit/check_version.py + aiida_lammps/tests/.*txt )$ repos: @@ -22,33 +20,40 @@ repos: - repo: https://github.com/timothycrosley/isort rev: 5.5.3 hooks: - - id: trailing-whitespace - - id: end-of-file-fixer - - id: check-yaml - - id: check-json - - id: check-added-large-files - args: ['--maxkb=1000'] - - id: double-quote-string-fixer - - id: forbid-new-submodules - - - repo: https://github.com/pre-commit/mirrors-yapf - rev: v0.30.0 + - id: isort + + - repo: https://github.com/psf/black + rev: 20.8b1 + hooks: + - id: black + + - repo: https://gitlab.com/pycqa/flake8 + rev: 3.8.3 hooks: - - id: yapf - name: yapf - types: [python] - args: ["-i"] + - id: flake8 + # additional_dependencies: + # - flake8-bugbear==20.1.4 + # - flake8-builtins==1.5.3 + # - flake8-comprehensions==3.2.3 + exclude: > + (?x)^( + aiida_lammps/calculations/dynaphopy.py + )$ - repo: local hooks: - - id: pylint - name: pylint - entry: pylint - types: [python] - args: ['-d duplicate-code', '-d bad-continuation'] - language: system - exclude: | - (?x)( - ^examples/| - ^tests/ - ) + - id: version-number + name: Check version numbers + entry: python ./.pre-commit/check_version.py version + language: python + files: >- + (?x)^( + setup.json| + .pre-commit/check_version.py| + aiida_lammps/__init__.py + )$ + pass_filenames: false + additional_dependencies: + - click + + # TODO could also add check-manifest diff --git a/.pre-commit/check_version.py b/.pre-commit/check_version.py index 54cf9fb..797d78d 100644 --- a/.pre-commit/check_version.py +++ b/.pre-commit/check_version.py @@ -11,7 +11,7 @@ import click -FILENAME_SETUP_JSON = 'setup.json' +FILENAME_SETUP_JSON = "setup.json" SCRIPT_PATH = os.path.split(os.path.realpath(__file__))[0] ROOT_DIR = os.path.join(SCRIPT_PATH, os.pardir) FILEPATH_SETUP_JSON = os.path.join(ROOT_DIR, FILENAME_SETUP_JSON) @@ -19,7 +19,7 @@ def get_setup_json(): """Return the `setup.json` as a python dictionary.""" - with open(FILEPATH_SETUP_JSON, 'r') as handle: + with open(FILEPATH_SETUP_JSON, "r") as handle: setup_json = json.load(handle) # , object_pairs_hook=OrderedDict) return setup_json @@ -31,7 +31,7 @@ def cli(): pass -@cli.command('version') +@cli.command("version") def validate_version(): """Check that version numbers match. @@ -45,22 +45,27 @@ def validate_version(): version = aiida_lammps.__version__ setup_content = get_setup_json() - if version != setup_content['version']: - click.echo('Version number mismatch detected:') - click.echo("Version number in '{}': {}".format( - FILENAME_SETUP_JSON, setup_content['version'])) - click.echo("Version number in '{}/__init__.py': {}".format( - 'aiida_lammps', version)) - click.echo("Updating version in '{}' to: {}".format( - FILENAME_SETUP_JSON, version)) - - setup_content['version'] = version - with open(FILEPATH_SETUP_JSON, 'w') as fil: + if version != setup_content["version"]: + click.echo("Version number mismatch detected:") + click.echo( + "Version number in '{}': {}".format( + FILENAME_SETUP_JSON, setup_content["version"] + ) + ) + click.echo( + "Version number in '{}/__init__.py': {}".format("aiida_lammps", version) + ) + click.echo( + "Updating version in '{}' to: {}".format(FILENAME_SETUP_JSON, version) + ) + + setup_content["version"] = version + with open(FILEPATH_SETUP_JSON, "w") as fil: # Write with indentation of two spaces and explicitly define separators to not have spaces at end of lines - json.dump(setup_content, fil, indent=2, separators=(',', ': ')) + json.dump(setup_content, fil, indent=2, separators=(",", ": ")) sys.exit(1) -if __name__ == '__main__': +if __name__ == "__main__": cli() # pylint: disable=no-value-for-parameter diff --git a/aiida_lammps/__init__.py b/aiida_lammps/__init__.py index eca28f0..2598895 100644 --- a/aiida_lammps/__init__.py +++ b/aiida_lammps/__init__.py @@ -1,2 +1,2 @@ """AiiDA plugin for the LAMMPS code""" -__version__ = '0.8.0' +__version__ = "0.8.0" diff --git a/aiida_lammps/calculations/dynaphopy.py b/aiida_lammps/calculations/dynaphopy.py index 3dc361a..5fa3851 100644 --- a/aiida_lammps/calculations/dynaphopy.py +++ b/aiida_lammps/calculations/dynaphopy.py @@ -5,7 +5,10 @@ from aiida.common.utils import classproperty from aiida.engine import CalcJob from aiida.orm import ArrayData, StructureData, TrajectoryData -from aiida_phonopy.common.raw_parsers import get_force_constants, get_poscar_txt # pylint: disable=no-name-in-module, import-error +from aiida_phonopy.common.raw_parsers import ( # pylint: disable=no-name-in-module, import-error + get_force_constants, + get_poscar_txt, +) from aiida_lammps.common.generate_input_files import ( get_trajectory_txt, @@ -19,19 +22,28 @@ class DynaphopyCalculation(CalcJob): Requirement: the node should be able to import phonopy """ + def _init_internal_params(self): super(DynaphopyCalculation, self)._init_internal_params() - self._INPUT_FILE_NAME = 'input_dynaphopy' # pylint: disable=invalid-name, attribute-defined-outside-init - self._INPUT_TRAJECTORY = 'trajectory' # pylint: disable=invalid-name, attribute-defined-outside-init - self._INPUT_CELL = 'POSCAR' # pylint: disable=invalid-name, attribute-defined-outside-init - self._INPUT_FORCE_CONSTANTS = 'FORCE_CONSTANTS' # pylint: disable=invalid-name, attribute-defined-outside-init - - self._OUTPUT_FORCE_CONSTANTS = 'FORCE_CONSTANTS_OUT' # pylint: disable=invalid-name, attribute-defined-outside-init - self._OUTPUT_FILE_NAME = 'OUTPUT' # pylint: disable=invalid-name, attribute-defined-outside-init - self._OUTPUT_QUASIPARTICLES = 'quasiparticles_data.yaml' # pylint: disable=invalid-name, attribute-defined-outside-init - - self._default_parser = 'dynaphopy' # pylint: disable=attribute-defined-outside-init + self._INPUT_FILE_NAME = "input_dynaphopy" # pylint: disable=invalid-name, attribute-defined-outside-init + self._INPUT_TRAJECTORY = ( + "trajectory" # pylint: disable=invalid-name, attribute-defined-outside-init + ) + self._INPUT_CELL = ( + "POSCAR" # pylint: disable=invalid-name, attribute-defined-outside-init + ) + self._INPUT_FORCE_CONSTANTS = "FORCE_CONSTANTS" # pylint: disable=invalid-name, attribute-defined-outside-init + + self._OUTPUT_FORCE_CONSTANTS = "FORCE_CONSTANTS_OUT" # pylint: disable=invalid-name, attribute-defined-outside-init + self._OUTPUT_FILE_NAME = ( + "OUTPUT" # pylint: disable=invalid-name, attribute-defined-outside-init + ) + self._OUTPUT_QUASIPARTICLES = "quasiparticles_data.yaml" # pylint: disable=invalid-name, attribute-defined-outside-init + + self._default_parser = ( + "dynaphopy" # pylint: disable=attribute-defined-outside-init + ) @classproperty def _use_methods(cls): @@ -39,45 +51,46 @@ def _use_methods(cls): Additional use_* methods for the namelists class. """ # pylint: disable=no-self-argument, no-self-use - retdict = JobCalculation._use_methods # pylint: disable=protected-access, undefined-variable - retdict.update({ - 'parameters': { - 'valid_types': - ParameterData, # pylint: disable=undefined-variable - 'additional_parameter': - None, - 'linkname': - 'parameters', - 'docstring': ('Use a node that specifies the dynaphopy input ' - 'for the namelists'), - }, - 'trajectory': { - 'valid_types': - TrajectoryData, - 'additional_parameter': - None, - 'linkname': - 'trajectory', - 'docstring': ('Use a node that specifies the trajectory data ' - 'for the namelists'), - }, - 'force_constants': { - 'valid_types': - ArrayData, - 'additional_parameter': - None, - 'linkname': - 'force_constants', - 'docstring': ('Use a node that specifies the force_constants ' - 'for the namelists'), - }, - 'structure': { - 'valid_types': StructureData, - 'additional_parameter': None, - 'linkname': 'structure', - 'docstring': 'Use a node for the structure', - }, - }) + retdict = ( + JobCalculation._use_methods + ) # pylint: disable=protected-access, undefined-variable + retdict.update( + { + "parameters": { + "valid_types": ParameterData, # pylint: disable=undefined-variable + "additional_parameter": None, + "linkname": "parameters", + "docstring": ( + "Use a node that specifies the dynaphopy input " + "for the namelists" + ), + }, + "trajectory": { + "valid_types": TrajectoryData, + "additional_parameter": None, + "linkname": "trajectory", + "docstring": ( + "Use a node that specifies the trajectory data " + "for the namelists" + ), + }, + "force_constants": { + "valid_types": ArrayData, + "additional_parameter": None, + "linkname": "force_constants", + "docstring": ( + "Use a node that specifies the force_constants " + "for the namelists" + ), + }, + "structure": { + "valid_types": StructureData, + "additional_parameter": None, + "linkname": "structure", + "docstring": "Use a node for the structure", + }, + } + ) return retdict def _prepare_for_submission(self, tempfolder, inputdict): @@ -92,41 +105,43 @@ def _prepare_for_submission(self, tempfolder, inputdict): """ # pylint: disable=too-many-locals, too-many-statements try: - parameters_data = inputdict.pop(self.get_linkname('parameters')) + parameters_data = inputdict.pop(self.get_linkname("parameters")) except KeyError: pass # raise InputValidationError("No parameters specified for this " # "calculation") - if not isinstance(parameters_data, ParameterData): # pylint: disable=undefined-variable - raise InputValidationError('parameters is not of type ' - 'ParameterData') + if not isinstance( + parameters_data, ParameterData + ): # pylint: disable=undefined-variable + raise InputValidationError("parameters is not of type " "ParameterData") try: - structure = inputdict.pop(self.get_linkname('structure')) + structure = inputdict.pop(self.get_linkname("structure")) except KeyError as key_error: raise InputValidationError( - 'no structure is specified for this calculation' + "no structure is specified for this calculation" ) from key_error try: - trajectory = inputdict.pop(self.get_linkname('trajectory')) + trajectory = inputdict.pop(self.get_linkname("trajectory")) except KeyError as key_error: raise InputValidationError( - 'trajectory is specified for this calculation') from key_error + "trajectory is specified for this calculation" + ) from key_error try: - force_constants = inputdict.pop( - self.get_linkname('force_constants')) + force_constants = inputdict.pop(self.get_linkname("force_constants")) except KeyError as key_error: raise InputValidationError( - 'no force_constants is specified for this calculation' + "no force_constants is specified for this calculation" ) from key_error try: - code = inputdict.pop(self.get_linkname('code')) + code = inputdict.pop(self.get_linkname("code")) except KeyError as key_error: raise InputValidationError( - 'no code is specified for this calculation') from key_error + "no code is specified for this calculation" + ) from key_error time_step = trajectory.get_times()[1] - trajectory.get_times()[0] @@ -144,20 +159,19 @@ def _prepare_for_submission(self, tempfolder, inputdict): # =========================== dump to file ============================= input_filename = tempfolder.get_abs_path(self._INPUT_FILE_NAME) - with open(input_filename, 'w') as infile: + with open(input_filename, "w") as infile: infile.write(input_txt) cell_filename = tempfolder.get_abs_path(self._INPUT_CELL) - with open(cell_filename, 'w') as infile: + with open(cell_filename, "w") as infile: infile.write(cell_txt) - force_constants_filename = tempfolder.get_abs_path( - self._INPUT_FORCE_CONSTANTS) - with open(force_constants_filename, 'w') as infile: + force_constants_filename = tempfolder.get_abs_path(self._INPUT_FORCE_CONSTANTS) + with open(force_constants_filename, "w") as infile: infile.write(force_constants_txt) trajectory_filename = tempfolder.get_abs_path(self._INPUT_TRAJECTORY) - with open(trajectory_filename, 'w') as infile: + with open(trajectory_filename, "w") as infile: infile.write(trajectory_txt) # ============================ calcinfo ================================ @@ -184,26 +198,25 @@ def _prepare_for_submission(self, tempfolder, inputdict): codeinfo.cmdline_params = [ self._INPUT_FILE_NAME, self._INPUT_TRAJECTORY, - '-ts', - f'{time_step}', - '--silent', - '-sfc', + "-ts", + f"{time_step}", + "--silent", + "-sfc", self._OUTPUT_FORCE_CONSTANTS, - '-thm', # '--resolution 0.01', - '-psm', - '2', - '--normalize_dos', - '-sdata', + "-thm", # '--resolution 0.01', + "-psm", + "2", + "--normalize_dos", + "-sdata", ] - if 'temperature' in parameters_data.get_dict(): - codeinfo.cmdline_params.append('--temperature') - codeinfo.cmdline_params.append( - f'{parameters_data.dict.temperature}') + if "temperature" in parameters_data.get_dict(): + codeinfo.cmdline_params.append("--temperature") + codeinfo.cmdline_params.append(f"{parameters_data.dict.temperature}") - if 'md_commensurate' in parameters_data.get_dict(): + if "md_commensurate" in parameters_data.get_dict(): if parameters_data.dict.md_commensurate: - codeinfo.cmdline_params.append('--MD_commensurate') + codeinfo.cmdline_params.append("--MD_commensurate") codeinfo.stdout_name = self._OUTPUT_FILE_NAME codeinfo.code_uuid = code.uuid diff --git a/aiida_lammps/calculations/lammps/__init__.py b/aiida_lammps/calculations/lammps/__init__.py index bf1111d..124bc94 100644 --- a/aiida_lammps/calculations/lammps/__init__.py +++ b/aiida_lammps/calculations/lammps/__init__.py @@ -1,13 +1,14 @@ """Base LAMMPS calculation for AiiDA.""" # pylint: disable=duplicate-code, duplicate-code import itertools -import numpy as np + +from aiida import orm from aiida.common import CalcInfo, CodeInfo from aiida.common.exceptions import ValidationError from aiida.engine import CalcJob -from aiida import orm from aiida.orm import Dict, StructureData from aiida.plugins import DataFactory +import numpy as np from aiida_lammps.common.generate_structure import generate_lammps_structure from aiida_lammps.data.potential import EmpiricalPotential @@ -35,8 +36,7 @@ def get_supercell( supercell = StructureData(cell=supercell_array) for k in range(positions.shape[0]): - for entry in itertools.product( - *[range(i) for i in supercell_shape[::-1]]): + for entry in itertools.product(*[range(i) for i in supercell_shape[::-1]]): position = positions[k, :] + np.dot(np.array(entry[::-1]), cell) symbol = symbols[k] supercell.append_atom(position=position, symbols=symbol) @@ -52,15 +52,15 @@ def get_force_constants(force_constants: orm.ArrayData) -> str: :return: force constants in text :rtype: str """ - force_constants = force_constants.get_array('force_constants') + force_constants = force_constants.get_array("force_constants") fc_shape = force_constants.shape - fc_txt = '%4d\n' % (fc_shape[0]) + fc_txt = "%4d\n" % (fc_shape[0]) for i in range(fc_shape[0]): for j in range(fc_shape[1]): - fc_txt += '%4d%4d\n' % (i + 1, j + 1) + fc_txt += "%4d%4d\n" % (i + 1, j + 1) for vec in force_constants[i][j]: - fc_txt += ('%22.15f' * 3 + '\n') % tuple(vec) + fc_txt += ("%22.15f" * 3 + "\n") % tuple(vec) return fc_txt @@ -79,19 +79,18 @@ def structure_to_poscar(structure: orm.StructureData) -> str: )[1] labels = np.diff(np.append(atom_type_unique, [len(structure.sites)])) - poscar = ' '.join(np.unique([site.kind_name for site in structure.sites])) - poscar += '\n1.0\n' + poscar = " ".join(np.unique([site.kind_name for site in structure.sites])) + poscar += "\n1.0\n" cell = structure.cell for row in cell: - poscar += f'{row[0]: 22.16f} {row[1]: 22.16f} {row[2]: 22.16f}\n' - poscar += ' '.join(np.unique([site.kind_name - for site in structure.sites])) + '\n' - poscar += ' '.join(np.array(labels, dtype=str)) + '\n' - poscar += 'Cartesian\n' + poscar += f"{row[0]: 22.16f} {row[1]: 22.16f} {row[2]: 22.16f}\n" + poscar += " ".join(np.unique([site.kind_name for site in structure.sites])) + "\n" + poscar += " ".join(np.array(labels, dtype=str)) + "\n" + poscar += "Cartesian\n" for site in structure.sites: - poscar += f'{site.position[0]: 22.16f} ' - poscar += f'{site.position[1]: 22.16f} ' - poscar += f'{site.position[2]: 22.16f}\n' + poscar += f"{site.position[0]: 22.16f} " + poscar += f"{site.position[1]: 22.16f} " + poscar += f"{site.position[2]: 22.16f}\n" return poscar @@ -105,9 +104,9 @@ def parameters_to_input_file(parameters_object: dict) -> str: :rtype: str """ parameters = parameters_object.get_dict() - input_file = 'STRUCTURE FILE POSCAR\nPOSCAR\n\n' - input_file += 'FORCE CONSTANTS\nFORCE_CONSTANTS\n\n' - input_file += 'PRIMITIVE MATRIX\n' + input_file = "STRUCTURE FILE POSCAR\nPOSCAR\n\n" + input_file += "FORCE CONSTANTS\nFORCE_CONSTANTS\n\n" + input_file += "PRIMITIVE MATRIX\n" input_file += f'{np.array(parameters["primitive"])[0, 0]} ' input_file += f'{np.array(parameters["primitive"])[0, 1]} ' input_file += f'{np.array(parameters["primitive"])[0, 2]} \n' @@ -117,8 +116,8 @@ def parameters_to_input_file(parameters_object: dict) -> str: input_file += f'{np.array(parameters["primitive"])[2, 0]} ' input_file += f'{np.array(parameters["primitive"])[2, 1]} ' input_file += f'{np.array(parameters["primitive"])[2, 2]} \n' - input_file += '\n' - input_file += 'SUPERCELL MATRIX PHONOPY\n' + input_file += "\n" + input_file += "SUPERCELL MATRIX PHONOPY\n" input_file += f'{np.array(parameters["supercell"])[0, 0]} ' input_file += f'{np.array(parameters["supercell"])[0, 1]} ' input_file += f'{np.array(parameters["supercell"])[0, 2]} \n' @@ -128,7 +127,7 @@ def parameters_to_input_file(parameters_object: dict) -> str: input_file += f'{np.array(parameters["supercell"])[2, 0]} ' input_file += f'{np.array(parameters["supercell"])[2, 1]} ' input_file += f'{np.array(parameters["supercell"])[2, 2]} \n' - input_file += '\n' + input_file += "\n" return input_file @@ -140,136 +139,138 @@ class BaseLammpsCalculation(CalcJob): Requirement: the node should be able to import phonopy """ - _INPUT_FILE_NAME = 'input.in' - _INPUT_STRUCTURE = 'input.data' + _INPUT_FILE_NAME = "input.in" + _INPUT_STRUCTURE = "input.data" - _DEFAULT_OUTPUT_FILE_NAME = 'log.lammps' - _DEFAULT_TRAJECTORY_FILE_NAME = 'trajectory.lammpstrj' - _DEFAULT_SYSTEM_FILE_NAME = 'system_info.dump' - _DEFAULT_RESTART_FILE_NAME = 'lammps.restart' + _DEFAULT_OUTPUT_FILE_NAME = "log.lammps" + _DEFAULT_TRAJECTORY_FILE_NAME = "trajectory.lammpstrj" + _DEFAULT_SYSTEM_FILE_NAME = "system_info.dump" + _DEFAULT_RESTART_FILE_NAME = "lammps.restart" - _cmdline_params = ('-in', _INPUT_FILE_NAME) + _cmdline_params = ("-in", _INPUT_FILE_NAME) _stdout_name = None @classmethod def define(cls, spec): super(BaseLammpsCalculation, cls).define(spec) spec.input( - 'structure', + "structure", valid_type=StructureData, - help='the structure', + help="the structure", ) spec.input( - 'potential', + "potential", valid_type=EmpiricalPotential, - help='lammps potential', + help="lammps potential", ) spec.input( - 'parameters', + "parameters", valid_type=Dict, - help='the parameters', + help="the parameters", required=False, ) spec.input( - 'metadata.options.cell_transform_filename', + "metadata.options.cell_transform_filename", valid_type=str, - default='cell_transform.npy', + default="cell_transform.npy", ) spec.input( - 'metadata.options.output_filename', + "metadata.options.output_filename", valid_type=str, default=cls._DEFAULT_OUTPUT_FILE_NAME, ) spec.input( - 'metadata.options.trajectory_suffix', + "metadata.options.trajectory_suffix", valid_type=str, default=cls._DEFAULT_TRAJECTORY_FILE_NAME, ) spec.input( - 'metadata.options.system_suffix', + "metadata.options.system_suffix", valid_type=str, default=cls._DEFAULT_SYSTEM_FILE_NAME, ) spec.input( - 'metadata.options.restart_filename', + "metadata.options.restart_filename", valid_type=str, default=cls._DEFAULT_RESTART_FILE_NAME, ) spec.output( - 'results', - valid_type=DataFactory('dict'), + "results", + valid_type=DataFactory("dict"), required=True, - help='the data extracted from the main output file', + help="the data extracted from the main output file", ) - spec.default_output_node = 'results' + spec.default_output_node = "results" # Unrecoverable errors: resources like the retrieved folder or # its expected contents are missing spec.exit_code( 200, - 'ERROR_NO_RETRIEVED_FOLDER', - message='The retrieved folder data node could not be accessed.', + "ERROR_NO_RETRIEVED_FOLDER", + message="The retrieved folder data node could not be accessed.", ) spec.exit_code( 201, - 'ERROR_NO_RETRIEVED_TEMP_FOLDER', - message= - 'The retrieved temporary folder data node could not be accessed.', + "ERROR_NO_RETRIEVED_TEMP_FOLDER", + message="The retrieved temporary folder data node could not be accessed.", ) spec.exit_code( 202, - 'ERROR_LOG_FILE_MISSING', - message='the main log output file was not found', + "ERROR_LOG_FILE_MISSING", + message="the main log output file was not found", ) spec.exit_code( 203, - 'ERROR_TRAJ_FILE_MISSING', - message='the trajectory output file was not found', + "ERROR_TRAJ_FILE_MISSING", + message="the trajectory output file was not found", ) spec.exit_code( 204, - 'ERROR_STDOUT_FILE_MISSING', - message='the stdout output file was not found', + "ERROR_STDOUT_FILE_MISSING", + message="the stdout output file was not found", ) spec.exit_code( 205, - 'ERROR_STDERR_FILE_MISSING', - message='the stderr output file was not found', + "ERROR_STDERR_FILE_MISSING", + message="the stderr output file was not found", ) # Unrecoverable errors: required retrieved files could not be read, # parsed or are otherwise incomplete spec.exit_code( 300, - 'ERROR_LOG_PARSING', - message=('An error was flagged trying to parse the ' - 'main lammps output log file'), + "ERROR_LOG_PARSING", + message=( + "An error was flagged trying to parse the " + "main lammps output log file" + ), ) spec.exit_code( 310, - 'ERROR_TRAJ_PARSING', - message=('An error was flagged trying to parse the ' - 'trajectory output file'), + "ERROR_TRAJ_PARSING", + message=( + "An error was flagged trying to parse the " "trajectory output file" + ), ) spec.exit_code( 320, - 'ERROR_INFO_PARSING', - message=('An error was flagged trying to parse the ' - 'system info output file'), + "ERROR_INFO_PARSING", + message=( + "An error was flagged trying to parse the " "system info output file" + ), ) # Significant errors but calculation can be used to restart spec.exit_code( 400, - 'ERROR_LAMMPS_RUN', - message='The main lammps output file flagged an error', + "ERROR_LAMMPS_RUN", + message="The main lammps output file flagged an error", ) spec.exit_code( 401, - 'ERROR_RUN_INCOMPLETE', - message= - 'The main lammps output file did not flag that the computation finished', + "ERROR_RUN_INCOMPLETE", + message="The main lammps output file did not flag that the computation finished", ) @staticmethod @@ -348,22 +349,23 @@ def prepare_for_submission(self, tempfolder): # pylint: disable=arguments-diffe # pylint: disable=too-many-locals # assert that the potential and structure have the same kind elements if self.inputs.potential.allowed_element_names is not None and not set( - k.symbol for k in self.inputs.structure.kinds).issubset( - self.inputs.potential.allowed_element_names): + k.symbol for k in self.inputs.structure.kinds + ).issubset(self.inputs.potential.allowed_element_names): raise ValidationError( - 'the structure and potential are not compatible (different kind elements)' + "the structure and potential are not compatible (different kind elements)" ) # Setup structure structure_txt, struct_transform = generate_lammps_structure( - self.inputs.structure, self.inputs.potential.atom_style) + self.inputs.structure, self.inputs.potential.atom_style + ) with open( - tempfolder.get_abs_path(self.options.cell_transform_filename), - 'w+b') as handle: + tempfolder.get_abs_path(self.options.cell_transform_filename), "w+b" + ) as handle: np.save(handle, struct_transform) - if 'parameters' in self.inputs: + if "parameters" in self.inputs: parameters = self.inputs.parameters else: parameters = Dict() @@ -381,14 +383,14 @@ def prepare_for_submission(self, tempfolder): # pylint: disable=arguments-diffe input_filename = tempfolder.get_abs_path(self._INPUT_FILE_NAME) - with open(input_filename, 'w') as infile: + with open(input_filename, "w") as infile: infile.write(input_txt) self.validate_parameters(parameters, self.inputs.potential) retrieve_list, retrieve_temporary_list = self.get_retrieve_lists() - retrieve_list.extend([ - self.options.output_filename, self.options.cell_transform_filename - ]) + retrieve_list.extend( + [self.options.output_filename, self.options.cell_transform_filename] + ) # prepare extra files if needed self.prepare_extra_files(tempfolder, self.inputs.potential) @@ -396,13 +398,12 @@ def prepare_for_submission(self, tempfolder): # pylint: disable=arguments-diffe # =========================== dump to file ============================= structure_filename = tempfolder.get_abs_path(self._INPUT_STRUCTURE) - with open(structure_filename, 'w') as infile: + with open(structure_filename, "w") as infile: infile.write(structure_txt) - for name, content in self.inputs.potential.get_external_files().items( - ): + for name, content in self.inputs.potential.get_external_files().items(): fpath = tempfolder.get_abs_path(name) - with open(fpath, 'w') as infile: + with open(fpath, "w") as infile: infile.write(content) # ============================ calcinfo ================================ diff --git a/aiida_lammps/calculations/lammps/base.py b/aiida_lammps/calculations/lammps/base.py index aab89d8..19e3a3c 100644 --- a/aiida_lammps/calculations/lammps/base.py +++ b/aiida_lammps/calculations/lammps/base.py @@ -7,11 +7,12 @@ the input structure and whether or not a restart file is provided. """ from aiida import orm -from aiida.engine import CalcJob from aiida.common import datastructures -from aiida_lammps.data.lammps_potential import LammpsPotentialData +from aiida.engine import CalcJob + from aiida_lammps.common.generate_structure import generate_lammps_structure from aiida_lammps.common.input_generator import generate_input_file +from aiida_lammps.data.lammps_potential import LammpsPotentialData from aiida_lammps.data.trajectory import LammpsTrajectory @@ -25,161 +26,159 @@ class BaseLammpsCalculation(CalcJob): the input structure and whether or not a restart file is provided. """ - _INPUT_FILENAME = 'input.in' - _STRUCTURE_FILENAME = 'structure.dat' + _INPUT_FILENAME = "input.in" + _STRUCTURE_FILENAME = "structure.dat" - _DEFAULT_LOGFILE_FILENAME = 'log.lammps' - _DEFAULT_OUTPUT_FILENAME = 'lammps_output' - _DEFAULT_TRAJECTORY_FILENAME = 'aiida_lampps.trajectory.dump' - _DEFAULT_VARIABLES_FILENAME = 'aiida_lammps.yaml' - _DEFAULT_RESTART_FILENAME = 'lammps.restart' - _DEFAULT_POTENTIAL_FILENAME = 'potential.dat' - _DEFAULT_READ_RESTART_FILENAME = 'aiida_lammps.restart' + _DEFAULT_LOGFILE_FILENAME = "log.lammps" + _DEFAULT_OUTPUT_FILENAME = "lammps_output" + _DEFAULT_TRAJECTORY_FILENAME = "aiida_lampps.trajectory.dump" + _DEFAULT_VARIABLES_FILENAME = "aiida_lammps.yaml" + _DEFAULT_RESTART_FILENAME = "lammps.restart" + _DEFAULT_POTENTIAL_FILENAME = "potential.dat" + _DEFAULT_READ_RESTART_FILENAME = "aiida_lammps.restart" - _DEFAULT_PARSER = 'lammps.base' + _DEFAULT_PARSER = "lammps.base" @classmethod def define(cls, spec): super(BaseLammpsCalculation, cls).define(spec) spec.input( - 'structure', + "structure", valid_type=orm.StructureData, required=True, - help='Structure used in the ``LAMMPS`` calculation', + help="Structure used in the ``LAMMPS`` calculation", ) spec.input( - 'potential', + "potential", valid_type=LammpsPotentialData, required=True, - help='Potential used in the ``LAMMPS`` calculation', + help="Potential used in the ``LAMMPS`` calculation", ) spec.input( - 'parameters', + "parameters", valid_type=orm.Dict, required=True, - help='Parameters that control the ``LAMMPS`` calculation', + help="Parameters that control the ``LAMMPS`` calculation", ) spec.input( - 'input_restartfile', + "input_restartfile", valid_type=orm.SinglefileData, required=False, - help= - 'Input restartfile to continue from a previous ``LAMMPS`` calculation' + help="Input restartfile to continue from a previous ``LAMMPS`` calculation", ) spec.input( - 'metadata.options.input_filename', + "metadata.options.input_filename", valid_type=str, default=cls._INPUT_FILENAME, ) spec.input( - 'metadata.options.structure_filename', + "metadata.options.structure_filename", valid_type=str, default=cls._STRUCTURE_FILENAME, ) spec.input( - 'metadata.options.output_filename', + "metadata.options.output_filename", valid_type=str, default=cls._DEFAULT_OUTPUT_FILENAME, ) spec.input( - 'metadata.options.logfile_filename', + "metadata.options.logfile_filename", valid_type=str, default=cls._DEFAULT_LOGFILE_FILENAME, ) spec.input( - 'metadata.options.variables_filename', + "metadata.options.variables_filename", valid_type=str, default=cls._DEFAULT_VARIABLES_FILENAME, ) spec.input( - 'metadata.options.trajectory_filename', + "metadata.options.trajectory_filename", valid_type=str, default=cls._DEFAULT_TRAJECTORY_FILENAME, ) spec.input( - 'metadata.options.restart_filename', + "metadata.options.restart_filename", valid_type=str, default=cls._DEFAULT_RESTART_FILENAME, ) spec.input( - 'metadata.options.parser_name', + "metadata.options.parser_name", valid_type=str, default=cls._DEFAULT_PARSER, ) spec.output( - 'results', + "results", valid_type=orm.Dict, required=True, - help='The data extracted from the lammps log file', + help="The data extracted from the lammps log file", ) spec.output( - 'trajectories', + "trajectories", valid_type=LammpsTrajectory, required=True, - help='The data extracted from the lammps trajectory file', + help="The data extracted from the lammps trajectory file", ) spec.output( - 'time_dependent_computes', + "time_dependent_computes", valid_type=orm.ArrayData, required=True, - help= - 'The data with the time dependent computes parsed from the lammps.log', + help="The data with the time dependent computes parsed from the lammps.log", ) spec.output( - 'restartfile', + "restartfile", valid_type=orm.SinglefileData, required=True, - help='The restartfile of a ``LAMMPS`` calculation', + help="The restartfile of a ``LAMMPS`` calculation", ) spec.output( - 'structure', + "structure", valid_type=orm.StructureData, required=False, - help='The output structure.', + help="The output structure.", ) spec.exit_code( 350, - 'ERROR_NO_RETRIEVED_FOLDER', - message='the retrieved folder data node could not be accessed.', + "ERROR_NO_RETRIEVED_FOLDER", + message="the retrieved folder data node could not be accessed.", invalidates_cache=True, ) spec.exit_code( 351, - 'ERROR_LOG_FILE_MISSING', - message='the file with the lammps log was not found', + "ERROR_LOG_FILE_MISSING", + message="the file with the lammps log was not found", invalidates_cache=True, ) spec.exit_code( 352, - 'ERROR_FINAL_VARIABLE_FILE_MISSING', - message='the file with the final variables was not found', + "ERROR_FINAL_VARIABLE_FILE_MISSING", + message="the file with the final variables was not found", invalidates_cache=True, ) spec.exit_code( 353, - 'ERROR_TRAJECTORY_FILE_MISSING', - message='the file with the trajectories was not found', + "ERROR_TRAJECTORY_FILE_MISSING", + message="the file with the trajectories was not found", invalidates_cache=True, ) spec.exit_code( 354, - 'ERROR_STDOUT_FILE_MISSING', - message='the stdout output file was not found', + "ERROR_STDOUT_FILE_MISSING", + message="the stdout output file was not found", ) spec.exit_code( 355, - 'ERROR_STDERR_FILE_MISSING', - message='the stderr output file was not found', + "ERROR_STDERR_FILE_MISSING", + message="the stderr output file was not found", ) spec.exit_code( 1001, - 'ERROR_PARSING_LOGFILE', - message='error parsing the log file has failed.', + "ERROR_PARSING_LOGFILE", + message="error parsing the log file has failed.", ) spec.exit_code( 1002, - 'ERROR_PARSING_FINAL_VARIABLES', - message='error parsing the final variable file has failed.', + "ERROR_PARSING_FINAL_VARIABLES", + message="error parsing the final variable file has failed.", ) def prepare_for_submission(self, folder): @@ -198,7 +197,7 @@ def prepare_for_submission(self, folder): # Get the name of the structure file and write it to the remote folder _structure_filename = self.inputs.metadata.options.structure_filename - with folder.open(_structure_filename, 'w') as handle: + with folder.open(_structure_filename, "w") as handle: handle.write(structure_filecontent) # Get the parameters dictionary so that they can be used for creating @@ -222,9 +221,9 @@ def prepare_for_submission(self, folder): # If there is a restartfile set its name to the input variables and # write it in the remote folder - if 'input_restartfile' in self.inputs: + if "input_restartfile" in self.inputs: _read_restart_filename = self._DEFAULT_READ_RESTART_FILENAME - with folder.open(_read_restart_filename, 'wb') as handle: + with folder.open(_read_restart_filename, "wb") as handle: handle.write(self.inputs.input_restartfile.get_content()) else: _read_restart_filename = None @@ -244,19 +243,17 @@ def prepare_for_submission(self, folder): # Get the name of the input file, and write it to the remote folder _input_filename = self.inputs.metadata.options.input_filename - with folder.open(_input_filename, 'w') as handle: + with folder.open(_input_filename, "w") as handle: handle.write(input_filecontent) # Write the potential to the remote folder - with folder.open(self._DEFAULT_POTENTIAL_FILENAME, 'w') as handle: + with folder.open(self._DEFAULT_POTENTIAL_FILENAME, "w") as handle: handle.write(self.inputs.potential.get_content()) codeinfo = datastructures.CodeInfo() # Command line variables to ensure that the input file from LAMMPS can # be read - codeinfo.cmdline_params = [ - '-in', _input_filename, '-log', _logfile_filename - ] + codeinfo.cmdline_params = ["-in", _input_filename, "-log", _logfile_filename] # Set the code uuid codeinfo.code_uuid = self.inputs.code.uuid # Set the name of the stdout diff --git a/aiida_lammps/calculations/lammps/combinate.py b/aiida_lammps/calculations/lammps/combinate.py index 85f9046..f794430 100644 --- a/aiida_lammps/calculations/lammps/combinate.py +++ b/aiida_lammps/calculations/lammps/combinate.py @@ -1,21 +1,23 @@ """Combined MD and Phonopy calculation""" # Not working with Aiida 1.0 # pylint: disable=no-name-in-module, duplicate-code -import numpy as np -from aiida.common.exceptions import InputValidationError from aiida import orm +from aiida.common.exceptions import InputValidationError from aiida_phonopy.common.raw_parsers import ( # pylint: disable=import-error - get_force_constants, get_FORCE_SETS_txt, get_poscar_txt, + get_force_constants, + get_FORCE_SETS_txt, + get_poscar_txt, ) +import numpy as np from aiida_lammps.calculations.lammps import BaseLammpsCalculation def generate_dynaphopy_input( parameters_object, - poscar_name: str = 'POSCAR', - force_constants_name: str = 'FORCE_CONSTANTS', - force_sets_filename: str = 'FORCE_SETS', + poscar_name: str = "POSCAR", + force_constants_name: str = "FORCE_CONSTANTS", + force_sets_filename: str = "FORCE_SETS", use_sets: bool = False, ) -> str: """Generates the input needed for the dynaphopy calculation. @@ -36,14 +38,14 @@ def generate_dynaphopy_input( :rtype: str """ parameters = parameters_object.get_dict() - input_file = f'STRUCTURE FILE POSCAR\n{poscar_name}\n\n' + input_file = f"STRUCTURE FILE POSCAR\n{poscar_name}\n\n" if use_sets: - input_file += f'FORCE SETS\n{force_sets_filename}\n\n' + input_file += f"FORCE SETS\n{force_sets_filename}\n\n" else: - input_file += f'FORCE CONSTANTS\n{force_constants_name}\n\n' + input_file += f"FORCE CONSTANTS\n{force_constants_name}\n\n" - input_file += 'PRIMITIVE MATRIX\n' + input_file += "PRIMITIVE MATRIX\n" input_file += f'{np.array(parameters["primitive"])[0, 0]} ' input_file += f'{np.array(parameters["primitive"])[1, 1]} ' input_file += f'{np.array(parameters["primitive"])[2, 2]} \n' @@ -53,8 +55,8 @@ def generate_dynaphopy_input( input_file += f'{np.array(parameters["primitive"])[0, 0]} ' input_file += f'{np.array(parameters["primitive"])[1, 1]} ' input_file += f'{np.array(parameters["primitive"])[2, 2]} \n' - input_file += '\n' - input_file += 'SUPERCELL MATRIX PHONOPY\n' + input_file += "\n" + input_file += "SUPERCELL MATRIX PHONOPY\n" input_file += f'{np.array(parameters["supercell"])[0, 0]} ' input_file += f'{np.array(parameters["supercell"])[0, 1]} ' input_file += f'{np.array(parameters["supercell"])[0, 2]} \n' @@ -64,7 +66,7 @@ def generate_dynaphopy_input( input_file += f'{np.array(parameters["supercell"])[2, 0]} ' input_file += f'{np.array(parameters["supercell"])[2, 1]} ' input_file += f'{np.array(parameters["supercell"])[2, 2]} \n' - input_file += '\n' + input_file += "\n" return input_file @@ -72,13 +74,13 @@ def generate_dynaphopy_input( class CombinateCalculation(BaseLammpsCalculation): """Combined MD and Phonopy calculation""" - _POSCAR_NAME = 'POSCAR' - _INPUT_FORCE_CONSTANTS = 'FORCE_CONSTANTS' - _INPUT_FORCE_SETS = 'FORCE_SETS' - _INPUT_FILE_NAME_DYNA = 'input_dynaphopy' - _OUTPUT_FORCE_CONSTANTS = 'FORCE_CONSTANTS_OUT' - _OUTPUT_QUASIPARTICLES = 'quasiparticles_data.yaml' - _OUTPUT_FILE_NAME = 'OUTPUT' + _POSCAR_NAME = "POSCAR" + _INPUT_FORCE_CONSTANTS = "FORCE_CONSTANTS" + _INPUT_FORCE_SETS = "FORCE_SETS" + _INPUT_FILE_NAME_DYNA = "input_dynaphopy" + _OUTPUT_FORCE_CONSTANTS = "FORCE_CONSTANTS_OUT" + _OUTPUT_QUASIPARTICLES = "quasiparticles_data.yaml" + _OUTPUT_FILE_NAME = "OUTPUT" # self._retrieve_list = [self._OUTPUT_QUASIPARTICLES, # self._OUTPUT_FORCE_CONSTANTS, self._OUTPUT_FILE_NAME] @@ -87,24 +89,24 @@ class CombinateCalculation(BaseLammpsCalculation): def define(cls, spec): super(CombinateCalculation, cls).define(spec) spec.input( - 'metadata.options.parser_name', + "metadata.options.parser_name", valid_type=str, - default='dynaphopy', + default="dynaphopy", ) spec.input( - 'parameters_dynaphopy', + "parameters_dynaphopy", valid_type=orm.Dict, - help='dynaphopy parameters', + help="dynaphopy parameters", ) spec.input( - 'force_constants', + "force_constants", valid_type=orm.ArrayData, - help='harmonic force constants', + help="harmonic force constants", ) spec.input( - 'force_sets', + "force_sets", valid_type=orm.ArrayData, - help='phonopy force sets', + help="phonopy force sets", ) # spec.input('settings', valid_type=str, default='lammps.optimize') @@ -122,37 +124,39 @@ def create_main_input_content( # pylint: disable=too-many-arguments, arguments-differ random_number = np.random.randint(10000000) - lammps_input_file = f'units {potential_data.default_units}\n' - lammps_input_file += 'boundary p p p\n' - lammps_input_file += 'box tilt large\n' - lammps_input_file += f'atom_style {potential_data.atom_style}\n' - lammps_input_file += f'read_data {structure_filename}\n' + lammps_input_file = f"units {potential_data.default_units}\n" + lammps_input_file += "boundary p p p\n" + lammps_input_file += "box tilt large\n" + lammps_input_file += f"atom_style {potential_data.atom_style}\n" + lammps_input_file += f"read_data {structure_filename}\n" lammps_input_file += potential_data.get_input_lines(structure_data) - lammps_input_file += 'neighbor 0.3 bin\n' - lammps_input_file += 'neigh_modify every 1 delay 0 check no\n' + lammps_input_file += "neighbor 0.3 bin\n" + lammps_input_file += "neigh_modify every 1 delay 0 check no\n" - lammps_input_file += 'velocity all create ' - lammps_input_file += f'{parameter_data.dict.temperature} {random_number} ' - lammps_input_file += 'dist gaussian mom yes\n' - lammps_input_file += f'velocity all scale {parameter_data.dict.temperature}\n' + lammps_input_file += "velocity all create " + lammps_input_file += f"{parameter_data.dict.temperature} {random_number} " + lammps_input_file += "dist gaussian mom yes\n" + lammps_input_file += ( + f"velocity all scale {parameter_data.dict.temperature}\n" + ) - lammps_input_file += 'fix int all nvt temp ' - lammps_input_file += f'{parameter_data.dict.temperature} ' - lammps_input_file += f'{parameter_data.dict.temperature} ' - lammps_input_file += f'{parameter_data.dict.thermostat_variable}\n' + lammps_input_file += "fix int all nvt temp " + lammps_input_file += f"{parameter_data.dict.temperature} " + lammps_input_file += f"{parameter_data.dict.temperature} " + lammps_input_file += f"{parameter_data.dict.thermostat_variable}\n" return lammps_input_file def prepare_extra_files(self, tempfolder, potential_object): # pylint: disable=too-many-locals - if 'fore_constants' in self.inputs: + if "fore_constants" in self.inputs: force_constants = self.inputs.force_constants else: force_constants = None - if 'fore_constants' in self.inputs: + if "fore_constants" in self.inputs: force_sets = self.inputs.force_sets else: force_sets = None @@ -160,33 +164,34 @@ def prepare_extra_files(self, tempfolder, potential_object): cell_txt = get_poscar_txt(self.inputs.structure) cell_filename = tempfolder(self._POSCAR_NAME) - with open(cell_filename, 'w') as infile: + with open(cell_filename, "w") as infile: infile.write(cell_txt) if force_constants is not None: force_constants_txt = get_force_constants(force_constants) force_constants_filename = tempfolder.get_abs_path( - self._INPUT_FORCE_CONSTANTS) - with open(force_constants_filename, 'w') as infile: + self._INPUT_FORCE_CONSTANTS + ) + with open(force_constants_filename, "w") as infile: infile.write(force_constants_txt) elif force_sets is not None: force_sets_txt = get_FORCE_SETS_txt(force_sets) - force_sets_filename = tempfolder.get_abs_path( - self._INPUT_FORCE_SETS) - with open(force_sets_filename, 'w') as infile: + force_sets_filename = tempfolder.get_abs_path(self._INPUT_FORCE_SETS) + with open(force_sets_filename, "w") as infile: infile.write(force_sets_txt) else: raise InputValidationError( - 'no force_sets nor force_constants are specified for this calculation' + "no force_sets nor force_constants are specified for this calculation" ) try: parameters_data_dynaphopy = orm.Dict.pop( # pylint: disable=no-member - self.get_linkname('parameters_dynaphopy')) + self.get_linkname("parameters_dynaphopy") + ) except KeyError as key_error: raise InputValidationError( - 'No dynaphopy parameters specified for this calculation' + "No dynaphopy parameters specified for this calculation" ) from key_error parameters_dynaphopy_txt = generate_dynaphopy_input( @@ -197,9 +202,8 @@ def prepare_extra_files(self, tempfolder, potential_object): use_sets=force_sets is not None, ) - dynaphopy_filename = tempfolder.get_abs_path( - self._INPUT_FILE_NAME_DYNA) - with open(dynaphopy_filename, 'w') as infile: + dynaphopy_filename = tempfolder.get_abs_path(self._INPUT_FILE_NAME_DYNA) + with open(dynaphopy_filename, "w") as infile: infile.write(parameters_dynaphopy_txt) md_supercell = parameters_data_dynaphopy.dict.md_supercell @@ -210,28 +214,28 @@ def prepare_extra_files(self, tempfolder, potential_object): self._cmdline_params = [ self._INPUT_FILE_NAME_DYNA, - '--run_lammps', + "--run_lammps", self._INPUT_FILE_NAME, - f'{total_time}', - f'{time_step}', - f'{equilibrium_time}', - '--dim', - f'{md_supercell[0]}', - f'{md_supercell[1]}', - f'{md_supercell[2]}', - '--silent', - '-sfc', + f"{total_time}", + f"{time_step}", + f"{equilibrium_time}", + "--dim", + f"{md_supercell[0]}", + f"{md_supercell[1]}", + f"{md_supercell[2]}", + "--silent", + "-sfc", self._OUTPUT_FORCE_CONSTANTS, - '-thm', # '--resolution 0.01', - '-psm', - '2', - '--normalize_dos', - '-sdata', - '--velocity_only', - '--temperature', - '{}'.format(self._parameters_data.dict.temperature), + "-thm", # '--resolution 0.01', + "-psm", + "2", + "--normalize_dos", + "-sdata", + "--velocity_only", + "--temperature", + "{}".format(self._parameters_data.dict.temperature), ] - if 'md_commensurate' in parameters_data_dynaphopy.get_dict(): + if "md_commensurate" in parameters_data_dynaphopy.get_dict(): if parameters_data_dynaphopy.dict.md_commensurate: - self._cmdline_params.append('--MD_commensurate') + self._cmdline_params.append("--MD_commensurate") diff --git a/aiida_lammps/calculations/lammps/force.py b/aiida_lammps/calculations/lammps/force.py index 3dffbb3..20fe55d 100644 --- a/aiida_lammps/calculations/lammps/force.py +++ b/aiida_lammps/calculations/lammps/force.py @@ -8,23 +8,23 @@ class ForceCalculation(BaseLammpsCalculation): - """Calculation of a single point in LAMMPS, to obtain the energy of the system. - """ + """Calculation of a single point in LAMMPS, to obtain the energy of the system.""" + @classmethod def define(cls, spec): super(ForceCalculation, cls).define(spec) spec.input( - 'metadata.options.parser_name', + "metadata.options.parser_name", valid_type=str, - default='lammps.force', + default="lammps.force", ) spec.output( - 'arrays', - valid_type=DataFactory('array'), + "arrays", + valid_type=DataFactory("array"), required=True, - help='force data per atom', + help="force data per atom", ) @staticmethod @@ -39,58 +39,61 @@ def create_main_input_content( ): # pylint: disable=too-many-arguments, too-many-locals version_date = convert_date_string( - parameter_data.get_attribute('lammps_version', '11 Aug 2017')) + parameter_data.get_attribute("lammps_version", "11 Aug 2017") + ) - lammps_input_file = f'units {potential_data.default_units}\n' - lammps_input_file += 'boundary p p p\n' - lammps_input_file += 'box tilt large\n' - lammps_input_file += f'atom_style {potential_data.atom_style}\n' + lammps_input_file = f"units {potential_data.default_units}\n" + lammps_input_file += "boundary p p p\n" + lammps_input_file += "box tilt large\n" + lammps_input_file += f"atom_style {potential_data.atom_style}\n" - lammps_input_file += f'read_data {structure_filename}\n' + lammps_input_file += f"read_data {structure_filename}\n" lammps_input_file += potential_data.get_input_lines(kind_symbols) - lammps_input_file += 'neighbor 0.3 bin\n' - lammps_input_file += 'neigh_modify every 1 delay 0 check no\n' + lammps_input_file += "neighbor 0.3 bin\n" + lammps_input_file += "neigh_modify every 1 delay 0 check no\n" - thermo_keywords = ['step', 'temp', 'epair', 'emol', 'etotal', 'press'] - for kwd in parameter_data.get_attribute('thermo_keywords', []): + thermo_keywords = ["step", "temp", "epair", "emol", "etotal", "press"] + for kwd in parameter_data.get_attribute("thermo_keywords", []): if kwd not in thermo_keywords: thermo_keywords.append(kwd) lammps_input_file += f'thermo_style custom {" ".join(thermo_keywords)}\n' - if potential_data.atom_style == 'charge': - dump_variables = 'element x y z fx fy fz q' + if potential_data.atom_style == "charge": + dump_variables = "element x y z fx fy fz q" dump_format = ( - '%4s %16.10f %16.10f %16.10f %16.10f %16.10f %16.10f %16.10f' + "%4s %16.10f %16.10f %16.10f %16.10f %16.10f %16.10f %16.10f" ) else: - dump_variables = 'element x y z fx fy fz' - dump_format = '%4s %16.10f %16.10f %16.10f %16.10f %16.10f %16.10f' + dump_variables = "element x y z fx fy fz" + dump_format = "%4s %16.10f %16.10f %16.10f %16.10f %16.10f %16.10f" - lammps_input_file += 'dump aiida all custom 1' - lammps_input_file += f' {trajectory_filename} {dump_variables}\n' + lammps_input_file += "dump aiida all custom 1" + lammps_input_file += f" {trajectory_filename} {dump_variables}\n" # TODO find exact version when changes were made - if version_date <= convert_date_string('10 Feb 2015'): - dump_mod_cmnd = 'format' + if version_date <= convert_date_string("10 Feb 2015"): + dump_mod_cmnd = "format" else: - dump_mod_cmnd = 'format line' + dump_mod_cmnd = "format line" lammps_input_file += f'dump_modify aiida {dump_mod_cmnd} "{dump_format}"\n' - lammps_input_file += 'dump_modify aiida sort id\n' + lammps_input_file += "dump_modify aiida sort id\n" lammps_input_file += f'dump_modify aiida element {" ".join(kind_symbols)}\n' - lammps_input_file += 'run 0\n' + lammps_input_file += "run 0\n" - variables = parameter_data.get_attribute('output_variables', []) + variables = parameter_data.get_attribute("output_variables", []) for var in variables: - var_alias = var.replace('[', '_').replace(']', '_') - lammps_input_file += f'variable {var_alias} equal {var}\n' - lammps_input_file += f'print "final_variable: {var_alias} = ${{{var_alias}}}"\n' + var_alias = var.replace("[", "_").replace("]", "_") + lammps_input_file += f"variable {var_alias} equal {var}\n" + lammps_input_file += ( + f'print "final_variable: {var_alias} = ${{{var_alias}}}"\n' + ) - lammps_input_file += 'variable final_energy equal etotal\n' + lammps_input_file += "variable final_energy equal etotal\n" lammps_input_file += 'print "final_energy: ${final_energy}"\n' lammps_input_file += 'print "END_OF_COMP"\n' @@ -105,7 +108,7 @@ def validate_parameters(param_data, potential_object): :type param_data: orm.Dict """ if param_data is not None: - validate_against_schema(param_data.get_dict(), 'force.schema.json') + validate_against_schema(param_data.get_dict(), "force.schema.json") def get_retrieve_lists(self): """Get list of files to be retrieved when the calculation is done. diff --git a/aiida_lammps/calculations/lammps/md.py b/aiida_lammps/calculations/lammps/md.py index 632d467..01d4ebf 100644 --- a/aiida_lammps/calculations/lammps/md.py +++ b/aiida_lammps/calculations/lammps/md.py @@ -1,8 +1,8 @@ """Single stage MD calculation in LAMMPS.""" # pylint: disable=fixme, useless-super-delegation, duplicate-code -import numpy as np from aiida.common.exceptions import InputValidationError from aiida.plugins import DataFactory +import numpy as np from aiida_lammps.calculations.lammps import BaseLammpsCalculation from aiida_lammps.common.utils import convert_date_string, get_path, join_keywords @@ -11,28 +11,29 @@ class MdCalculation(BaseLammpsCalculation): """Calculation of a single MD stage in LAMMPS.""" + @classmethod def define(cls, spec): super(MdCalculation, cls).define(spec) spec.input( - 'metadata.options.parser_name', + "metadata.options.parser_name", valid_type=str, - default='lammps.md', + default="lammps.md", ) - spec.default_output_port = 'results' + spec.default_output_port = "results" spec.output( - 'trajectory_data', - valid_type=DataFactory('lammps.trajectory'), + "trajectory_data", + valid_type=DataFactory("lammps.trajectory"), required=True, - help='atomic configuration data per dump step', + help="atomic configuration data per dump step", ) spec.output( - 'system_data', - valid_type=DataFactory('array'), + "system_data", + valid_type=DataFactory("array"), required=False, - help='selected system data per dump step', + help="selected system data per dump step", ) @staticmethod @@ -47,119 +48,130 @@ def create_main_input_content( ): # pylint: disable=too-many-locals, too-many-arguments¸ too-many-branches, too-many-statements, duplicate-code pdict = parameter_data.get_dict() - version_date = convert_date_string( - pdict.get('lammps_version', '11 Aug 2017')) + version_date = convert_date_string(pdict.get("lammps_version", "11 Aug 2017")) # Geometry Setup - lammps_input_file = f'units {potential_data.default_units}\n' - lammps_input_file += 'boundary p p p\n' - lammps_input_file += 'box tilt large\n' - lammps_input_file += f'atom_style {potential_data.atom_style}\n' - lammps_input_file += f'read_data {structure_filename}\n' + lammps_input_file = f"units {potential_data.default_units}\n" + lammps_input_file += "boundary p p p\n" + lammps_input_file += "box tilt large\n" + lammps_input_file += f"atom_style {potential_data.atom_style}\n" + lammps_input_file += f"read_data {structure_filename}\n" # Potential Specification lammps_input_file += potential_data.get_input_lines(kind_symbols) # Pairwise neighbour list creation - if 'neighbor' in pdict: + if "neighbor" in pdict: # neighbor skin_dist bin/nsq/multi - lammps_input_file += f'neighbor {pdict["neighbor"][0]} {pdict["neighbor"][1]}\n' - if 'neigh_modify' in pdict: + lammps_input_file += ( + f'neighbor {pdict["neighbor"][0]} {pdict["neighbor"][1]}\n' + ) + if "neigh_modify" in pdict: # e.g. 'neigh_modify every 1 delay 0 check no\n' - lammps_input_file += f'neigh_modify {join_keywords(pdict["neigh_modify"])}\n' + lammps_input_file += ( + f'neigh_modify {join_keywords(pdict["neigh_modify"])}\n' + ) # Define Timestep lammps_input_file += f'timestep {pdict["timestep"]}\n' # Define computation/printing of thermodynamic info - thermo_keywords = ['step', 'temp', 'epair', 'emol', 'etotal', 'press'] - for kwd in pdict.get('thermo_keywords', []): + thermo_keywords = ["step", "temp", "epair", "emol", "etotal", "press"] + for kwd in pdict.get("thermo_keywords", []): if kwd not in thermo_keywords: thermo_keywords.append(kwd) lammps_input_file += f'thermo_style custom {" ".join(thermo_keywords)}\n' - lammps_input_file += 'thermo 1000\n' + lammps_input_file += "thermo 1000\n" # Define output of restart file - restart = pdict.get('restart', False) + restart = pdict.get("restart", False) if restart: - lammps_input_file += f'restart {restart} {restart_filename}\n' + lammps_input_file += f"restart {restart} {restart_filename}\n" # Set the initial velocities of atoms, if a temperature is set initial_temp, _, _ = get_path( pdict, - ['integration', 'constraints', 'temp'], + ["integration", "constraints", "temp"], default=[None, None, None], raise_error=False, ) if initial_temp is not None: - lammps_input_file += f'velocity all create {initial_temp} ' - lammps_input_file += f'{pdict.get("rand_seed", np.random.randint(10000000))} ' - lammps_input_file += 'dist gaussian mom yes\n' - lammps_input_file += f'velocity all scale {initial_temp}\n' + lammps_input_file += f"velocity all create {initial_temp} " + lammps_input_file += ( + f'{pdict.get("rand_seed", np.random.randint(10000000))} ' + ) + lammps_input_file += "dist gaussian mom yes\n" + lammps_input_file += f"velocity all scale {initial_temp}\n" # Define Equilibration Stage - lammps_input_file += 'fix int all ' + lammps_input_file += "fix int all " lammps_input_file += f'{get_path(pdict, ["integration", "style"])} ' _temp = join_keywords( get_path( pdict, - ['integration', 'constraints'], + ["integration", "constraints"], {}, raise_error=False, - )) - lammps_input_file += f'{_temp} ' + ) + ) + lammps_input_file += f"{_temp} " _temp = join_keywords( get_path( pdict, - ['integration', 'keywords'], + ["integration", "keywords"], {}, raise_error=False, - )) - lammps_input_file += f'{_temp}\n' + ) + ) + lammps_input_file += f"{_temp}\n" - lammps_input_file += f'run {parameter_data.dict.equilibrium_steps}\n' - lammps_input_file += 'reset_timestep 0\n' + lammps_input_file += ( + f"run {parameter_data.dict.equilibrium_steps}\n" + ) + lammps_input_file += "reset_timestep 0\n" - if potential_data.atom_style == 'charge': - dump_variables = 'element x y z q' - dump_format = '%4s %16.10f %16.10f %16.10f %16.10f' + if potential_data.atom_style == "charge": + dump_variables = "element x y z q" + dump_format = "%4s %16.10f %16.10f %16.10f %16.10f" else: - dump_variables = 'element x y z' - dump_format = '%4s %16.10f %16.10f %16.10f' + dump_variables = "element x y z" + dump_format = "%4s %16.10f %16.10f %16.10f" - lammps_input_file += 'dump aiida all custom ' - lammps_input_file += f'{parameter_data.dict.dump_rate} ' - lammps_input_file += f'{trajectory_filename} {dump_variables}\n' + lammps_input_file += "dump aiida all custom " + lammps_input_file += f"{parameter_data.dict.dump_rate} " + lammps_input_file += f"{trajectory_filename} {dump_variables}\n" # TODO find exact version when changes were made - if version_date <= convert_date_string('10 Feb 2015'): - dump_mod_cmnd = 'format' + if version_date <= convert_date_string("10 Feb 2015"): + dump_mod_cmnd = "format" else: - dump_mod_cmnd = 'format line' + dump_mod_cmnd = "format line" lammps_input_file += f'dump_modify aiida {dump_mod_cmnd} "{dump_format}"\n' - lammps_input_file += 'dump_modify aiida sort id\n' + lammps_input_file += "dump_modify aiida sort id\n" lammps_input_file += f'dump_modify aiida element {" ".join(kind_symbols)}\n' - variables = pdict.get('output_variables', []) - if variables and 'step' not in variables: + variables = pdict.get("output_variables", []) + if variables and "step" not in variables: # always include 'step', so we can sync with the `dump` data # NOTE `dump` includes step 0, whereas `print` starts from step 1 - variables.append('step') + variables.append("step") var_aliases = [] for var in variables: - var_alias = var.replace('[', '_').replace(']', '_') + var_alias = var.replace("[", "_").replace("]", "_") var_aliases.append(var_alias) - lammps_input_file += f'variable {var_alias} equal {var}\n' + lammps_input_file += f"variable {var_alias} equal {var}\n" if variables: - lammps_input_file += 'fix sys_info all print' - lammps_input_file += f' {parameter_data.dict.dump_rate}' - lammps_input_file += f' "{" ".join(["${{{0}}}".format(v) for v in var_aliases])}"' + lammps_input_file += "fix sys_info all print" + lammps_input_file += f" {parameter_data.dict.dump_rate}" + lammps_input_file += ( + f' "{" ".join(["${{{0}}}".format(v) for v in var_aliases])}"' + ) lammps_input_file += f' title "{" ".join(var_aliases)}"' - lammps_input_file += f' file {system_filename} screen no\n' + lammps_input_file += f" file {system_filename} screen no\n" - lammps_input_file += f'run {parameter_data.dict.total_steps}\n' + lammps_input_file += f"run {parameter_data.dict.total_steps}\n" - lammps_input_file += 'variable final_energy equal etotal\n' + lammps_input_file += "variable final_energy equal etotal\n" lammps_input_file += 'print "final_energy: ${final_energy}"\n' lammps_input_file += 'print "END_OF_COMP"\n' @@ -169,16 +181,17 @@ def create_main_input_content( @staticmethod def validate_parameters(param_data, potential_object): if param_data is None: - raise InputValidationError('parameter data not set') - validate_against_schema(param_data.get_dict(), 'md.schema.json') + raise InputValidationError("parameter data not set") + validate_against_schema(param_data.get_dict(), "md.schema.json") # ensure the potential and paramters are in the same unit systems # TODO convert between unit systems (e.g. using https://pint.readthedocs.io) - punits = param_data.get_dict()['units'] + punits = param_data.get_dict()["units"] if not punits == potential_object.default_units: raise InputValidationError( - f'the units of the parameters ({punits}) and potential ' - f'({potential_object.default_units}) are different') + f"the units of the parameters ({punits}) and potential " + f"({potential_object.default_units}) are different" + ) return True diff --git a/aiida_lammps/calculations/lammps/md_multi.py b/aiida_lammps/calculations/lammps/md_multi.py index 80c4419..c33e2c5 100644 --- a/aiida_lammps/calculations/lammps/md_multi.py +++ b/aiida_lammps/calculations/lammps/md_multi.py @@ -10,29 +10,30 @@ class MdMultiCalculation(BaseLammpsCalculation): """Run a multi-stage molecular dynamic simulation.""" + @classmethod def define(cls, spec): super(MdMultiCalculation, cls).define(spec) spec.input( - 'metadata.options.parser_name', + "metadata.options.parser_name", valid_type=str, - default='lammps.md.multi', + default="lammps.md.multi", ) - spec.default_output_port = 'results' + spec.default_output_port = "results" spec.output_namespace( - 'system', + "system", dynamic=True, - valid_type=DataFactory('array'), - help='selected system data per dump step of a stage', + valid_type=DataFactory("array"), + help="selected system data per dump step of a stage", ) spec.output_namespace( - 'trajectory', + "trajectory", dynamic=True, - valid_type=DataFactory('lammps.trajectory'), - help='atomic configuration data per dump step of a stage', + valid_type=DataFactory("lammps.trajectory"), + help="atomic configuration data per dump step of a stage", ) @staticmethod @@ -48,48 +49,51 @@ def create_main_input_content( # pylint: disable=too-many-arguments, too-many-locals, too-many-branches, too-many-statements pdict = parameter_data.get_dict() - version_date = convert_date_string( - pdict.get('lammps_version', '11 Aug 2017')) - lammps_input_file = '' + version_date = convert_date_string(pdict.get("lammps_version", "11 Aug 2017")) + lammps_input_file = "" - lammps_input_file += f'# Input written to comply with LAMMPS {version_date}\n' + lammps_input_file += f"# Input written to comply with LAMMPS {version_date}\n" # Configuration setup - lammps_input_file += '\n# Atomic Configuration\n' - lammps_input_file += f'units {potential_data.default_units}\n' - lammps_input_file += 'boundary p p p\n' # TODO allow non-periodic - lammps_input_file += 'box tilt large\n' - lammps_input_file += f'atom_style {potential_data.atom_style}\n' - lammps_input_file += f'read_data {structure_filename}\n' + lammps_input_file += "\n# Atomic Configuration\n" + lammps_input_file += f"units {potential_data.default_units}\n" + lammps_input_file += "boundary p p p\n" # TODO allow non-periodic + lammps_input_file += "box tilt large\n" + lammps_input_file += f"atom_style {potential_data.atom_style}\n" + lammps_input_file += f"read_data {structure_filename}\n" # Potential specification - lammps_input_file += '\n# Potential Setup\n' + lammps_input_file += "\n# Potential Setup\n" lammps_input_file += potential_data.get_input_lines(kind_symbols) # Modify pairwise neighbour list creation - lammps_input_file += '\n# General Setup\n' - if 'neighbor' in pdict: + lammps_input_file += "\n# General Setup\n" + if "neighbor" in pdict: # neighbor skin_dist bin/nsq/multi - lammps_input_file += f'neighbor {pdict["neighbor"][0]} {pdict["neighbor"][1]}\n' - if 'neigh_modify' in pdict: + lammps_input_file += ( + f'neighbor {pdict["neighbor"][0]} {pdict["neighbor"][1]}\n' + ) + if "neigh_modify" in pdict: # e.g. 'neigh_modify every 1 delay 0 check no\n' - lammps_input_file += f'neigh_modify {join_keywords(pdict["neigh_modify"])}\n' + lammps_input_file += ( + f'neigh_modify {join_keywords(pdict["neigh_modify"])}\n' + ) # Define Timestep lammps_input_file += f'timestep {pdict["timestep"]}\n' # Define computation/printing of thermodynamic info - lammps_input_file += '\n# Thermodynamic Information Output\n' - thermo_keywords = ['step', 'temp', 'epair', 'emol', 'etotal', 'press'] - for kwd in pdict.get('thermo_keywords', []): + lammps_input_file += "\n# Thermodynamic Information Output\n" + thermo_keywords = ["step", "temp", "epair", "emol", "etotal", "press"] + for kwd in pdict.get("thermo_keywords", []): if kwd not in thermo_keywords: thermo_keywords.append(kwd) lammps_input_file += f'thermo_style custom {" ".join(thermo_keywords)}\n' - lammps_input_file += 'thermo 1000\n' # TODO make variable? + lammps_input_file += "thermo 1000\n" # TODO make variable? # Setup initial velocities of atoms - if 'velocity' in pdict: - lammps_input_file += '\n# Intial Atom Velocity\n' - for vdict in pdict.get('velocity', []): + if "velocity" in pdict: + lammps_input_file += "\n# Intial Atom Velocity\n" + for vdict in pdict.get("velocity", []): lammps_input_file += f'velocity all {vdict["style"]} ' lammps_input_file += f'{" ".join([str(a) for a in vdict["args"]])} ' lammps_input_file += f'{join_keywords(vdict.get("keywords", {}))}\n' @@ -99,96 +103,97 @@ def create_main_input_content( current_dumps = [] current_computes = [] - for stage_id, stage_dict in enumerate(pdict.get('stages')): + for stage_id, stage_dict in enumerate(pdict.get("stages")): - stage_name = stage_dict.get('name') + stage_name = stage_dict.get("name") if stage_name in stage_names: - raise ValueError(f'non-unique stage name: {stage_name}') + raise ValueError(f"non-unique stage name: {stage_name}") stage_names.append(stage_name) - lammps_input_file += f'\n# Stage {stage_id}: {stage_name}\n' + lammps_input_file += f"\n# Stage {stage_id}: {stage_name}\n" # clear timestep # lammps_input_file += "reset_timestep 0\n" # Clear fixes, dumps and computes for fix in current_fixes: - lammps_input_file += f'unfix {fix}\n' + lammps_input_file += f"unfix {fix}\n" current_fixes = [] for dump in current_dumps: - lammps_input_file += f'undump {dump}\n' + lammps_input_file += f"undump {dump}\n" current_dumps = [] for compute in current_computes: - lammps_input_file += f'uncompute {compute}\n' + lammps_input_file += f"uncompute {compute}\n" current_computes = [] # Define Computes - for compute in stage_dict.get('computes', []): - c_id = compute['id'] - c_style = compute['style'] - c_args = ' '.join([str(a) for a in compute.get('args', [])]) - lammps_input_file += f'compute {c_id} all {c_style} {c_args}\n' + for compute in stage_dict.get("computes", []): + c_id = compute["id"] + c_style = compute["style"] + c_args = " ".join([str(a) for a in compute.get("args", [])]) + lammps_input_file += f"compute {c_id} all {c_style} {c_args}\n" current_computes.append(c_id) # Define Atom Level Outputs - output_atom_dict = stage_dict.get('output_atom', {}) - if output_atom_dict.get('dump_rate', 0): + output_atom_dict = stage_dict.get("output_atom", {}) + if output_atom_dict.get("dump_rate", 0): atom_dump_cmnds, acomputes, afixes = atom_info_commands( - variables=output_atom_dict.get('variables', []), - ave_variables=output_atom_dict.get('ave_variables', []), + variables=output_atom_dict.get("variables", []), + ave_variables=output_atom_dict.get("ave_variables", []), kind_symbols=kind_symbols, atom_style=potential_data.atom_style, - dump_rate=output_atom_dict.get('dump_rate', 0), - average_rate=output_atom_dict.get('average_rate', 1), - filename='{}-{}'.format(stage_name, trajectory_filename), + dump_rate=output_atom_dict.get("dump_rate", 0), + average_rate=output_atom_dict.get("average_rate", 1), + filename="{}-{}".format(stage_name, trajectory_filename), version_date=version_date, - dump_name='atom_info', + dump_name="atom_info", ) if atom_dump_cmnds: - lammps_input_file += '\n'.join(atom_dump_cmnds) + '\n' - current_dumps.append('atom_info') + lammps_input_file += "\n".join(atom_dump_cmnds) + "\n" + current_dumps.append("atom_info") current_computes.extend(acomputes) current_fixes.extend(afixes) # Define System Level Outputs - output_sys_dict = stage_dict.get('output_system', {}) - if output_sys_dict.get('dump_rate', 0): + output_sys_dict = stage_dict.get("output_system", {}) + if output_sys_dict.get("dump_rate", 0): sys_info_cmnds = sys_ave_commands( - variables=output_sys_dict.get('variables', []), - ave_variables=output_sys_dict.get('ave_variables', []), - dump_rate=output_sys_dict.get('dump_rate', 0), - filename='{}-{}'.format(stage_name, system_filename), - fix_name='sys_info', - average_rate=output_sys_dict.get('average_rate', 1), + variables=output_sys_dict.get("variables", []), + ave_variables=output_sys_dict.get("ave_variables", []), + dump_rate=output_sys_dict.get("dump_rate", 0), + filename="{}-{}".format(stage_name, system_filename), + fix_name="sys_info", + average_rate=output_sys_dict.get("average_rate", 1), ) if sys_info_cmnds: - lammps_input_file += '\n'.join(sys_info_cmnds) + '\n' - current_fixes.append('sys_info') + lammps_input_file += "\n".join(sys_info_cmnds) + "\n" + current_fixes.append("sys_info") # Define restart - if stage_dict.get('restart_rate', 0): - lammps_input_file += 'restart ' + if stage_dict.get("restart_rate", 0): + lammps_input_file += "restart " lammps_input_file += f'{stage_dict.get("restart_rate", 0)} ' lammps_input_file += f'{"{}-{}".format(stage_name, restart_filename)}\n' else: - lammps_input_file += 'restart 0\n' + lammps_input_file += "restart 0\n" # Define time integration method - lammps_input_file += 'fix int all ' + lammps_input_file += "fix int all " lammps_input_file += f'{get_path(stage_dict, ["integration", "style"])} ' _temp = join_keywords( get_path( stage_dict, - ['integration', 'constraints'], + ["integration", "constraints"], {}, raise_error=False, - )) - lammps_input_file += f'{_temp} ' + ) + ) + lammps_input_file += f"{_temp} " _temp = join_keywords( - get_path(stage_dict, ['integration', 'keywords'], {}, - raise_error=False)) - lammps_input_file += f'{_temp}\n' - current_fixes.append('int') + get_path(stage_dict, ["integration", "keywords"], {}, raise_error=False) + ) + lammps_input_file += f"{_temp}\n" + current_fixes.append("int") # Run lammps_input_file += f'run {stage_dict.get("steps", 0)}\n' @@ -196,19 +201,20 @@ def create_main_input_content( # check compute/fix/dump ids are unique if len(current_computes) != len(set(current_computes)): raise ValueError( - f'Stage {stage_name}: Non-unique compute ids; {current_computes}' + f"Stage {stage_name}: Non-unique compute ids; {current_computes}" ) if len(current_fixes) != len(set(current_fixes)): raise ValueError( - f'Stage {stage_name}: Non-unique fix ids; {current_fixes}') + f"Stage {stage_name}: Non-unique fix ids; {current_fixes}" + ) if len(current_dumps) != len(set(current_dumps)): raise ValueError( - f'Stage {stage_name}: Non-unique dump ids; {current_dumps}' + f"Stage {stage_name}: Non-unique dump ids; {current_dumps}" ) - lammps_input_file += '\n# Final Commands\n' + lammps_input_file += "\n# Final Commands\n" # output final energy - lammps_input_file += 'variable final_energy equal etotal\n' + lammps_input_file += "variable final_energy equal etotal\n" lammps_input_file += 'print "final_energy: ${final_energy}"\n' lammps_input_file += 'print "END_OF_COMP"\n' @@ -218,16 +224,17 @@ def create_main_input_content( @staticmethod def validate_parameters(param_data, potential_object): if param_data is None: - raise InputValidationError('parameter data not set') - validate_against_schema(param_data.get_dict(), 'md-multi.schema.json') + raise InputValidationError("parameter data not set") + validate_against_schema(param_data.get_dict(), "md-multi.schema.json") # ensure the potential and parameters are in the same unit systems # TODO convert between unit systems (e.g. using https://pint.readthedocs.io) - punits = param_data.get_dict()['units'] + punits = param_data.get_dict()["units"] if not punits == potential_object.default_units: raise InputValidationError( - f'the units of the parameters ({punits}) and potential ' - f'({potential_object.default_units}) are different') + f"the units of the parameters ({punits}) and potential " + f"({potential_object.default_units}) are different" + ) return True @@ -235,9 +242,9 @@ def get_retrieve_lists(self): return ( [], [ - '*-' + self.options.trajectory_suffix, - '*-' + self.options.system_suffix, - '*-' + self.options.restart_filename + '.*', + "*-" + self.options.trajectory_suffix, + "*-" + self.options.system_suffix, + "*-" + self.options.restart_filename + ".*", ], ) @@ -246,7 +253,7 @@ def sys_print_commands( variables, dump_rate, filename, - fix_name: str = 'sys_info', + fix_name: str = "sys_info", append: bool = True, print_header: bool = True, ): @@ -257,24 +264,26 @@ def sys_print_commands( if not variables: return commands - if 'step' not in variables: + if "step" not in variables: # always include 'step', so we can sync with the `dump` data - variables.insert(0, 'step') + variables.insert(0, "step") var_aliases = [] for var in variables: - var_alias = var.replace('[', '_').replace(']', '_') + var_alias = var.replace("[", "_").replace("]", "_") var_aliases.append(var_alias) - commands.append(f'variable {var_alias} equal {var}') + commands.append(f"variable {var_alias} equal {var}") - commands.append('fix {0} all print {1} "{2}" {3} {4} {5} screen no'.format( - fix_name, - dump_rate, - ' '.join(['${{{0}}}'.format(v) for v in var_aliases]), - 'title "{}"'.format(' '.join(var_aliases)) if print_header else '', - 'append' if append else 'file', - filename, - )) + commands.append( + 'fix {0} all print {1} "{2}" {3} {4} {5} screen no'.format( + fix_name, + dump_rate, + " ".join(["${{{0}}}".format(v) for v in var_aliases]), + 'title "{}"'.format(" ".join(var_aliases)) if print_header else "", + "append" if append else "file", + filename, + ) + ) return commands @@ -284,7 +293,7 @@ def sys_ave_commands( ave_variables, dump_rate, filename, - fix_name: str = 'sys_info', + fix_name: str = "sys_info", average_rate: bool = None, ): """Create commands to output required system variables to a file.""" @@ -297,14 +306,15 @@ def sys_ave_commands( if set(variables).intersection(ave_variables): raise ValueError( 'variables cannot be in both "variables" and "ave_variables": ' - f'{set(variables).intersection(ave_variables)}') + f"{set(variables).intersection(ave_variables)}" + ) # Note step is included, by default, as the first arg var_aliases = [] for var in variables + ave_variables: - var_alias = var.replace('[', '_').replace(']', '_') + var_alias = var.replace("[", "_").replace("]", "_") var_aliases.append(var_alias) - commands.append(f'variable {var_alias} equal {var}') + commands.append(f"variable {var_alias} equal {var}") if not ave_variables: nevery = dump_rate @@ -312,28 +322,28 @@ def sys_ave_commands( else: if dump_rate % average_rate != 0 or average_rate > dump_rate: raise ValueError( - f'The dump rate ({dump_rate}) must be a multiple of the ' - f'average_rate ({average_rate})') + f"The dump rate ({dump_rate}) must be a multiple of the " + f"average_rate ({average_rate})" + ) nevery = average_rate nrep = int(dump_rate / average_rate) - commands.append("""fix {fid} all ave/time {nevery} {nrepeat} {nfreq} & + commands.append( + """fix {fid} all ave/time {nevery} {nrepeat} {nfreq} & {variables} & {non_ave} & title1 "step {header}" & file {filename}""".format( - fid=fix_name, - nevery=nevery, # compute variables every n steps - nfreq= - dump_rate, # nfreq is the dump rate and must be a multiple of nevery - nrepeat= - nrep, # average is over nrepeat quantities, nrepeat*nevery <= nfreq - variables=' '.join(['v_{0}'.format(v) for v in var_aliases]), - non_ave=' '.join( - ['off {0}'.format(i + 1) for i in range(len(variables))]), - header=' '.join(var_aliases), - filename=filename, - )) + fid=fix_name, + nevery=nevery, # compute variables every n steps + nfreq=dump_rate, # nfreq is the dump rate and must be a multiple of nevery + nrepeat=nrep, # average is over nrepeat quantities, nrepeat*nevery <= nfreq + variables=" ".join(["v_{0}".format(v) for v in var_aliases]), + non_ave=" ".join(["off {0}".format(i + 1) for i in range(len(variables))]), + header=" ".join(var_aliases), + filename=filename, + ) + ) return commands @@ -347,7 +357,7 @@ def atom_info_commands( average_rate, filename, version_date, - dump_name: str = 'atom_info', + dump_name: str = "atom_info", append: bool = True, ): """Create commands to output required atom variables to a file. @@ -366,10 +376,10 @@ def atom_info_commands( # pylint: disable=too-many-arguments, too-many-locals, too-many-branches, unused-argument commands, computes, fixes = [], [], [] - if atom_style == 'charge': - dump_variables = 'element x y z q'.split() + if atom_style == "charge": + dump_variables = "element x y z q".split() else: - dump_variables = 'element x y z'.split() + dump_variables = "element x y z".split() for variable in variables: if variable not in dump_variables: @@ -378,67 +388,70 @@ def atom_info_commands( if ave_variables: if dump_rate % average_rate != 0 or average_rate > dump_rate: raise ValueError( - f'The dump rate ({dump_rate}) must be a multiple of ' - f'the average_rate ({average_rate})') + f"The dump rate ({dump_rate}) must be a multiple of " + f"the average_rate ({average_rate})" + ) nevery = average_rate nrep = int(dump_rate / average_rate) # work out which variables need to be computed avar_props = [ - v for v in ave_variables - if not any([v.startswith(s) for s in ['c_', 'f_', 'v_']]) + v + for v in ave_variables + if not any([v.startswith(s) for s in ["c_", "f_", "v_"]]) ] avar_names = [] c_at_vars = 1 for ave_var in ave_variables: - if any([ave_var.startswith(s) for s in ['c_', 'f_', 'v_']]): + if any([ave_var.startswith(s) for s in ["c_", "f_", "v_"]]): avar_names.append(ave_var) else: if len(avar_props) > 1: - avar_names.append(f'c_at_vars[{c_at_vars}]') + avar_names.append(f"c_at_vars[{c_at_vars}]") c_at_vars += 1 else: - avar_names.append('c_at_vars') + avar_names.append("c_at_vars") # compute required variables if avar_props: - commands.append( - f'compute at_vars all property/atom {" ".join(avar_props)}') - computes.append('at_vars') + commands.append(f'compute at_vars all property/atom {" ".join(avar_props)}') + computes.append("at_vars") # compute means for variables commands.append( - 'fix at_means all ave/atom {nevery} {nrepeat} {nfreq} {variables}'. - format( + "fix at_means all ave/atom {nevery} {nrepeat} {nfreq} {variables}".format( nevery=nevery, # compute variables every n steps - nfreq= - dump_rate, # nfreq is the dump rate and must be a multiple of nevery - nrepeat= - nrep, # average is over nrepeat quantities, nrepeat*nevery <= nfreq - variables=' '.join(avar_names), - )) - fixes.append('at_means') + nfreq=dump_rate, # nfreq is the dump rate and must be a multiple of nevery + nrepeat=nrep, # average is over nrepeat quantities, nrepeat*nevery <= nfreq + variables=" ".join(avar_names), + ) + ) + fixes.append("at_means") # set the averages as variables, just so the dump names are decipherable for i, ave_var in enumerate(ave_variables): - commands.append('variable ave_{0} atom f_at_means{1}'.format( - ave_var, - '[{}]'.format(i + 1) if len(ave_variables) > 1 else '')) + commands.append( + "variable ave_{0} atom f_at_means{1}".format( + ave_var, "[{}]".format(i + 1) if len(ave_variables) > 1 else "" + ) + ) commands.append( - 'dump {dump_id} all custom {rate} {fname} {variables} {ave_vars}'. - format( + "dump {dump_id} all custom {rate} {fname} {variables} {ave_vars}".format( dump_id=dump_name, rate=dump_rate, fname=filename, - variables=' '.join(dump_variables), - ave_vars=' '.join([f'v_ave_{v}' for v in ave_variables]), - )) + variables=" ".join(dump_variables), + ave_vars=" ".join([f"v_ave_{v}" for v in ave_variables]), + ) + ) if append: - commands.append(f'dump_modify {dump_name} append yes') + commands.append(f"dump_modify {dump_name} append yes") - commands.extend([ - f'dump_modify {dump_name} sort id', - f'dump_modify {dump_name} element {" ".join(kind_symbols)}', - ]) + commands.extend( + [ + f"dump_modify {dump_name} sort id", + f'dump_modify {dump_name} element {" ".join(kind_symbols)}', + ] + ) return commands, computes, fixes diff --git a/aiida_lammps/calculations/lammps/optimize.py b/aiida_lammps/calculations/lammps/optimize.py index ab1ec0a..e2c1be1 100644 --- a/aiida_lammps/calculations/lammps/optimize.py +++ b/aiida_lammps/calculations/lammps/optimize.py @@ -12,27 +12,28 @@ class OptimizeCalculation(BaseLammpsCalculation): """Calculation for the optimization of the structure in LAMMPS.""" + @classmethod def define(cls, spec): super(OptimizeCalculation, cls).define(spec) spec.input( - 'metadata.options.parser_name', + "metadata.options.parser_name", valid_type=str, - default='lammps.optimize', + default="lammps.optimize", ) spec.output( - 'structure', - valid_type=DataFactory('structure'), + "structure", + valid_type=DataFactory("structure"), required=True, - help='the structure output from the calculation', + help="the structure output from the calculation", ) spec.output( - 'trajectory_data', - valid_type=DataFactory('lammps.trajectory'), + "trajectory_data", + valid_type=DataFactory("lammps.trajectory"), required=True, - help='forces, stresses and positions data per step', + help="forces, stresses and positions data per step", ) @staticmethod @@ -49,84 +50,92 @@ def create_main_input_content( parameter_data = parameter_data.get_dict() version_date = convert_date_string( - parameter_data.get('lammps_version', '11 Aug 2017')) + parameter_data.get("lammps_version", "11 Aug 2017") + ) - lammps_input_file = f'units {potential_data.default_units}\n' - lammps_input_file += 'boundary p p p\n' - lammps_input_file += 'box tilt large\n' - lammps_input_file += f'atom_style {potential_data.atom_style}\n' - lammps_input_file += f'read_data {structure_filename}\n' + lammps_input_file = f"units {potential_data.default_units}\n" + lammps_input_file += "boundary p p p\n" + lammps_input_file += "box tilt large\n" + lammps_input_file += f"atom_style {potential_data.atom_style}\n" + lammps_input_file += f"read_data {structure_filename}\n" lammps_input_file += potential_data.get_input_lines(kind_symbols) - lammps_input_file += 'fix int all box/relax' + lammps_input_file += "fix int all box/relax" lammps_input_file += f' {parameter_data["relax"]["type"]}' lammps_input_file += f' {parameter_data["relax"]["pressure"]}' - _temp = join_keywords(parameter_data['relax'], - ignore=['type', 'pressure']) - lammps_input_file += f' {_temp}\n' + _temp = join_keywords(parameter_data["relax"], ignore=["type", "pressure"]) + lammps_input_file += f" {_temp}\n" # TODO find exact version when changes were made - if version_date <= convert_date_string('11 Nov 2013'): - lammps_input_file += 'compute stpa all stress/atom\n' + if version_date <= convert_date_string("11 Nov 2013"): + lammps_input_file += "compute stpa all stress/atom\n" else: - lammps_input_file += 'compute stpa all stress/atom NULL\n' + lammps_input_file += "compute stpa all stress/atom NULL\n" - lammps_input_file += 'compute stgb all reduce sum ' - lammps_input_file += 'c_stpa[1] c_stpa[2] c_stpa[3] c_stpa[4] c_stpa[5] c_stpa[6]\n' + lammps_input_file += "compute stgb all reduce sum " + lammps_input_file += ( + "c_stpa[1] c_stpa[2] c_stpa[3] c_stpa[4] c_stpa[5] c_stpa[6]\n" + ) lammps_input_file += ( - 'variable stress_pr equal -(c_stgb[1]+c_stgb[2]+c_stgb[3])/(3*vol)\n' + "variable stress_pr equal -(c_stgb[1]+c_stgb[2]+c_stgb[3])/(3*vol)\n" ) thermo_keywords = [ - 'step', - 'temp', - 'press', - 'etotal', - 'v_stress_pr', + "step", + "temp", + "press", + "etotal", + "v_stress_pr", ] - for kwd in parameter_data.get('thermo_keywords', []): + for kwd in parameter_data.get("thermo_keywords", []): if kwd not in thermo_keywords: thermo_keywords.append(kwd) lammps_input_file += f'thermo_style custom {" ".join(thermo_keywords)}\n' - if potential_data.atom_style == 'charge': - dump_variables = 'element x y z fx fy fz q' - dump_variables += ' c_stpa[1] c_stpa[2] c_stpa[3] c_stpa[4] c_stpa[5] c_stpa[6]' - dump_format = '%4s ' + ' '.join(['%16.10f'] * 13) + if potential_data.atom_style == "charge": + dump_variables = "element x y z fx fy fz q" + dump_variables += ( + " c_stpa[1] c_stpa[2] c_stpa[3] c_stpa[4] c_stpa[5] c_stpa[6]" + ) + dump_format = "%4s " + " ".join(["%16.10f"] * 13) else: - dump_variables = 'element x y z fx fy fz' - dump_variables += ' c_stpa[1] c_stpa[2] c_stpa[3] c_stpa[4] c_stpa[5] c_stpa[6]' - dump_format = '%4s ' + ' '.join(['%16.10f'] * 12) + dump_variables = "element x y z fx fy fz" + dump_variables += ( + " c_stpa[1] c_stpa[2] c_stpa[3] c_stpa[4] c_stpa[5] c_stpa[6]" + ) + dump_format = "%4s " + " ".join(["%16.10f"] * 12) - lammps_input_file += 'dump aiida all custom 1 ' - lammps_input_file += f'{trajectory_filename} {dump_variables}\n' + lammps_input_file += "dump aiida all custom 1 " + lammps_input_file += f"{trajectory_filename} {dump_variables}\n" # TODO find exact version when changes were made - if version_date <= convert_date_string('10 Feb 2015'): - dump_mod_cmnd = 'format' + if version_date <= convert_date_string("10 Feb 2015"): + dump_mod_cmnd = "format" else: - dump_mod_cmnd = 'format line' + dump_mod_cmnd = "format line" lammps_input_file += f'dump_modify aiida {dump_mod_cmnd} "{dump_format}"\n' - lammps_input_file += 'dump_modify aiida sort id\n' + lammps_input_file += "dump_modify aiida sort id\n" lammps_input_file += f'dump_modify aiida element {" ".join(kind_symbols)}\n' lammps_input_file += f'min_style {parameter_data["minimize"]["style"]}\n' # lammps_input_file += 'min_style cg\n' - lammps_input_file += 'minimize ' + lammps_input_file += "minimize " lammps_input_file += f'{parameter_data["minimize"]["energy_tolerance"]} ' lammps_input_file += f'{parameter_data["minimize"]["force_tolerance"]} ' lammps_input_file += f'{parameter_data["minimize"]["max_iterations"]} ' lammps_input_file += f'{parameter_data["minimize"]["max_evaluations"]}\n' - variables = parameter_data.get('output_variables', []) + variables = parameter_data.get("output_variables", []) for var in variables: - var_alias = var.replace('[', '_').replace(']', '_') - lammps_input_file += f'variable {var_alias} equal {var}\n' - lammps_input_file += f'print "final_variable: {var_alias} = ${{{var_alias}}}"\n' + var_alias = var.replace("[", "_").replace("]", "_") + lammps_input_file += f"variable {var_alias} equal {var}\n" + lammps_input_file += ( + f'print "final_variable: {var_alias} = ${{{var_alias}}}"\n' + ) - lammps_input_file += 'variable final_energy equal etotal\n' + lammps_input_file += "variable final_energy equal etotal\n" lammps_input_file += 'print "final_energy: ${final_energy}"\n' lammps_input_file += 'print "END_OF_COMP"\n' @@ -148,17 +157,18 @@ def validate_parameters(param_data, potential_object) -> bool: :rtype: bool """ if param_data is None: - raise InputValidationError('parameter data not set') - validate_against_schema(param_data.get_dict(), 'optimize.schema.json') + raise InputValidationError("parameter data not set") + validate_against_schema(param_data.get_dict(), "optimize.schema.json") # ensure the potential and paramters are in the same unit systems # TODO convert between unit systems (e.g. using https://pint.readthedocs.io) - if 'units' in param_data.get_dict(): - punits = param_data.get_dict()['units'] + if "units" in param_data.get_dict(): + punits = param_data.get_dict()["units"] if not punits == potential_object.default_units: raise InputValidationError( - f'the units of the parameters ({punits}) and potential ' - f'({potential_object.default_units}) are different') + f"the units of the parameters ({punits}) and potential " + f"({potential_object.default_units}) are different" + ) return True diff --git a/aiida_lammps/common/generate_input_files.py b/aiida_lammps/common/generate_input_files.py index 5a03044..88932cb 100644 --- a/aiida_lammps/common/generate_input_files.py +++ b/aiida_lammps/common/generate_input_files.py @@ -38,21 +38,20 @@ def get_trajectory_txt(trajectory) -> str: zlo_bound = 0 zhi_bound = zhi - ind = trajectory.get_array('steps') - lammps_data_file = '' + ind = trajectory.get_array("steps") + lammps_data_file = "" for i, position_step in enumerate(trajectory.get_positions()): - lammps_data_file += 'ITEM: TIMESTEP\n' - lammps_data_file += f'{ind[i]}\n' - lammps_data_file += 'ITEM: NUMBER OF ATOMS\n' - lammps_data_file += f'{len(position_step)}\n' - lammps_data_file += 'ITEM: BOX BOUNDS xy xz yz pp pp pp\n' - lammps_data_file += f'{xlo_bound:20.10f} {xhi_bound:20.10f} {xy_box:20.10f}\n' - lammps_data_file += f'{ylo_bound:20.10f} {yhi_bound:20.10f} {yz_box:20.10f}\n' - lammps_data_file += f'{zlo_bound:20.10f} {zhi_bound:20.10f} {yz_box:20.10f}\n' - lammps_data_file += 'ITEM: ATOMS x y z\n' + lammps_data_file += "ITEM: TIMESTEP\n" + lammps_data_file += f"{ind[i]}\n" + lammps_data_file += "ITEM: NUMBER OF ATOMS\n" + lammps_data_file += f"{len(position_step)}\n" + lammps_data_file += "ITEM: BOX BOUNDS xy xz yz pp pp pp\n" + lammps_data_file += f"{xlo_bound:20.10f} {xhi_bound:20.10f} {xy_box:20.10f}\n" + lammps_data_file += f"{ylo_bound:20.10f} {yhi_bound:20.10f} {yz_box:20.10f}\n" + lammps_data_file += f"{zlo_bound:20.10f} {zhi_bound:20.10f} {yz_box:20.10f}\n" + lammps_data_file += "ITEM: ATOMS x y z\n" for position in position_step: - lammps_data_file += '{0:20.10f} {1:20.10f} {2:20.10f}\n'.format( - *position) + lammps_data_file += "{0:20.10f} {1:20.10f} {2:20.10f}\n".format(*position) return lammps_data_file @@ -65,9 +64,9 @@ def parameters_to_input_file(parameters_object: dict) -> str: :rtype: str """ parameters = parameters_object.get_dict() - input_file = 'STRUCTURE FILE POSCAR\nPOSCAR\n\n' - input_file += 'FORCE CONSTANTS\nFORCE_CONSTANTS\n\n' - input_file += 'PRIMITIVE MATRIX\n' + input_file = "STRUCTURE FILE POSCAR\nPOSCAR\n\n" + input_file += "FORCE CONSTANTS\nFORCE_CONSTANTS\n\n" + input_file += "PRIMITIVE MATRIX\n" input_file += f'{np.array(parameters["primitive"])[0, 0]} ' input_file += f'{np.array(parameters["primitive"])[0, 1]} ' input_file += f'{np.array(parameters["primitive"])[0, 2]} \n' @@ -77,8 +76,8 @@ def parameters_to_input_file(parameters_object: dict) -> str: input_file += f'{np.array(parameters["primitive"])[2, 0]} ' input_file += f'{np.array(parameters["primitive"])[2, 1]} ' input_file += f'{np.array(parameters["primitive"])[2, 2]} \n' - input_file += '\n' - input_file += 'SUPERCELL MATRIX PHONOPY\n' + input_file += "\n" + input_file += "SUPERCELL MATRIX PHONOPY\n" input_file += f'{np.array(parameters["supercell"])[0, 0]} ' input_file += f'{np.array(parameters["supercell"])[0, 1]} ' input_file += f'{np.array(parameters["supercell"])[0, 2]} \n' @@ -88,6 +87,6 @@ def parameters_to_input_file(parameters_object: dict) -> str: input_file += f'{np.array(parameters["supercell"])[2, 0]} ' input_file += f'{np.array(parameters["supercell"])[2, 1]} ' input_file += f'{np.array(parameters["supercell"])[2, 2]} \n' - input_file += '\n' + input_file += "\n" return input_file diff --git a/aiida_lammps/common/generate_structure.py b/aiida_lammps/common/generate_structure.py index fdebe88..bda4832 100644 --- a/aiida_lammps/common/generate_structure.py +++ b/aiida_lammps/common/generate_structure.py @@ -9,6 +9,7 @@ a triclinic cell compatible with what LAMMPS expects. """ import typing + import numpy as np @@ -25,7 +26,7 @@ def transform_cell(cell) -> typing.Union[np.array, np.array]: :rtype: typing.Union[np.array, np.array] """ cell = np.array(cell) - transform, upper_tri = np.linalg.qr(cell.T, mode='complete') + transform, upper_tri = np.linalg.qr(cell.T, mode="complete") new_cell = np.transpose(upper_tri) # LAMMPS also requires positive values on the diagonal of the, @@ -42,10 +43,10 @@ def transform_cell(cell) -> typing.Union[np.array, np.array]: def generate_lammps_structure( structure, - atom_style: str = 'atomic', + atom_style: str = "atomic", charge_dict: dict = None, round_dp: float = None, - docstring: str = 'generated by aiida_lammps', + docstring: str = "generated by aiida_lammps", ) -> typing.Union[str, np.array]: """Create lammps input structure file content. @@ -66,9 +67,10 @@ def generate_lammps_structure( """ # pylint: disable=too-many-locals - if atom_style not in ['atomic', 'charge']: + if atom_style not in ["atomic", "charge"]: raise ValueError( - f"atom_style must be in ['atomic', 'charge'], not '{atom_style}'") + f"atom_style must be in ['atomic', 'charge'], not '{atom_style}'" + ) if charge_dict is None: charge_dict = {} @@ -80,42 +82,45 @@ def generate_lammps_structure( # mapping of atom kind_name to mass kind_mass_dict = {kind.name: kind.mass for kind in structure.kinds} - filestring = '' - filestring += f'# {docstring}\n\n' - filestring += f'{len(structure.sites)} atoms\n' - filestring += f'{len(kind_name_id_map)} atom types\n\n' + filestring = "" + filestring += f"# {docstring}\n\n" + filestring += f"{len(structure.sites)} atoms\n" + filestring += f"{len(kind_name_id_map)} atom types\n\n" atoms = structure.get_ase() cell, coord_transform = transform_cell(atoms.cell) - positions = np.transpose( - np.dot(coord_transform, np.transpose(atoms.positions))) + positions = np.transpose(np.dot(coord_transform, np.transpose(atoms.positions))) if round_dp: cell = np.round(cell, round_dp) + 0.0 positions = np.round(positions, round_dp) + 0.0 - filestring += f'0.0 {cell[0, 0]:20.10f} xlo xhi\n' - filestring += f'0.0 {cell[1, 1]:20.10f} ylo yhi\n' - filestring += f'0.0 {cell[2, 2]:20.10f} zlo zhi\n' - filestring += f'{cell[1, 0]:20.10f} {cell[2, 0]:20.10f} {cell[2, 1]:20.10f} xy xz yz\n\n' + filestring += f"0.0 {cell[0, 0]:20.10f} xlo xhi\n" + filestring += f"0.0 {cell[1, 1]:20.10f} ylo yhi\n" + filestring += f"0.0 {cell[2, 2]:20.10f} zlo zhi\n" + filestring += ( + f"{cell[1, 0]:20.10f} {cell[2, 0]:20.10f} {cell[2, 1]:20.10f} xy xz yz\n\n" + ) - filestring += 'Masses\n\n' + filestring += "Masses\n\n" for kind_name in sorted(list(kind_name_id_map.keys())): - filestring += f'{kind_name_id_map[kind_name]} {kind_mass_dict[kind_name]:20.10f} \n' - filestring += '\n' + filestring += ( + f"{kind_name_id_map[kind_name]} {kind_mass_dict[kind_name]:20.10f} \n" + ) + filestring += "\n" - filestring += 'Atoms\n\n' + filestring += "Atoms\n\n" for site_index, (pos, site) in enumerate(zip(positions, structure.sites)): kind_id = kind_name_id_map[site.kind_name] - if atom_style == 'atomic': - filestring += f'{site_index + 1} {kind_id}' - filestring += f' {pos[0]:20.10f} {pos[1]:20.10f} {pos[2]:20.10f}\n' - if atom_style == 'charge': + if atom_style == "atomic": + filestring += f"{site_index + 1} {kind_id}" + filestring += f" {pos[0]:20.10f} {pos[1]:20.10f} {pos[2]:20.10f}\n" + if atom_style == "charge": charge = charge_dict.get(site.kind_name, 0.0) - filestring += f'{site_index + 1} {kind_id} {charge}' - filestring += f' {pos[0]:20.10f} {pos[1]:20.10f} {pos[2]:20.10f}\n' + filestring += f"{site_index + 1} {kind_id} {charge}" + filestring += f" {pos[0]:20.10f} {pos[1]:20.10f} {pos[2]:20.10f}\n" return filestring, coord_transform diff --git a/aiida_lammps/common/input_generator.py b/aiida_lammps/common/input_generator.py index a57d6c3..2d7fc0b 100644 --- a/aiida_lammps/common/input_generator.py +++ b/aiida_lammps/common/input_generator.py @@ -11,25 +11,27 @@ called since it is necessary for the functioning of LAMMPS. """ from builtins import ValueError +import json import os from typing import Union -import json + +from aiida import orm import jsonschema import numpy as np -from aiida import orm -from aiida_lammps.data.lammps_potential import LammpsPotentialData + from aiida_lammps.common.utils import flatten, generate_header +from aiida_lammps.data.lammps_potential import LammpsPotentialData def generate_input_file( parameters: dict, potential: LammpsPotentialData, structure: orm.StructureData, - trajectory_filename: str = 'aiida_lampps.trajectory.dump', - restart_filename: str = 'lammps.restart', - potential_filename: str = 'potential.dat', - structure_filename: str = 'structure.dat', - variables_filename: str = 'aiida_lammps.yaml', + trajectory_filename: str = "aiida_lampps.trajectory.dump", + restart_filename: str = "lammps.restart", + potential_filename: str = "potential.dat", + structure_filename: str = "structure.dat", + variables_filename: str = "aiida_lammps.yaml", read_restart_filename: str = None, ) -> str: """ @@ -77,54 +79,58 @@ def generate_input_file( # Generate the control input block control_block = write_control_block( - parameters_control=parameters.get('control', {})) + parameters_control=parameters.get("control", {}) + ) # Generate the compute input block - if 'compute' in parameters: + if "compute" in parameters: compute_block = write_compute_block( - parameters_compute=parameters.get('compute', {})) + parameters_compute=parameters.get("compute", {}) + ) else: - compute_block = '' + compute_block = "" # Generate the thermo input block thermo_block, fixed_thermo = write_thermo_block( - parameters_thermo=parameters.get('thermo', {}), - parameters_compute=parameters.get('compute', {}), + parameters_thermo=parameters.get("thermo", {}), + parameters_compute=parameters.get("compute", {}), ) # Generate the minimization input block - if 'minimize' in parameters: + if "minimize" in parameters: run_block = write_minimize_block( - parameters_minimize=parameters.get('minimize', {})) + parameters_minimize=parameters.get("minimize", {}) + ) # Generate the md input block - if 'md' in parameters: - run_block = write_md_block(parameters_md=parameters.get('md', {})) + if "md" in parameters: + run_block = write_md_block(parameters_md=parameters.get("md", {})) # Generate the structure input block structure_block, group_lists = write_structure_block( - parameters_structure=parameters.get('structure', {}), + parameters_structure=parameters.get("structure", {}), structure=structure, structure_filename=structure_filename, ) # Append the read restart to the structure block if read_restart_filename is not None: structure_block += write_read_restart_block( - restart_filename=read_restart_filename) + restart_filename=read_restart_filename + ) # Generate the fix input block - if 'fix' in parameters: + if "fix" in parameters: fix_block = write_fix_block( - parameters_fix=parameters.get('fix', {}), + parameters_fix=parameters.get("fix", {}), group_names=group_lists, ) else: - fix_block = '' + fix_block = "" # Generate the potential input block potential_block = write_potential_block( - parameters_potential=parameters.get('potential', {}), + parameters_potential=parameters.get("potential", {}), potential_file=potential_filename, potential=potential, structure=structure, ) # Generate the dump input block dump_block = write_dump_block( - parameters_dump=parameters.get('dump', {}), - parameters_compute=parameters.get('compute', {}), + parameters_dump=parameters.get("dump", {}), + parameters_compute=parameters.get("compute", {}), trajectory_filename=trajectory_filename, atom_style=potential.atom_style, kind_symbols=[kind.symbol for kind in structure.kinds], @@ -137,9 +143,18 @@ def generate_input_file( final_file=variables_filename, ) # Printing the potential - input_file = control_block+structure_block+potential_block+fix_block+\ - compute_block+thermo_block+dump_block+run_block+final_block+\ - restart_block + input_file = ( + control_block + + structure_block + + potential_block + + fix_block + + compute_block + + thermo_block + + dump_block + + run_block + + final_block + + restart_block + ) return input_file @@ -155,8 +170,8 @@ def validate_input_parameters(parameters: dict = None): """ _file = os.path.join( os.path.dirname(os.path.abspath(__file__)), - '..', - 'validation/schemas/lammps_schema.json', + "..", + "validation/schemas/lammps_schema.json", ) with open(_file) as handler: @@ -179,25 +194,27 @@ def write_control_block(parameters_control: dict) -> str: """ default_timestep = { - 'si': 1.0e-8, - 'lj': 5.0e-3, - 'real': 1.0, - 'metal': 1.0e-3, - 'cgs': 1.0e-8, - 'electron': 1.0e-3, - 'micro': 2.0, - 'nano': 4.5e-4, + "si": 1.0e-8, + "lj": 5.0e-3, + "real": 1.0, + "metal": 1.0e-3, + "cgs": 1.0e-8, + "electron": 1.0e-3, + "micro": 2.0, + "nano": 4.5e-4, } - _time = default_timestep[parameters_control.get('units', 'si')] - control_block = generate_header('Start of the Control information') - control_block += 'clear\n' + _time = default_timestep[parameters_control.get("units", "si")] + control_block = generate_header("Start of the Control information") + control_block += "clear\n" control_block += f'units {parameters_control.get("units", "si")}\n' control_block += f'newton {parameters_control.get("newton", "on")}\n' - if 'processors' in parameters_control: - control_block += f'processors {join_keywords(parameters_control["processors"])}\n' + if "processors" in parameters_control: + control_block += ( + f'processors {join_keywords(parameters_control["processors"])}\n' + ) control_block += f'timestep {parameters_control.get("timestep", _time)}\n' - control_block += generate_header('End of the Control information') + control_block += generate_header("End of the Control information") return control_block @@ -231,25 +248,32 @@ def write_potential_block( kind_symbols = [kind.symbol for kind in structure.kinds] - potential_block = generate_header('Start of Potential information') - potential_block += f'pair_style {potential.pair_style}' - potential_block += f' {" ".join(parameters_potential.get("potential_style_options", [""]))}\n' + potential_block = generate_header("Start of Potential information") + potential_block += f"pair_style {potential.pair_style}" + potential_block += ( + f' {" ".join(parameters_potential.get("potential_style_options", [""]))}\n' + ) - if default_potential[potential.pair_style].get('read_from_file'): + if default_potential[potential.pair_style].get("read_from_file"): potential_block += f'pair_coeff * * {potential_file} {" ".join(kind_symbols)}\n' - if not default_potential[potential.pair_style].get('read_from_file'): + if not default_potential[potential.pair_style].get("read_from_file"): data = [ - line for line in potential.get_content().split('\n') - if not line.startswith('#') and line + line + for line in potential.get_content().split("\n") + if not line.startswith("#") and line ] potential_block += f'pair_coeff * * {" ".join(data)}\n' - if 'neighbor' in parameters_potential: - potential_block += f'neighbor {join_keywords(parameters_potential["neighbor"])}\n' - if 'neighbor_modify' in parameters_potential: - potential_block += 'neigh_modify' - potential_block += f' {join_keywords(parameters_potential["neighbor_modify"])}\n' - potential_block += generate_header('End of Potential information') + if "neighbor" in parameters_potential: + potential_block += ( + f'neighbor {join_keywords(parameters_potential["neighbor"])}\n' + ) + if "neighbor_modify" in parameters_potential: + potential_block += "neigh_modify" + potential_block += ( + f' {join_keywords(parameters_potential["neighbor_modify"])}\n' + ) + potential_block += generate_header("End of Potential information") return potential_block @@ -288,34 +312,37 @@ def write_structure_block( if site.kind_name not in kind_name_id_map: kind_name_id_map[site.kind_name] = len(kind_name_id_map) + 1 - structure_block = generate_header('Start of the Structure information') + structure_block = generate_header("Start of the Structure information") structure_block += f'box tilt {parameters_structure.get("box_tilt", "small")}\n' structure_block += f'dimension {structure.get_dimensionality()["dim"]}\n' - structure_block += 'boundary ' - for _bound in ['pbc1', 'pbc2', 'pbc3']: + structure_block += "boundary " + for _bound in ["pbc1", "pbc2", "pbc3"]: structure_block += f'{"p" if structure.attributes[_bound] else "f"} ' - structure_block += '\n' + structure_block += "\n" structure_block += f'atom_style {parameters_structure["atom_style"]}\n' - structure_block += f'read_data {structure_filename}\n' + structure_block += f"read_data {structure_filename}\n" # Set the groups which will be used for the calculations - if 'groups' in parameters_structure: - for _group in parameters_structure['group']: + if "groups" in parameters_structure: + for _group in parameters_structure["group"]: # Check if the given type name corresponds to the ones assigned to the atom types - if 'type' in _group['args']: + if "type" in _group["args"]: - _subset = _group['args'][_group['args'].index('type') + 1:] + _subset = _group["args"][_group["args"].index("type") + 1 :] - if not all(kind in kind_name_id_map.values() - for kind in _subset): - raise ValueError('atom type not defined') + if not all(kind in kind_name_id_map.values() for kind in _subset): + raise ValueError("atom type not defined") # Set the current group - structure_block += f'group {_group["name"]} {join_keywords(_group["args"])}\n' + structure_block += ( + f'group {_group["name"]} {join_keywords(_group["args"])}\n' + ) # Store the name of the group for later usage - group_names.append(_group['name']) + group_names.append(_group["name"]) if restart_file is not None: - structure_block += f'read_restart {restart_file} {parameters_structure["remap"]}' - structure_block += generate_header('End of the Structure information') + structure_block += ( + f'read_restart {restart_file} {parameters_structure["remap"]}' + ) + structure_block += generate_header("End of the Structure information") return structure_block, group_names @@ -335,13 +362,13 @@ def write_minimize_block(parameters_minimize: dict) -> str: :rtype: str """ - minimize_block = generate_header('Start of the Minimization information') + minimize_block = generate_header("Start of the Minimization information") minimize_block += f'min_style {parameters_minimize.get("style", "cg")}\n' minimize_block += f'minimize {parameters_minimize.get("energy_tolerance", 1e-4)}' minimize_block += f' {parameters_minimize.get("force_tolerance", 1e-4)}' minimize_block += f' {parameters_minimize.get("max_iterations", 1000)}' minimize_block += f' {parameters_minimize.get("max_evaluations", 1000)}\n' - minimize_block += generate_header('End of the Minimization information') + minimize_block += generate_header("End of the Minimization information") return minimize_block @@ -366,30 +393,32 @@ def write_md_block(parameters_md: dict) -> str: """ integration_options = generate_integration_options( - style=parameters_md['integration'].get('style', 'nve'), - integration_parameters=parameters_md['integration'].get('constraints'), + style=parameters_md["integration"].get("style", "nve"), + integration_parameters=parameters_md["integration"].get("constraints"), ) - md_block = generate_header('Start of the MD information') - _key = parameters_md['integration'].get('style', 'nve') + md_block = generate_header("Start of the MD information") + _key = parameters_md["integration"].get("style", "nve") md_block += f'fix {generate_id_tag(_key, "all")} all {_key}{integration_options}\n' - if 'velocity' in parameters_md: - md_block += f'{generate_velocity_string(parameters_velocity=parameters_md["velocity"])}' - md_block += 'reset_timestep 0\n' - if parameters_md.get('run_style', 'verlet') == 'rspa': + if "velocity" in parameters_md: + md_block += ( + f'{generate_velocity_string(parameters_velocity=parameters_md["velocity"])}' + ) + md_block += "reset_timestep 0\n" + if parameters_md.get("run_style", "verlet") == "rspa": md_block += f'run_style {parameters_md.get("run_style", "verlet")} ' md_block += f'{join_keywords(parameters_md["rspa_options"])}\n' else: md_block += f'run_style {parameters_md.get("run_style", "verlet")}\n' md_block += f'run {parameters_md.get("max_number_steps", 100)}\n' - md_block += generate_header('End of the MD information') + md_block += generate_header("End of the MD information") return md_block def write_final_variables_block( fixed_thermo: list, - final_file: str = 'aiida_lammps.yaml', + final_file: str = "aiida_lammps.yaml", ) -> str: """ Generate the block to print the final values of the compute variables. @@ -405,22 +434,24 @@ def write_final_variables_block( _variables = [] - variables_block = generate_header( - 'Start of the Final Variables information') + variables_block = generate_header("Start of the Final Variables information") for _thermo in fixed_thermo: - _variables.append(_thermo.replace('[', '_').replace(']', '')) - variables_block += f'variable final_{_variables[-1]} equal {_thermo}\n' - variables_block += generate_header( - 'End of the Final Variables information') + _variables.append(_thermo.replace("[", "_").replace("]", "")) + variables_block += f"variable final_{_variables[-1]} equal {_thermo}\n" + variables_block += generate_header("End of the Final Variables information") variables_block += generate_header( - 'Start of the Printing Final Variables information') + "Start of the Printing Final Variables information" + ) variables_block += f'print "#Final results" file {final_file}\n' for variable in _variables: - variables_block += f'print "final_{variable}: ${{final_{variable}}}" append {final_file}\n' + variables_block += ( + f'print "final_{variable}: ${{final_{variable}}}" append {final_file}\n' + ) variables_block += generate_header( - 'End of the Printing Final Variables information') + "End of the Printing Final Variables information" + ) return variables_block @@ -437,27 +468,31 @@ def generate_velocity_string(parameters_velocity: dict) -> str: :return: string with the velocity options :rtype: str """ - options = '' + options = "" for entry in parameters_velocity: _options = generate_velocity_options(entry) - if 'create' in entry: + if "create" in entry: options += f'velocity {entry.get("group", "all")} create' options += f' {entry["create"].get("temp")}' - options += f' {entry["create"].get("seed", np.random.randint(1e4))} {_options}\n' - if 'set' in entry: + options += ( + f' {entry["create"].get("seed", np.random.randint(1e4))} {_options}\n' + ) + if "set" in entry: options += f'velocity {entry.get("group", "all")} set' options += f' {entry["set"].get("vx", "NULL")}' options += f' {entry["set"].get("vy", "NULL")}' options += f' {entry["set"].get("vz", "NULL")} {_options}\n' - if 'scale' in entry: + if "scale" in entry: options += f'velocity {entry.get("group", "all")} scale' options += f' {entry["scale"]} {_options}\n' - if 'ramp' in entry: + if "ramp" in entry: options += f'velocity {entry.get("group", "all")} ramp' options += f' {entry["ramp"].get("vdim")} {entry["ramp"].get("vlo")}' options += f' {entry["ramp"].get("vhi")} {entry["ramp"].get("dim")}' - options += f' {entry["ramp"].get("clo")} {entry["ramp"].get("chi")} {_options}\n' - if 'zero' in entry: + options += ( + f' {entry["ramp"].get("clo")} {entry["ramp"].get("chi")} {_options}\n' + ) + if "zero" in entry: options += f'velocity {entry.get("group", "all")} zero' options += f' {entry["zero"]} {_options}\n' return options @@ -475,15 +510,12 @@ def generate_velocity_options(options_velocity: dict) -> str: :return: string with the velocity options :rtype: str """ - _options = [ - 'dist', 'sum', 'mom' - 'rot', 'temp', 'bias', 'loop', 'rigid', 'units' - ] + _options = ["dist", "sum", "mom" "rot", "temp", "bias", "loop", "rigid", "units"] - velocity_option = '' + velocity_option = "" for _option in _options: if _option in options_velocity: - velocity_option += f' {_option} {options_velocity[_option]} ' + velocity_option += f" {_option} {options_velocity[_option]} " return velocity_option @@ -507,54 +539,73 @@ def generate_integration_options( """ temperature_dependent = [ - 'nvt', - 'nvt/asphere', - 'nvt/body', - 'nvt/eff', - 'nvt/manifold/rattle', - 'nvt/sllod', - 'nvt/sllod/eff', - 'nvt/sphere', - 'nvt/uef', - 'nphug', - 'npt', - 'npt/asphere', - 'npt/body', - 'npt/cauchy', - 'npt/eff', - 'npt/sphere', - 'npt/uef', + "nvt", + "nvt/asphere", + "nvt/body", + "nvt/eff", + "nvt/manifold/rattle", + "nvt/sllod", + "nvt/sllod/eff", + "nvt/sphere", + "nvt/uef", + "nphug", + "npt", + "npt/asphere", + "npt/body", + "npt/cauchy", + "npt/eff", + "npt/sphere", + "npt/uef", ] pressure_dependent = [ - 'nph', - 'nph/asphere', - 'nph/body', - 'nph/eff', - 'nph/sphere', - 'nphug', - 'npt', - 'npt/asphere', - 'npt/body', - 'npt/cauchy', - 'npt/eff', - 'npt/sphere', - 'npt/uef', + "nph", + "nph/asphere", + "nph/body", + "nph/eff", + "nph/sphere", + "nphug", + "npt", + "npt/asphere", + "npt/body", + "npt/cauchy", + "npt/eff", + "npt/sphere", + "npt/uef", ] - uef_dependent = ['npt/uef', 'nvt/uef'] + uef_dependent = ["npt/uef", "nvt/uef"] - temperature_options = ['temp', 'tchain', 'tloop', 'drag'] + temperature_options = ["temp", "tchain", "tloop", "drag"] pressure_options = [ - 'ani', 'iso', 'tri', 'x', 'y', 'z', 'xy', 'xz', 'yz', 'couple', - 'pchain', 'mtk', 'ploop', 'nreset', 'drag', 'dilate', 'scaleyz', - 'scalexz', 'scalexy', 'flip', 'fixedpoint', 'update' + "ani", + "iso", + "tri", + "x", + "y", + "z", + "xy", + "xz", + "yz", + "couple", + "pchain", + "mtk", + "ploop", + "nreset", + "drag", + "dilate", + "scaleyz", + "scalexz", + "scalexy", + "flip", + "fixedpoint", + "update", ] - uef_options = ['ext', 'erotate'] + uef_options = ["ext", "erotate"] - options = '' + options = "" # Set the options that depend on the temperature if style in temperature_dependent: @@ -578,10 +629,10 @@ def generate_integration_options( _value = [str(val) for val in _value] options += f' {_option} {" ".join(_value) if isinstance(_value, list) else _value} ' # Set the options that depend on the 'nve/limit' parameters - if style in ['nve/limit']: + if style in ["nve/limit"]: options += f' {integration_parameters.get("xmax", 0.1)} ' # Set the options that depend on the 'langevin' parameters - if style in ['nve/dotc/langevin']: + if style in ["nve/dotc/langevin"]: options += f' {integration_parameters.get("temp")}' options += f' {integration_parameters.get("seed")}' options += f' angmom {integration_parameters.get("angmom")}' @@ -618,17 +669,17 @@ def write_fix_block( if group_names is None: group_names = [] - fix_block = generate_header('Start of the Fix information') + fix_block = generate_header("Start of the Fix information") for key, value in parameters_fix.items(): for entry in value: - _group = entry.get('group', 'all') - if _group not in group_names + ['all']: + _group = entry.get("group", "all") + if _group not in group_names + ["all"]: raise ValueError( f'group name "{_group}" is not the defined groups {group_names + ["all"]}' ) - fix_block += f'fix {generate_id_tag(key, _group)} {_group} {key} ' + fix_block += f"fix {generate_id_tag(key, _group)} {_group} {key} " fix_block += f'{join_keywords(entry["type"])}\n' - fix_block += generate_header('End of the Fix information') + fix_block += generate_header("End of the Fix information") return fix_block @@ -656,16 +707,15 @@ def write_compute_block( if group_names is None: group_names = [] - compute_block = generate_header('Start of the Compute information') + compute_block = generate_header("Start of the Compute information") for key, value in parameters_compute.items(): for entry in value: - _group = entry.get('group', 'all') - if _group not in group_names + ['all']: - raise ValueError( - f'group name "{_group}" is not the defined groups') - compute_block += f'compute {generate_id_tag(key, _group)} {_group} {key} ' + _group = entry.get("group", "all") + if _group not in group_names + ["all"]: + raise ValueError(f'group name "{_group}" is not the defined groups') + compute_block += f"compute {generate_id_tag(key, _group)} {_group} {key} " compute_block += f'{join_keywords(entry["type"])}\n' - compute_block += generate_header('End of the Compute information') + compute_block += generate_header("End of the Compute information") return compute_block @@ -695,42 +745,42 @@ def write_dump_block( # pylint: disable=too-many-locals _file = os.path.join( os.path.dirname(os.path.abspath(__file__)), - 'variables_types.json', + "variables_types.json", ) - with open(_file, 'r') as handler: - _compute_variables = json.load(handler)['computes'] + with open(_file, "r") as handler: + _compute_variables = json.load(handler)["computes"] computes_list = [] for key, value in parameters_compute.items(): for entry in value: - _locality = _compute_variables[key]['locality'] - _printable = _compute_variables[key]['printable'] + _locality = _compute_variables[key]["locality"] + _printable = _compute_variables[key]["printable"] - if _locality == 'local' and _printable: + if _locality == "local" and _printable: computes_list.append( generate_printing_string( name=key, - group=entry['group'], - calculation_type='compute', - )) + group=entry["group"], + calculation_type="compute", + ) + ) - num_double = len( - list(flatten([compute.split() for compute in computes_list]))) + num_double = len(list(flatten([compute.split() for compute in computes_list]))) num_double += 3 - if atom_style == 'charge': + if atom_style == "charge": num_double += 1 - dump_block = generate_header('Start of the Dump information') + dump_block = generate_header("Start of the Dump information") dump_block += f'dump aiida all custom {parameters_dump.get("dump_rate", 10)} ' - dump_block += f'{trajectory_filename} id type element x y z ' + dump_block += f"{trajectory_filename} id type element x y z " dump_block += f'{"q " if atom_style=="charge" else ""}' dump_block += f'{" ".join(computes_list)}\n' - dump_block += 'dump_modify aiida sort id\n' + dump_block += "dump_modify aiida sort id\n" dump_block += f'dump_modify aiida element {" ".join(kind_symbols)}\n' - dump_block += 'dump_modify aiida format line ' + dump_block += "dump_modify aiida format line " dump_block += f'"%6d %4d %4s {" ".join(["%16.10f"]*num_double)}"\n' - dump_block += generate_header('End of the Dump information') + dump_block += generate_header("End of the Dump information") return dump_block @@ -757,51 +807,53 @@ def write_thermo_block( _file = os.path.join( os.path.dirname(os.path.abspath(__file__)), - 'variables_types.json', + "variables_types.json", ) - with open(_file, 'r') as handler: - _compute_variables = json.load(handler)['computes'] + with open(_file, "r") as handler: + _compute_variables = json.load(handler)["computes"] computes_list = [] for key, value in parameters_compute.items(): for entry in value: - _locality = _compute_variables[key]['locality'] - _printable = _compute_variables[key]['printable'] + _locality = _compute_variables[key]["locality"] + _printable = _compute_variables[key]["printable"] - if _locality == 'global' and _printable: + if _locality == "global" and _printable: computes_list.append( generate_printing_string( name=key, - group=entry['group'], - calculation_type='compute', - )) + group=entry["group"], + calculation_type="compute", + ) + ) - computes_printing = parameters_thermo.get('thermo_printing', None) + computes_printing = parameters_thermo.get("thermo_printing", None) if computes_printing is None or not computes_printing: - fixed_thermo = ['step', 'temp', 'epair', 'emol', 'etotal', 'press'] + fixed_thermo = ["step", "temp", "epair", "emol", "etotal", "press"] else: - fixed_thermo = [ - key for key, value in computes_printing.items() if value - ] - if 'step' not in fixed_thermo: - fixed_thermo = ['step'] + fixed_thermo - if 'etotal' not in fixed_thermo: - fixed_thermo = fixed_thermo + ['etotal'] - - if fixed_thermo.index('step') != 0: - fixed_thermo.remove('step') - fixed_thermo = ['step'] + fixed_thermo - - thermo_block = generate_header('Start of the Thermo information') - thermo_block += f'thermo_style custom {" ".join(fixed_thermo)} {" ".join(computes_list)}\n' + fixed_thermo = [key for key, value in computes_printing.items() if value] + if "step" not in fixed_thermo: + fixed_thermo = ["step"] + fixed_thermo + if "etotal" not in fixed_thermo: + fixed_thermo = fixed_thermo + ["etotal"] + + if fixed_thermo.index("step") != 0: + fixed_thermo.remove("step") + fixed_thermo = ["step"] + fixed_thermo + + thermo_block = generate_header("Start of the Thermo information") + thermo_block += ( + f'thermo_style custom {" ".join(fixed_thermo)} {" ".join(computes_list)}\n' + ) thermo_block += f'thermo {parameters_thermo.get("printing_rate", 1000)}\n' - thermo_block += generate_header('End of the Thermo information') + thermo_block += generate_header("End of the Thermo information") printing_variables = fixed_thermo + list( - flatten([compute.split() for compute in computes_list])) + flatten([compute.split() for compute in computes_list]) + ) return thermo_block, printing_variables @@ -815,9 +867,9 @@ def write_restart_block(restart_filename: str) -> str: :rtype: str """ - restart_block = generate_header('Start of the write restart information') - restart_block += f'write_restart {restart_filename}\n' - restart_block += generate_header('End of the write restart information') + restart_block = generate_header("Start of the write restart information") + restart_block += f"write_restart {restart_filename}\n" + restart_block += generate_header("End of the write restart information") return restart_block @@ -831,11 +883,9 @@ def write_read_restart_block(restart_filename: str) -> str: :rtype: str """ - read_restart_block = generate_header( - 'Start of the read restart information') - read_restart_block += f'read_restart {restart_filename}\n' - read_restart_block += generate_header( - 'End of the read restart information') + read_restart_block = generate_header("Start of the read restart information") + read_restart_block += f"read_restart {restart_filename}\n" + read_restart_block += generate_header("End of the read restart information") return read_restart_block @@ -860,47 +910,45 @@ def generate_printing_string( :rtype: str """ - if calculation_type == 'compute': - prefactor = 'c' - if calculation_type == 'fix': - prefactor = 'f' + if calculation_type == "compute": + prefactor = "c" + if calculation_type == "fix": + prefactor = "f" _file = os.path.join( os.path.dirname(os.path.abspath(__file__)), - 'variables_types.json', + "variables_types.json", ) - with open(_file, 'r') as handler: - _compute_variables = json.load(handler)['computes'] + with open(_file, "r") as handler: + _compute_variables = json.load(handler)["computes"] - _type = _compute_variables[name]['type'] - _size = _compute_variables[name]['size'] + _type = _compute_variables[name]["type"] + _size = _compute_variables[name]["size"] _string = [] - if _type == 'vector' and _size > 0: + if _type == "vector" and _size > 0: for index in range(1, _size + 1): - _string.append( - f'{prefactor}_{generate_id_tag(name, group)}[{index}]') - elif _type == 'vector' and _size == 0: - _string.append(f'{prefactor}_{generate_id_tag(name, group)}[*]') + _string.append(f"{prefactor}_{generate_id_tag(name, group)}[{index}]") + elif _type == "vector" and _size == 0: + _string.append(f"{prefactor}_{generate_id_tag(name, group)}[*]") - if _type == 'mixed' and _size > 0: - _string.append(f'{prefactor}_{generate_id_tag(name, group)}') + if _type == "mixed" and _size > 0: + _string.append(f"{prefactor}_{generate_id_tag(name, group)}") for index in range(1, _size + 1): - _string.append( - f'{prefactor}_{generate_id_tag(name, group)}[{index}]') - elif _type == 'mixed' and _size == 0: - _string.append(f'{prefactor}_{generate_id_tag(name, group)}') - _string.append(f'{prefactor}_{generate_id_tag(name, group)}[*]') + _string.append(f"{prefactor}_{generate_id_tag(name, group)}[{index}]") + elif _type == "mixed" and _size == 0: + _string.append(f"{prefactor}_{generate_id_tag(name, group)}") + _string.append(f"{prefactor}_{generate_id_tag(name, group)}[*]") - if _type == 'scalar': - _string.append(f'{prefactor}_{generate_id_tag(name, group)}') + if _type == "scalar": + _string.append(f"{prefactor}_{generate_id_tag(name, group)}") - if _type == 'array': - _string.append(f'{prefactor}_{generate_id_tag(name, group)}') + if _type == "array": + _string.append(f"{prefactor}_{generate_id_tag(name, group)}") - return ' '.join(_string) + return " ".join(_string) def generate_id_tag(name: str = None, group: str = None) -> str: @@ -940,7 +988,11 @@ def join_keywords(value: list) -> str: :rtype: str """ - return ' '.join([ - f"{entry['keyword']} {entry['value']}" - if isinstance(entry, dict) else f'{entry}' for entry in value - ]) + return " ".join( + [ + f"{entry['keyword']} {entry['value']}" + if isinstance(entry, dict) + else f"{entry}" + for entry in value + ] + ) diff --git a/aiida_lammps/common/parse_trajectory.py b/aiida_lammps/common/parse_trajectory.py index 6609175..cd24d53 100644 --- a/aiida_lammps/common/parse_trajectory.py +++ b/aiida_lammps/common/parse_trajectory.py @@ -2,12 +2,13 @@ """ # pylint: disable=fixme from collections import namedtuple -import numpy as np + from aiida import orm +import numpy as np TrajectoryBlock = namedtuple( - 'TRAJ_BLOCK', - ['lines', 'timestep', 'natoms', 'cell', 'pbc', 'atom_fields']) + "TRAJ_BLOCK", ["lines", "timestep", "natoms", "cell", "pbc", "atom_fields"] +) def iter_step_lines(file_obj): @@ -21,7 +22,7 @@ def iter_step_lines(file_obj): step_content = None init_line = 0 for i, line in enumerate(file_obj): - if 'ITEM: TIMESTEP' in line: + if "ITEM: TIMESTEP" in line: if step_content is not None: yield init_line, step_content init_line = i + 1 @@ -47,17 +48,15 @@ def parse_step(lines, initial_line=0) -> namedtuple: :rtype: namedtuple """ # pylint: disable=too-many-locals - if 'ITEM: TIMESTEP' not in lines[0]: - raise IOError(f'expected line {initial_line} to be TIMESTEP') - if 'ITEM: NUMBER OF ATOMS' not in lines[2]: - raise IOError( - f'expected line {initial_line + 2} to be NUMBER OF ATOMS') - if 'ITEM: BOX BOUNDS xy xz yz' not in lines[4]: - raise IOError( - f'expected line {initial_line + 4} to be BOX BOUNDS xy xz yz') + if "ITEM: TIMESTEP" not in lines[0]: + raise IOError(f"expected line {initial_line} to be TIMESTEP") + if "ITEM: NUMBER OF ATOMS" not in lines[2]: + raise IOError(f"expected line {initial_line + 2} to be NUMBER OF ATOMS") + if "ITEM: BOX BOUNDS xy xz yz" not in lines[4]: + raise IOError(f"expected line {initial_line + 4} to be BOX BOUNDS xy xz yz") # TODO handle case when xy xz yz not present -> orthogonal box - if 'ITEM: ATOMS' not in lines[8]: - raise IOError(f'expected line {initial_line + 8} to be ATOMS') + if "ITEM: ATOMS" not in lines[8]: + raise IOError(f"expected line {initial_line + 8} to be ATOMS") timestep = int(lines[1]) number_of_atoms = int(lines[3]) @@ -81,21 +80,19 @@ def parse_step(lines, initial_line=0) -> namedtuple: zlo = bounds[2, 0] zhi = bounds[2, 1] - super_cell = np.array([ - [xhi - xlo, box_xy, box_xz], - [0.0, yhi - ylo, box_yz], - [0.0, 0.0, zhi - zlo], - ]) + super_cell = np.array( + [ + [xhi - xlo, box_xy, box_xz], + [0.0, yhi - ylo, box_yz], + [0.0, 0.0, zhi - zlo], + ] + ) cell = super_cell.T field_names = lines[8].split()[2:] fields = [] for i in range(number_of_atoms): fields.append(lines[9 + i].split()) - atom_fields = { - n: v.tolist() - for n, v in zip(field_names, - np.array(fields).T) - } + atom_fields = {n: v.tolist() for n, v in zip(field_names, np.array(fields).T)} return TrajectoryBlock( lines, @@ -115,8 +112,8 @@ def iter_trajectories(file_obj): def create_structure( trajectory_block: namedtuple, - symbol_field: str = 'element', - position_fields: tuple = ('x', 'y', 'z'), + symbol_field: str = "element", + position_fields: tuple = ("x", "y", "z"), original_structure: orm.StructureData = None, ) -> orm.StructureData: """Generate a structure from the atomic positions at a given step. @@ -139,17 +136,15 @@ def create_structure( """ symbols = trajectory_block.atom_fields[symbol_field] positions = np.array( - [trajectory_block.atom_fields[f] for f in position_fields], - dtype=float).T + [trajectory_block.atom_fields[f] for f in position_fields], dtype=float + ).T if original_structure is not None: kind_names = original_structure.get_site_kindnames() - kind_symbols = [ - original_structure.get_kind(n).symbol for n in kind_names - ] + kind_symbols = [original_structure.get_kind(n).symbol for n in kind_names] if symbols != kind_symbols: raise ValueError( - f'original_structure has different symbols:: {kind_symbols} != {symbols}' + f"original_structure has different symbols:: {kind_symbols} != {symbols}" ) structure = original_structure.clone() structure.reset_cell(trajectory_block.cell) @@ -159,12 +154,12 @@ def create_structure( boundary_conditions = [] for pbc in trajectory_block.pbc: - if pbc == 'pp': + if pbc == "pp": boundary_conditions.append(True) - elif pbc == 'ff': + elif pbc == "ff": boundary_conditions.append(False) else: - raise NotImplementedError(f'pbc = {trajectory_block.pbc}') + raise NotImplementedError(f"pbc = {trajectory_block.pbc}") structure = orm.StructureData( cell=trajectory_block.cell, diff --git a/aiida_lammps/common/raw_parsers.py b/aiida_lammps/common/raw_parsers.py index 3eb64e5..7e92698 100644 --- a/aiida_lammps/common/raw_parsers.py +++ b/aiida_lammps/common/raw_parsers.py @@ -1,16 +1,16 @@ """Set of functions to parse the unformatted files generated by LAMMPS. """ # pylint: disable=fixme -import io import ast +import io import re from typing import Union -import yaml + import numpy as np +import yaml -def parse_logfile(filename: str = None, - file_contents: str = None) -> Union[dict, dict]: +def parse_logfile(filename: str = None, file_contents: str = None) -> Union[dict, dict]: """ Parse the log.lammps file. @@ -33,63 +33,64 @@ def parse_logfile(filename: str = None, if filename is not None: try: - with io.open(filename, 'r') as handler: + with io.open(filename, "r") as handler: data = handler.read() - data = data.split('\n') + data = data.split("\n") except (IOError, OSError): return None if file_contents is not None: - data = file_contents.split('\n') + data = file_contents.split("\n") header_line_position = -1 - header_line = '' + header_line = "" _data = [] end_found = False parsed_data = {} global_parsed_data = {} perf_regex = re.compile( - r'Performance\:\s(.+)\sns\/day,\s(.+)\shours\/ns\,\s(.+)\stimesteps\/s\s*' + r"Performance\:\s(.+)\sns\/day,\s(.+)\shours\/ns\,\s(.+)\stimesteps\/s\s*" ) for index, line in enumerate(data): if perf_regex.match(line): _, _, step_sec = perf_regex.match(line).groups() - global_parsed_data['steps_per_second'] = float(step_sec) - if 'binsize' in line: - global_parsed_data['binsize'] = ast.literal_eval( - line.split()[2].replace(',', '')) - global_parsed_data['bins'] = [ + global_parsed_data["steps_per_second"] = float(step_sec) + if "binsize" in line: + global_parsed_data["binsize"] = ast.literal_eval( + line.split()[2].replace(",", "") + ) + global_parsed_data["bins"] = [ ast.literal_eval(entry) for entry in line.split()[5:] ] - if 'ghost atom cutoff' in line: - global_parsed_data['ghost_atom_cutoff'] = ast.literal_eval( - line.split()[-1]) - if 'master list distance cutoff' in line: - global_parsed_data[ - 'master_list_distance_cutoff'] = ast.literal_eval( - line.split()[-1]) - if 'max neighbors/atom' in line: - global_parsed_data['max_neighbors_atom'] = ast.literal_eval( - line.split()[2].replace(',', '')) - if 'units' in line: - global_parsed_data['units_style'] = line.split()[1] - if 'Total wall time:' in line: - global_parsed_data['total_wall_time'] = line.split()[-1] - if 'bin:' in line: - global_parsed_data['bin'] = line.split()[-1] - if line.startswith('Step'): + if "ghost atom cutoff" in line: + global_parsed_data["ghost_atom_cutoff"] = ast.literal_eval(line.split()[-1]) + if "master list distance cutoff" in line: + global_parsed_data["master_list_distance_cutoff"] = ast.literal_eval( + line.split()[-1] + ) + if "max neighbors/atom" in line: + global_parsed_data["max_neighbors_atom"] = ast.literal_eval( + line.split()[2].replace(",", "") + ) + if "units" in line: + global_parsed_data["units_style"] = line.split()[1] + if "Total wall time:" in line: + global_parsed_data["total_wall_time"] = line.split()[-1] + if "bin:" in line: + global_parsed_data["bin"] = line.split()[-1] + if line.startswith("Step"): header_line_position = index header_line = line.split() if header_line_position > 0 and index != header_line_position and not end_found: - if not line.split()[0].replace('.', '', 1).isdigit(): + if not line.split()[0].replace(".", "", 1).isdigit(): end_found = True if header_line_position > 0 and index != header_line_position and not end_found: _data.append([ast.literal_eval(entry) for entry in line.split()]) _data = np.asarray(_data) for index, entry in enumerate(header_line): parsed_data[entry] = _data[:, index].tolist() - return {'time_dependent': parsed_data, 'global': global_parsed_data} + return {"time_dependent": parsed_data, "global": global_parsed_data} def parse_final_data(filename: str = None, file_contents: str = None) -> dict: @@ -113,7 +114,7 @@ def parse_final_data(filename: str = None, file_contents: str = None) -> dict: return None if filename is not None: try: - with io.open(filename, 'r') as handle: + with io.open(filename, "r") as handle: data = yaml.load(handle, Loader=yaml.Loader) except (IOError, OSError): data = None @@ -128,10 +129,10 @@ def read_log_file(logdata_txt, compute_stress=False): data = logdata_txt.splitlines() if not data: - raise IOError('The logfile is empty') + raise IOError("The logfile is empty") perf_regex = re.compile( - r'Performance\:\s(.+)\sns\/day,\s(.+)\shours\/ns\,\s(.+)\stimesteps\/s\s*' + r"Performance\:\s(.+)\sns\/day,\s(.+)\shours\/ns\,\s(.+)\stimesteps\/s\s*" ) data_dict = {} @@ -140,10 +141,10 @@ def read_log_file(logdata_txt, compute_stress=False): found_end = False for _, line in enumerate(data): line = line.strip() - if 'END_OF_COMP' in line: + if "END_OF_COMP" in line: found_end = True - elif 'Total wall time:' in line: - data_dict['total_wall_time'] = line.split()[-1] + elif "Total wall time:" in line: + data_dict["total_wall_time"] = line.split()[-1] # These are handled in LAMMPSBaseParser.add_warnings_and_errors # if line.strip().startswith("WARNING"): # data_dict.setdefault("warnings", []).append(line.strip()) @@ -151,25 +152,23 @@ def read_log_file(logdata_txt, compute_stress=False): # data_dict.setdefault("errors", []).append(line.strip()) elif perf_regex.match(line): _, _, step_sec = perf_regex.match(line).groups() - data_dict.setdefault('steps_per_second', - []).append(float(step_sec)) - elif 'units' in line: - data_dict['units_style'] = line.split()[1] - elif line.startswith('final_energy:'): - data_dict['energy'] = float(line.split()[1]) - elif line.startswith('final_variable:'): - if 'final_variables' not in data_dict: - data_dict['final_variables'] = {} - data_dict['final_variables'][line.split()[1]] = float( - line.split()[3]) - - elif line.startswith('final_cell:'): + data_dict.setdefault("steps_per_second", []).append(float(step_sec)) + elif "units" in line: + data_dict["units_style"] = line.split()[1] + elif line.startswith("final_energy:"): + data_dict["energy"] = float(line.split()[1]) + elif line.startswith("final_variable:"): + if "final_variables" not in data_dict: + data_dict["final_variables"] = {} + data_dict["final_variables"][line.split()[1]] = float(line.split()[3]) + + elif line.startswith("final_cell:"): cell_params = [float(v) for v in line.split()[1:10]] - elif line.startswith('final_stress:'): + elif line.startswith("final_stress:"): stress_params = [float(v) for v in line.split()[1:7]] if not compute_stress: - return {'data': data_dict, 'found_end': found_end} + return {"data": data_dict, "found_end": found_end} if cell_params is None: raise IOError("'final_cell' could not be found") @@ -177,11 +176,13 @@ def read_log_file(logdata_txt, compute_stress=False): raise IOError("'final_stress' could not be found") xlo, xhi, box_xy, ylo, yhi, box_xz, zlo, zhi, box_yz = cell_params - super_cell = np.array([ - [xhi - xlo, box_xy, box_xz], - [0, yhi - ylo, box_yz], - [0, 0, zhi - zlo], - ]) + super_cell = np.array( + [ + [xhi - xlo, box_xy, box_xz], + [0, yhi - ylo, box_yz], + [0, 0, zhi - zlo], + ] + ) cell = super_cell.T if np.linalg.det(cell) < 0: cell = -1.0 * cell @@ -198,15 +199,10 @@ def read_log_file(logdata_txt, compute_stress=False): ) stress = -stress / volume # to get stress in units of pressure - return { - 'data': data_dict, - 'cell': cell, - 'stress': stress, - 'found_end': found_end - } + return {"data": data_dict, "cell": cell, "stress": stress, "found_end": found_end} -def get_units_dict(style, quantities, suffix='_units'): +def get_units_dict(style, quantities, suffix="_units"): """Return a mapping of the unit name to the units, for a particular style. :param style: the unit style set in the lammps input @@ -217,114 +213,114 @@ def get_units_dict(style, quantities, suffix='_units'): """ units_dict = { - 'real': { - 'mass': 'grams/mole', - 'distance': 'Angstroms', - 'time': 'femtoseconds', - 'energy': 'Kcal/mole', - 'velocity': 'Angstroms/femtosecond', - 'force': 'Kcal/mole-Angstrom', - 'torque': 'Kcal/mole', - 'temperature': 'Kelvin', - 'pressure': 'atmospheres', - 'dynamic_viscosity': 'Poise', - 'charge': 'e', # multiple of electron charge (1.0 is a proton) - 'dipole': 'charge*Angstroms', - 'electric field': 'volts/Angstrom', - 'density': 'gram/cm^dim', + "real": { + "mass": "grams/mole", + "distance": "Angstroms", + "time": "femtoseconds", + "energy": "Kcal/mole", + "velocity": "Angstroms/femtosecond", + "force": "Kcal/mole-Angstrom", + "torque": "Kcal/mole", + "temperature": "Kelvin", + "pressure": "atmospheres", + "dynamic_viscosity": "Poise", + "charge": "e", # multiple of electron charge (1.0 is a proton) + "dipole": "charge*Angstroms", + "electric field": "volts/Angstrom", + "density": "gram/cm^dim", }, - 'metal': { - 'mass': 'grams/mole', - 'distance': 'Angstroms', - 'time': 'picoseconds', - 'energy': 'eV', - 'velocity': 'Angstroms/picosecond', - 'force': 'eV/Angstrom', - 'torque': 'eV', - 'temperature': 'Kelvin', - 'pressure': 'bars', - 'dynamic_viscosity': 'Poise', - 'charge': 'e', # multiple of electron charge (1.0 is a proton) - 'dipole': 'charge*Angstroms', - 'electric field': 'volts/Angstrom', - 'density': 'gram/cm^dim', + "metal": { + "mass": "grams/mole", + "distance": "Angstroms", + "time": "picoseconds", + "energy": "eV", + "velocity": "Angstroms/picosecond", + "force": "eV/Angstrom", + "torque": "eV", + "temperature": "Kelvin", + "pressure": "bars", + "dynamic_viscosity": "Poise", + "charge": "e", # multiple of electron charge (1.0 is a proton) + "dipole": "charge*Angstroms", + "electric field": "volts/Angstrom", + "density": "gram/cm^dim", }, - 'si': { - 'mass': 'kilograms', - 'distance': 'meters', - 'time': 'seconds', - 'energy': 'Joules', - 'velocity': 'meters/second', - 'force': 'Newtons', - 'torque': 'Newton-meters', - 'temperature': 'Kelvin', - 'pressure': 'Pascals', - 'dynamic_viscosity': 'Pascal*second', - 'charge': 'Coulombs', # (1.6021765e-19 is a proton) - 'dipole': 'Coulombs*meters', - 'electric field': 'volts/meter', - 'density': 'kilograms/meter^dim', + "si": { + "mass": "kilograms", + "distance": "meters", + "time": "seconds", + "energy": "Joules", + "velocity": "meters/second", + "force": "Newtons", + "torque": "Newton-meters", + "temperature": "Kelvin", + "pressure": "Pascals", + "dynamic_viscosity": "Pascal*second", + "charge": "Coulombs", # (1.6021765e-19 is a proton) + "dipole": "Coulombs*meters", + "electric field": "volts/meter", + "density": "kilograms/meter^dim", }, - 'cgs': { - 'mass': 'grams', - 'distance': 'centimeters', - 'time': 'seconds', - 'energy': 'ergs', - 'velocity': 'centimeters/second', - 'force': 'dynes', - 'torque': 'dyne-centimeters', - 'temperature': 'Kelvin', - 'pressure': 'dyne/cm^2', # or barye': '1.0e-6 bars - 'dynamic_viscosity': 'Poise', - 'charge': 'statcoulombs', # or esu (4.8032044e-10 is a proton) - 'dipole': 'statcoul-cm', #: '10^18 debye - 'electric_field': 'statvolt/cm', # or dyne/esu - 'density': 'grams/cm^dim', + "cgs": { + "mass": "grams", + "distance": "centimeters", + "time": "seconds", + "energy": "ergs", + "velocity": "centimeters/second", + "force": "dynes", + "torque": "dyne-centimeters", + "temperature": "Kelvin", + "pressure": "dyne/cm^2", # or barye': '1.0e-6 bars + "dynamic_viscosity": "Poise", + "charge": "statcoulombs", # or esu (4.8032044e-10 is a proton) + "dipole": "statcoul-cm", #: '10^18 debye + "electric_field": "statvolt/cm", # or dyne/esu + "density": "grams/cm^dim", }, - 'electron': { - 'mass': 'amu', - 'distance': 'Bohr', - 'time': 'femtoseconds', - 'energy': 'Hartrees', - 'velocity': 'Bohr/atu', # [1.03275e-15 seconds] - 'force': 'Hartrees/Bohr', - 'temperature': 'Kelvin', - 'pressure': 'Pascals', - 'charge': 'e', # multiple of electron charge (1.0 is a proton) - 'dipole_moment': 'Debye', - 'electric_field': 'volts/cm', + "electron": { + "mass": "amu", + "distance": "Bohr", + "time": "femtoseconds", + "energy": "Hartrees", + "velocity": "Bohr/atu", # [1.03275e-15 seconds] + "force": "Hartrees/Bohr", + "temperature": "Kelvin", + "pressure": "Pascals", + "charge": "e", # multiple of electron charge (1.0 is a proton) + "dipole_moment": "Debye", + "electric_field": "volts/cm", }, - 'micro': { - 'mass': 'picograms', - 'distance': 'micrometers', - 'time': 'microseconds', - 'energy': 'picogram-micrometer^2/microsecond^2', - 'velocity': 'micrometers/microsecond', - 'force': 'picogram-micrometer/microsecond^2', - 'torque': 'picogram-micrometer^2/microsecond^2', - 'temperature': 'Kelvin', - 'pressure': 'picogram/(micrometer-microsecond^2)', - 'dynamic_viscosity': 'picogram/(micrometer-microsecond)', - 'charge': 'picocoulombs', # (1.6021765e-7 is a proton) - 'dipole': 'picocoulomb-micrometer', - 'electric field': 'volt/micrometer', - 'density': 'picograms/micrometer^dim', + "micro": { + "mass": "picograms", + "distance": "micrometers", + "time": "microseconds", + "energy": "picogram-micrometer^2/microsecond^2", + "velocity": "micrometers/microsecond", + "force": "picogram-micrometer/microsecond^2", + "torque": "picogram-micrometer^2/microsecond^2", + "temperature": "Kelvin", + "pressure": "picogram/(micrometer-microsecond^2)", + "dynamic_viscosity": "picogram/(micrometer-microsecond)", + "charge": "picocoulombs", # (1.6021765e-7 is a proton) + "dipole": "picocoulomb-micrometer", + "electric field": "volt/micrometer", + "density": "picograms/micrometer^dim", }, - 'nano': { - 'mass': 'attograms', - 'distance': 'nanometers', - 'time': 'nanoseconds', - 'energy': 'attogram-nanometer^2/nanosecond^2', - 'velocity': 'nanometers/nanosecond', - 'force': 'attogram-nanometer/nanosecond^2', - 'torque': 'attogram-nanometer^2/nanosecond^2', - 'temperature': 'Kelvin', - 'pressure': 'attogram/(nanometer-nanosecond^2)', - 'dynamic_viscosity': 'attogram/(nanometer-nanosecond)', - 'charge': 'e', # multiple of electron charge (1.0 is a proton) - 'dipole': 'charge-nanometer', - 'electric_field': 'volt/nanometer', - 'density': 'attograms/nanometer^dim', + "nano": { + "mass": "attograms", + "distance": "nanometers", + "time": "nanoseconds", + "energy": "attogram-nanometer^2/nanosecond^2", + "velocity": "nanometers/nanosecond", + "force": "attogram-nanometer/nanosecond^2", + "torque": "attogram-nanometer^2/nanosecond^2", + "temperature": "Kelvin", + "pressure": "attogram/(nanometer-nanosecond^2)", + "dynamic_viscosity": "attogram/(nanometer-nanosecond)", + "charge": "e", # multiple of electron charge (1.0 is a proton) + "dipole": "charge-nanometer", + "electric_field": "volt/nanometer", + "density": "attograms/nanometer^dim", }, } out_dict = {} @@ -349,17 +345,17 @@ def convert_units(value, style, unit_type, out_units): :rtype: float """ conversion = { - 'seconds': 1, - 'milliseconds': 1e-3, - 'microseconds': 1e-6, - 'nanoseconds': 1e-9, - 'picoseconds': 1e-12, - 'femtoseconds': 1e-15, + "seconds": 1, + "milliseconds": 1e-3, + "microseconds": 1e-6, + "nanoseconds": 1e-9, + "picoseconds": 1e-12, + "femtoseconds": 1e-15, } - if unit_type != 'time' or out_units not in conversion: + if unit_type != "time" or out_units not in conversion: # TODO use https://pint.readthedocs.io raise NotImplementedError - in_units = get_units_dict(style, [unit_type], '')[unit_type] + in_units = get_units_dict(style, [unit_type], "")[unit_type] return value * conversion[in_units] * (1.0 / conversion[out_units]) @@ -372,12 +368,12 @@ def parse_quasiparticle_data(qp_file: str) -> dict: :rtype: dict """ - with open(qp_file, 'r') as handle: + with open(qp_file, "r") as handle: quasiparticle_data = yaml.load(handle) data_dict = {} for i, data in enumerate(quasiparticle_data): - data_dict[f'q_point_{i}'] = data + data_dict[f"q_point_{i}"] = data return data_dict @@ -393,57 +389,58 @@ def parse_dynaphopy_output(filename: str) -> dict: # pylint: disable=too-many-locals thermal_properties = None - with open(filename, 'r') as handle: + with open(filename, "r") as handle: data_lines = handle.readlines() indices = [] q_points = [] for i, line in enumerate(data_lines): - if 'Q-point' in line: + if "Q-point" in line: indices.append(i) q_points.append( np.array( - line.replace(']', '').replace('[', '').split()[4:8], + line.replace("]", "").replace("[", "").split()[4:8], dtype=float, - )) + ) + ) indices.append(len(data_lines)) phonons = {} for i, _ in enumerate(indices[:-1]): - fragment = data_lines[indices[i]:indices[i + 1]] - if 'kipped' in fragment: + fragment = data_lines[indices[i] : indices[i + 1]] + if "kipped" in fragment: continue phonon_modes = {} for j, line in enumerate(fragment): - if 'Peak' in line: + if "Peak" in line: number = line.split()[2] phonon_mode = { - 'width': float(fragment[j + 2].split()[1]), - 'positions': float(fragment[j + 3].split()[1]), - 'shift': float(fragment[j + 12].split()[2]), + "width": float(fragment[j + 2].split()[1]), + "positions": float(fragment[j + 3].split()[1]), + "shift": float(fragment[j + 12].split()[2]), } phonon_modes.update({number: phonon_mode}) - if 'Thermal' in line: + if "Thermal" in line: free_energy = float(fragment[j + 4].split()[4]) entropy = float(fragment[j + 5].split()[3]) specific_heat = float(fragment[j + 6].split()[3]) total_energy = float(fragment[j + 7].split()[4]) - temperature = float(fragment[j].split()[5].replace('(', '')) + temperature = float(fragment[j].split()[5].replace("(", "")) thermal_properties = { - 'temperature': temperature, - 'free_energy': free_energy, - 'entropy': entropy, - 'cv': specific_heat, - 'total_energy': total_energy, + "temperature": temperature, + "free_energy": free_energy, + "entropy": entropy, + "cv": specific_heat, + "total_energy": total_energy, } - phonon_modes.update({'q_point': q_points[i].tolist()}) + phonon_modes.update({"q_point": q_points[i].tolist()}) - phonons.update({'wave_vector_' + str(i): phonon_modes}) + phonons.update({"wave_vector_" + str(i): phonon_modes}) return thermal_properties diff --git a/aiida_lammps/common/reaxff_convert.py b/aiida_lammps/common/reaxff_convert.py index 06e6717..206c9b3 100644 --- a/aiida_lammps/common/reaxff_convert.py +++ b/aiida_lammps/common/reaxff_convert.py @@ -8,165 +8,165 @@ from aiida_lammps.validation import validate_against_schema -INDEX_SEP = '-' +INDEX_SEP = "-" KEYS_GLOBAL = ( - 'reaxff0_boc1', - 'reaxff0_boc2', - 'reaxff3_coa2', - 'Triple bond stabilisation 1', - 'Triple bond stabilisation 2', - 'C2-correction', - 'reaxff0_ovun6', - 'Triple bond stabilisation', - 'reaxff0_ovun7', - 'reaxff0_ovun8', - 'Triple bond stabilization energy', - 'Lower Taper-radius', - 'Upper Taper-radius', - 'reaxff2_pen2', - 'reaxff0_val7', - 'reaxff0_lp1', - 'reaxff0_val9', - 'reaxff0_val10', - 'Not used 2', - 'reaxff0_pen2', - 'reaxff0_pen3', - 'reaxff0_pen4', - 'Not used 3', - 'reaxff0_tor2', - 'reaxff0_tor3', - 'reaxff0_tor4', - 'Not used 4', - 'reaxff0_cot2', - 'reaxff0_vdw1', - 'bond order cutoff', - 'reaxff3_coa4', - 'reaxff0_ovun4', - 'reaxff0_ovun3', - 'reaxff0_val8', - 'Not used 5', - 'Not used 6', - 'Not used 7', - 'Not used 8', - 'reaxff3_coa3', + "reaxff0_boc1", + "reaxff0_boc2", + "reaxff3_coa2", + "Triple bond stabilisation 1", + "Triple bond stabilisation 2", + "C2-correction", + "reaxff0_ovun6", + "Triple bond stabilisation", + "reaxff0_ovun7", + "reaxff0_ovun8", + "Triple bond stabilization energy", + "Lower Taper-radius", + "Upper Taper-radius", + "reaxff2_pen2", + "reaxff0_val7", + "reaxff0_lp1", + "reaxff0_val9", + "reaxff0_val10", + "Not used 2", + "reaxff0_pen2", + "reaxff0_pen3", + "reaxff0_pen4", + "Not used 3", + "reaxff0_tor2", + "reaxff0_tor3", + "reaxff0_tor4", + "Not used 4", + "reaxff0_cot2", + "reaxff0_vdw1", + "bond order cutoff", + "reaxff3_coa4", + "reaxff0_ovun4", + "reaxff0_ovun3", + "reaxff0_val8", + "Not used 5", + "Not used 6", + "Not used 7", + "Not used 8", + "reaxff3_coa3", ) # TODO some variables lammps sets as global are actually species dependant # in GULP, how to handle these? KEYS_1BODY = ( - 'reaxff1_radii1', - 'reaxff1_valence1', - 'mass', - 'reaxff1_morse3', - 'reaxff1_morse2', - 'reaxff_gamma', - 'reaxff1_radii2', - 'reaxff1_valence3', - 'reaxff1_morse1', - 'reaxff1_morse4', - 'reaxff1_valence4', - 'reaxff1_under', - 'dummy1', - 'reaxff_chi', - 'reaxff_mu', - 'dummy2', - 'reaxff1_radii3', - 'reaxff1_lonepair2', - 'dummy3', - 'reaxff1_over2', - 'reaxff1_over1', - 'reaxff1_over3', - 'dummy4', - 'dummy5', - 'reaxff1_over4', - 'reaxff1_angle1', - 'dummy11', - 'reaxff1_valence2', - 'reaxff1_angle2', - 'dummy6', - 'dummy7', - 'dummy8', + "reaxff1_radii1", + "reaxff1_valence1", + "mass", + "reaxff1_morse3", + "reaxff1_morse2", + "reaxff_gamma", + "reaxff1_radii2", + "reaxff1_valence3", + "reaxff1_morse1", + "reaxff1_morse4", + "reaxff1_valence4", + "reaxff1_under", + "dummy1", + "reaxff_chi", + "reaxff_mu", + "dummy2", + "reaxff1_radii3", + "reaxff1_lonepair2", + "dummy3", + "reaxff1_over2", + "reaxff1_over1", + "reaxff1_over3", + "dummy4", + "dummy5", + "reaxff1_over4", + "reaxff1_angle1", + "dummy11", + "reaxff1_valence2", + "reaxff1_angle2", + "dummy6", + "dummy7", + "dummy8", ) KEYS_2BODY_BONDS = ( - 'reaxff2_bond1', - 'reaxff2_bond2', - 'reaxff2_bond3', - 'reaxff2_bond4', - 'reaxff2_bo5', - 'reaxff2_bo7', - 'reaxff2_bo6', - 'reaxff2_over', - 'reaxff2_bond5', - 'reaxff2_bo3', - 'reaxff2_bo4', - 'dummy1', - 'reaxff2_bo1', - 'reaxff2_bo2', - 'reaxff2_bo8', - 'reaxff2_pen1', + "reaxff2_bond1", + "reaxff2_bond2", + "reaxff2_bond3", + "reaxff2_bond4", + "reaxff2_bo5", + "reaxff2_bo7", + "reaxff2_bo6", + "reaxff2_over", + "reaxff2_bond5", + "reaxff2_bo3", + "reaxff2_bo4", + "dummy1", + "reaxff2_bo1", + "reaxff2_bo2", + "reaxff2_bo8", + "reaxff2_pen1", ) KEYS_2BODY_OFFDIAG = [ - 'reaxff2_morse1', - 'reaxff2_morse3', - 'reaxff2_morse2', - 'reaxff2_morse4', - 'reaxff2_morse5', - 'reaxff2_morse6', + "reaxff2_morse1", + "reaxff2_morse3", + "reaxff2_morse2", + "reaxff2_morse4", + "reaxff2_morse5", + "reaxff2_morse6", ] KEYS_3BODY_ANGLES = ( - 'reaxff3_angle1', - 'reaxff3_angle2', - 'reaxff3_angle3', - 'reaxff3_coa1', - 'reaxff3_angle5', - 'reaxff3_penalty', - 'reaxff3_angle4', + "reaxff3_angle1", + "reaxff3_angle2", + "reaxff3_angle3", + "reaxff3_coa1", + "reaxff3_angle5", + "reaxff3_penalty", + "reaxff3_angle4", ) KEYS_3BODY_HBOND = ( - 'reaxff3_hbond1', - 'reaxff3_hbond2', - 'reaxff3_hbond3', - 'reaxff3_hbond4', + "reaxff3_hbond1", + "reaxff3_hbond2", + "reaxff3_hbond3", + "reaxff3_hbond4", ) KEYS_4BODY_TORSION = ( - 'reaxff4_torsion1', - 'reaxff4_torsion2', - 'reaxff4_torsion3', - 'reaxff4_torsion4', - 'reaxff4_torsion5', - 'dummy1', - 'dummy2', + "reaxff4_torsion1", + "reaxff4_torsion2", + "reaxff4_torsion3", + "reaxff4_torsion4", + "reaxff4_torsion5", + "dummy1", + "dummy2", ) DEFAULT_TOLERANCES = ( # ReaxFF angle/torsion bond order threshold, # for bond orders in valence, penalty and 3-body conjugation # GULP default: 0.001 - ('anglemin', 0.001), + ("anglemin", 0.001), # ReaxFF bond order double product threshold, # for the product of bond orders (1-2 x 2-3, where 2 = pivot) # Hard coded to 0.001 in original code, but this leads to discontinuities # GULP default: 0.000001 - ('angleprod', 0.00001), + ("angleprod", 0.00001), # ReaxFF hydrogen-bond bond order threshold # Hard coded to 0.01 in original code. # GULP default: 0.01 - ('hbondmin', 0.01), + ("hbondmin", 0.01), # ReaxFF H-bond cutoff # Hard coded to 7.5 Ang in original code. # GULP default: 7.5 - ('hbonddist', 7.5), + ("hbonddist", 7.5), # ReaxFF bond order triple product threshold, # for the product of bond orders (1-2 x 2-3 x 3-4) # GULP default: 0.000000001 - ('torsionprod', 0.00001), + ("torsionprod", 0.00001), ) @@ -200,10 +200,9 @@ def split_numbers(string): [0.001, -2.0] """ - _match_number = re.compile( - '-?\\ *[0-9]+\\.?[0-9]*(?:[Ee]\\ *[+-]?\\ *[0-9]+)?') - string = string.replace(' .', ' 0.') - string = string.replace('-.', '-0.') + _match_number = re.compile("-?\\ *[0-9]+\\.?[0-9]*(?:[Ee]\\ *[+-]?\\ *[0-9]+)?") + string = string.replace(" .", " 0.") + string = string.replace("-.", "-0.") return [float(s) for s in re.findall(_match_number, string)] @@ -226,33 +225,31 @@ def read_lammps_format(lines, tolerances=None): """ # pylint: disable=too-many-locals, too-many-branches, too-many-statements output = { - 'description': lines[0], - 'global': {}, - 'species': ['X core'], # X is always first - '1body': {}, - '2body': {}, - '3body': {}, - '4body': {}, + "description": lines[0], + "global": {}, + "species": ["X core"], # X is always first + "1body": {}, + "2body": {}, + "3body": {}, + "4body": {}, } lineno = 1 # Global parameters if lines[lineno].split()[0] != str(len(KEYS_GLOBAL)): - raise IOError('Expecting {} global parameters'.format( - len(KEYS_GLOBAL))) + raise IOError("Expecting {} global parameters".format(len(KEYS_GLOBAL))) for key in KEYS_GLOBAL: lineno += 1 - output['global'][key] = float(lines[lineno].split()[0]) + output["global"][key] = float(lines[lineno].split()[0]) - output['global'][ - 'reaxff2_pen3'] = 1.0 # this is not provided by lammps, but is used by GULP + output["global"][ + "reaxff2_pen3" + ] = 1.0 # this is not provided by lammps, but is used by GULP tolerances = tolerances or {} - output['global'].update( - {k: tolerances.get(k, v) - for k, v in DEFAULT_TOLERANCES}) + output["global"].update({k: tolerances.get(k, v) for k, v in DEFAULT_TOLERANCES}) # one-body parameters lineno += 1 @@ -262,12 +259,12 @@ def read_lammps_format(lines, tolerances=None): for _ in range(num_species): lineno += 1 symbol, values = lines[lineno].split(None, 1) - if symbol == 'X': + if symbol == "X": species_idx = 0 # the X symbol is always assigned index 0 else: species_idx = idx idx += 1 - output['species'].append(symbol + ' core') + output["species"].append(symbol + " core") values = split_numbers(values) for _ in range(3): lineno += 1 @@ -275,36 +272,41 @@ def read_lammps_format(lines, tolerances=None): if len(values) != len(KEYS_1BODY): raise Exception( - 'number of values different than expected for species {0}, ' - '{1} != {2}'.format(symbol, len(values), len(KEYS_1BODY))) + "number of values different than expected for species {0}, " + "{1} != {2}".format(symbol, len(values), len(KEYS_1BODY)) + ) - key_map = {k: v for k, v in zip(KEYS_1BODY, values)} # pylint: disable=unnecessary-comprehension - key_map['reaxff1_lonepair1'] = 0.5 * (key_map['reaxff1_valence3'] - - key_map['reaxff1_valence1']) + key_map = { + k: v for k, v in zip(KEYS_1BODY, values) + } # pylint: disable=unnecessary-comprehension + key_map["reaxff1_lonepair1"] = 0.5 * ( + key_map["reaxff1_valence3"] - key_map["reaxff1_valence1"] + ) - output['1body'][str(species_idx)] = key_map + output["1body"][str(species_idx)] = key_map # two-body bond parameters lineno += 1 num_lines = int(lines[lineno].split()[0]) lineno += 2 for _ in range(num_lines): - values = split_numbers(lines[lineno]) + split_numbers( - lines[lineno + 1]) + values = split_numbers(lines[lineno]) + split_numbers(lines[lineno + 1]) species_idx1 = int(values.pop(0)) species_idx2 = int(values.pop(0)) - key_name = '{}-{}'.format(species_idx1, species_idx2) + key_name = "{}-{}".format(species_idx1, species_idx2) lineno += 2 if len(values) != len(KEYS_2BODY_BONDS): raise Exception( - 'number of bond values different than expected for key {0}, ' - '{1} != {2}'.format(key_name, len(values), - len(KEYS_2BODY_BONDS))) + "number of bond values different than expected for key {0}, " + "{1} != {2}".format(key_name, len(values), len(KEYS_2BODY_BONDS)) + ) - output['2body'][key_name] = { + output["2body"][key_name] = { k: v - for k, v in zip(KEYS_2BODY_BONDS, values) # pylint: disable=unnecessary-comprehension + for k, v in zip( + KEYS_2BODY_BONDS, values + ) # pylint: disable=unnecessary-comprehension } # two-body off-diagonal parameters @@ -314,18 +316,20 @@ def read_lammps_format(lines, tolerances=None): values = split_numbers(lines[lineno]) species_idx1 = int(values.pop(0)) species_idx2 = int(values.pop(0)) - key_name = '{}-{}'.format(species_idx1, species_idx2) + key_name = "{}-{}".format(species_idx1, species_idx2) lineno += 1 if len(values) != len(KEYS_2BODY_OFFDIAG): raise Exception( - 'number of off-diagonal values different than expected for key {0} (line {1}), ' - '{2} != {3}'.format(key_name, lineno - 1, len(values), - len(KEYS_2BODY_OFFDIAG))) + "number of off-diagonal values different than expected for key {0} (line {1}), " + "{2} != {3}".format( + key_name, lineno - 1, len(values), len(KEYS_2BODY_OFFDIAG) + ) + ) - output['2body'].setdefault(key_name, {}).update( - {k: v - for k, v in zip(KEYS_2BODY_OFFDIAG, values)}) # pylint: disable=unnecessary-comprehension + output["2body"].setdefault(key_name, {}).update( + {k: v for k, v in zip(KEYS_2BODY_OFFDIAG, values)} + ) # pylint: disable=unnecessary-comprehension # three-body angle parameters num_lines = int(lines[lineno].split()[0]) @@ -335,18 +339,20 @@ def read_lammps_format(lines, tolerances=None): species_idx1 = int(values.pop(0)) species_idx2 = int(values.pop(0)) species_idx3 = int(values.pop(0)) - key_name = '{}-{}-{}'.format(species_idx1, species_idx2, species_idx3) + key_name = "{}-{}-{}".format(species_idx1, species_idx2, species_idx3) lineno += 1 if len(values) != len(KEYS_3BODY_ANGLES): raise Exception( - 'number of angle values different than expected for key {0} (line {1}), ' - '{2} != {3}'.format(key_name, lineno - 1, len(values), - len(KEYS_3BODY_ANGLES))) + "number of angle values different than expected for key {0} (line {1}), " + "{2} != {3}".format( + key_name, lineno - 1, len(values), len(KEYS_3BODY_ANGLES) + ) + ) - output['3body'].setdefault(key_name, {}).update( - {k: v - for k, v in zip(KEYS_3BODY_ANGLES, values)}) # pylint: disable=unnecessary-comprehension + output["3body"].setdefault(key_name, {}).update( + {k: v for k, v in zip(KEYS_3BODY_ANGLES, values)} + ) # pylint: disable=unnecessary-comprehension # four-body torsion parameters num_lines = int(lines[lineno].split()[0]) @@ -357,19 +363,22 @@ def read_lammps_format(lines, tolerances=None): species_idx2 = int(values.pop(0)) species_idx3 = int(values.pop(0)) species_idx4 = int(values.pop(0)) - key_name = '{}-{}-{}-{}'.format(species_idx1, species_idx2, - species_idx3, species_idx4) + key_name = "{}-{}-{}-{}".format( + species_idx1, species_idx2, species_idx3, species_idx4 + ) lineno += 1 if len(values) != len(KEYS_4BODY_TORSION): raise Exception( - 'number of torsion values different than expected for key {0} (line {1}), ' - '{2} != {3}'.format(key_name, lineno - 1, len(values), - len(KEYS_4BODY_TORSION))) + "number of torsion values different than expected for key {0} (line {1}), " + "{2} != {3}".format( + key_name, lineno - 1, len(values), len(KEYS_4BODY_TORSION) + ) + ) - output['4body'].setdefault(key_name, {}).update( - {k: v - for k, v in zip(KEYS_4BODY_TORSION, values)}) # pylint: disable=unnecessary-comprehension + output["4body"].setdefault(key_name, {}).update( + {k: v for k, v in zip(KEYS_4BODY_TORSION, values)} + ) # pylint: disable=unnecessary-comprehension # three-body h-bond parameters num_lines = int(lines[lineno].split()[0]) @@ -379,18 +388,20 @@ def read_lammps_format(lines, tolerances=None): species_idx1 = int(values.pop(0)) species_idx2 = int(values.pop(0)) species_idx3 = int(values.pop(0)) - key_name = '{}-{}-{}'.format(species_idx1, species_idx2, species_idx3) + key_name = "{}-{}-{}".format(species_idx1, species_idx2, species_idx3) lineno += 1 if len(values) != len(KEYS_3BODY_HBOND): raise Exception( - 'number of h-bond values different than expected for key {0} (line {1}), ' - '{2} != {3}'.format(key_name, lineno - 1, len(values), - len(KEYS_3BODY_HBOND))) + "number of h-bond values different than expected for key {0} (line {1}), " + "{2} != {3}".format( + key_name, lineno - 1, len(values), len(KEYS_3BODY_HBOND) + ) + ) - output['3body'].setdefault(key_name, {}).update( - {k: v - for k, v in zip(KEYS_3BODY_HBOND, values)}) # pylint: disable=unnecessary-comprehension + output["3body"].setdefault(key_name, {}).update( + {k: v for k, v in zip(KEYS_3BODY_HBOND, values)} + ) # pylint: disable=unnecessary-comprehension return output @@ -403,65 +414,80 @@ def format_lammps_value(value): :return: formatter value :rtype: str """ - return '{:.4f}'.format(value) + return "{:.4f}".format(value) def write_lammps_format(data): """Write a reaxff file, in lammps format, from a standardized potential dictionary.""" # pylint: disable=too-many-branches, too-many-statements # validate dictionary - validate_against_schema(data, 'reaxff.schema.json') + validate_against_schema(data, "reaxff.schema.json") - output = [data['description']] + output = [data["description"]] # Global parameters - output.append('{} ! Number of general parameters'.format(len(KEYS_GLOBAL))) + output.append("{} ! Number of general parameters".format(len(KEYS_GLOBAL))) for key in KEYS_GLOBAL: - output.append('{0:.4f} ! {1}'.format(data['global'][key], key)) + output.append("{0:.4f} ! {1}".format(data["global"][key], key)) # one-body parameters - output.extend([ - '{0} ! Nr of atoms; cov.r; valency;a.m;Rvdw;Evdw;gammaEEM;cov.r2;#'. - format(len(data['species'])), - 'alfa;gammavdW;valency;Eunder;Eover;chiEEM;etaEEM;n.u.', - 'cov r3;Elp;Heat inc.;n.u.;n.u.;n.u.;n.u.', - 'ov/un;val1;n.u.;val3,vval4', - ]) + output.extend( + [ + "{0} ! Nr of atoms; cov.r; valency;a.m;Rvdw;Evdw;gammaEEM;cov.r2;#".format( + len(data["species"]) + ), + "alfa;gammavdW;valency;Eunder;Eover;chiEEM;etaEEM;n.u.", + "cov r3;Elp;Heat inc.;n.u.;n.u.;n.u.;n.u.", + "ov/un;val1;n.u.;val3,vval4", + ] + ) idx_map = {} i = 1 x_species_line = None - for idx, species in enumerate(data['species']): - if species.endswith('shell'): + for idx, species in enumerate(data["species"]): + if species.endswith("shell"): raise ValueError( - 'only core species can be used for reaxff, not shell: {}'. - format(species)) + "only core species can be used for reaxff, not shell: {}".format( + species + ) + ) species = species[:-5] # X is not always present in 1body, even if it is used in nbody terms # see e.g. https://github.com/lammps/lammps/blob/master/potentials/ffield.reax.cho - if species == 'X' and str(idx) not in data['1body']: + if species == "X" and str(idx) not in data["1body"]: species_lines = [] else: species_lines = [ - species + ' ' + ' '.join([ - format_lammps_value(data['1body'][str(idx)][k]) - for k in KEYS_1BODY[:8] - ]), - ' '.join([ - format_lammps_value(data['1body'][str(idx)][k]) - for k in KEYS_1BODY[8:16] - ]), - ' '.join([ - format_lammps_value(data['1body'][str(idx)][k]) - for k in KEYS_1BODY[16:24] - ]), - ' '.join([ - format_lammps_value(data['1body'][str(idx)][k]) - for k in KEYS_1BODY[24:32] - ]), + species + + " " + + " ".join( + [ + format_lammps_value(data["1body"][str(idx)][k]) + for k in KEYS_1BODY[:8] + ] + ), + " ".join( + [ + format_lammps_value(data["1body"][str(idx)][k]) + for k in KEYS_1BODY[8:16] + ] + ), + " ".join( + [ + format_lammps_value(data["1body"][str(idx)][k]) + for k in KEYS_1BODY[16:24] + ] + ), + " ".join( + [ + format_lammps_value(data["1body"][str(idx)][k]) + for k in KEYS_1BODY[24:32] + ] + ), ] - if species == 'X': + if species == "X": # X is always index 0, but must be last in the species list - idx_map[str(idx)] = '0' + idx_map[str(idx)] = "0" x_species_line = species_lines else: idx_map[str(idx)] = str(i) @@ -472,98 +498,124 @@ def write_lammps_format(data): # two-body angle parameters suboutout = [] - for key in sorted(data['2body']): - subdata = data['2body'][key] + for key in sorted(data["2body"]): + subdata = data["2body"][key] if not set(subdata.keys()).issuperset(KEYS_2BODY_BONDS): continue - suboutout.extend([ - ' '.join([idx_map[k] - for k in key.split(INDEX_SEP)]) + ' ' + ' '.join([ - format_lammps_value(subdata[k]) - for k in KEYS_2BODY_BONDS[:8] - ]), - ' '.join([ - format_lammps_value(subdata[k]) for k in KEYS_2BODY_BONDS[8:16] - ]), - ]) - - output.extend([ - '{0} ! Nr of bonds; Edis1;LPpen;n.u.;pbe1;pbo5;13corr;pbo6'.format( - int(len(suboutout) / 2)), - 'pbe2;pbo3;pbo4;n.u.;pbo1;pbo2;ovcorr', - ] + suboutout) + suboutout.extend( + [ + " ".join([idx_map[k] for k in key.split(INDEX_SEP)]) + + " " + + " ".join( + [format_lammps_value(subdata[k]) for k in KEYS_2BODY_BONDS[:8]] + ), + " ".join( + [format_lammps_value(subdata[k]) for k in KEYS_2BODY_BONDS[8:16]] + ), + ] + ) + + output.extend( + [ + "{0} ! Nr of bonds; Edis1;LPpen;n.u.;pbe1;pbo5;13corr;pbo6".format( + int(len(suboutout) / 2) + ), + "pbe2;pbo3;pbo4;n.u.;pbo1;pbo2;ovcorr", + ] + + suboutout + ) # two-body off-diagonal parameters suboutout = [] - for key in sorted(data['2body']): - subdata = data['2body'][key] + for key in sorted(data["2body"]): + subdata = data["2body"][key] if not set(subdata.keys()).issuperset(KEYS_2BODY_OFFDIAG): continue - suboutout.extend([ - ' '.join([idx_map[k] for k in key.split(INDEX_SEP)]) + ' ' + - ' '.join( - [format_lammps_value(subdata[k]) for k in KEYS_2BODY_OFFDIAG]) - ]) + suboutout.extend( + [ + " ".join([idx_map[k] for k in key.split(INDEX_SEP)]) + + " " + + " ".join( + [format_lammps_value(subdata[k]) for k in KEYS_2BODY_OFFDIAG] + ) + ] + ) - output.extend([ - '{0} ! Nr of off-diagonal terms; Ediss;Ro;gamma;rsigma;rpi;rpi2'. - format(len(suboutout)) - ] + suboutout) + output.extend( + [ + "{0} ! Nr of off-diagonal terms; Ediss;Ro;gamma;rsigma;rpi;rpi2".format( + len(suboutout) + ) + ] + + suboutout + ) # three-body angle parameters suboutout = [] - for key in sorted(data['3body']): - subdata = data['3body'][key] + for key in sorted(data["3body"]): + subdata = data["3body"][key] if not set(subdata.keys()).issuperset(KEYS_3BODY_ANGLES): continue - suboutout.extend([ - ' '.join([idx_map[k] for k in key.split(INDEX_SEP)]) + ' ' + - ' '.join( - [format_lammps_value(subdata[k]) for k in KEYS_3BODY_ANGLES]) - ]) + suboutout.extend( + [ + " ".join([idx_map[k] for k in key.split(INDEX_SEP)]) + + " " + + " ".join([format_lammps_value(subdata[k]) for k in KEYS_3BODY_ANGLES]) + ] + ) - output.extend([ - '{0} ! Nr of angles;at1;at2;at3;Thetao,o;ka;kb;pv1;pv2'.format( - len(suboutout)) - ] + suboutout) + output.extend( + ["{0} ! Nr of angles;at1;at2;at3;Thetao,o;ka;kb;pv1;pv2".format(len(suboutout))] + + suboutout + ) # four-body torsion parameters suboutout = [] - for key in sorted(data['4body']): - subdata = data['4body'][key] + for key in sorted(data["4body"]): + subdata = data["4body"][key] if not set(subdata.keys()).issuperset(KEYS_4BODY_TORSION): continue - suboutout.extend([ - ' '.join([idx_map[k] for k in key.split(INDEX_SEP)]) + ' ' + - ' '.join( - [format_lammps_value(subdata[k]) for k in KEYS_4BODY_TORSION]) - ]) + suboutout.extend( + [ + " ".join([idx_map[k] for k in key.split(INDEX_SEP)]) + + " " + + " ".join( + [format_lammps_value(subdata[k]) for k in KEYS_4BODY_TORSION] + ) + ] + ) - output.extend([ - '{0} ! Nr of torsions;at1;at2;at3;at4;;V1;V2;V3;V2(BO);vconj;n.u;n'. - format(len(suboutout)) - ] + suboutout) + output.extend( + [ + "{0} ! Nr of torsions;at1;at2;at3;at4;;V1;V2;V3;V2(BO);vconj;n.u;n".format( + len(suboutout) + ) + ] + + suboutout + ) # three-body h-bond parameters suboutout = [] - for key in sorted(data['3body']): - subdata = data['3body'][key] + for key in sorted(data["3body"]): + subdata = data["3body"][key] if not set(subdata.keys()).issuperset(KEYS_3BODY_HBOND): continue - suboutout.extend([ - ' '.join([idx_map[k] for k in key.split(INDEX_SEP)]) + ' ' + - ' '.join( - [format_lammps_value(subdata[k]) for k in KEYS_3BODY_HBOND]) - ]) + suboutout.extend( + [ + " ".join([idx_map[k] for k in key.split(INDEX_SEP)]) + + " " + + " ".join([format_lammps_value(subdata[k]) for k in KEYS_3BODY_HBOND]) + ] + ) - output.extend([ - '{0} ! Nr of hydrogen bonds;at1;at2;at3;Rhb;Dehb;vhb1'.format( - len(suboutout)) - ] + suboutout) + output.extend( + ["{0} ! Nr of hydrogen bonds;at1;at2;at3;Rhb;Dehb;vhb1".format(len(suboutout))] + + suboutout + ) - output.append('') + output.append("") - return '\n'.join(output) + return "\n".join(output) def filter_by_species(data, species): @@ -580,21 +632,23 @@ def filter_by_species(data, species): """ species = sorted(list(set(species))) - if not set(species).issubset(data['species']): + if not set(species).issubset(data["species"]): raise AssertionError( - 'the filter set ({}) is not a subset of the available species ({})' - .format(set(species), set(data['species']))) + "the filter set ({}) is not a subset of the available species ({})".format( + set(species), set(data["species"]) + ) + ) data = copy.deepcopy(data) indices = set( # pylint: disable=consider-using-set-comprehension - [str(i) for i, s in enumerate(data['species']) if s in species]) + [str(i) for i, s in enumerate(data["species"]) if s in species] + ) def convert_indices(key): - return INDEX_SEP.join([ - str(species.index(data['species'][int(k)])) - for k in key.split(INDEX_SEP) - ]) + return INDEX_SEP.join( + [str(species.index(data["species"][int(k)])) for k in key.split(INDEX_SEP)] + ) - for key in ['1body', '2body', '3body', '4body']: + for key in ["1body", "2body", "3body", "4body"]: if key not in data: continue data[key] = { @@ -603,6 +657,6 @@ def convert_indices(key): if indices.issuperset(k.split(INDEX_SEP)) } - data['species'] = species + data["species"] = species return data diff --git a/aiida_lammps/common/utils.py b/aiida_lammps/common/utils.py index 48d57b5..e7332ea 100644 --- a/aiida_lammps/common/utils.py +++ b/aiida_lammps/common/utils.py @@ -1,6 +1,7 @@ """Utility functions for the handling of the input files""" from collections.abc import Iterable from datetime import datetime + from dateutil.parser import parse as get_date @@ -13,7 +14,7 @@ def generate_header(value: str) -> str: :return: header/footer for the input block :rtype: str """ - return '#' + value.center(80, '-') + '#\n' + return "#" + value.center(80, "-") + "#\n" def flatten(full_list: list) -> list: @@ -25,8 +26,7 @@ def flatten(full_list: list) -> list: :rtype: list """ for element in full_list: - if isinstance(element, - Iterable) and not isinstance(element, (str, bytes)): + if isinstance(element, Iterable) and not isinstance(element, (str, bytes)): yield from flatten(element) else: yield element @@ -47,14 +47,14 @@ def convert_to_str(value): """convert True/False to yes/no and all values to strings""" if isinstance(value, bool): if value: - return 'yes' - return 'no' + return "yes" + return "no" return str(value) def _convert_values(value): if isinstance(value, (tuple, list)): - return ' '.join([convert_to_str(v) for v in value]) + return " ".join([convert_to_str(v) for v in value]) return convert_to_str(value) @@ -64,10 +64,13 @@ def join_keywords(dct, ignore=None): value can be a single value or a list/tuple of values """ ignore = [] if not ignore else ignore - return ' '.join([ - f'{k} {_convert_values(dct[k])}' for k in sorted(dct.keys()) - if k not in ignore - ]) + return " ".join( + [ + f"{k} {_convert_values(dct[k])}" + for k in sorted(dct.keys()) + if k not in ignore + ] + ) def get_path(dct, path, default=None, raise_error=True): @@ -76,7 +79,7 @@ def get_path(dct, path, default=None, raise_error=True): for i, key in enumerate(path): if not isinstance(subdct, dict) or key not in subdct: if raise_error: - raise KeyError(f'path does not exist in dct: {path[0:i + 1]}') + raise KeyError(f"path does not exist in dct: {path[0:i + 1]}") return default subdct = subdct[key] return subdct diff --git a/aiida_lammps/data/lammps_potential.py b/aiida_lammps/data/lammps_potential.py index 341f27a..9fe2624 100644 --- a/aiida_lammps/data/lammps_potential.py +++ b/aiida_lammps/data/lammps_potential.py @@ -16,16 +16,16 @@ class written by Sebaastian Huber. `schema `_, as to make them more easy to track and as compatible as possible to the KIM schema. """ +import datetime + # pylint: disable=arguments-differ, too-many-public-methods import io +import json import os import pathlib import typing -import json -import datetime -from aiida import orm -from aiida import plugins +from aiida import orm, plugins from aiida.common.constants import elements from aiida.common.exceptions import StoringNotAllowed from aiida.common.files import md5_from_filelike @@ -52,55 +52,35 @@ class written by Sebaastian Huber. """ # pylint: disable=line-too-long # pylint: disable=too-many-arguments, too-many-ancestors - _key_element = 'element' - _key_md5 = 'md5' + _key_element = "element" + _key_md5 = "md5" _schema_file = os.path.join( os.path.dirname(os.path.abspath(__file__)), - 'lammps_potentials.json', + "lammps_potentials.json", ) _extra_keys = { - 'content_origin': { - 'type': str - }, - 'content_other_locations': { - 'type': (str, list) - }, - 'data_method': { - 'type': str, - 'values': ['experiment', 'computation', 'unknown'] - }, - 'description': { - 'type': str - }, - 'developer': { - 'type': (str, list) - }, - 'disclaimer': { - 'type': str - }, - 'generation_method': { - 'type': str - }, - 'properties': { - 'type': (str, list) - }, - 'publication_year': { - 'type': (str, datetime.datetime, int) - }, - 'source_citations': { - 'type': (str, list) - }, - 'title': { - 'type': str + "content_origin": {"type": str}, + "content_other_locations": {"type": (str, list)}, + "data_method": { + "type": str, + "values": ["experiment", "computation", "unknown"], }, + "description": {"type": str}, + "developer": {"type": (str, list)}, + "disclaimer": {"type": str}, + "generation_method": {"type": str}, + "properties": {"type": (str, list)}, + "publication_year": {"type": (str, datetime.datetime, int)}, + "source_citations": {"type": (str, list)}, + "title": {"type": str}, } - with open(_schema_file, 'r') as handler: + with open(_schema_file, "r") as handler: _defaults = json.load(handler) - default_potential_info = _defaults['pair_style'] - default_atom_style_info = _defaults['atom_style'] + default_potential_info = _defaults["pair_style"] + default_atom_style_info = _defaults["atom_style"] @classmethod def get_or_create( @@ -147,7 +127,7 @@ def get_or_create( query.append( cls, subclassing=False, - filters={f'attributes.{cls._key_md5}': md5_from_filelike(source)}, + filters={f"attributes.{cls._key_md5}": md5_from_filelike(source)}, ) existing = query.first() @@ -184,9 +164,9 @@ def is_readable_byte_stream(stream) -> bool: :returns: True if ``stream`` appears to be a readable filelike object in binary mode, False otherwise. """ - return (isinstance(stream, io.BytesIO) - or (hasattr(stream, 'read') and hasattr(stream, 'mode') - and 'b' in stream.mode)) + return isinstance(stream, io.BytesIO) or ( + hasattr(stream, "read") and hasattr(stream, "mode") and "b" in stream.mode + ) @classmethod def prepare_source( @@ -202,15 +182,16 @@ def prepare_source( :raises FileNotFoundError: if the source is a filepath but does not exist. """ if not isinstance( - source, - (str, pathlib.Path)) and not cls.is_readable_byte_stream(source): + source, (str, pathlib.Path) + ) and not cls.is_readable_byte_stream(source): raise TypeError( - '`source` should be a `str` or `pathlib.Path` filepath on ' + - f'disk or a stream of bytes, got: {source}') + "`source` should be a `str` or `pathlib.Path` filepath on " + + f"disk or a stream of bytes, got: {source}" + ) if isinstance(source, (str, pathlib.Path)): filename = pathlib.Path(source).name - with open(source, 'rb') as handle: + with open(source, "rb") as handle: source = io.BytesIO(handle.read()) source.name = filename @@ -222,11 +203,11 @@ def validate_md5(self, md5: str): :param value: the md5 checksum. :raises ValueError: if the md5 does not match that of the currently stored file. """ - with self.open(mode='rb') as handle: + with self.open(mode="rb") as handle: md5_file = md5_from_filelike(handle) if md5 != md5_file: raise ValueError( - f'md5 does not match that of stored file: {md5} != {md5_file}' + f"md5 does not match that of stored file: {md5} != {md5_file}" ) def validate_pair_style(self, pair_style: str): @@ -242,11 +223,10 @@ def validate_pair_style(self, pair_style: str): :raises KeyError: If the `pair_style` is not supported by LAMMPS. """ if pair_style is None: - raise TypeError( - 'The pair_style of the potential must be provided.') + raise TypeError("The pair_style of the potential must be provided.") if pair_style not in self.default_potential_info.keys(): raise KeyError(f'The pair_style "{pair_style}" is not valid') - self.set_attribute('pair_style', pair_style) + self.set_attribute("pair_style", pair_style) def validate_species(self, species: list): """ @@ -260,10 +240,10 @@ def validate_species(self, species: list): :raises TypeError: If the list of species is not provided """ if species is None: - raise TypeError('The species for this potential must be provided.') + raise TypeError("The species for this potential must be provided.") for _specie in species: self.validate_element(_specie) - self.set_attribute('species', species) + self.set_attribute("species", species) def validate_atom_style(self, atom_style: str, pair_style: str): """ @@ -279,10 +259,10 @@ def validate_atom_style(self, atom_style: str, pair_style: str): :raises ValueError: If the `atom_style` is not supported by LAMMPS """ if atom_style is None: - atom_style = self.default_potential_info[pair_style]['atom_style'] + atom_style = self.default_potential_info[pair_style]["atom_style"] if atom_style not in self.default_atom_style_info: raise ValueError(f'The atom_style "{atom_style}" is not valid') - self.set_attribute('atom_style', atom_style) + self.set_attribute("atom_style", atom_style) @classmethod def validate_element(cls, element: str): @@ -291,8 +271,8 @@ def validate_element(cls, element: str): :param element: the symbol of the element following the IUPAC naming standard. :raises ValueError: if the element symbol is invalid. """ - if element not in [values['symbol'] for values in elements.values()]: - raise ValueError(f'`{element}` is not a valid element.') + if element not in [values["symbol"] for values in elements.values()]: + raise ValueError(f"`{element}` is not a valid element.") def validate_units(self, units: str, pair_style: str): """ @@ -308,12 +288,19 @@ def validate_units(self, units: str, pair_style: str): :raises ValueError: If the `units` are not LAMMPS compatible. """ if units is None: - units = self.default_potential_info[pair_style]['units'] + units = self.default_potential_info[pair_style]["units"] if units not in [ - 'si', 'lj', 'real', 'metal', 'cgs', 'electron', 'micro', 'nano' + "si", + "lj", + "real", + "metal", + "cgs", + "electron", + "micro", + "nano", ]: raise ValueError(f'The units "{units}" is not valid') - self.set_attribute('default_units', units) + self.set_attribute("default_units", units) def validate_extra_tags(self, extra_tags: dict): """ @@ -331,8 +318,8 @@ def validate_extra_tags(self, extra_tags: dict): """ for key, value in self._extra_keys.items(): _value = extra_tags.get(key, None) - _types = value.get('type', None) - _values = value.get('values', None) + _types = value.get("type", None) + _values = value.get("values", None) if _value is not None: if not isinstance(_value, _types): raise ValueError( @@ -441,7 +428,7 @@ def atom_style(self) -> str: :return: the default `atomic_style` of this potential :rtype: str """ - return self.get_attribute('atom_style') + return self.get_attribute("atom_style") @property def pair_style(self) -> str: @@ -450,7 +437,7 @@ def pair_style(self) -> str: :return: the `pair_style` of the potential :rtype: str """ - return self.get_attribute('pair_style') + return self.get_attribute("pair_style") @property def species(self) -> list: @@ -458,7 +445,7 @@ def species(self) -> list: :return: The list of chemical species which are contained in this potential. :rtype: list """ - return self.get_attribute('species') + return self.get_attribute("species") @property def default_units(self) -> str: @@ -467,7 +454,7 @@ def default_units(self) -> str: :return: the default units associated with this potential :rtype: str """ - return self.get_attribute('default_units') + return self.get_attribute("default_units") @property def content_origin(self) -> str: @@ -484,7 +471,7 @@ def content_origin(self) -> str: :return: the place where this potential information can be found. :rtype: str """ - return self.get_attribute('content_origin') + return self.get_attribute("content_origin") @property def content_other_locations(self) -> typing.Union[str, list]: @@ -497,7 +484,7 @@ def content_other_locations(self) -> typing.Union[str, list]: :return: other locations where the potential can be found. :rtype: typing.Union[str, list] """ - return self.get_attribute('content_other_locations') + return self.get_attribute("content_other_locations") @property def data_method(self) -> str: @@ -511,7 +498,7 @@ def data_method(self) -> str: :return: data_method used to generate the potential :rtype: str """ - return self.get_attribute('data_method') + return self.get_attribute("data_method") @property def description(self) -> str: @@ -526,7 +513,7 @@ def description(self) -> str: :return: description of the potential :rtype: str """ - return self.get_attribute('description') + return self.get_attribute("description") @property def developer(self) -> typing.Union[str, list]: @@ -542,7 +529,7 @@ def developer(self) -> typing.Union[str, list]: :return: developer information of this potential :rtype: typing.Union[str, list] """ - return self.get_attribute('developer') + return self.get_attribute("developer") @property def disclaimer(self) -> str: @@ -556,7 +543,7 @@ def disclaimer(self) -> str: :return: disclaimer regarding the usage of this potential :rtype: str """ - return self.get_attribute('disclaimer') + return self.get_attribute("disclaimer") @property def properties(self) -> typing.Union[str, list]: @@ -568,7 +555,7 @@ def properties(self) -> typing.Union[str, list]: :return: properties fow which this potential was devised. :rtype: typing.Union[str, list] """ - return self.get_attribute('properties') + return self.get_attribute("properties") @property def publication_year(self) -> typing.Union[str, datetime.datetime, int]: @@ -580,7 +567,7 @@ def publication_year(self) -> typing.Union[str, datetime.datetime, int]: :return: year of publication of this potential :rtype: typing.Union[str, datetime.datetime, int] """ - return self.get_attribute('publication_year') + return self.get_attribute("publication_year") @property def source_citations(self) -> typing.Union[str, list]: @@ -593,7 +580,7 @@ def source_citations(self) -> typing.Union[str, list]: :return: the citation where the potential was originally published. :rtype: typing.Union[str, list]. """ - return self.get_attribute('source_citations') + return self.get_attribute("source_citations") @property def title(self) -> str: @@ -607,7 +594,7 @@ def title(self) -> str: :return: the title of the potential :rtype: str """ - return self.get_attribute('title') + return self.get_attribute("title") @property def md5(self) -> typing.Optional[int]: @@ -627,7 +614,7 @@ def generation_method(self) -> str: :return: the generation method of the potential :rtype: str """ - return self.get_attribute('generation_method') + return self.get_attribute("generation_method") @md5.setter def md5(self, value: str): diff --git a/aiida_lammps/data/pot_plugins/base_plugin.py b/aiida_lammps/data/pot_plugins/base_plugin.py index bdda3c9..c99c4d2 100644 --- a/aiida_lammps/data/pot_plugins/base_plugin.py +++ b/aiida_lammps/data/pot_plugins/base_plugin.py @@ -4,6 +4,7 @@ class PotentialAbstract(abc.ABC): """Abstract class for potential plugins.""" + def __init__(self, data): self.validate_data(data) self.data = data diff --git a/aiida_lammps/data/pot_plugins/eam.py b/aiida_lammps/data/pot_plugins/eam.py index 62ed22d..edd88a9 100644 --- a/aiida_lammps/data/pot_plugins/eam.py +++ b/aiida_lammps/data/pot_plugins/eam.py @@ -6,41 +6,41 @@ class EAM(PotentialAbstract): """Class for creation of EAM potential inputs.""" - potential_fname = 'potential.pot' + potential_fname = "potential.pot" def validate_data(self, data): """Validate the input data.""" # TODO use schema - assert 'file_contents' in data, data - assert 'type' in data, data + assert "file_contents" in data, data + assert "type" in data, data def get_external_content(self): # potential_file = ( # "# Potential file generated by aiida plugin " # "(please check citation in the original file)\n" # ) - potential_file = '' - for line in self.data['file_contents']: - potential_file += f'{line}' + potential_file = "" + for line in self.data["file_contents"]: + potential_file += f"{line}" return {self.potential_fname: potential_file} def get_input_potential_lines(self): # pylint: disable=arguments-differ lammps_input_text = f'pair_style eam/{self.data["type"]}\n' - lammps_input_text += f'pair_coeff * * {self.potential_fname} ' - lammps_input_text += '{kind_symbols}\n' + lammps_input_text += f"pair_coeff * * {self.potential_fname} " + lammps_input_text += "{kind_symbols}\n" return lammps_input_text @property def allowed_element_names(self): - return self.data.get('element_names', None) + return self.data.get("element_names", None) @property def atom_style(self): - return 'atomic' + return "atomic" @property def default_units(self): - return 'metal' + return "metal" diff --git a/aiida_lammps/data/pot_plugins/lennard_jones.py b/aiida_lammps/data/pot_plugins/lennard_jones.py index 8b05fd5..1b3cf0b 100644 --- a/aiida_lammps/data/pot_plugins/lennard_jones.py +++ b/aiida_lammps/data/pot_plugins/lennard_jones.py @@ -1,11 +1,13 @@ """Class for creation of Lennard-Jones potential inputs.""" # pylint: disable=fixme import numpy as np + from aiida_lammps.data.pot_plugins.base_plugin import PotentialAbstract class LennardJones(PotentialAbstract): """Class for creation of Lennard-Jones potential inputs.""" + def validate_data(self, data): """Validate the input data.""" # pylint: disable=unnecessary-pass @@ -18,12 +20,12 @@ def get_input_potential_lines(self): # pylint: disable=arguments-differ cut = np.max([float(i.split()[2]) for i in self.data.values()]) - lammps_input_text = f'pair_style lj/cut {cut}\n' + lammps_input_text = f"pair_style lj/cut {cut}\n" # TODO how to map kinds to pair coefficient for lj? for key in sorted(self.data.keys()): - lammps_input_text += f'pair_coeff {key} {self.data[key]}\n' + lammps_input_text += f"pair_coeff {key} {self.data[key]}\n" return lammps_input_text @property @@ -32,8 +34,8 @@ def allowed_element_names(self): @property def atom_style(self): - return 'atomic' + return "atomic" @property def default_units(self): - return 'metal' + return "metal" diff --git a/aiida_lammps/data/pot_plugins/reaxff.py b/aiida_lammps/data/pot_plugins/reaxff.py index 404ae5d..74ff00f 100644 --- a/aiida_lammps/data/pot_plugins/reaxff.py +++ b/aiida_lammps/data/pot_plugins/reaxff.py @@ -30,12 +30,12 @@ class Reaxff(PotentialAbstract): """ - potential_fname = 'potential.pot' - control_fname = 'potential.control' + potential_fname = "potential.pot" + control_fname = "potential.control" def validate_data(self, data): """Validate the input data.""" - validate_against_schema(data, 'reaxff.schema.json') + validate_against_schema(data, "reaxff.schema.json") def get_potential_file_content(self): """Get the data from the potential file @@ -43,10 +43,10 @@ def get_potential_file_content(self): :return: reaxff potential file content :rtype: str """ - if 'file_contents' in self.data: - content = '' - for line in self.data['file_contents']: - content += f'{line}' + if "file_contents" in self.data: + content = "" + for line in self.data["file_contents"]: + content += f"{line}" else: content = write_lammps_format(self.data) return content @@ -57,48 +57,48 @@ def get_control_file_content(self): :return: text information from the control file :rtype: str """ - control = self.data.get('control', {}) - global_dict = self.data.get('global', {}) + control = self.data.get("control", {}) + global_dict = self.data.get("global", {}) content = [] tolerances = { - 'hbonddist': 'hbond_cutoff', - 'nbrhood_cutoff': 'nbrhood_cutoff', - 'anglemin': 'thb_cutoff', - 'angleprod': 'thb_cutoff_sq', + "hbonddist": "hbond_cutoff", + "nbrhood_cutoff": "nbrhood_cutoff", + "anglemin": "thb_cutoff", + "angleprod": "thb_cutoff_sq", } for key, name in tolerances.items(): if key in global_dict: - content.append(f'{name} {global_dict[key]}') + content.append(f"{name} {global_dict[key]}") control_variables = [ - 'simulation_name', - 'traj_title', - 'tabulate_long_range', - 'energy_update_freq', - 'write_freq', - 'bond_graph_cutoff', + "simulation_name", + "traj_title", + "tabulate_long_range", + "energy_update_freq", + "write_freq", + "bond_graph_cutoff", ] for name in control_variables: if name in control: - content.append(f'{name} {control[name]}') + content.append(f"{name} {control[name]}") bool_to_int = { - 'print_atom_info': 'atom_info', - 'print_atom_forces': 'atom_forces', - 'print_atom_velocities': 'atom_velocities', - 'print_bond_info': 'bond_info', - 'print_angle_info': 'angle_info', + "print_atom_info": "atom_info", + "print_atom_forces": "atom_forces", + "print_atom_velocities": "atom_velocities", + "print_bond_info": "bond_info", + "print_angle_info": "angle_info", } for key, name in bool_to_int.items(): if key in control: - content.append(f'{name} {1 if control[key] else 0}') + content.append(f"{name} {1 if control[key] else 0}") if content: - return '\n'.join(content) + return "\n".join(content) return None def get_external_content(self): @@ -120,29 +120,33 @@ def get_input_potential_lines(self): # pylint: disable=arguments-differ :return: lammps input text :rtype: str """ - control = self.data.get('control', {}) + control = self.data.get("control", {}) - lammps_input_text = 'pair_style reax/c ' - lammps_input_text += f'{self.control_fname if self.get_control_file_content() else "NULL"} ' - if 'safezone' in control: + lammps_input_text = "pair_style reax/c " + lammps_input_text += ( + f'{self.control_fname if self.get_control_file_content() else "NULL"} ' + ) + if "safezone" in control: lammps_input_text += f'safezone {control["safezone"]} ' - lammps_input_text += '\n' - lammps_input_text += f'pair_coeff * * {self.potential_fname} {{kind_symbols}}\n' - lammps_input_text += 'fix qeq all qeq/reax 1 0.0 10.0 1e-6 reax/c\n' - if control.get('fix_modify_qeq', True): + lammps_input_text += "\n" + lammps_input_text += ( + f"pair_coeff * * {self.potential_fname} {{kind_symbols}}\n" + ) + lammps_input_text += "fix qeq all qeq/reax 1 0.0 10.0 1e-6 reax/c\n" + if control.get("fix_modify_qeq", True): # TODO #15 in conda-forge/osx-64::lammps-2019.06.05-py36_openmpi_5, # an error is raised: ERROR: Illegal fix_modify command (src/fix.cpp:147) # posted question to lammps-users@lists.sourceforge.net # 'Using qeq/reax fix_modify energy in recent versions of LAMMPS' # lammps_input_text += "fix_modify qeq energy yes\n" pass - lammps_input_text += 'compute reax all pair reax/c\n' + lammps_input_text += "compute reax all pair reax/c\n" return lammps_input_text @property def allowed_element_names(self): - elements = self.data.get('species', None) + elements = self.data.get("species", None) if elements: # strip core/shell elements = [e.split()[0] for e in elements] @@ -150,8 +154,8 @@ def allowed_element_names(self): @property def atom_style(self): - return 'charge' + return "charge" @property def default_units(self): - return 'real' + return "real" diff --git a/aiida_lammps/data/pot_plugins/tersoff.py b/aiida_lammps/data/pot_plugins/tersoff.py index d0f1134..b8eb129 100644 --- a/aiida_lammps/data/pot_plugins/tersoff.py +++ b/aiida_lammps/data/pot_plugins/tersoff.py @@ -5,7 +5,7 @@ class Tersoff(PotentialAbstract): """Class for creation of Tersoff potential inputs.""" - potential_fname = 'potential.pot' + potential_fname = "potential.pot" def validate_data(self, data): """Validate the input data.""" @@ -13,18 +13,20 @@ def validate_data(self, data): pass def get_external_content(self): - potential_file = ('# Potential file generated by aiida plugin ' - '(please check citation in the original file)\n') + potential_file = ( + "# Potential file generated by aiida plugin " + "(please check citation in the original file)\n" + ) for key in sorted(self.data.keys()): - potential_file += f'{key} {self.data[key]}\n' + potential_file += f"{key} {self.data[key]}\n" return {self.potential_fname: potential_file} def get_input_potential_lines(self): # pylint: disable=arguments-differ - lammps_input_text = 'pair_style tersoff\n' - lammps_input_text += f'pair_coeff * * {self.potential_fname} ' - lammps_input_text += '{kind_symbols}\n' + lammps_input_text = "pair_style tersoff\n" + lammps_input_text += f"pair_coeff * * {self.potential_fname} " + lammps_input_text += "{kind_symbols}\n" return lammps_input_text @@ -37,8 +39,8 @@ def allowed_element_names(self): @property def atom_style(self): - return 'atomic' + return "atomic" @property def default_units(self): - return 'metal' + return "metal" diff --git a/aiida_lammps/data/potential.py b/aiida_lammps/data/potential.py index 958fb1b..46b90fb 100644 --- a/aiida_lammps/data/potential.py +++ b/aiida_lammps/data/potential.py @@ -12,8 +12,8 @@ class EmpiricalPotential(Data): Store the empirical potential data """ - entry_name = 'lammps.potentials' - pot_lines_fname = 'potential_lines.txt' + entry_name = "lammps.potentials" + pot_lines_fname = "potential_lines.txt" @classmethod def list_types(cls): @@ -49,8 +49,7 @@ def set_data(self, potential_type, data=None): if potential_type is None: raise ValueError('"potential_type" must be provided') if potential_type not in self.list_types(): - raise ValueError( - f'"potential_type" must be in: {self.list_types()}') + raise ValueError(f'"potential_type" must be in: {self.list_types()}') pot_class = self.load_type(potential_type)(data or {}) atom_style = pot_class.atom_style @@ -60,31 +59,32 @@ def set_data(self, potential_type, data=None): external_contents = pot_class.get_external_content() or {} pot_lines = pot_class.get_input_potential_lines() - self.set_attribute('potential_type', potential_type) - self.set_attribute('atom_style', atom_style) - self.set_attribute('default_units', default_units) + self.set_attribute("potential_type", potential_type) + self.set_attribute("atom_style", atom_style) + self.set_attribute("default_units", default_units) self.set_attribute( - 'allowed_element_names', + "allowed_element_names", sorted(allowed_element_names) - if allowed_element_names else allowed_element_names, + if allowed_element_names + else allowed_element_names, ) # store potential section of main input file - self.set_attribute('md5|input_lines', - md5(pot_lines.encode('utf-8')).hexdigest()) - self.put_object_from_filelike(StringIO(pot_lines), - self.pot_lines_fname) + self.set_attribute( + "md5|input_lines", md5(pot_lines.encode("utf-8")).hexdigest() + ) + self.put_object_from_filelike(StringIO(pot_lines), self.pot_lines_fname) # store external files required by the potential external_files = [] for fname, content in external_contents.items(): self.set_attribute( f'md5|{fname.replace(".", "_")}', - md5(content.encode('utf-8')).hexdigest(), + md5(content.encode("utf-8")).hexdigest(), ) self.put_object_from_filelike(StringIO(content), fname) external_files.append(fname) - self.set_attribute('external_files', sorted(external_files)) + self.set_attribute("external_files", sorted(external_files)) # delete any previously stored files that are no longer required for fname in self.list_object_names(): @@ -94,22 +94,22 @@ def set_data(self, potential_type, data=None): @property def potential_type(self): """Return lammps atom style.""" - return self.get_attribute('potential_type') + return self.get_attribute("potential_type") @property def atom_style(self): """Return lammps atom style.""" - return self.get_attribute('atom_style') + return self.get_attribute("atom_style") @property def default_units(self): """Return lammps default units.""" - return self.get_attribute('default_units') + return self.get_attribute("default_units") @property def allowed_element_names(self): """Return available atomic symbols.""" - return self.get_attribute('allowed_element_names') + return self.get_attribute("allowed_element_names") def get_input_lines(self, kind_symbols=None): """Return the command(s) required to setup the potential. @@ -128,14 +128,14 @@ def get_input_lines(self, kind_symbols=None): pair_coeff * * S Cr """ - content = self.get_object_content(self.pot_lines_fname, 'r') + content = self.get_object_content(self.pot_lines_fname, "r") if kind_symbols: - content = content.replace('{kind_symbols}', ' '.join(kind_symbols)) + content = content.replace("{kind_symbols}", " ".join(kind_symbols)) return content def get_external_files(self): """Return the mapping of external filenames to content.""" fmap = {} - for fname in self.get_attribute('external_files'): - fmap[fname] = self.get_object_content(fname, 'r') + for fname in self.get_attribute("external_files"): + fmap[fname] = self.get_object_content(fname, "r") return fmap diff --git a/aiida_lammps/data/trajectory.py b/aiida_lammps/data/trajectory.py index 34c26ee..887b7f8 100644 --- a/aiida_lammps/data/trajectory.py +++ b/aiida_lammps/data/trajectory.py @@ -6,8 +6,8 @@ """ # pylint: disable=too-many-ancestors import io -import tempfile import pathlib +import tempfile from zipfile import ZIP_DEFLATED, ZipFile from aiida import orm @@ -28,9 +28,9 @@ class LammpsTrajectory(orm.Data): """ - _zip_prefix = 'step-' - _trajectory_filename = 'trajectory.zip' - _timestep_filename = 'timesteps.txt' + _zip_prefix = "step-" + _trajectory_filename = "trajectory.zip" + _timestep_filename = "timesteps.txt" _compression_method = ZIP_DEFLATED def __init__(self, fileobj=None, aliases=None, **kwargs): @@ -56,8 +56,8 @@ def _validate(self): """Validate that a trajectory has been set, before storing.""" super()._validate() - if self.get_attribute('number_steps', None) is None: - raise ValidationError('trajectory has not yet been set') + if self.get_attribute("number_steps", None) is None: + raise ValidationError("trajectory has not yet been set") def set_from_fileobj(self, fileobj, aliases=None): """Store a lammps trajectory file. @@ -81,17 +81,16 @@ def set_from_fileobj(self, fileobj, aliases=None): self.reset_attributes({}) if not (aliases is None or isinstance(aliases, dict)): - raise ValueError('aliases must be None or dict') + raise ValueError("aliases must be None or dict") # Write the zip to a temporary file, and then add it to the node repository with tempfile.NamedTemporaryFile() as temp_handle: with ZipFile( - temp_handle, - 'w', - self._compression_method, + temp_handle, + "w", + self._compression_method, ) as zip_file: - for step_id, trajectory_step in enumerate( - iter_trajectories(fileobj)): + for step_id, trajectory_step in enumerate(iter_trajectories(fileobj)): # extract data to store in attributes time_steps.append(trajectory_step.timestep) @@ -99,26 +98,26 @@ def set_from_fileobj(self, fileobj, aliases=None): number_atoms = trajectory_step.natoms elif trajectory_step.natoms != number_atoms: raise IOError( - f'step {step_id} contains different number of' - f' atoms: {trajectory_step.natoms}') + f"step {step_id} contains different number of" + f" atoms: {trajectory_step.natoms}" + ) if field_names is None: field_names = list(trajectory_step.atom_fields.keys()) - elif field_names != list( - trajectory_step.atom_fields.keys()): + elif field_names != list(trajectory_step.atom_fields.keys()): raise IOError( - f'step {step_id} contains different field names:' - f' {list(trajectory_step.atom_fields.keys())}') - if 'element' in trajectory_step.atom_fields: - elements.update(trajectory_step.atom_fields['element']) + f"step {step_id} contains different field names:" + f" {list(trajectory_step.atom_fields.keys())}" + ) + if "element" in trajectory_step.atom_fields: + elements.update(trajectory_step.atom_fields["element"]) # save content - content = '\n'.join(trajectory_step.lines) - zip_name = f'{self._zip_prefix}{step_id}' + content = "\n".join(trajectory_step.lines) + zip_name = f"{self._zip_prefix}{step_id}" zip_file.writestr(zip_name, content) if not time_steps: - raise IOError( - 'The trajectory file does not contain any timesteps') + raise IOError("The trajectory file does not contain any timesteps") # Flush and rewind the temporary handle, # otherwise the command to store it in the repo will write an empty file @@ -134,7 +133,7 @@ def set_from_fileobj(self, fileobj, aliases=None): self.put_object_from_filelike( temp_handle, self._trajectory_filename, - mode='wb', + mode="wb", encoding=None, ) else: @@ -144,19 +143,19 @@ def set_from_fileobj(self, fileobj, aliases=None): ) self.put_object_from_filelike( - io.StringIO(' '.join([str(entry) for entry in time_steps])), + io.StringIO(" ".join([str(entry) for entry in time_steps])), self._timestep_filename, ) - self.set_attribute('number_steps', len(time_steps)) - self.set_attribute('number_atoms', number_atoms) - self.set_attribute('field_names', list(sorted(field_names))) - self.set_attribute('trajectory_filename', self._trajectory_filename) - self.set_attribute('timestep_filename', self._timestep_filename) - self.set_attribute('zip_prefix', self._zip_prefix) - self.set_attribute('compression_method', self._compression_method) - self.set_attribute('aliases', aliases) - self.set_attribute('elements', list(sorted(elements))) + self.set_attribute("number_steps", len(time_steps)) + self.set_attribute("number_atoms", number_atoms) + self.set_attribute("field_names", list(sorted(field_names))) + self.set_attribute("trajectory_filename", self._trajectory_filename) + self.set_attribute("timestep_filename", self._timestep_filename) + self.set_attribute("zip_prefix", self._zip_prefix) + self.set_attribute("compression_method", self._compression_method) + self.set_attribute("aliases", aliases) + self.set_attribute("elements", list(sorted(elements))) @property def number_steps(self): @@ -165,7 +164,7 @@ def number_steps(self): :return: number of steps stored in the data :rtype: int """ - return self.get_attribute('number_steps') + return self.get_attribute("number_steps") @property def time_steps(self): @@ -174,7 +173,7 @@ def time_steps(self): :return: time steps stored in the data. :rtype: list """ - with self.open(self.get_attribute('timestep_filename'), 'r') as handle: + with self.open(self.get_attribute("timestep_filename"), "r") as handle: output = [int(i) for i in handle.readline().split()] return output @@ -185,7 +184,7 @@ def number_atoms(self): :return: number of atoms in the simulation box :rtype: int """ - return self.get_attribute('number_atoms') + return self.get_attribute("number_atoms") @property def field_names(self): @@ -194,7 +193,7 @@ def field_names(self): :return: list of field names as written to file. :rtype: list """ - return self.get_attribute('field_names') + return self.get_attribute("field_names") @property def aliases(self): @@ -203,24 +202,24 @@ def aliases(self): :return: mapping of one or more lammps variables. :rtype: list """ - return self.get_attribute('aliases') + return self.get_attribute("aliases") def get_step_string(self, step_idx): """Return the content string, for a specific trajectory step.""" step_idx = list(range(self.number_steps))[step_idx] zip_name = f'{self.get_attribute("zip_prefix")}{step_idx}' with self.open( - self.get_attribute('trajectory_filename'), - mode='rb', + self.get_attribute("trajectory_filename"), + mode="rb", ) as handle: with ZipFile( - handle, - 'r', - self.get_attribute('compression_method'), + handle, + "r", + self.get_attribute("compression_method"), ) as zip_file: - with zip_file.open(zip_name, 'r') as step_file: + with zip_file.open(zip_name, "r") as step_file: content = step_file.read() - return content.decode('utf8') + return content.decode("utf8") def get_step_data(self, step_idx): """Return parsed data, for a specific trajectory step.""" @@ -235,13 +234,13 @@ def iter_step_strings(self, steps=None): steps = range(0, self.number_steps, steps) with self.open( - self.get_attribute('trajectory_filename'), - mode='rb', + self.get_attribute("trajectory_filename"), + mode="rb", ) as handle: with ZipFile( - handle, - 'r', - self.get_attribute('compression_method'), + handle, + "r", + self.get_attribute("compression_method"), ) as zip_file: for step_idx in steps: zip_name = f'{self.get_attribute("zip_prefix")}{step_idx}' @@ -252,8 +251,8 @@ def iter_step_strings(self, steps=None): def get_step_structure( self, step_idx: int, - symbol_field: str = 'element', - position_fields: tuple = ('x', 'y', 'z'), + symbol_field: str = "element", + position_fields: tuple = ("x", "y", "z"), original_structure: orm.StructureData = None, ) -> orm.StructureData: """Return a StructureData object, for a specific trajectory step. @@ -289,4 +288,4 @@ def write_as_lammps(self, handle, steps=None): """ for string in self.iter_step_strings(steps=steps): handle.write(string) - handle.write(b'\n') + handle.write(b"\n") diff --git a/aiida_lammps/parsers/dynaphopy.py b/aiida_lammps/parsers/dynaphopy.py index a8bd1bb..eacfb0e 100644 --- a/aiida_lammps/parsers/dynaphopy.py +++ b/aiida_lammps/parsers/dynaphopy.py @@ -1,9 +1,13 @@ """Parser for dynaphopy calculations.""" # Not working with Aiida 1.0 # pylint: disable=useless-super-delegation -from aiida.orm.data.parameter import ParameterData # pylint: disable=no-name-in-module, import-error +from aiida.orm.data.parameter import ( + ParameterData, # pylint: disable=no-name-in-module, import-error +) from aiida.parsers.parser import Parser -from aiida_phonopy.common.raw_parsers import parse_FORCE_CONSTANTS # pylint: disable=import-error +from aiida_phonopy.common.raw_parsers import ( + parse_FORCE_CONSTANTS, # pylint: disable=import-error +) from aiida_lammps.common.raw_parsers import ( parse_dynaphopy_output, @@ -15,6 +19,7 @@ class DynaphopyParser(Parser): """ Simple Parser for LAMMPS. """ + def __init__(self, calc): """ Initialize the instance of LammpsParser @@ -32,9 +37,11 @@ def parse_with_retrieved(self, retrieved): # select the folder object # Check that the retrieved folder is there try: - out_folder = retrieved[self._calc._get_linkname_retrieved()] # pylint: disable=protected-access, no-member + out_folder = retrieved[ + self._calc._get_linkname_retrieved() + ] # pylint: disable=protected-access, no-member except KeyError: - self.logger.error('No retrieved folder found') + self.logger.error("No retrieved folder found") return False, () # check what is inside the folder @@ -47,10 +54,15 @@ def parse_with_retrieved(self, retrieved): # return successful, () # Get file and do the parsing - outfile = out_folder.get_abs_path(self._calc._OUTPUT_FILE_NAME) # pylint: disable=no-member, protected-access + outfile = out_folder.get_abs_path( + self._calc._OUTPUT_FILE_NAME + ) # pylint: disable=no-member, protected-access force_constants_file = out_folder.get_abs_path( - self._calc._OUTPUT_FORCE_CONSTANTS) # pylint: disable=no-member, protected-access - qp_file = out_folder.get_abs_path(self._calc._OUTPUT_QUASIPARTICLES) # pylint: disable=no-member, protected-access + self._calc._OUTPUT_FORCE_CONSTANTS + ) # pylint: disable=no-member, protected-access + qp_file = out_folder.get_abs_path( + self._calc._OUTPUT_QUASIPARTICLES + ) # pylint: disable=no-member, protected-access try: thermal_properties = parse_dynaphopy_output(outfile) @@ -65,8 +77,9 @@ def parse_with_retrieved(self, retrieved): # look at warnings warnings = [] - with open(out_folder.get_abs_path( - self._calc._SCHED_ERROR_FILE)) as _file: # pylint: disable=no-member, protected-access + with open( + out_folder.get_abs_path(self._calc._SCHED_ERROR_FILE) + ) as _file: # pylint: disable=no-member, protected-access errors = _file.read() if errors: warnings = [errors] @@ -79,24 +92,29 @@ def parse_with_retrieved(self, retrieved): # save phonon data into node try: new_nodes_list.append( - ('quasiparticle_data', ParameterData(dict=quasiparticle_data))) + ("quasiparticle_data", ParameterData(dict=quasiparticle_data)) + ) except KeyError: # keys not pass try: new_nodes_list.append( - ('thermal_properties', ParameterData(dict=thermal_properties))) + ("thermal_properties", ParameterData(dict=thermal_properties)) + ) except KeyError: # keys not pass try: - new_nodes_list.append(('force_constants', force_constants)) + new_nodes_list.append(("force_constants", force_constants)) except KeyError: # keys not pass # add the dictionary with warnings - new_nodes_list.append(( - self.get_linkname_outparams(), # pylint: disable=no-member - ParameterData(dict={'warnings': warnings}))) + new_nodes_list.append( + ( + self.get_linkname_outparams(), # pylint: disable=no-member + ParameterData(dict={"warnings": warnings}), + ) + ) return successful, new_nodes_list diff --git a/aiida_lammps/parsers/lammps/base.py b/aiida_lammps/parsers/lammps/base.py index 7d7ecce..b20f930 100644 --- a/aiida_lammps/parsers/lammps/base.py +++ b/aiida_lammps/parsers/lammps/base.py @@ -12,12 +12,13 @@ from aiida_lammps.common.raw_parsers import read_log_file ParsingResources = namedtuple( - 'ParsingResources', - ['exit_code', 'sys_paths', 'traj_paths', 'restart_paths']) + "ParsingResources", ["exit_code", "sys_paths", "traj_paths", "restart_paths"] +) class LAMMPSBaseParser(Parser): """Abstract Base Parser for LAMMPS, supplying common methods.""" + def __init__(self, node): """Initialize the parser.""" # pylint: disable=useless-super-delegation @@ -35,74 +36,78 @@ def get_parsing_resources( try: out_folder = self.retrieved except exceptions.NotExistent: - return ParsingResources(self.exit_codes.ERROR_NO_RETRIEVED_FOLDER, - None, None, None) + return ParsingResources( + self.exit_codes.ERROR_NO_RETRIEVED_FOLDER, None, None, None + ) # Check for temporary folder if traj_in_temp or sys_in_temp: - if 'retrieved_temporary_folder' not in kwargs: + if "retrieved_temporary_folder" not in kwargs: return ParsingResources( - self.exit_codes.ERROR_NO_RETRIEVED_TEMP_FOLDER, None, None, - None) - temporary_folder = kwargs['retrieved_temporary_folder'] + self.exit_codes.ERROR_NO_RETRIEVED_TEMP_FOLDER, None, None, None + ) + temporary_folder = kwargs["retrieved_temporary_folder"] list_of_temp_files = os.listdir(temporary_folder) # check what is inside the folder list_of_files = out_folder.list_object_names() # check log file - if self.node.get_option('output_filename') not in list_of_files: - return ParsingResources(self.exit_codes.ERROR_LOG_FILE_MISSING, - None, None, None) + if self.node.get_option("output_filename") not in list_of_files: + return ParsingResources( + self.exit_codes.ERROR_LOG_FILE_MISSING, None, None, None + ) # check stdin and stdout - if self.node.get_option('scheduler_stdout') not in list_of_files: - return ParsingResources(self.exit_codes.ERROR_STDOUT_FILE_MISSING, - None, None, None) - if self.node.get_option('scheduler_stderr') not in list_of_files: - return ParsingResources(self.exit_codes.ERROR_STDERR_FILE_MISSING, - None, None, None) + if self.node.get_option("scheduler_stdout") not in list_of_files: + return ParsingResources( + self.exit_codes.ERROR_STDOUT_FILE_MISSING, None, None, None + ) + if self.node.get_option("scheduler_stderr") not in list_of_files: + return ParsingResources( + self.exit_codes.ERROR_STDERR_FILE_MISSING, None, None, None + ) # check for system info file(s) - system_suffix = self.node.get_option('system_suffix') + system_suffix = self.node.get_option("system_suffix") system_filepaths = [] if sys_in_temp: for filename in list_of_temp_files: - if fnmatch(filename, '*' + system_suffix): - system_filepaths.append( - os.path.join(temporary_folder, filename)) + if fnmatch(filename, "*" + system_suffix): + system_filepaths.append(os.path.join(temporary_folder, filename)) else: for filename in list_of_files: - if fnmatch(filename, '*' + system_suffix): + if fnmatch(filename, "*" + system_suffix): system_filepaths.append(filename) # check for trajectory file(s) - trajectory_suffix = self.node.get_option('trajectory_suffix') + trajectory_suffix = self.node.get_option("trajectory_suffix") trajectory_filepaths = [] if traj_in_temp: for filename in list_of_temp_files: - if fnmatch(filename, '*' + trajectory_suffix): + if fnmatch(filename, "*" + trajectory_suffix): trajectory_filepaths.append( - os.path.join(temporary_folder, filename)) + os.path.join(temporary_folder, filename) + ) else: for filename in list_of_files: - if fnmatch(filename, '*' + trajectory_suffix): + if fnmatch(filename, "*" + trajectory_suffix): trajectory_filepaths.append(filename) # check for restart file(s) - restart_file = self.node.get_option('restart_filename') + restart_file = self.node.get_option("restart_filename") restart_filepaths = [] for filename in list_of_temp_files: - if fnmatch(filename, '*' + restart_file + '*'): - restart_filepaths.append( - os.path.join(temporary_folder, filename)) + if fnmatch(filename, "*" + restart_file + "*"): + restart_filepaths.append(os.path.join(temporary_folder, filename)) - return ParsingResources(None, system_filepaths, trajectory_filepaths, - restart_filepaths) + return ParsingResources( + None, system_filepaths, trajectory_filepaths, restart_filepaths + ) def parse_log_file(self, compute_stress=False): """Parse the log file.""" - output_filename = self.node.get_option('output_filename') + output_filename = self.node.get_option("output_filename") output_txt = self.retrieved.get_object_content(output_filename) try: output_data = read_log_file( @@ -117,25 +122,27 @@ def parse_log_file(self, compute_stress=False): def add_warnings_and_errors(self, output_data): """Add warning and errors to the output data.""" # add the dictionary with warnings and errors - warnings = (self.retrieved.get_object_content( - self.node.get_option('scheduler_stderr')).strip().splitlines()) + warnings = ( + self.retrieved.get_object_content(self.node.get_option("scheduler_stderr")) + .strip() + .splitlines() + ) # for some reason, errors may be in the stdout, but not the log.lammps stdout = self.retrieved.get_object_content( - self.node.get_option('scheduler_stdout')) - errors = [ - line for line in stdout.splitlines() if line.startswith('ERROR') - ] - warnings.extend([ - line for line in stdout.splitlines() if line.startswith('WARNING') - ]) + self.node.get_option("scheduler_stdout") + ) + errors = [line for line in stdout.splitlines() if line.startswith("ERROR")] + warnings.extend( + [line for line in stdout.splitlines() if line.startswith("WARNING")] + ) for error in errors: self.logger.error(error) - output_data.setdefault('warnings', []).extend(warnings) - output_data.setdefault('errors', []).extend(errors) + output_data.setdefault("warnings", []).extend(warnings) + output_data.setdefault("errors", []).extend(errors) def add_standard_info(self, output_data): """Add standard information to output data.""" - output_data['parser_class'] = self.__class__.__name__ - output_data['parser_version'] = aiida_lammps_version + output_data["parser_class"] = self.__class__.__name__ + output_data["parser_version"] = aiida_lammps_version diff --git a/aiida_lammps/parsers/lammps/force.py b/aiida_lammps/parsers/lammps/force.py index 1df2083..725b22d 100644 --- a/aiida_lammps/parsers/lammps/force.py +++ b/aiida_lammps/parsers/lammps/force.py @@ -1,6 +1,6 @@ """Parser for LAMMPS single point energy calculation.""" -import numpy as np from aiida.orm import ArrayData, Dict +import numpy as np from aiida_lammps.common.parse_trajectory import iter_trajectories from aiida_lammps.common.raw_parsers import get_units_dict @@ -9,6 +9,7 @@ class ForceParser(LAMMPSBaseParser): """Parser for LAMMPS single point energy calculation.""" + def __init__(self, node): """Initialize the instance of Force Lammps Parser.""" # pylint: disable=useless-super-delegation @@ -32,31 +33,33 @@ def parse(self, **kwargs): else: try: array_data = self.parse_traj_file(resources.traj_paths[0]) - self.out('arrays', array_data) + self.out("arrays", array_data) except IOError as err: self.logger.error(str(err)) traj_error = self.exit_codes.ERROR_TRAJ_PARSING # save results into node - output_data = log_data['data'] - if 'units_style' in output_data: + output_data = log_data["data"] + if "units_style" in output_data: output_data.update( - get_units_dict(output_data['units_style'], - ['energy', 'force', 'distance'])) + get_units_dict( + output_data["units_style"], ["energy", "force", "distance"] + ) + ) else: - self.logger.warning('units missing in log') + self.logger.warning("units missing in log") self.add_warnings_and_errors(output_data) self.add_standard_info(output_data) parameters_data = Dict(dict=output_data) - self.out('results', parameters_data) + self.out("results", parameters_data) - if output_data['errors']: + if output_data["errors"]: return self.exit_codes.ERROR_LAMMPS_RUN if traj_error: return traj_error - if not log_data.get('found_end', False): + if not log_data.get("found_end", False): return self.exit_codes.ERROR_RUN_INCOMPLETE return None @@ -71,37 +74,36 @@ def parse_traj_file(self, trajectory_filename: str) -> ArrayData: :return: array with the forces and charges (if present) for the calculation :rtype: orm.ArrayData """ - with self.retrieved.open(trajectory_filename, 'r') as handle: + with self.retrieved.open(trajectory_filename, "r") as handle: traj_steps = list(iter_trajectories(handle)) if not traj_steps: - raise IOError('trajectory file empty') + raise IOError("trajectory file empty") if len(traj_steps) > 1: - raise IOError( - 'trajectory file has multiple steps (expecting only one)') + raise IOError("trajectory file has multiple steps (expecting only one)") - traj_step = traj_steps[0] # type: TRAJ_BLOCK + traj_step = traj_steps[0] - for field in ['fx', 'fy', 'fz']: + for field in ["fx", "fy", "fz"]: if field not in traj_step.atom_fields: - raise IOError( - f'trajectory file does not contain fields {field}') + raise IOError(f"trajectory file does not contain fields {field}") array_data = ArrayData() array_data.set_array( - 'forces', + "forces", np.array( [ - traj_step.atom_fields['fx'], - traj_step.atom_fields['fy'], - traj_step.atom_fields['fz'], + traj_step.atom_fields["fx"], + traj_step.atom_fields["fy"], + traj_step.atom_fields["fz"], ], dtype=float, ).T, ) - if 'q' in traj_step.atom_fields: + if "q" in traj_step.atom_fields: array_data.set_array( - 'charges', np.array(traj_step.atom_fields['q'], dtype=float)) + "charges", np.array(traj_step.atom_fields["q"], dtype=float) + ) return array_data diff --git a/aiida_lammps/parsers/lammps/lammps_parser.py b/aiida_lammps/parsers/lammps/lammps_parser.py index 2963cd2..7b0faf2 100644 --- a/aiida_lammps/parsers/lammps/lammps_parser.py +++ b/aiida_lammps/parsers/lammps/lammps_parser.py @@ -4,10 +4,11 @@ It takes care of parsing the log.lammps file, the trajectory file and the yaml file with the final value of the variables printed in the ``thermo_style``. """ -import numpy as np from aiida import orm from aiida.common import exceptions from aiida.parsers.parser import Parser +import numpy as np + from aiida_lammps.common.raw_parsers import parse_final_data, parse_logfile from aiida_lammps.data.trajectory import LammpsTrajectory @@ -20,6 +21,7 @@ class LAMMPSBaseParser(Parser): yaml file with the final value of the variables printed in the ``thermo_style``. """ + def __init__(self, node): """Initialize the parser""" # pylint: disable=useless-super-delegation @@ -43,33 +45,32 @@ def parse(self, **kwargs): list_of_files = out_folder.list_object_names() # check log file - if self.node.get_option('logfile_filename') not in list_of_files: + if self.node.get_option("logfile_filename") not in list_of_files: return self.exit_codes.ERROR_LOG_FILE_MISSING - filename = self.node.get_option('logfile_filename') - parsed_data = parse_logfile(file_contents=self.node.outputs.retrieved. - get_object_content(filename)) + filename = self.node.get_option("logfile_filename") + parsed_data = parse_logfile( + file_contents=self.node.outputs.retrieved.get_object_content(filename) + ) if parsed_data is None: return self.exit_codes.ERROR_PARSING_LOGFILE - global_data = parsed_data['global'] - arrays = parsed_data['time_dependent'] + global_data = parsed_data["global"] + arrays = parsed_data["time_dependent"] # check final variable file - if self.node.get_option('variables_filename') not in list_of_files: + if self.node.get_option("variables_filename") not in list_of_files: return self.exit_codes.ERROR_FINAL_VARIABLE_FILE_MISSING - filename = self.node.get_option('variables_filename') + filename = self.node.get_option("variables_filename") final_variables = parse_final_data( - file_contents=self.node.outputs.retrieved.get_object_content( - filename)) + file_contents=self.node.outputs.retrieved.get_object_content(filename) + ) if final_variables is None: return self.exit_codes.ERROR_PARSING_FINAL_VARIABLES - results = orm.Dict(dict={ - **final_variables, 'compute_variables': global_data - }) + results = orm.Dict(dict={**final_variables, "compute_variables": global_data}) # Expose the results from the log.lammps outputs - self.out('results', results) + self.out("results", results) # Get the time-dependent outputs exposed as an ArrayData @@ -79,25 +80,25 @@ def parse(self, **kwargs): _data = [val if val is not None else np.nan for val in value] time_dependent_computes.set_array(key, np.array(_data)) - self.out('time_dependent_computes', time_dependent_computes) + self.out("time_dependent_computes", time_dependent_computes) # check trajectory file - if self.node.get_option('trajectory_filename') not in list_of_files: + if self.node.get_option("trajectory_filename") not in list_of_files: return self.exit_codes.ERROR_TRAJECTORY_FILE_MISSING # Gather the lammps trajectory data - filename = self.node.get_option('trajectory_filename') + filename = self.node.get_option("trajectory_filename") with self.node.outputs.retrieved.open(filename) as handle: lammps_trajectory = LammpsTrajectory(handle) - self.out('trajectories', lammps_trajectory) + self.out("trajectories", lammps_trajectory) - self.out('structure', lammps_trajectory.get_step_structure(-1)) + self.out("structure", lammps_trajectory.get_step_structure(-1)) # check stdout - if self.node.get_option('scheduler_stdout') not in list_of_files: + if self.node.get_option("scheduler_stdout") not in list_of_files: return self.exit_codes.ERROR_STDOUT_FILE_MISSING # check stderr - if self.node.get_option('scheduler_stderr') not in list_of_files: + if self.node.get_option("scheduler_stderr") not in list_of_files: return self.exit_codes.ERROR_STDERR_FILE_MISSING return None diff --git a/aiida_lammps/parsers/lammps/md.py b/aiida_lammps/parsers/lammps/md.py index 9770010..d09ec9d 100644 --- a/aiida_lammps/parsers/lammps/md.py +++ b/aiida_lammps/parsers/lammps/md.py @@ -1,8 +1,8 @@ """Parser for LAMMPS MD calculations.""" import traceback -import numpy as np from aiida.orm import ArrayData, Dict +import numpy as np from aiida_lammps.common.raw_parsers import convert_units, get_units_dict from aiida_lammps.data.trajectory import LammpsTrajectory @@ -11,6 +11,7 @@ class MdParser(LAMMPSBaseParser): """Parser for LAMMPS MD calculations.""" + def __init__(self, node): """Initialize the instance of Lammps MD Parser.""" # pylint: disable=useless-super-delegation @@ -35,31 +36,33 @@ def parse(self, **kwargs): else: try: trajectory_data = LammpsTrajectory(resources.traj_paths[0]) - self.out('trajectory_data', trajectory_data) + self.out("trajectory_data", trajectory_data) except Exception as err: # pylint: disable=broad-except traceback.print_exc() self.logger.error(str(err)) traj_error = self.exit_codes.ERROR_TRAJ_PARSING # save results into node - output_data = log_data['data'] - if 'units_style' in output_data: + output_data = log_data["data"] + if "units_style" in output_data: output_data.update( - get_units_dict(output_data['units_style'], - ['distance', 'time', 'energy'])) + get_units_dict( + output_data["units_style"], ["distance", "time", "energy"] + ) + ) else: - self.logger.warning('units missing in log') + self.logger.warning("units missing in log") self.add_warnings_and_errors(output_data) self.add_standard_info(output_data) - if 'parameters' in self.node.get_incoming().all_link_labels(): - output_data['timestep_picoseconds'] = convert_units( + if "parameters" in self.node.get_incoming().all_link_labels(): + output_data["timestep_picoseconds"] = convert_units( self.node.inputs.parameters.dict.timestep, - output_data['units_style'], - 'time', - 'picoseconds', + output_data["units_style"], + "time", + "picoseconds", ) parameters_data = Dict(dict=output_data) - self.out('results', parameters_data) + self.out("results", parameters_data) # parse the system data file sys_data_error = None @@ -69,19 +72,16 @@ def parse(self, **kwargs): with open(resources.sys_paths[0]) as handle: names = handle.readline().strip().split() for i, col in enumerate( - np.loadtxt(resources.sys_paths[0], - skiprows=1, - unpack=True, - ndmin=2)): + np.loadtxt(resources.sys_paths[0], skiprows=1, unpack=True, ndmin=2) + ): sys_data.set_array(names[i], col) except Exception: # pylint: disable=broad-except traceback.print_exc() sys_data_error = self.exit_codes.ERROR_INFO_PARSING - sys_data.set_attribute('units_style', - output_data.get('units_style', None)) - self.out('system_data', sys_data) + sys_data.set_attribute("units_style", output_data.get("units_style", None)) + self.out("system_data", sys_data) - if output_data['errors']: + if output_data["errors"]: return self.exit_codes.ERROR_LAMMPS_RUN if traj_error: @@ -90,6 +90,6 @@ def parse(self, **kwargs): if sys_data_error: return sys_data_error - if not log_data.get('found_end', False): + if not log_data.get("found_end", False): return self.exit_codes.ERROR_RUN_INCOMPLETE return None diff --git a/aiida_lammps/parsers/lammps/md_multi.py b/aiida_lammps/parsers/lammps/md_multi.py index b936929..ebc8c33 100644 --- a/aiida_lammps/parsers/lammps/md_multi.py +++ b/aiida_lammps/parsers/lammps/md_multi.py @@ -3,8 +3,10 @@ import os import re import traceback -import numpy as np + from aiida.orm import ArrayData, Dict +import numpy as np + from aiida_lammps.common.raw_parsers import convert_units, get_units_dict from aiida_lammps.data.trajectory import LammpsTrajectory from aiida_lammps.parsers.lammps.base import LAMMPSBaseParser @@ -12,6 +14,7 @@ class MdMultiParser(LAMMPSBaseParser): """Parser for LAMMPS MDMulti calculations.""" + def __init__(self, node): """Initialize the instance of Lammps MD Parser.""" # pylint: disable=useless-super-delegation @@ -36,77 +39,80 @@ def parse(self, **kwargs): else: try: trajectories = { - os.path.basename(traj_path).split('-')[0]: - LammpsTrajectory(traj_path) + os.path.basename(traj_path).split("-")[0]: LammpsTrajectory( + traj_path + ) for traj_path in resources.traj_paths } - self.out('trajectory', trajectories) + self.out("trajectory", trajectories) except Exception as err: # pylint: disable=broad-except traceback.print_exc() self.logger.error(str(err)) traj_error = self.exit_codes.ERROR_TRAJ_PARSING # save results into node - output_data = log_data['data'] - if 'units_style' in output_data: + output_data = log_data["data"] + if "units_style" in output_data: output_data.update( - get_units_dict(output_data['units_style'], - ['distance', 'time', 'energy'])) + get_units_dict( + output_data["units_style"], ["distance", "time", "energy"] + ) + ) else: - self.logger.warning('units missing in log') + self.logger.warning("units missing in log") self.add_warnings_and_errors(output_data) self.add_standard_info(output_data) - if 'parameters' in self.node.get_incoming().all_link_labels(): - output_data['timestep_picoseconds'] = convert_units( + if "parameters" in self.node.get_incoming().all_link_labels(): + output_data["timestep_picoseconds"] = convert_units( self.node.inputs.parameters.dict.timestep, - output_data['units_style'], - 'time', - 'picoseconds', + output_data["units_style"], + "time", + "picoseconds", ) - output_data['stage_names'] = [ - s['name'] for s in self.node.inputs.parameters.dict.stages + output_data["stage_names"] = [ + s["name"] for s in self.node.inputs.parameters.dict.stages ] parameters_data = Dict(dict=output_data) - self.out('results', parameters_data) + self.out("results", parameters_data) # parse the system data file sys_data_error = None arrays = {} for sys_path in resources.sys_paths: - stage_name = os.path.basename(sys_path).split('-')[0] + stage_name = os.path.basename(sys_path).split("-")[0] sys_data = ArrayData() - sys_data.set_attribute('units_style', - output_data.get('units_style', None)) + sys_data.set_attribute("units_style", output_data.get("units_style", None)) try: with open(sys_path) as handle: names = handle.readline().strip().split() for i, col in enumerate( - np.loadtxt(sys_path, skiprows=1, unpack=True, - ndmin=2)): + np.loadtxt(sys_path, skiprows=1, unpack=True, ndmin=2) + ): sys_data.set_array(names[i], col) arrays[stage_name] = sys_data except Exception: # pylint: disable=broad-except traceback.print_exc() sys_data_error = self.exit_codes.ERROR_INFO_PARSING if arrays: - self.out('system', arrays) + self.out("system", arrays) # retrieve the last restart file, per stage restart_map = {} for rpath in resources.restart_paths: rpath_base = os.path.basename(rpath) - match = re.match(r'([^\-]*)\-.*\.([\d]+)', rpath_base) + match = re.match(r"([^\-]*)\-.*\.([\d]+)", rpath_base) if match: stage, step = match.groups() if int(step) > restart_map.get(stage, (-1, None))[0]: restart_map[stage] = (int(step), rpath) for stage, (step, rpath) in restart_map.items(): - with io.open(rpath, 'rb') as handle: + with io.open(rpath, "rb") as handle: self.retrieved.put_object_from_filelike( - handle, os.path.basename(rpath), 'wb', force=True) + handle, os.path.basename(rpath), "wb", force=True + ) - if output_data['errors']: + if output_data["errors"]: return self.exit_codes.ERROR_LAMMPS_RUN if traj_error: @@ -115,6 +121,6 @@ def parse(self, **kwargs): if sys_data_error: return sys_data_error - if not log_data.get('found_end', False): + if not log_data.get("found_end", False): return self.exit_codes.ERROR_RUN_INCOMPLETE return None diff --git a/aiida_lammps/parsers/lammps/optimize.py b/aiida_lammps/parsers/lammps/optimize.py index 0e6941a..24397a8 100644 --- a/aiida_lammps/parsers/lammps/optimize.py +++ b/aiida_lammps/parsers/lammps/optimize.py @@ -14,6 +14,7 @@ class OptimizeParser(LAMMPSBaseParser): """Parser for LAMMPS optimization calculation.""" + def __init__(self, node): """Initialize the instance of Optimize Lammps Parser.""" # pylint: disable=useless-super-delegation @@ -37,15 +38,16 @@ def parse(self, **kwargs): trajectory_data = LammpsTrajectory( resources.traj_paths[0], aliases={ - 'stresses': [f'c_stpa[{i+1}]' for i in range(6)], - 'forces': ['fx', 'fy', 'fz'], + "stresses": [f"c_stpa[{i+1}]" for i in range(6)], + "forces": ["fx", "fy", "fz"], }, ) - self.out('trajectory_data', trajectory_data) + self.out("trajectory_data", trajectory_data) self.out( - 'structure', + "structure", trajectory_data.get_step_structure( - -1, original_structure=self.node.inputs.structure), + -1, original_structure=self.node.inputs.structure + ), ) except Exception as err: # pylint: disable=broad-except traceback.print_exc() @@ -53,27 +55,28 @@ def parse(self, **kwargs): traj_error = self.exit_codes.ERROR_TRAJ_PARSING # save results into node - output_data = log_data['data'] - if 'units_style' in output_data: + output_data = log_data["data"] + if "units_style" in output_data: output_data.update( get_units_dict( - output_data['units_style'], - ['energy', 'force', 'distance', 'pressure'], - )) - output_data['stress_units'] = output_data.pop('pressure_units') + output_data["units_style"], + ["energy", "force", "distance", "pressure"], + ) + ) + output_data["stress_units"] = output_data.pop("pressure_units") else: - self.logger.warning('units missing in log') + self.logger.warning("units missing in log") self.add_warnings_and_errors(output_data) self.add_standard_info(output_data) parameters_data = Dict(dict=output_data) - self.out('results', parameters_data) + self.out("results", parameters_data) - if output_data['errors']: + if output_data["errors"]: return self.exit_codes.ERROR_LAMMPS_RUN if traj_error: return traj_error - if not log_data.get('found_end', False): + if not log_data.get("found_end", False): return self.exit_codes.ERROR_RUN_INCOMPLETE return None diff --git a/aiida_lammps/tests/test_calculations.py b/aiida_lammps/tests/test_calculations.py index 39fe00c..af86807 100644 --- a/aiida_lammps/tests/test_calculations.py +++ b/aiida_lammps/tests/test_calculations.py @@ -1,9 +1,9 @@ """Test the aiida-lammps calculations.""" -import pytest from aiida.cmdline.utils.common import get_calcjob_report from aiida.engine import run_get_node from aiida.orm import Dict from aiida.plugins import CalculationFactory, DataFactory +import pytest import aiida_lammps.tests.utils as tests @@ -31,138 +31,98 @@ def get_calc_parameters(lammps_version, plugin_name, units, potential_type): :rtype: orm.Dict """ - if potential_type == 'reaxff': - output_variables = ['temp', 'etotal', 'c_reax[1]'] - thermo_keywords = ['c_reax[1]'] + if potential_type == "reaxff": + output_variables = ["temp", "etotal", "c_reax[1]"] + thermo_keywords = ["c_reax[1]"] else: - output_variables = ['temp', 'etotal'] + output_variables = ["temp", "etotal"] thermo_keywords = [] - if plugin_name == 'lammps.force': + if plugin_name == "lammps.force": parameters_opt = { - 'lammps_version': lammps_version, - 'output_variables': output_variables, - 'thermo_keywords': thermo_keywords, + "lammps_version": lammps_version, + "output_variables": output_variables, + "thermo_keywords": thermo_keywords, } - elif plugin_name == 'lammps.optimize': + elif plugin_name == "lammps.optimize": parameters_opt = { - 'lammps_version': lammps_version, - 'units': units, - 'relax': { - 'type': 'iso', - 'pressure': 0.0, - 'vmax': 0.001 - }, - 'minimize': { - 'style': 'cg', - 'energy_tolerance': 1.0e-25, - 'force_tolerance': 1.0e-25, - 'max_evaluations': 100000, - 'max_iterations': 50000, + "lammps_version": lammps_version, + "units": units, + "relax": {"type": "iso", "pressure": 0.0, "vmax": 0.001}, + "minimize": { + "style": "cg", + "energy_tolerance": 1.0e-25, + "force_tolerance": 1.0e-25, + "max_evaluations": 100000, + "max_iterations": 50000, }, - 'output_variables': output_variables, - 'thermo_keywords': thermo_keywords, + "output_variables": output_variables, + "thermo_keywords": thermo_keywords, } - elif plugin_name == 'lammps.md': + elif plugin_name == "lammps.md": parameters_opt = { - 'lammps_version': lammps_version, - 'units': units, - 'rand_seed': 12345, - 'timestep': 0.001, - 'integration': { - 'style': 'nvt', - 'constraints': { - 'temp': [300, 300, 0.5] - } - }, - 'neighbor': [0.3, 'bin'], - 'neigh_modify': { - 'every': 1, - 'delay': 0, - 'check': False - }, - 'equilibrium_steps': 100, - 'total_steps': 1000, - 'dump_rate': 10, - 'restart': 100, - 'output_variables': output_variables, - 'thermo_keywords': thermo_keywords, + "lammps_version": lammps_version, + "units": units, + "rand_seed": 12345, + "timestep": 0.001, + "integration": {"style": "nvt", "constraints": {"temp": [300, 300, 0.5]}}, + "neighbor": [0.3, "bin"], + "neigh_modify": {"every": 1, "delay": 0, "check": False}, + "equilibrium_steps": 100, + "total_steps": 1000, + "dump_rate": 10, + "restart": 100, + "output_variables": output_variables, + "thermo_keywords": thermo_keywords, } - elif plugin_name == 'lammps.md.multi': + elif plugin_name == "lammps.md.multi": parameters_opt = { - 'lammps_version': - lammps_version, - 'units': - units, - 'timestep': - 0.001, - 'neighbor': [0.3, 'bin'], - 'neigh_modify': { - 'every': 1, - 'delay': 0, - 'check': False - }, - 'thermo_keywords': - thermo_keywords, - 'velocity': [ + "lammps_version": lammps_version, + "units": units, + "timestep": 0.001, + "neighbor": [0.3, "bin"], + "neigh_modify": {"every": 1, "delay": 0, "check": False}, + "thermo_keywords": thermo_keywords, + "velocity": [ { - 'style': 'create', - 'args': [300, 12345], - 'keywords': { - 'dist': 'gaussian', - 'mom': True - }, - }, - { - 'style': 'scale', - 'args': [300] + "style": "create", + "args": [300, 12345], + "keywords": {"dist": "gaussian", "mom": True}, }, + {"style": "scale", "args": [300]}, ], - 'stages': [ + "stages": [ { - 'name': 'thermalise', - 'steps': 100, - 'integration': { - 'style': 'nvt', - 'constraints': { - 'temp': [300, 300, 0.5] - }, - }, - 'output_atom': { - 'dump_rate': 10 - }, - 'output_system': { - 'dump_rate': 100, - 'variables': output_variables + "name": "thermalise", + "steps": 100, + "integration": { + "style": "nvt", + "constraints": {"temp": [300, 300, 0.5]}, }, + "output_atom": {"dump_rate": 10}, + "output_system": {"dump_rate": 100, "variables": output_variables}, }, { - 'name': 'equilibrate', - 'steps': 400, - 'integration': { - 'style': 'nvt', - 'constraints': { - 'temp': [300, 300, 0.5] - }, + "name": "equilibrate", + "steps": 400, + "integration": { + "style": "nvt", + "constraints": {"temp": [300, 300, 0.5]}, }, - 'computes': [{ - 'id': 'cna', - 'style': 'cna/atom', - 'args': [3.0] - }], - 'output_atom': { - 'dump_rate': 100, - 'average_rate': 10, - 'ave_variables': ['xu', 'yu', 'zu'], - 'variables': ['c_cna'], + "computes": [{"id": "cna", "style": "cna/atom", "args": [3.0]}], + "output_atom": { + "dump_rate": 100, + "average_rate": 10, + "ave_variables": ["xu", "yu", "zu"], + "variables": ["c_cna"], }, - 'output_system': { - 'dump_rate': 10, - 'average_rate': 2, - 'ave_variables': output_variables, + "output_system": { + "dump_rate": 10, + "average_rate": 2, + "ave_variables": output_variables, }, - 'restart_rate': 200, + "restart_rate": 200, }, ], } @@ -174,24 +134,24 @@ def get_calc_parameters(lammps_version, plugin_name, units, potential_type): def sanitize_results(results_dict, round_dp_all=None, round_energy=None): """Sanitize the results dictionary for test regression.""" - results_dict.pop('parser_version') - results_dict.pop('warnings') - results_dict.pop('steps_per_second', None) - results_dict.pop('total_wall_time', None) - if round_energy and 'energy' in results_dict: - results_dict['energy'] = round(results_dict['energy'], round_energy) + results_dict.pop("parser_version") + results_dict.pop("warnings") + results_dict.pop("steps_per_second", None) + results_dict.pop("total_wall_time", None) + if round_energy and "energy" in results_dict: + results_dict["energy"] = round(results_dict["energy"], round_energy) if round_dp_all: results_dict = tests.recursive_round(results_dict, round_dp_all) return results_dict @pytest.mark.parametrize( - 'potential_type,calc_type', + "potential_type,calc_type", [ - ('lennard-jones', 'lammps.force'), - ('tersoff', 'lammps.optimize'), - ('eam', 'lammps.md'), - ('reaxff', 'lammps.md.multi'), + ("lennard-jones", "lammps.force"), + ("tersoff", "lammps.optimize"), + ("eam", "lammps.md"), + ("reaxff", "lammps.md.multi"), ], ) def test_input_creation( @@ -205,12 +165,12 @@ def test_input_creation( Test the generation of the input file for lammps """ pot_data = get_potential_data(potential_type) - potential_data = DataFactory('lammps.potential')( + potential_data = DataFactory("lammps.potential")( potential_type=pot_data.type, data=pot_data.data, ) parameter_data = get_calc_parameters( - '17 Aug 2017', + "17 Aug 2017", calc_type, potential_data.default_units, potential_type, @@ -220,18 +180,18 @@ def test_input_creation( content = calc.create_main_input_content( parameter_data, potential_data, - kind_symbols=['A', 'B'], - structure_filename='input.data', - trajectory_filename='output.traj', - system_filename='sys_info.txt', - restart_filename='calc.restart', + kind_symbols=["A", "B"], + structure_filename="input.data", + trajectory_filename="output.traj", + system_filename="sys_info.txt", + restart_filename="calc.restart", ) file_regression.check(content) @pytest.mark.parametrize( - 'potential_type', - ['lennard-jones', 'tersoff', 'eam', 'reaxff'], + "potential_type", + ["lennard-jones", "tersoff", "eam", "reaxff"], ) def test_force_submission( db_test_app, @@ -241,10 +201,10 @@ def test_force_submission( """ Test the submission of the force-type calculations. """ - calc_plugin = 'lammps.force' + calc_plugin = "lammps.force" code = db_test_app.get_or_create_code(calc_plugin) pot_data = get_potential_data(potential_type) - potential = DataFactory('lammps.potential')( + potential = DataFactory("lammps.potential")( potential_type=pot_data.type, data=pot_data.data, ) @@ -255,34 +215,35 @@ def test_force_submission( potential_type, ) builder = code.get_builder() - builder._update({ # pylint: disable=protected-access - 'metadata': tests.get_default_metadata(), - 'code': code, - 'structure': pot_data.structure, - 'potential': potential, - 'parameters': parameters, - }) + builder._update( + { # pylint: disable=protected-access + "metadata": tests.get_default_metadata(), + "code": code, + "structure": pot_data.structure, + "potential": potential, + "parameters": parameters, + } + ) with db_test_app.sandbox_folder() as folder: calc_info = db_test_app.generate_calcinfo(calc_plugin, folder, builder) - assert calc_info.codes_info[0].cmdline_params == ['-in', 'input.in'] - assert set(folder.get_content_list()).issuperset( - ['input.data', 'input.in']) + assert calc_info.codes_info[0].cmdline_params == ["-in", "input.in"] + assert set(folder.get_content_list()).issuperset(["input.data", "input.in"]) @pytest.mark.parametrize( - 'potential_type', - ['lennard-jones', 'tersoff', 'eam', 'reaxff'], + "potential_type", + ["lennard-jones", "tersoff", "eam", "reaxff"], ) def test_optimize_submission(db_test_app, get_potential_data, potential_type): """ Test the submission of the optimize type of calculation """ - calc_plugin = 'lammps.optimize' + calc_plugin = "lammps.optimize" code = db_test_app.get_or_create_code(calc_plugin) pot_data = get_potential_data(potential_type) - potential = DataFactory('lammps.potential')( + potential = DataFactory("lammps.potential")( potential_type=pot_data.type, data=pot_data.data, ) @@ -293,32 +254,33 @@ def test_optimize_submission(db_test_app, get_potential_data, potential_type): potential_type, ) builder = code.get_builder() - builder._update({ # pylint: disable=protected-access - 'metadata': tests.get_default_metadata(), - 'code': code, - 'structure': pot_data.structure, - 'potential': potential, - 'parameters': parameters, - }) + builder._update( + { # pylint: disable=protected-access + "metadata": tests.get_default_metadata(), + "code": code, + "structure": pot_data.structure, + "potential": potential, + "parameters": parameters, + } + ) with db_test_app.sandbox_folder() as folder: calc_info = db_test_app.generate_calcinfo(calc_plugin, folder, builder) - assert calc_info.codes_info[0].cmdline_params == ['-in', 'input.in'] - assert set(folder.get_content_list()).issuperset( - ['input.data', 'input.in']) + assert calc_info.codes_info[0].cmdline_params == ["-in", "input.in"] + assert set(folder.get_content_list()).issuperset(["input.data", "input.in"]) @pytest.mark.parametrize( - 'potential_type', - ['lennard-jones', 'tersoff', 'eam', 'reaxff'], + "potential_type", + ["lennard-jones", "tersoff", "eam", "reaxff"], ) def test_md_submission(db_test_app, get_potential_data, potential_type): """Test the submission of the md type of calculation""" - calc_plugin = 'lammps.md' + calc_plugin = "lammps.md" code = db_test_app.get_or_create_code(calc_plugin) pot_data = get_potential_data(potential_type) - potential = DataFactory('lammps.potential')( + potential = DataFactory("lammps.potential")( potential_type=pot_data.type, data=pot_data.data, ) @@ -329,26 +291,27 @@ def test_md_submission(db_test_app, get_potential_data, potential_type): potential_type, ) builder = code.get_builder() - builder._update({ # pylint: disable=protected-access - 'metadata': tests.get_default_metadata(), - 'code': code, - 'structure': pot_data.structure, - 'potential': potential, - 'parameters': parameters, - }) + builder._update( + { # pylint: disable=protected-access + "metadata": tests.get_default_metadata(), + "code": code, + "structure": pot_data.structure, + "potential": potential, + "parameters": parameters, + } + ) with db_test_app.sandbox_folder() as folder: calc_info = db_test_app.generate_calcinfo(calc_plugin, folder, builder) - assert calc_info.codes_info[0].cmdline_params == ['-in', 'input.in'] - assert set(folder.get_content_list()).issuperset( - ['input.data', 'input.in']) + assert calc_info.codes_info[0].cmdline_params == ["-in", "input.in"] + assert set(folder.get_content_list()).issuperset(["input.data", "input.in"]) @pytest.mark.lammps_call @pytest.mark.parametrize( - 'potential_type', - ['lennard-jones', 'tersoff', 'eam', 'reaxff'], + "potential_type", + ["lennard-jones", "tersoff", "eam", "reaxff"], ) def test_force_process( db_test_app, @@ -357,10 +320,10 @@ def test_force_process( data_regression, ): """Test the functionality of the force calculation type""" - calc_plugin = 'lammps.force' + calc_plugin = "lammps.force" code = db_test_app.get_or_create_code(calc_plugin) pot_data = get_potential_data(potential_type) - potential = DataFactory('lammps.potential')( + potential = DataFactory("lammps.potential")( potential_type=pot_data.type, data=pot_data.data, ) @@ -371,13 +334,15 @@ def test_force_process( potential_type, ) builder = code.get_builder() - builder._update({ # pylint: disable=protected-access - 'metadata': tests.get_default_metadata(), - 'code': code, - 'structure': pot_data.structure, - 'potential': potential, - 'parameters': parameters, - }) + builder._update( + { # pylint: disable=protected-access + "metadata": tests.get_default_metadata(), + "code": code, + "structure": pot_data.structure, + "potential": potential, + "parameters": parameters, + } + ) output = run_get_node(builder) calc_node = output.node @@ -389,24 +354,23 @@ def test_force_process( if not calc_node.is_finished_ok: print(calc_node.attributes) print(get_calcjob_report(calc_node)) - raise Exception('finished with exit message: {}'.format( - calc_node.exit_message)) + raise Exception("finished with exit message: {}".format(calc_node.exit_message)) link_labels = calc_node.get_outgoing().all_link_labels() - assert set(link_labels).issuperset(['results', 'arrays']) + assert set(link_labels).issuperset(["results", "arrays"]) - data_regression.check({ - 'results': - sanitize_results(calc_node.outputs.results.get_dict(), 1), - 'arrays': - calc_node.outputs.arrays.attributes, - }) + data_regression.check( + { + "results": sanitize_results(calc_node.outputs.results.get_dict(), 1), + "arrays": calc_node.outputs.arrays.attributes, + } + ) @pytest.mark.lammps_call @pytest.mark.parametrize( - 'potential_type', - ['lennard-jones', 'tersoff', 'eam', 'reaxff'], + "potential_type", + ["lennard-jones", "tersoff", "eam", "reaxff"], ) def test_optimize_process( db_test_app, @@ -415,10 +379,10 @@ def test_optimize_process( data_regression, ): """Test the functionality of the optimization calculation type""" - calc_plugin = 'lammps.optimize' + calc_plugin = "lammps.optimize" code = db_test_app.get_or_create_code(calc_plugin) pot_data = get_potential_data(potential_type) - potential = DataFactory('lammps.potential')( + potential = DataFactory("lammps.potential")( potential_type=pot_data.type, data=pot_data.data, ) @@ -429,13 +393,15 @@ def test_optimize_process( potential_type, ) builder = code.get_builder() - builder._update({ # pylint: disable=protected-access - 'metadata': tests.get_default_metadata(), - 'code': code, - 'structure': pot_data.structure, - 'potential': potential, - 'parameters': parameters, - }) + builder._update( + { # pylint: disable=protected-access + "metadata": tests.get_default_metadata(), + "code": code, + "structure": pot_data.structure, + "potential": potential, + "parameters": parameters, + } + ) output = run_get_node(builder) calc_node = output.node @@ -443,37 +409,30 @@ def test_optimize_process( if not calc_node.is_finished_ok: print(calc_node.attributes) print(get_calcjob_report(calc_node)) - raise Exception( - f'finished with exit message: {calc_node.exit_message}') + raise Exception(f"finished with exit message: {calc_node.exit_message}") link_labels = calc_node.get_outgoing().all_link_labels() - assert set(link_labels).issuperset( - ['results', 'trajectory_data', 'structure']) + assert set(link_labels).issuperset(["results", "trajectory_data", "structure"]) trajectory_data = calc_node.outputs.trajectory_data.attributes # optimization steps may differ between lammps versions - trajectory_data = { - k: v - for k, v in trajectory_data.items() if k != 'number_steps' - } - data_regression.check({ - 'results': - sanitize_results(calc_node.outputs.results.get_dict(), 1), - 'trajectory_data': - trajectory_data, - 'structure': { - 'kind_names': calc_node.outputs.structure.get_kind_names() + trajectory_data = {k: v for k, v in trajectory_data.items() if k != "number_steps"} + data_regression.check( + { + "results": sanitize_results(calc_node.outputs.results.get_dict(), 1), + "trajectory_data": trajectory_data, + "structure": {"kind_names": calc_node.outputs.structure.get_kind_names()} + # "structure": tests.recursive_round( + # calc_node.outputs.structure.attributes, 1, apply_lists=True + # ), } - # "structure": tests.recursive_round( - # calc_node.outputs.structure.attributes, 1, apply_lists=True - # ), - }) + ) @pytest.mark.lammps_call @pytest.mark.parametrize( - 'potential_type', - ['lennard-jones', 'tersoff', 'eam'], + "potential_type", + ["lennard-jones", "tersoff", "eam"], ) def test_md_process( db_test_app, @@ -482,10 +441,10 @@ def test_md_process( data_regression, ): """Test the functionality of the md calculation type""" - calc_plugin = 'lammps.md' + calc_plugin = "lammps.md" code = db_test_app.get_or_create_code(calc_plugin) pot_data = get_potential_data(potential_type) - potential = DataFactory('lammps.potential')( + potential = DataFactory("lammps.potential")( potential_type=pot_data.type, data=pot_data.data, ) @@ -498,13 +457,15 @@ def test_md_process( potential_type, ) builder = code.get_builder() - builder._update({ # pylint: disable=protected-access - 'metadata': tests.get_default_metadata(), - 'code': code, - 'structure': pot_data.structure, - 'potential': potential, - 'parameters': parameters, - }) + builder._update( + { # pylint: disable=protected-access + "metadata": tests.get_default_metadata(), + "code": code, + "structure": pot_data.structure, + "potential": potential, + "parameters": parameters, + } + ) output = run_get_node(builder) calc_node = output.node @@ -512,33 +473,28 @@ def test_md_process( if not calc_node.is_finished_ok: print(calc_node.attributes) print(get_calcjob_report(calc_node)) - raise Exception( - f'finished with exit message: {calc_node.exit_message}') + raise Exception(f"finished with exit message: {calc_node.exit_message}") link_labels = calc_node.get_outgoing().all_link_labels() - assert set(link_labels).issuperset( - ['results', 'trajectory_data', 'system_data']) + assert set(link_labels).issuperset(["results", "trajectory_data", "system_data"]) data_regression.check( { - 'results': - sanitize_results( + "results": sanitize_results( calc_node.outputs.results.get_dict(), round_energy=1, ), - 'system_data': - calc_node.outputs.system_data.attributes, - 'trajectory_data': - calc_node.outputs.trajectory_data.attributes, + "system_data": calc_node.outputs.system_data.attributes, + "trajectory_data": calc_node.outputs.trajectory_data.attributes, }, - basename=f'test_md_process-{potential_type}-{version_year}', + basename=f"test_md_process-{potential_type}-{version_year}", ) @pytest.mark.lammps_call @pytest.mark.parametrize( - 'potential_type', - ['lennard-jones', 'tersoff', 'eam', 'reaxff'], + "potential_type", + ["lennard-jones", "tersoff", "eam", "reaxff"], ) def test_md_multi_process( db_test_app, @@ -547,10 +503,10 @@ def test_md_multi_process( data_regression, ): """Test the functionality of the multi-stage md calculation type""" - calc_plugin = 'lammps.md.multi' + calc_plugin = "lammps.md.multi" code = db_test_app.get_or_create_code(calc_plugin) pot_data = get_potential_data(potential_type) - potential = DataFactory('lammps.potential')( + potential = DataFactory("lammps.potential")( potential_type=pot_data.type, data=pot_data.data, ) @@ -561,13 +517,15 @@ def test_md_multi_process( potential_type, ) builder = code.get_builder() - builder._update({ # pylint: disable=protected-access - 'metadata': tests.get_default_metadata(), - 'code': code, - 'structure': pot_data.structure, - 'potential': potential, - 'parameters': parameters, - }) + builder._update( + { # pylint: disable=protected-access + "metadata": tests.get_default_metadata(), + "code": code, + "structure": pot_data.structure, + "potential": potential, + "parameters": parameters, + } + ) output = run_get_node(builder) calc_node = output.node @@ -575,30 +533,29 @@ def test_md_multi_process( if not calc_node.is_finished_ok: print(calc_node.attributes) print(get_calcjob_report(calc_node)) - raise Exception( - f'finished with exit message: {calc_node.exit_message}') + raise Exception(f"finished with exit message: {calc_node.exit_message}") link_labels = calc_node.get_outgoing().all_link_labels() - assert set(link_labels).issuperset([ - 'results', - 'retrieved', - 'trajectory__thermalise', - 'trajectory__equilibrate', - 'system__thermalise', - 'system__equilibrate', - ]) - - data_regression.check({ - 'retrieved': - calc_node.outputs.retrieved.list_object_names(), - 'results': - sanitize_results(calc_node.outputs.results.get_dict(), round_energy=1), - 'system__thermalise': - calc_node.outputs.system__thermalise.attributes, - 'system__equilibrate': - calc_node.outputs.system__equilibrate.attributes, - 'trajectory__thermalise': - calc_node.outputs.trajectory__thermalise.attributes, - 'trajectory__equilibrate': - calc_node.outputs.trajectory__equilibrate.attributes, - }) + assert set(link_labels).issuperset( + [ + "results", + "retrieved", + "trajectory__thermalise", + "trajectory__equilibrate", + "system__thermalise", + "system__equilibrate", + ] + ) + + data_regression.check( + { + "retrieved": calc_node.outputs.retrieved.list_object_names(), + "results": sanitize_results( + calc_node.outputs.results.get_dict(), round_energy=1 + ), + "system__thermalise": calc_node.outputs.system__thermalise.attributes, + "system__equilibrate": calc_node.outputs.system__equilibrate.attributes, + "trajectory__thermalise": calc_node.outputs.trajectory__thermalise.attributes, + "trajectory__equilibrate": calc_node.outputs.trajectory__equilibrate.attributes, + } + ) diff --git a/aiida_lammps/tests/test_generate_inputs.py b/aiida_lammps/tests/test_generate_inputs.py index 7c94e1b..6d8139b 100644 --- a/aiida_lammps/tests/test_generate_inputs.py +++ b/aiida_lammps/tests/test_generate_inputs.py @@ -2,16 +2,18 @@ import io import os -import yaml + import pytest -from aiida_lammps.tests.utils import TEST_DIR -from aiida_lammps.data.lammps_potential import LammpsPotentialData +import yaml + from aiida_lammps.common import input_generator +from aiida_lammps.data.lammps_potential import LammpsPotentialData +from aiida_lammps.tests.utils import TEST_DIR @pytest.mark.parametrize( - 'potential_type', - ['eam_alloy'], + "potential_type", + ["eam_alloy"], ) def test_input_generate_minimize( db_test_app, # pylint: disable=unused-argument @@ -23,8 +25,8 @@ def test_input_generate_minimize( parameters_file = os.path.join( TEST_DIR, - 'test_generate_inputs', - 'parameters_minimize.yaml', + "test_generate_inputs", + "parameters_minimize.yaml", ) # Dictionary with parameters for controlling aiida-lammps with open(parameters_file) as handler: @@ -34,37 +36,37 @@ def test_input_generate_minimize( # Generate the potential potential_information = get_lammps_potential_data(potential_type) potential = LammpsPotentialData.get_or_create( - source=potential_information['filename'], - filename=potential_information['filename'], - **potential_information['parameters'], + source=potential_information["filename"], + filename=potential_information["filename"], + **potential_information["parameters"], ) # Generating the structure - structure = potential_information['structure'] + structure = potential_information["structure"] # Generating the input file input_file = input_generator.generate_input_file( parameters=parameters, potential=potential, structure=structure, - trajectory_filename='temp.dump', - restart_filename='restart.aiida', - potential_filename='potential.dat', - structure_filename='structure.dat', + trajectory_filename="temp.dump", + restart_filename="restart.aiida", + potential_filename="potential.dat", + structure_filename="structure.dat", ) reference_file = os.path.join( TEST_DIR, - 'test_generate_inputs', - f'test_generate_input_{potential_type}_minimize.txt', + "test_generate_inputs", + f"test_generate_input_{potential_type}_minimize.txt", ) - with io.open(reference_file, 'r') as handler: + with io.open(reference_file, "r") as handler: reference_value = handler.read() - assert input_file == reference_value, 'the content of the files differ' + assert input_file == reference_value, "the content of the files differ" @pytest.mark.parametrize( - 'potential_type', - ['eam_alloy'], + "potential_type", + ["eam_alloy"], ) def test_input_generate_md( db_test_app, # pylint: disable=unused-argument @@ -76,8 +78,8 @@ def test_input_generate_md( parameters_file = os.path.join( TEST_DIR, - 'test_generate_inputs', - 'parameters_md.yaml', + "test_generate_inputs", + "parameters_md.yaml", ) # Dictionary with parameters for controlling aiida-lammps with open(parameters_file) as handler: @@ -87,28 +89,28 @@ def test_input_generate_md( # Generate the potential potential_information = get_lammps_potential_data(potential_type) potential = LammpsPotentialData.get_or_create( - source=potential_information['filename'], - filename=potential_information['filename'], - **potential_information['parameters'], + source=potential_information["filename"], + filename=potential_information["filename"], + **potential_information["parameters"], ) # Generating the structure - structure = potential_information['structure'] + structure = potential_information["structure"] # Generating the input file input_file = input_generator.generate_input_file( parameters=parameters, potential=potential, structure=structure, - trajectory_filename='temp.dump', - restart_filename='restart.aiida', - potential_filename='potential.dat', - structure_filename='structure.dat', + trajectory_filename="temp.dump", + restart_filename="restart.aiida", + potential_filename="potential.dat", + structure_filename="structure.dat", ) reference_file = os.path.join( TEST_DIR, - 'test_generate_inputs', - f'test_generate_input_{potential_type}_md.txt', + "test_generate_inputs", + f"test_generate_input_{potential_type}_md.txt", ) - with io.open(reference_file, 'r') as handler: + with io.open(reference_file, "r") as handler: reference_value = handler.read() - assert input_file == reference_value, 'the content of the files differ' + assert input_file == reference_value, "the content of the files differ" diff --git a/aiida_lammps/tests/test_generate_structure.py b/aiida_lammps/tests/test_generate_structure.py index 9adcc1c..8896b2d 100644 --- a/aiida_lammps/tests/test_generate_structure.py +++ b/aiida_lammps/tests/test_generate_structure.py @@ -1,13 +1,16 @@ """Test the structure generation in aiida-lammps""" import pytest + from aiida_lammps.common.generate_structure import generate_lammps_structure @pytest.mark.parametrize( - 'structure', - ['Fe', 'pyrite', 'fes_cubic-zincblende', 'greigite'], + "structure", + ["Fe", "pyrite", "fes_cubic-zincblende", "greigite"], ) -def test_generate(db_test_app, get_structure_data, structure, file_regression): # pylint: disable=unused-argument +def test_generate( + db_test_app, get_structure_data, structure, file_regression +): # pylint: disable=unused-argument """Test the structure generation in aiida-lammps""" structure = get_structure_data(structure) text, _ = generate_lammps_structure(structure, round_dp=8) diff --git a/aiida_lammps/tests/test_parsers.py b/aiida_lammps/tests/test_parsers.py index 9d13232..e0e7fde 100644 --- a/aiida_lammps/tests/test_parsers.py +++ b/aiida_lammps/tests/test_parsers.py @@ -1,31 +1,36 @@ """ Tests to aiida-lammps parsers. """ -from textwrap import dedent import io import os -import pytest -import yaml +from textwrap import dedent + from aiida.cmdline.utils.common import get_calcjob_report from aiida.orm import FolderData from aiida.plugins import ParserFactory +import pytest +import yaml + +from aiida_lammps.common.raw_parsers import parse_final_data, parse_logfile from aiida_lammps.tests.utils import TEST_DIR -from aiida_lammps.common.raw_parsers import parse_logfile, parse_final_data def get_log(): """Get the reference values for the log parser""" - return dedent("""\ + return dedent( + """\ units metal final_energy: 2.0 final_cell: 0 1 0 0 1 0 0 1 0 final_stress: 0 0 0 0 0 0 - """) + """ + ) def get_traj_force(): """Get the reference values for the trajectory parser""" - return dedent("""\ + return dedent( + """\ ITEM: TIMESTEP 0 ITEM: NUMBER OF ATOMS @@ -41,12 +46,13 @@ def get_traj_force(): S -25.5468278966 -20.6615772179 -0.0000000000 S 25.5468278966 20.6615772179 -0.0000000000 S 25.5468278966 -20.6615772179 0.0000000000 - """) + """ + ) @pytest.mark.parametrize( - 'plugin_name', - ['lammps.force', 'lammps.optimize', 'lammps.md', 'lammps.md.multi']) + "plugin_name", ["lammps.force", "lammps.optimize", "lammps.md", "lammps.md.multi"] +) def test_missing_log(db_test_app, plugin_name): """Check if the log file is produced during calculation.""" retrieved = FolderData() @@ -54,134 +60,155 @@ def test_missing_log(db_test_app, plugin_name): calc_node = db_test_app.generate_calcjob_node(plugin_name, retrieved) parser = ParserFactory(plugin_name) with db_test_app.sandbox_folder() as temp_path: - results, calcfunction = parser.parse_from_node( # pylint: disable=unused-variable + ( + results, + calcfunction, + ) = parser.parse_from_node( # pylint: disable=unused-variable calc_node, retrieved_temporary_folder=temp_path.abspath, ) assert calcfunction.is_finished, calcfunction.exception assert calcfunction.is_failed, calcfunction.exit_status - assert (calcfunction.exit_status == - calc_node.process_class.exit_codes.ERROR_LOG_FILE_MISSING.status) + assert ( + calcfunction.exit_status + == calc_node.process_class.exit_codes.ERROR_LOG_FILE_MISSING.status + ) @pytest.mark.parametrize( - 'plugin_name', - ['lammps.force', 'lammps.optimize', 'lammps.md', 'lammps.md.multi']) + "plugin_name", ["lammps.force", "lammps.optimize", "lammps.md", "lammps.md.multi"] +) def test_missing_traj(db_test_app, plugin_name): """Check if the trajectory file is produced during calculation.""" retrieved = FolderData() - retrieved.put_object_from_filelike(io.StringIO(get_log()), 'log.lammps') - retrieved.put_object_from_filelike(io.StringIO(''), - '_scheduler-stdout.txt') - retrieved.put_object_from_filelike(io.StringIO(''), - '_scheduler-stderr.txt') + retrieved.put_object_from_filelike(io.StringIO(get_log()), "log.lammps") + retrieved.put_object_from_filelike(io.StringIO(""), "_scheduler-stdout.txt") + retrieved.put_object_from_filelike(io.StringIO(""), "_scheduler-stderr.txt") calc_node = db_test_app.generate_calcjob_node(plugin_name, retrieved) parser = ParserFactory(plugin_name) with db_test_app.sandbox_folder() as temp_path: - results, calcfunction = parser.parse_from_node( # pylint: disable=unused-variable + ( + results, + calcfunction, + ) = parser.parse_from_node( # pylint: disable=unused-variable calc_node, retrieved_temporary_folder=temp_path.abspath, ) assert calcfunction.is_finished, calcfunction.exception assert calcfunction.is_failed, calcfunction.exit_status - assert (calcfunction.exit_status == - calc_node.process_class.exit_codes.ERROR_TRAJ_FILE_MISSING.status) + assert ( + calcfunction.exit_status + == calc_node.process_class.exit_codes.ERROR_TRAJ_FILE_MISSING.status + ) @pytest.mark.parametrize( - 'plugin_name', - ['lammps.force', 'lammps.optimize', 'lammps.md', 'lammps.md.multi']) + "plugin_name", ["lammps.force", "lammps.optimize", "lammps.md", "lammps.md.multi"] +) def test_empty_log(db_test_app, plugin_name): """Check if the lammps log is empty.""" retrieved = FolderData() for filename in [ - 'log.lammps', - 'trajectory.lammpstrj', - '_scheduler-stdout.txt', - '_scheduler-stderr.txt', + "log.lammps", + "trajectory.lammpstrj", + "_scheduler-stdout.txt", + "_scheduler-stderr.txt", ]: - retrieved.put_object_from_filelike(io.StringIO(''), filename) + retrieved.put_object_from_filelike(io.StringIO(""), filename) calc_node = db_test_app.generate_calcjob_node(plugin_name, retrieved) parser = ParserFactory(plugin_name) with db_test_app.sandbox_folder() as temp_path: - with temp_path.open('x-trajectory.lammpstrj', 'w'): + with temp_path.open("x-trajectory.lammpstrj", "w"): pass - results, calcfunction = parser.parse_from_node( # pylint: disable=unused-variable + ( + results, + calcfunction, + ) = parser.parse_from_node( # pylint: disable=unused-variable calc_node, retrieved_temporary_folder=temp_path.abspath, ) assert calcfunction.is_finished, calcfunction.exception assert calcfunction.is_failed, calcfunction.exit_status - assert (calcfunction.exit_status == - calc_node.process_class.exit_codes.ERROR_LOG_PARSING.status) + assert ( + calcfunction.exit_status + == calc_node.process_class.exit_codes.ERROR_LOG_PARSING.status + ) @pytest.mark.parametrize( - 'plugin_name', - ['lammps.force', 'lammps.optimize', 'lammps.md', 'lammps.md.multi']) + "plugin_name", ["lammps.force", "lammps.optimize", "lammps.md", "lammps.md.multi"] +) def test_empty_traj(db_test_app, plugin_name): """Check if the lammps trajectory file is empty.""" retrieved = FolderData() - retrieved.put_object_from_filelike(io.StringIO(get_log()), 'log.lammps') + retrieved.put_object_from_filelike(io.StringIO(get_log()), "log.lammps") for filename in [ - 'trajectory.lammpstrj', - '_scheduler-stdout.txt', - '_scheduler-stderr.txt', + "trajectory.lammpstrj", + "_scheduler-stdout.txt", + "_scheduler-stderr.txt", ]: - retrieved.put_object_from_filelike(io.StringIO(''), filename) + retrieved.put_object_from_filelike(io.StringIO(""), filename) calc_node = db_test_app.generate_calcjob_node(plugin_name, retrieved) parser = ParserFactory(plugin_name) with db_test_app.sandbox_folder() as temp_path: - with temp_path.open('x-trajectory.lammpstrj', 'w'): + with temp_path.open("x-trajectory.lammpstrj", "w"): pass - results, calcfunction = parser.parse_from_node( # pylint: disable=unused-variable + ( + results, + calcfunction, + ) = parser.parse_from_node( # pylint: disable=unused-variable calc_node, retrieved_temporary_folder=temp_path.abspath, ) assert calcfunction.is_finished, calcfunction.exception assert calcfunction.is_failed, calcfunction.exit_status - assert (calcfunction.exit_status == - calc_node.process_class.exit_codes.ERROR_TRAJ_PARSING.status) + assert ( + calcfunction.exit_status + == calc_node.process_class.exit_codes.ERROR_TRAJ_PARSING.status + ) @pytest.mark.parametrize( - 'plugin_name', - ['lammps.force', 'lammps.optimize', 'lammps.md', 'lammps.md.multi']) + "plugin_name", ["lammps.force", "lammps.optimize", "lammps.md", "lammps.md.multi"] +) def test_run_error(db_test_app, plugin_name): """Check if the parser runs without producing errors.""" retrieved = FolderData() retrieved.put_object_from_filelike( io.StringIO(get_log()), - 'log.lammps', + "log.lammps", ) retrieved.put_object_from_filelike( io.StringIO(get_traj_force()), - 'x-trajectory.lammpstrj', + "x-trajectory.lammpstrj", ) retrieved.put_object_from_filelike( - io.StringIO('ERROR description'), - '_scheduler-stdout.txt', + io.StringIO("ERROR description"), + "_scheduler-stdout.txt", ) retrieved.put_object_from_filelike( - io.StringIO(''), - '_scheduler-stderr.txt', + io.StringIO(""), + "_scheduler-stderr.txt", ) calc_node = db_test_app.generate_calcjob_node(plugin_name, retrieved) parser = ParserFactory(plugin_name) with db_test_app.sandbox_folder() as temp_path: - with temp_path.open('x-trajectory.lammpstrj', 'w') as handle: + with temp_path.open("x-trajectory.lammpstrj", "w") as handle: handle.write(get_traj_force()) - results, calcfunction = parser.parse_from_node( # pylint: disable=unused-variable + ( + results, + calcfunction, + ) = parser.parse_from_node( # pylint: disable=unused-variable calc_node, retrieved_temporary_folder=temp_path.abspath, ) @@ -190,8 +217,10 @@ def test_run_error(db_test_app, plugin_name): assert calcfunction.is_finished, calcfunction.exception assert calcfunction.is_failed, calcfunction.exit_status - assert (calcfunction.exit_status == - calc_node.process_class.exit_codes.ERROR_LAMMPS_RUN.status) + assert ( + calcfunction.exit_status + == calc_node.process_class.exit_codes.ERROR_LAMMPS_RUN.status + ) def test_parser_log(): @@ -200,23 +229,25 @@ def test_parser_log(): """ filename = os.path.join( TEST_DIR, - 'input_files', - 'parsers', - 'log.lammps', + "input_files", + "parsers", + "log.lammps", ) parsed_data = parse_logfile(filename=filename) reference_filename = os.path.join( TEST_DIR, - 'test_raw_parsers', - 'test_parse_log.yaml', + "test_raw_parsers", + "test_parse_log.yaml", ) with io.open(reference_filename) as handle: reference_data = yaml.load(handle, Loader=yaml.Loader) - assert parsed_data == reference_data, 'content of "log.lammps" differs from reference' + assert ( + parsed_data == reference_data + ), 'content of "log.lammps" differs from reference' def test_parse_final_variables(): @@ -225,15 +256,14 @@ def test_parse_final_variables(): """ filename = os.path.join( TEST_DIR, - 'input_files', - 'parsers', - 'aiida_lammps.yaml', + "input_files", + "parsers", + "aiida_lammps.yaml", ) parsed_data = parse_final_data(filename=filename) - assert isinstance(parsed_data, - dict), 'the parsed data is not of the correct format' + assert isinstance(parsed_data, dict), "the parsed data is not of the correct format" - assert 'final_step' in parsed_data, 'no step information present' - assert 'final_etotal' in parsed_data, 'no total energy information present' + assert "final_step" in parsed_data, "no step information present" + assert "final_etotal" in parsed_data, "no total energy information present" diff --git a/aiida_lammps/tests/test_potential_data.py b/aiida_lammps/tests/test_potential_data.py index c223534..dc210a9 100644 --- a/aiida_lammps/tests/test_potential_data.py +++ b/aiida_lammps/tests/test_potential_data.py @@ -5,26 +5,28 @@ import pytest import yaml -from aiida_lammps.tests.utils import TEST_DIR -from aiida_lammps.data.potential import EmpiricalPotential -from aiida_lammps.data.lammps_potential import LammpsPotentialData + from aiida_lammps.common import input_generator +from aiida_lammps.data.lammps_potential import LammpsPotentialData +from aiida_lammps.data.potential import EmpiricalPotential +from aiida_lammps.tests.utils import TEST_DIR def test_list_potentials(): """Test that all the supported potential types are recognized.""" assert set(EmpiricalPotential.list_types()).issuperset( - ['eam', 'lennard_jones', 'reaxff', 'tersoff']) + ["eam", "lennard_jones", "reaxff", "tersoff"] + ) def test_load_type(): """Test that an specific potential can be loaded""" - EmpiricalPotential.load_type('eam') + EmpiricalPotential.load_type("eam") @pytest.mark.parametrize( - 'potential_type', - ['lennard-jones', 'tersoff', 'eam', 'reaxff'], + "potential_type", + ["lennard-jones", "tersoff", "eam", "reaxff"], ) def test_init( db_test_app, # pylint: disable=unused-argument @@ -41,7 +43,7 @@ def test_init( data_regression.check(node.attributes) -@pytest.mark.parametrize('potential_type', ['tersoff']) +@pytest.mark.parametrize("potential_type", ["tersoff"]) def test_potential_files( db_test_app, # pylint: disable=unused-argument get_potential_data, @@ -54,12 +56,12 @@ def test_potential_files( potential_type=potential.type, data=potential.data, ) - file_regression.check(node.get_object_content('potential.pot', 'r')) + file_regression.check(node.get_object_content("potential.pot", "r")) @pytest.mark.parametrize( - 'potential_type', - ['lennard-jones', 'tersoff', 'eam', 'reaxff'], + "potential_type", + ["lennard-jones", "tersoff", "eam", "reaxff"], ) def test_input_lines( db_test_app, # pylint: disable=unused-argument @@ -77,8 +79,8 @@ def test_input_lines( @pytest.mark.parametrize( - 'potential_type', - ['tersoff', 'eam_alloy', 'meam', 'morse'], + "potential_type", + ["tersoff", "eam_alloy", "meam", "morse"], ) def test_lammps_potentials_init( db_test_app, # pylint: disable=unused-argument @@ -89,33 +91,30 @@ def test_lammps_potentials_init( potential_information = get_lammps_potential_data(potential_type) node = LammpsPotentialData.get_or_create( - source=potential_information['filename'], - filename=potential_information['filename'], - **potential_information['parameters'], + source=potential_information["filename"], + filename=potential_information["filename"], + **potential_information["parameters"], ) reference_file = os.path.join( TEST_DIR, - 'test_lammps_potential_data', - f'test_init_{potential_type}.yaml', + "test_lammps_potential_data", + f"test_init_{potential_type}.yaml", ) - with io.open(reference_file, 'r') as handler: + with io.open(reference_file, "r") as handler: reference_values = yaml.load(handler, yaml.SafeLoader) - _attributes = [ - 'md5', 'pair_style', 'species', 'atom_style', 'default_units' - ] + _attributes = ["md5", "pair_style", "species", "atom_style", "default_units"] for _attribute in _attributes: _msg = f'attribute "{_attribute}" does not match between reference and current value' - assert reference_values[_attribute] == node.get_attribute( - _attribute), _msg + assert reference_values[_attribute] == node.get_attribute(_attribute), _msg @pytest.mark.parametrize( - 'potential_type', - ['tersoff', 'eam_alloy', 'meam', 'morse'], + "potential_type", + ["tersoff", "eam_alloy", "meam", "morse"], ) def test_lammps_potentials_files( db_test_app, # pylint: disable=unused-argument @@ -126,19 +125,20 @@ def test_lammps_potentials_files( potential_information = get_lammps_potential_data(potential_type) node = LammpsPotentialData.get_or_create( - source=potential_information['filename'], - filename=potential_information['filename'], - **potential_information['parameters'], + source=potential_information["filename"], + filename=potential_information["filename"], + **potential_information["parameters"], ) - _msg = 'content of the files differ' - assert node.get_content().split( - '\n') == potential_information['potential_data'].split('\n'), _msg + _msg = "content of the files differ" + assert node.get_content().split("\n") == potential_information[ + "potential_data" + ].split("\n"), _msg @pytest.mark.parametrize( - 'potential_type', - ['tersoff', 'eam_alloy', 'meam', 'morse'], + "potential_type", + ["tersoff", "eam_alloy", "meam", "morse"], ) def test_lammps_potentials_input_block( db_test_app, # pylint: disable=unused-argument @@ -149,25 +149,25 @@ def test_lammps_potentials_input_block( potential_information = get_lammps_potential_data(potential_type) node = LammpsPotentialData.get_or_create( - source=potential_information['filename'], - filename=potential_information['filename'], - **potential_information['parameters'], + source=potential_information["filename"], + filename=potential_information["filename"], + **potential_information["parameters"], ) potential_block = input_generator.write_potential_block( parameters_potential={}, - potential_file='potential.dat', + potential_file="potential.dat", potential=node, - structure=potential_information['structure'], + structure=potential_information["structure"], ) reference_file = os.path.join( TEST_DIR, - 'test_lammps_potential_data', - f'test_init_{potential_type}_block.txt', + "test_lammps_potential_data", + f"test_init_{potential_type}_block.txt", ) - with io.open(reference_file, 'r') as handler: + with io.open(reference_file, "r") as handler: reference_value = handler.read() - assert potential_block == reference_value, 'content of the potential blocks differ' + assert potential_block == reference_value, "content of the potential blocks differ" diff --git a/aiida_lammps/tests/test_reaxff_parse.py b/aiida_lammps/tests/test_reaxff_parse.py index 0f61a84..2eca03f 100644 --- a/aiida_lammps/tests/test_reaxff_parse.py +++ b/aiida_lammps/tests/test_reaxff_parse.py @@ -3,7 +3,8 @@ from aiida_lammps.common.reaxff_convert import read_lammps_format, write_lammps_format -lammps_file1 = dedent("""\ +lammps_file1 = dedent( + """\ Reactive MD-force field: Cr/O/Fe/S/C/H force field 2014 39 ! Number of general parameters 50.0000 ! Overcoordination 1 @@ -296,9 +297,11 @@ 3 2 5 2.5000 -1.0000 1.4500 19.5000 5 2 3 2.5000 -1.0000 1.4500 19.5000 5 2 5 2.5000 -2.0000 1.4500 19.5000 - """) + """ +) -lammps_file2 = dedent("""\ +lammps_file2 = dedent( + """\ Reactive MD-force field c/h/o combustion force field 39 ! Number of general parameters 50.0000 !p(boc1) @@ -422,7 +425,8 @@ 0 3 3 0 0.5511 25.4150 1.1330 -5.1903 -1.0000 0.0000 0.0000 1 ! Nr of hydrogen bonds. at1;at2;at3;r(hb);p(hb1);p(hb2);p(hb3) 3 2 3 1.9682 -4.4628 1.7976 3.0000 - """) + """ +) def test_read_lammps_format(data_regression): diff --git a/aiida_lammps/tests/test_trajectory.py b/aiida_lammps/tests/test_trajectory.py index b9fb1b3..cee8786 100644 --- a/aiida_lammps/tests/test_trajectory.py +++ b/aiida_lammps/tests/test_trajectory.py @@ -9,55 +9,61 @@ def test_iter_trajectories(data_regression): """Test that one can iterate over the trajectory steps""" - path = os.path.join(TEST_DIR, 'input_files', 'trajectory.lammpstrj') + path = os.path.join(TEST_DIR, "input_files", "trajectory.lammpstrj") output = [] with io.open(path) as handle: for tstep in iter_trajectories(handle): dct = dict(tstep._asdict()) - dct.pop('cell') - dct.pop('lines') + dct.pop("cell") + dct.pop("lines") output.append(dct) data_regression.check(output) -def test_create_structure(db_test_app, data_regression): # pylint: disable=unused-argument +def test_create_structure( + db_test_app, data_regression +): # pylint: disable=unused-argument """Test that one can create an structure from a trajectory step""" - path = os.path.join(TEST_DIR, 'input_files', 'trajectory.lammpstrj') + path = os.path.join(TEST_DIR, "input_files", "trajectory.lammpstrj") with io.open(path) as handle: traj_block = next(iter_trajectories(handle)) structure = create_structure(traj_block) - data_regression.check( - recursive_round(structure.attributes, 2, apply_lists=True)) + data_regression.check(recursive_round(structure.attributes, 2, apply_lists=True)) -def test_lammps_trajectory_data(db_test_app, data_regression): # pylint: disable=unused-argument +def test_lammps_trajectory_data( + db_test_app, data_regression +): # pylint: disable=unused-argument """Test that one can generate a trajectory from a file""" - path = os.path.join(TEST_DIR, 'input_files', 'trajectory.lammpstrj') + path = os.path.join(TEST_DIR, "input_files", "trajectory.lammpstrj") data = LammpsTrajectory(path) data_regression.check(data.attributes) -def test_lammpstraj_get_step_string(db_test_app, file_regression): # pylint: disable=unused-argument +def test_lammpstraj_get_step_string( + db_test_app, file_regression +): # pylint: disable=unused-argument """Get the step information from a trajectory data file""" - path = os.path.join(TEST_DIR, 'input_files', 'trajectory.lammpstrj') + path = os.path.join(TEST_DIR, "input_files", "trajectory.lammpstrj") data = LammpsTrajectory(path) file_regression.check(data.get_step_string(-1)) -def test_lammpstraj_get_step_struct(db_test_app, data_regression): # pylint: disable=unused-argument +def test_lammpstraj_get_step_struct( + db_test_app, data_regression +): # pylint: disable=unused-argument """Get the structure data for a given trajectory step""" - path = os.path.join(TEST_DIR, 'input_files', 'trajectory.lammpstrj') + path = os.path.join(TEST_DIR, "input_files", "trajectory.lammpstrj") data = LammpsTrajectory(path) data_regression.check( - recursive_round(data.get_step_structure(-1).attributes, - 2, - apply_lists=True)) + recursive_round(data.get_step_structure(-1).attributes, 2, apply_lists=True) + ) def test_lammpstraj_timesteps(db_test_app): # pylint: disable=unused-argument """Get the list of timesteps for the trajectory data""" - path = os.path.join(TEST_DIR, 'input_files', 'trajectory.lammpstrj') + path = os.path.join(TEST_DIR, "input_files", "trajectory.lammpstrj") data = LammpsTrajectory(path) assert data.time_steps == [ 0, @@ -86,7 +92,7 @@ def test_lammpstraj_timesteps(db_test_app): # pylint: disable=unused-argument def test_write_as_lammps(db_test_app, tmp_path): # pylint: disable=unused-argument """Test that one can write the trajectory in a lammps compatible format""" - path = os.path.join(TEST_DIR, 'input_files', 'trajectory.lammpstrj') + path = os.path.join(TEST_DIR, "input_files", "trajectory.lammpstrj") data = LammpsTrajectory(path) - with tmp_path.joinpath('trajectory.lammpstrj').open(mode='wb') as handle: + with tmp_path.joinpath("trajectory.lammpstrj").open(mode="wb") as handle: data.write_as_lammps(handle) diff --git a/aiida_lammps/tests/utils.py b/aiida_lammps/tests/utils.py index cdcdc5c..c5f5519 100644 --- a/aiida_lammps/tests/utils.py +++ b/aiida_lammps/tests/utils.py @@ -8,36 +8,36 @@ import sys from aiida.common import NotExistent -from aiida.orm import Computer, Code, CalcJobNode -from aiida.plugins import ParserFactory, CalculationFactory, DataFactory +from aiida.common.folders import SandboxFolder +from aiida.common.links import LinkType from aiida.engine.utils import instantiate_process from aiida.manage.manager import get_manager -from aiida.common.links import LinkType +from aiida.orm import CalcJobNode, Code, Computer +from aiida.plugins import CalculationFactory, DataFactory, ParserFactory from aiida.plugins.entry_point import format_entry_point_string -from aiida.common.folders import SandboxFolder TEST_DIR = os.path.dirname(os.path.realpath(__file__)) -def lammps_version(executable='lammps'): +def lammps_version(executable="lammps"): """Get the version of lammps. we assume `lammps -h` returns e.g. 'LAMMPS (10 Feb 2015)' or 'Large-scale Atomic/Molecular Massively Parallel Simulator - 5 Jun 2019' """ - out_text = subprocess.check_output([executable, '-h']).decode('utf8') - match = re.search(r'LAMMPS \((.*)\)', out_text) + out_text = subprocess.check_output([executable, "-h"]).decode("utf8") + match = re.search(r"LAMMPS \((.*)\)", out_text) if match: return match.group(1) regex = re.compile( - r'^Large-scale Atomic/Molecular Massively Parallel Simulator - (.*)$', + r"^Large-scale Atomic/Molecular Massively Parallel Simulator - (.*)$", re.MULTILINE, ) match = re.search(regex, out_text) if match: return match.group(1).strip() - raise IOError('Could not find version from `{} -h`'.format(executable)) + raise IOError("Could not find version from `{} -h`".format(executable)) def get_path_to_executable(executable): @@ -60,12 +60,12 @@ def get_path_to_executable(executable): if path is None: path = distutils.spawn.find_executable(executable) if path is None: - raise ValueError('{} executable not found in PATH.'.format(executable)) + raise ValueError("{} executable not found in PATH.".format(executable)) return os.path.abspath(path) -def get_or_create_local_computer(work_directory, name='localhost'): +def get_or_create_local_computer(work_directory, name="localhost"): """Retrieve or setup a local computer :param work_directory: str path to a local directory for running computations in @@ -80,11 +80,10 @@ def get_or_create_local_computer(work_directory, name='localhost'): except NotExistent: computer = Computer( label=name, - hostname='localhost', - description=('localhost computer, ' - 'set up by aiida_lammps tests'), - transport_type='local', - scheduler_type='direct', + hostname="localhost", + description=("localhost computer, " "set up by aiida_lammps tests"), + transport_type="local", + scheduler_type="direct", workdir=os.path.abspath(work_directory), ) computer.store() @@ -101,13 +100,15 @@ def get_or_create_code(entry_point, computer, executable, exec_path=None): try: code = Code.objects.get( # pylint: disable=no-member - label=f'{entry_point}-{executable}-{computer.label}') + label=f"{entry_point}-{executable}-{computer.label}" + ) except NotExistent: if exec_path is None: exec_path = get_path_to_executable(executable) - code = Code(input_plugin_name=entry_point, - remote_computer_exec=[computer, exec_path]) - code.label = f'{entry_point}-{executable}-{computer.label}' + code = Code( + input_plugin_name=entry_point, remote_computer_exec=[computer, exec_path] + ) + code.label = f"{entry_point}-{executable}-{computer.label}" code.store() return code @@ -131,13 +132,13 @@ def get_default_metadata( :rtype: dict """ return { - 'options': { - 'resources': { - 'num_machines': int(max_num_machines), - 'num_mpiprocs_per_machine': int(num_mpiprocs_per_machine), + "options": { + "resources": { + "num_machines": int(max_num_machines), + "num_mpiprocs_per_machine": int(num_mpiprocs_per_machine), }, - 'max_wallclock_seconds': int(max_wallclock_seconds), - 'withmpi': with_mpi, + "max_wallclock_seconds": int(max_wallclock_seconds), + "withmpi": with_mpi, } } @@ -150,9 +151,7 @@ def recursive_round(check_object, precision, apply_lists=False): for k, v in check_object.items() } if apply_lists and isinstance(check_object, (list, tuple)): - return [ - recursive_round(v, precision, apply_lists) for v in check_object - ] + return [recursive_round(v, precision, apply_lists) for v in check_object] if isinstance(check_object, float): return round(check_object, precision) return check_object @@ -185,11 +184,11 @@ def environment(self): """return manager of a temporary AiiDA environment""" return self._environment - def get_or_create_computer(self, name='localhost'): + def get_or_create_computer(self, name="localhost"): """Setup localhost computer""" return get_or_create_local_computer(self.work_directory, name) - def get_or_create_code(self, entry_point, computer_name='localhost'): + def get_or_create_code(self, entry_point, computer_name="localhost"): """Setup code on localhost computer""" computer = self.get_or_create_computer(computer_name) @@ -198,8 +197,9 @@ def get_or_create_code(self, entry_point, computer_name='localhost'): executable = self._executables[entry_point] except KeyError as key_error: raise KeyError( - f'Entry point {entry_point} not recognized. ' - f'Allowed values: {self._executables.keys()}') from key_error + f"Entry point {entry_point} not recognized. " + f"Allowed values: {self._executables.keys()}" + ) from key_error return get_or_create_code(entry_point, computer, executable) @@ -252,7 +252,7 @@ def generate_calcjob_node( self, entry_point_name, retrieved, - computer_name='localhost', + computer_name="localhost", attributes=None, ): """Fixture to generate a mock `CalcJobNode` for testing parsers. @@ -267,19 +267,18 @@ def generate_calcjob_node( process = self.get_calc_cls(entry_point_name) computer = self.get_or_create_computer(computer_name) - entry_point = format_entry_point_string('aiida.calculations', - entry_point_name) + entry_point = format_entry_point_string("aiida.calculations", entry_point_name) node = CalcJobNode(computer=computer, process_type=entry_point) - node.set_options({ - k: v.default() if callable(v.default) else v.default - for k, v in process.spec_options.items() if v.has_default() - }) - node.set_option('resources', { - 'num_machines': 1, - 'num_mpiprocs_per_machine': 1 - }) - node.set_option('max_wallclock_seconds', 1800) + node.set_options( + { + k: v.default() if callable(v.default) else v.default + for k, v in process.spec_options.items() + if v.has_default() + } + ) + node.set_option("resources", {"num_machines": 1, "num_mpiprocs_per_machine": 1}) + node.set_option("max_wallclock_seconds", 1800) if attributes: node.set_attributes(attributes) # pylint: disable=no-member @@ -289,7 +288,7 @@ def generate_calcjob_node( retrieved.add_incoming( node, link_type=LinkType.CREATE, - link_label='retrieved', + link_label="retrieved", ) retrieved.store() diff --git a/aiida_lammps/utils.py b/aiida_lammps/utils.py index 703b9fc..c750fbf 100644 --- a/aiida_lammps/utils.py +++ b/aiida_lammps/utils.py @@ -1,6 +1,6 @@ """General utility functions for aiida-lammps""" -from packaging import version from aiida import __version__ as aiida_version_ +from packaging import version def aiida_version(): diff --git a/aiida_lammps/validation/__init__.py b/aiida_lammps/validation/__init__.py index 8990c03..1f7e5e8 100644 --- a/aiida_lammps/validation/__init__.py +++ b/aiida_lammps/validation/__init__.py @@ -1,4 +1,6 @@ """Package for validating JSON objects against schemas.""" from aiida_lammps.validation.utils import ( # noqa: F401 - load_schema, load_validator, validate_against_schema, + load_schema, + load_validator, + validate_against_schema, ) diff --git a/aiida_lammps/validation/utils.py b/aiida_lammps/validation/utils.py index 56f4a7f..ec94e16 100644 --- a/aiida_lammps/validation/utils.py +++ b/aiida_lammps/validation/utils.py @@ -47,9 +47,10 @@ def load_validator(schema): def is_array(checker, instance): # pylint: disable=unused-argument return isinstance(instance, (tuple, list)) - type_checker = validator_cls.TYPE_CHECKER.redefine('array', is_array) - validator_cls = jsonschema.validators.extend(validator_cls, - type_checker=type_checker) + type_checker = validator_cls.TYPE_CHECKER.redefine("array", is_array) + validator_cls = jsonschema.validators.extend( + validator_cls, type_checker=type_checker + ) validator = validator_cls(schema=schema) return validator @@ -70,9 +71,13 @@ def validate_against_schema(data, schema): # validator.validate(data) errors = sorted(validator.iter_errors(data), key=lambda e: e.path) if errors: - raise jsonschema.ValidationError('\n'.join([ - f'- {error.message} [key path: "{"/".join([str(p) for p in error.path])}"]' - for error in errors - ])) + raise jsonschema.ValidationError( + "\n".join( + [ + f'- {error.message} [key path: "{"/".join([str(p) for p in error.path])}"]' + for error in errors + ] + ) + ) return True diff --git a/conftest.py b/conftest.py index 47f7b9b..f4decb4 100644 --- a/conftest.py +++ b/conftest.py @@ -7,45 +7,44 @@ import os import shutil import tempfile -import yaml -import pytest -import numpy as np + from aiida import orm +import numpy as np +import pytest +import yaml + +from aiida_lammps.common.reaxff_convert import filter_by_species, read_lammps_format from aiida_lammps.tests.utils import TEST_DIR, AiidaTestApp -from aiida_lammps.common.reaxff_convert import ( - filter_by_species, - read_lammps_format, -) -pytest_plugins = ['aiida.manage.tests.pytest_fixtures'] +pytest_plugins = ["aiida.manage.tests.pytest_fixtures"] def pytest_addoption(parser): """Define pytest command-line.""" - group = parser.getgroup('aiida_lammps') + group = parser.getgroup("aiida_lammps") group.addoption( - '--lammps-workdir', - dest='lammps_workdir', + "--lammps-workdir", + dest="lammps_workdir", default=None, help=( - 'Specify a work directory path for aiida calcjob execution. ' - 'If not specified, ' - 'a temporary directory is used and deleted after tests execution.' + "Specify a work directory path for aiida calcjob execution. " + "If not specified, " + "a temporary directory is used and deleted after tests execution." ), ) group.addoption( - '--lammps-exec', - dest='lammps_exec', + "--lammps-exec", + dest="lammps_exec", default=None, - help=('Specify a the lammps executable to run (default: lammps).'), + help=("Specify a the lammps executable to run (default: lammps)."), ) def get_work_directory(config): """Return the aiida work directory to use.""" - if config.getoption('lammps_workdir') is not None: - return config.getoption('lammps_workdir') + if config.getoption("lammps_workdir") is not None: + return config.getoption("lammps_workdir") return None @@ -53,20 +52,20 @@ def pytest_report_header(config): """Add header information for pytest execution.""" return [ f'LAMMPS Executable: {shutil.which(config.getoption("lammps_exec") or "lammps")}', - f'LAMMPS Work Directory: {config.getoption("lammps_workdir") or ""}' + f'LAMMPS Work Directory: {config.getoption("lammps_workdir") or ""}', ] -@pytest.fixture(scope='function') +@pytest.fixture(scope="function") def db_test_app(aiida_profile, pytestconfig): """Clear the database after each test.""" - exec_name = pytestconfig.getoption('lammps_exec') or 'lammps' + exec_name = pytestconfig.getoption("lammps_exec") or "lammps" executables = { - 'lammps.md': exec_name, - 'lammps.md.multi': exec_name, - 'lammps.optimize': exec_name, - 'lammps.force': exec_name, - 'lammps.combinate': exec_name, + "lammps.md": exec_name, + "lammps.md.multi": exec_name, + "lammps.optimize": exec_name, + "lammps.force": exec_name, + "lammps.combinate": exec_name, } test_workdir = get_work_directory(pytestconfig) @@ -82,12 +81,13 @@ def db_test_app(aiida_profile, pytestconfig): shutil.rmtree(work_directory) -@pytest.fixture(scope='function') +@pytest.fixture(scope="function") def get_structure_data(): """get the structure data for the simulation.""" + def _get_structure_data(pkey): """return test structure data""" - if pkey == 'Fe': + if pkey == "Fe": cell = [ [2.848116, 0.000000, 0.000000], @@ -101,10 +101,10 @@ def _get_structure_data(pkey): ] fractional = True - symbols = ['Fe', 'Fe'] - names = ['Fe1', 'Fe2'] + symbols = ["Fe", "Fe"] + names = ["Fe1", "Fe2"] - elif pkey == 'Ar': + elif pkey == "Ar": cell = [ [3.987594, 0.000000, 0.000000], @@ -112,7 +112,7 @@ def _get_structure_data(pkey): [0.000000, 0.000000, 6.538394], ] - symbols = names = ['Ar'] * 2 + symbols = names = ["Ar"] * 2 positions = [ (0.33333, 0.66666, 0.25000), @@ -120,7 +120,7 @@ def _get_structure_data(pkey): ] fractional = True - elif pkey == 'GaN': + elif pkey == "GaN": cell = [ [3.1900000572, 0, 0], @@ -136,9 +136,9 @@ def _get_structure_data(pkey): ] fractional = True - symbols = names = ['Ga', 'Ga', 'N', 'N'] + symbols = names = ["Ga", "Ga", "N", "N"] - elif pkey == 'pyrite': + elif pkey == "pyrite": cell = [ [5.38, 0.000000, 0.000000], @@ -162,16 +162,15 @@ def _get_structure_data(pkey): ] fractional = True - symbols = names = ['Fe'] * 4 + ['S'] * 8 + symbols = names = ["Fe"] * 4 + ["S"] * 8 - elif pkey == 'fes_cubic-zincblende': + elif pkey == "fes_cubic-zincblende": cell = [[2.71, -2.71, 0.0], [2.71, 0.0, 2.71], [0.0, -2.71, 2.71]] - symbols = names = ['Fe', 'S'] + symbols = names = ["Fe", "S"] positions = [[0, 0, 0], [4.065, -4.065, 4.065]] fractional = False - elif pkey == 'greigite': - cell = [[0.0, 4.938, 4.938], [4.938, 0.0, 4.938], - [4.938, 4.938, 0.0]] + elif pkey == "greigite": + cell = [[0.0, 4.938, 4.938], [4.938, 0.0, 4.938], [4.938, 4.938, 0.0]] positions = [ (1.2345, 1.2345, 1.2345), (8.6415, 8.6415, 8.6415), @@ -190,24 +189,24 @@ def _get_structure_data(pkey): ] fractional = False symbols = names = [ - 'Fe', - 'Fe', - 'Fe', - 'Fe', - 'Fe', - 'Fe', - 'S', - 'S', - 'S', - 'S', - 'S', - 'S', - 'S', - 'S', + "Fe", + "Fe", + "Fe", + "Fe", + "Fe", + "Fe", + "S", + "S", + "S", + "S", + "S", + "S", + "S", + "S", ] else: - raise ValueError(f'Unknown structure key: {pkey}') + raise ValueError(f"Unknown structure key: {pkey}") # create structure structure = orm.StructureData(cell=cell) @@ -222,123 +221,114 @@ def _get_structure_data(pkey): PotentialData = namedtuple( - 'PotentialTestData', - ['type', 'data', 'structure', 'output'], + "PotentialTestData", + ["type", "data", "structure", "output"], ) -@pytest.fixture(scope='function') +@pytest.fixture(scope="function") def get_potential_data(get_structure_data): """Get the potential information for different types of potentials. :param get_structure_data: Structure to be used in the simulation :type get_structure_data: orm.StructureData """ + def _get_potential_data(pkey): """return data to create a potential, and accompanying structure data and expected output data to test it with """ - if pkey == 'eam': - pair_style = 'eam' + if pkey == "eam": + pair_style = "eam" filename = os.path.join( TEST_DIR, - 'input_files', - 'potentials', - 'Fe_mm.eam.fs', + "input_files", + "potentials", + "Fe_mm.eam.fs", ) with io.open(filename) as handle: potential_dict = { - 'type': 'fs', - 'file_contents': handle.readlines(), - 'element_names': ['Fe'], + "type": "fs", + "file_contents": handle.readlines(), + "element_names": ["Fe"], } - structure = get_structure_data('Fe') - output_dict = {'initial_energy': -8.2441284, 'energy': -8.2448702} + structure = get_structure_data("Fe") + output_dict = {"initial_energy": -8.2441284, "energy": -8.2448702} - elif pkey == 'lennard-jones': + elif pkey == "lennard-jones": - structure = get_structure_data('Ar') + structure = get_structure_data("Ar") # Example LJ parameters for Argon. These may not be accurate at all - pair_style = 'lennard_jones' + pair_style = "lennard_jones" potential_dict = { - '1 1': '0.01029 3.4 3.5', + "1 1": "0.01029 3.4 3.5", } output_dict = { - 'initial_energy': 0.0, - 'energy': 0.0, # TODO should LJ energy be 0? + "initial_energy": 0.0, + "energy": 0.0, # TODO should LJ energy be 0? } - elif pkey == 'tersoff': + elif pkey == "tersoff": - structure = get_structure_data('GaN') + structure = get_structure_data("GaN") potential_dict = { - 'Ga Ga Ga': - '1.0 0.007874 1.846 1.918000 0.75000 -0.301300 '+\ - '1.0 1.0 1.44970 410.132 2.87 0.15 1.60916 535.199', - 'N N N': - '1.0 0.766120 0.000 0.178493 0.20172 -0.045238 '+\ - '1.0 1.0 2.38426 423.769 2.20 0.20 3.55779 1044.77', - 'Ga Ga N': - '1.0 0.001632 0.000 65.20700 2.82100 -0.518000 '+\ - '1.0 0.0 0.00000 0.00000 2.90 0.20 0.00000 0.00000', - 'Ga N N': - '1.0 0.001632 0.000 65.20700 2.82100 -0.518000 '+\ - '1.0 1.0 2.63906 3864.27 2.90 0.20 2.93516 6136.44', - 'N Ga Ga': - '1.0 0.001632 0.000 65.20700 2.82100 -0.518000 '+\ - '1.0 1.0 2.63906 3864.27 2.90 0.20 2.93516 6136.44', - 'N Ga N ': - '1.0 0.766120 0.000 0.178493 0.20172 -0.045238 '+\ - '1.0 0.0 0.00000 0.00000 2.20 0.20 0.00000 0.00000', - 'N N Ga': - '1.0 0.001632 0.000 65.20700 2.82100 -0.518000 '+\ - '1.0 0.0 0.00000 0.00000 2.90 0.20 0.00000 0.00000', - 'Ga N Ga': - '1.0 0.007874 1.846 1.918000 0.75000 -0.301300 '+\ - '1.0 0.0 0.00000 0.00000 2.87 0.15 0.00000 0.00000', + "Ga Ga Ga": "1.0 0.007874 1.846 1.918000 0.75000 -0.301300 " + + "1.0 1.0 1.44970 410.132 2.87 0.15 1.60916 535.199", + "N N N": "1.0 0.766120 0.000 0.178493 0.20172 -0.045238 " + + "1.0 1.0 2.38426 423.769 2.20 0.20 3.55779 1044.77", + "Ga Ga N": "1.0 0.001632 0.000 65.20700 2.82100 -0.518000 " + + "1.0 0.0 0.00000 0.00000 2.90 0.20 0.00000 0.00000", + "Ga N N": "1.0 0.001632 0.000 65.20700 2.82100 -0.518000 " + + "1.0 1.0 2.63906 3864.27 2.90 0.20 2.93516 6136.44", + "N Ga Ga": "1.0 0.001632 0.000 65.20700 2.82100 -0.518000 " + + "1.0 1.0 2.63906 3864.27 2.90 0.20 2.93516 6136.44", + "N Ga N ": "1.0 0.766120 0.000 0.178493 0.20172 -0.045238 " + + "1.0 0.0 0.00000 0.00000 2.20 0.20 0.00000 0.00000", + "N N Ga": "1.0 0.001632 0.000 65.20700 2.82100 -0.518000 " + + "1.0 0.0 0.00000 0.00000 2.90 0.20 0.00000 0.00000", + "Ga N Ga": "1.0 0.007874 1.846 1.918000 0.75000 -0.301300 " + + "1.0 0.0 0.00000 0.00000 2.87 0.15 0.00000 0.00000", } - pair_style = 'tersoff' + pair_style = "tersoff" - output_dict = {'initial_energy': -18.109886, 'energy': -18.110852} + output_dict = {"initial_energy": -18.109886, "energy": -18.110852} - elif pkey == 'reaxff': + elif pkey == "reaxff": - pair_style = 'reaxff' + pair_style = "reaxff" filename = os.path.join( TEST_DIR, - 'input_files', - 'potentials', - 'FeCrOSCH.reaxff', + "input_files", + "potentials", + "FeCrOSCH.reaxff", ) with io.open(filename) as handle: potential_dict = read_lammps_format( handle.read().splitlines(), - tolerances={'hbonddist': 7.0}, + tolerances={"hbonddist": 7.0}, ) potential_dict = filter_by_species( potential_dict, - ['Fe core', 'S core'], + ["Fe core", "S core"], ) - for name in [ - 'anglemin', 'angleprod', 'hbondmin', 'torsionprod' - ]: - potential_dict['global'].pop(name) - potential_dict['control'] = {'safezone': 1.6} + for name in ["anglemin", "angleprod", "hbondmin", "torsionprod"]: + potential_dict["global"].pop(name) + potential_dict["control"] = {"safezone": 1.6} - structure = get_structure_data('pyrite') + structure = get_structure_data("pyrite") output_dict = { - 'initial_energy': -1027.9739, - 'energy': -1030.3543, - 'units': 'real', + "initial_energy": -1027.9739, + "energy": -1030.3543, + "units": "real", } else: - raise ValueError(f'Unknown potential key: {pkey}') + raise ValueError(f"Unknown potential key: {pkey}") return PotentialData( pair_style, @@ -350,105 +340,106 @@ def _get_potential_data(pkey): return _get_potential_data -@pytest.fixture(scope='function') +@pytest.fixture(scope="function") def get_lammps_potential_data(get_structure_data): """Get the potential information for different types of potentials. :param get_structure_data: Structure to be used in the simulation :type get_structure_data: orm.StructureData """ + def _get_lammps_potential_data(pkey): """return data to create a potential, and accompanying structure data and expected output data to test it with """ output_dict = {} - if pkey == 'eam_alloy': - output_dict['filename'] = os.path.join( - 'aiida_lammps/tests', - 'input_files', - 'potentials', - 'FeW_MO_737567242631_000.eam.alloy', + if pkey == "eam_alloy": + output_dict["filename"] = os.path.join( + "aiida_lammps/tests", + "input_files", + "potentials", + "FeW_MO_737567242631_000.eam.alloy", ) filename_parameters = os.path.join( - 'aiida_lammps/tests', - 'input_files', - 'parameters', - 'FeW_MO_737567242631_000.eam.alloy.yaml', + "aiida_lammps/tests", + "input_files", + "parameters", + "FeW_MO_737567242631_000.eam.alloy.yaml", ) with io.open(filename_parameters) as handle: - output_dict['parameters'] = yaml.load(handle, yaml.SafeLoader) - - with io.open(output_dict['filename']) as handle: - output_dict['potential_data'] = handle.read() - output_dict['structure'] = get_structure_data('Fe') - - if pkey == 'tersoff': - output_dict['filename'] = os.path.join( - 'aiida_lammps/tests', - 'input_files', - 'potentials', - 'Fe_MO_137964310702_004.tersoff', + output_dict["parameters"] = yaml.load(handle, yaml.SafeLoader) + + with io.open(output_dict["filename"]) as handle: + output_dict["potential_data"] = handle.read() + output_dict["structure"] = get_structure_data("Fe") + + if pkey == "tersoff": + output_dict["filename"] = os.path.join( + "aiida_lammps/tests", + "input_files", + "potentials", + "Fe_MO_137964310702_004.tersoff", ) filename_parameters = os.path.join( - 'aiida_lammps/tests', - 'input_files', - 'parameters', - 'Fe_MO_137964310702_004.tersoff.yaml', + "aiida_lammps/tests", + "input_files", + "parameters", + "Fe_MO_137964310702_004.tersoff.yaml", ) with io.open(filename_parameters) as handle: - output_dict['parameters'] = yaml.load(handle, yaml.SafeLoader) - - with io.open(output_dict['filename']) as handle: - output_dict['potential_data'] = handle.read() - output_dict['structure'] = get_structure_data('Fe') - - if pkey == 'meam': - output_dict['filename'] = os.path.join( - 'aiida_lammps/tests', - 'input_files', - 'potentials', - 'Fe_MO_492310898779_001.meam', + output_dict["parameters"] = yaml.load(handle, yaml.SafeLoader) + + with io.open(output_dict["filename"]) as handle: + output_dict["potential_data"] = handle.read() + output_dict["structure"] = get_structure_data("Fe") + + if pkey == "meam": + output_dict["filename"] = os.path.join( + "aiida_lammps/tests", + "input_files", + "potentials", + "Fe_MO_492310898779_001.meam", ) filename_parameters = os.path.join( - 'aiida_lammps/tests', - 'input_files', - 'parameters', - 'Fe_MO_492310898779_001.meam.yaml', + "aiida_lammps/tests", + "input_files", + "parameters", + "Fe_MO_492310898779_001.meam.yaml", ) with io.open(filename_parameters) as handle: - output_dict['parameters'] = yaml.load(handle, yaml.SafeLoader) - - with io.open(output_dict['filename']) as handle: - output_dict['potential_data'] = handle.read() - output_dict['structure'] = get_structure_data('Fe') - - if pkey == 'morse': - output_dict['filename'] = os.path.join( - 'aiida_lammps/tests', - 'input_files', - 'potentials', - 'Fe_MO_331285495617_004.morse', + output_dict["parameters"] = yaml.load(handle, yaml.SafeLoader) + + with io.open(output_dict["filename"]) as handle: + output_dict["potential_data"] = handle.read() + output_dict["structure"] = get_structure_data("Fe") + + if pkey == "morse": + output_dict["filename"] = os.path.join( + "aiida_lammps/tests", + "input_files", + "potentials", + "Fe_MO_331285495617_004.morse", ) filename_parameters = os.path.join( - 'aiida_lammps/tests', - 'input_files', - 'parameters', - 'Fe_MO_331285495617_004.morse.yaml', + "aiida_lammps/tests", + "input_files", + "parameters", + "Fe_MO_331285495617_004.morse.yaml", ) with io.open(filename_parameters) as handle: - output_dict['parameters'] = yaml.load(handle, yaml.SafeLoader) + output_dict["parameters"] = yaml.load(handle, yaml.SafeLoader) - with io.open(output_dict['filename']) as handle: - output_dict['potential_data'] = handle.read() - output_dict['structure'] = get_structure_data('Fe') + with io.open(output_dict["filename"]) as handle: + output_dict["potential_data"] = handle.read() + output_dict["structure"] = get_structure_data("Fe") return output_dict diff --git a/docs/source/conf.py b/docs/source/conf.py index 6deb51c..4c6c22a 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -5,9 +5,11 @@ or directly: `sphinx-build -n -W --keep-going docs/source docs/_build` """ import os -import sys import subprocess +import sys + from aiida.manage.configuration import load_documentation_profile + from aiida_lammps import __version__ # -- AiiDA-related setup -------------------------------------------------- @@ -17,50 +19,50 @@ # default profile of the AiiDA installation does not use a Django backend. load_documentation_profile() -PROJECT = 'AiiDA LAMMPS' -COPYRIGHT = '2021, AiiDA Team' -AUTHOR = 'AiiDA Team' +PROJECT = "AiiDA LAMMPS" +COPYRIGHT = "2021, AiiDA Team" +AUTHOR = "AiiDA Team" VERSION = __version__ extensions = [ # read Markdown files - 'myst_parser', + "myst_parser", # specify sitemap in single file (not toctrees) - 'sphinx_external_toc', - 'sphinx.ext.intersphinx', - 'sphinx.ext.autodoc', - 'sphinx.ext.doctest', - 'sphinx.ext.viewcode', - 'sphinx.ext.coverage', - 'sphinx.ext.mathjax', - 'sphinx.ext.ifconfig', - 'sphinx.ext.todo', - 'IPython.sphinxext.ipython_console_highlighting', - 'IPython.sphinxext.ipython_directive', - 'aiida.sphinxext', - 'sphinx_panels', - 'sphinx_copybutton', - 'sphinxext.rediraffe', - 'notfound.extension', + "sphinx_external_toc", + "sphinx.ext.intersphinx", + "sphinx.ext.autodoc", + "sphinx.ext.doctest", + "sphinx.ext.viewcode", + "sphinx.ext.coverage", + "sphinx.ext.mathjax", + "sphinx.ext.ifconfig", + "sphinx.ext.todo", + "IPython.sphinxext.ipython_console_highlighting", + "IPython.sphinxext.ipython_directive", + "aiida.sphinxext", + "sphinx_panels", + "sphinx_copybutton", + "sphinxext.rediraffe", + "notfound.extension", ] intersphinx_mapping = { - 'python': ('https://docs.python.org/3', None), - 'aiida': ('https://aiida-core.readthedocs.io/en/latest', None), - 'click': ('https://click.palletsprojects.com/', None), - 'flask': ('http://flask.pocoo.org/docs/latest/', None), - 'flask_restful': ('https://flask-restful.readthedocs.io/en/latest/', None), - 'kiwipy': ('https://kiwipy.readthedocs.io/en/latest/', None), - 'pandas': ('https://pandas.pydata.org/docs/', None), - 'plumpy': ('https://plumpy.readthedocs.io/en/latest/', None), - 'pymatgen': ('https://pymatgen.org/', None), + "python": ("https://docs.python.org/3", None), + "aiida": ("https://aiida-core.readthedocs.io/en/latest", None), + "click": ("https://click.palletsprojects.com/", None), + "flask": ("http://flask.pocoo.org/docs/latest/", None), + "flask_restful": ("https://flask-restful.readthedocs.io/en/latest/", None), + "kiwipy": ("https://kiwipy.readthedocs.io/en/latest/", None), + "pandas": ("https://pandas.pydata.org/docs/", None), + "plumpy": ("https://plumpy.readthedocs.io/en/latest/", None), + "pymatgen": ("https://pymatgen.org/", None), } -html_theme = 'furo' # pylint: disable=invalid-name -html_title = f'v{__version__}' # pylint: disable=invalid-name -html_logo = 'static/logo.png' # pylint: disable=invalid-name +html_theme = "furo" # pylint: disable=invalid-name +html_title = f"v{__version__}" # pylint: disable=invalid-name +html_logo = "static/logo.png" # pylint: disable=invalid-name html_theme_options = { - 'announcement': 'This documentation is in development!', + "announcement": "This documentation is in development!", } @@ -73,55 +75,57 @@ def run_apidoc(_): See also https://github.com/rtfd/readthedocs.org/issues/1139 """ source_dir = os.path.abspath(os.path.dirname(__file__)) - apidoc_dir = os.path.join(source_dir, 'reference', 'apidoc') - package_dir = os.path.join(source_dir, os.pardir, os.pardir, - 'aiida_lammps') + apidoc_dir = os.path.join(source_dir, "reference", "apidoc") + package_dir = os.path.join(source_dir, os.pardir, os.pardir, "aiida_lammps") # In #1139, they suggest the route below, but this ended up # calling sphinx-build, not sphinx-apidoc - #from sphinx.apidoc import main - #main([None, '-e', '-o', apidoc_dir, package_dir, '--force']) + # from sphinx.apidoc import main + # main([None, '-e', '-o', apidoc_dir, package_dir, '--force']) - cmd_path = 'sphinx-apidoc' - if hasattr(sys, 'real_prefix'): # Check to see if we are in a virtualenv + cmd_path = "sphinx-apidoc" + if hasattr(sys, "real_prefix"): # Check to see if we are in a virtualenv # If we are, assemble the path manually cmd_path = os.path.abspath( os.path.join( sys.prefix, - 'bin', - 'sphinx-apidoc', - )) + "bin", + "sphinx-apidoc", + ) + ) options = [ - '-o', + "-o", apidoc_dir, package_dir, - '--private', - '--force', - '--no-headings', - '--module-first', - '--no-toc', - '--maxdepth', - '4', + "--private", + "--force", + "--no-headings", + "--module-first", + "--no-toc", + "--maxdepth", + "4", ] # See https://stackoverflow.com/a/30144019 env = os.environ.copy() - env['SPHINX_APIDOC_OPTIONS'] = \ - 'members,special-members,private-members,undoc-members,show-inheritance' + env[ + "SPHINX_APIDOC_OPTIONS" + ] = "members,special-members,private-members,undoc-members,show-inheritance" subprocess.check_call([cmd_path] + options, env=env) def setup(app): """Run the apidoc.""" - if os.environ.get('RUN_APIDOC', None) != 'False': - app.connect('builder-inited', run_apidoc) + if os.environ.get("RUN_APIDOC", None) != "False": + app.connect("builder-inited", run_apidoc) # We should ignore any python built-in exception, for instance # Warnings to ignore when using the -n (nitpicky) option -with open('nitpick-exceptions', 'r') as handle: +with open("nitpick-exceptions", "r") as handle: nitpick_ignore = [ - tuple(line.strip().split(None, 1)) for line in handle.readlines() - if line.strip() and not line.startswith('#') + tuple(line.strip().split(None, 1)) + for line in handle.readlines() + if line.strip() and not line.startswith("#") ] diff --git a/examples/launch_dynaphopy_si.py b/examples/launch_dynaphopy_si.py index df0f428..eb0bab8 100644 --- a/examples/launch_dynaphopy_si.py +++ b/examples/launch_dynaphopy_si.py @@ -4,13 +4,13 @@ from aiida.plugins import CalculationFactory import numpy as np -if __name__ == '__main__': +if __name__ == "__main__": from aiida import load_profile # noqa: F401 load_profile() - codename = 'dynaphopy@stern' + codename = "dynaphopy@stern" ############################ # Define input parameters # @@ -19,7 +19,7 @@ a = 5.404 cell = [[a, 0, 0], [0, a, 0], [0, 0, a]] - symbols = ['Si'] * 8 + symbols = ["Si"] * 8 scaled_positions = [ (0.875, 0.875, 0.875), (0.875, 0.375, 0.375), @@ -35,23 +35,24 @@ positions = np.dot(scaled_positions, cell) for i, scaled_position in enumerate(scaled_positions): - structure.append_atom(position=np.dot(scaled_position, cell).tolist(), - symbols=symbols[i]) + structure.append_atom( + position=np.dot(scaled_position, cell).tolist(), symbols=symbols[i] + ) structure.store() dynaphopy_parameters = { - 'supercell': [[2, 0, 0], [0, 2, 0], [0, 0, 2]], - 'primitive': [[1.0, 0.0, 0.0], [0.0, 1.0, 0.0], [0.0, 0.0, 1.0]], - 'mesh': [40, 40, 40], - 'md_commensurate': True, - 'temperature': 300, + "supercell": [[2, 0, 0], [0, 2, 0], [0, 0, 2]], + "primitive": [[1.0, 0.0, 0.0], [0.0, 1.0, 0.0], [0.0, 0.0, 1.0]], + "mesh": [40, 40, 40], + "md_commensurate": True, + "temperature": 300, } # Temperature can be omitted (If ommited calculated from Max.-Boltz.) dynaphopy_machine = { - 'num_machines': 1, - 'parallel_env': 'mpi*', - 'tot_num_mpiprocs': 16, + "num_machines": 1, + "parallel_env": "mpi*", + "tot_num_mpiprocs": 16, } from aiida.orm import load_node @@ -60,15 +61,15 @@ 20569 ) # Loads node that contains the harmonic force constants (Array data) trajectory = load_node( - 20528) # Loads node that constains the MD trajectory (TrajectoryData) + 20528 + ) # Loads node that constains the MD trajectory (TrajectoryData) codename = codename code = Code.get_from_string(codename) - calc = code.new_calc(max_wallclock_seconds=3600, - resources=dynaphopy_machine) + calc = code.new_calc(max_wallclock_seconds=3600, resources=dynaphopy_machine) - calc.label = 'test dynaphopy calculation' - calc.description = 'A much longer description' + calc.label = "test dynaphopy calculation" + calc.description = "A much longer description" calc.use_code(code) @@ -80,20 +81,20 @@ calc.store_all() calc.submit() - print('submitted calculation with PK={}'.format(calc.dbnode.pk)) + print("submitted calculation with PK={}".format(calc.dbnode.pk)) - LammpsOptimizeCalculation = CalculationFactory('lammps.optimize') + LammpsOptimizeCalculation = CalculationFactory("lammps.optimize") inputs = LammpsOptimizeCalculation.get_builder() # Computer options options = AttributeDict() - options.account = '' - options.qos = '' + options.account = "" + options.qos = "" options.resources = { - 'num_machines': 1, - 'num_mpiprocs_per_machine': 1, - 'parallel_env': 'localmpi', - 'tot_num_mpiprocs': 1, + "num_machines": 1, + "num_mpiprocs_per_machine": 1, + "parallel_env": "localmpi", + "tot_num_mpiprocs": 1, } # options.queue_name = 'iqtc04.q' options.max_wallclock_seconds = 3600 @@ -110,8 +111,8 @@ # run calculation result, node = run_get_node(LammpsOptimizeCalculation, **inputs) - print('results:', result) - print('node:', node) + print("results:", result) + print("node:", node) # submit to deamon # submit(LammpsOptimizeCalculation, **inputs) diff --git a/examples/launch_lammps_base.py b/examples/launch_lammps_base.py index fc12baa..c76bb2b 100644 --- a/examples/launch_lammps_base.py +++ b/examples/launch_lammps_base.py @@ -1,11 +1,12 @@ """ Sets up an example for the calculation of bcc Fe using ``aiida-lammps``. """ -import numpy as np from aiida import orm +from aiida.common.extendeddicts import AttributeDict from aiida.engine import submit from aiida.plugins import CalculationFactory -from aiida.common.extendeddicts import AttributeDict +import numpy as np + from aiida_lammps.data.lammps_potential import LammpsPotentialData @@ -31,8 +32,8 @@ def generate_structure() -> orm.StructureData: ] fractional = True - symbols = ['Fe', 'Fe'] - names = ['Fe1', 'Fe2'] + symbols = ["Fe", "Fe"] + names = ["Fe1", "Fe2"] structure = orm.StructureData(cell=cell) for position, symbol, name in zip(positions, symbols, names): @@ -54,19 +55,15 @@ def generate_potential() -> LammpsPotentialData: """ potential_parameters = { - 'species': ['Fe'], - 'atom_style': 'atomic', - 'pair_style': 'eam/fs', - 'units': 'metal', - 'extra_tags': { - 'content_origin': - 'NIST IPRP: https: // www.ctcms.nist.gov/potentials/Fe.html', - 'content_other_locations': - None, - 'data_method': - 'unknown', - 'description': - """This Fe EAM potential parameter file is from the NIST repository, + "species": ["Fe"], + "atom_style": "atomic", + "pair_style": "eam/fs", + "units": "metal", + "extra_tags": { + "content_origin": "NIST IPRP: https: // www.ctcms.nist.gov/potentials/Fe.html", + "content_other_locations": None, + "data_method": "unknown", + "description": """This Fe EAM potential parameter file is from the NIST repository, \"Fe_2.eam.fs\" as of the March 9, 2009 update. It is similar to \"Fe_mm.eam.fs\" in the LAMMPS distribution dated 2007-06-11, but gives different results for very small interatomic distances @@ -75,39 +72,35 @@ def generate_potential() -> LammpsPotentialData: The file header includes a note from the NIST contributor: \"The potential was taken from v9_4_bcc (in C:\\SIMULATION.MD\\Fe\\Results\\ab_initio+Interstitials)\" """, - 'developer': ['Ronald E. Miller'], - 'disclaimer': - """According to the developer Giovanni Bonny + "developer": ["Ronald E. Miller"], + "disclaimer": """According to the developer Giovanni Bonny (as reported by the NIST IPRP), this potential was not stiffened and cannot be used in its present form for collision cascades. """, - 'properties': - None, - 'publication_year': - 2018, - 'source_citations': [{ - 'abstract': None, - 'author': - 'Mendelev, MI and Han, S and Srolovitz, DJ and Ackland, GJ and Sun, DY and Asta, M', - 'doi': '10.1080/14786430310001613264', - 'journal': '{Phil. Mag.}', - 'number': '{35}', - 'pages': '{3977-3994}', - 'recordkey': 'MO_546673549085_000a', - 'recordprimary': 'recordprimary', - 'recordtype': 'article', - 'title': - '{Development of new interatomic potentials appropriate for crystalline and liquid iron}', - 'volume': '{83}', - 'year': '{2003}' - }], - 'title': - 'EAM potential (LAMMPS cubic hermite tabulation) for Fe developed by Mendelev et al. (2003) v000' - } + "properties": None, + "publication_year": 2018, + "source_citations": [ + { + "abstract": None, + "author": "Mendelev, MI and Han, S and Srolovitz, DJ and Ackland, GJ and Sun, DY and Asta, M", + "doi": "10.1080/14786430310001613264", + "journal": "{Phil. Mag.}", + "number": "{35}", + "pages": "{3977-3994}", + "recordkey": "MO_546673549085_000a", + "recordprimary": "recordprimary", + "recordtype": "article", + "title": "{Development of new interatomic potentials appropriate for crystalline and liquid iron}", + "volume": "{83}", + "year": "{2003}", + } + ], + "title": "EAM potential (LAMMPS cubic hermite tabulation) for Fe developed by Mendelev et al. (2003) v000", + }, } potential = LammpsPotentialData.get_or_create( - source='Fe_2.eam.fs', + source="Fe_2.eam.fs", **potential_parameters, ) @@ -138,7 +131,7 @@ def main( :rtype: orm.Node """ - calculation = CalculationFactory('lammps.base') + calculation = CalculationFactory("lammps.base") builder = calculation.get_builder() builder.code = code @@ -152,83 +145,60 @@ def main( return node -if __name__ == '__main__': +if __name__ == "__main__": STRUCTURE = generate_structure() POTENTIAL = generate_potential() - CODE = orm.load_code('my_lammps_code') + CODE = orm.load_code("my_lammps_code") OPTIONS = AttributeDict() OPTIONS.resources = AttributeDict() # Total number of mpi processes OPTIONS.resources.tot_num_mpiprocs = 2 # Name of the parallel environment - OPTIONS.resources.parallel_env = 'mpi' + OPTIONS.resources.parallel_env = "mpi" # Maximum allowed execution time in seconds OPTIONS.max_wallclock_seconds = 18000 # Whether to run in parallel OPTIONS.withmpi = True # Set the slot type for the calculation - OPTIONS.custom_scheduler_commands = '#$ -l slot_type=execute\n#$ -l exclusive=true' + OPTIONS.custom_scheduler_commands = "#$ -l slot_type=execute\n#$ -l exclusive=true" _parameters = AttributeDict() _parameters.control = AttributeDict() - _parameters.control.units = 'metal' + _parameters.control.units = "metal" _parameters.control.timestep = 1e-5 _parameters.compute = { - 'pe/atom': [{ - 'type': [{ - 'keyword': ' ', - 'value': ' ' - }], - 'group': 'all' - }], - 'ke/atom': [{ - 'type': [{ - 'keyword': ' ', - 'value': ' ' - }], - 'group': 'all' - }], - 'stress/atom': [{ - 'type': ['NULL'], - 'group': 'all' - }], - 'pressure': [{ - 'type': ['thermo_temp'], - 'group': 'all' - }], + "pe/atom": [{"type": [{"keyword": " ", "value": " "}], "group": "all"}], + "ke/atom": [{"type": [{"keyword": " ", "value": " "}], "group": "all"}], + "stress/atom": [{"type": ["NULL"], "group": "all"}], + "pressure": [{"type": ["thermo_temp"], "group": "all"}], } _parameters.md = { - 'integration': { - 'style': 'npt', - 'constraints': { - 'temp': [300, 300, 100], - 'iso': [0.0, 0.0, 1000.0], - } - }, - 'max_number_steps': 5000, - 'velocity': [{ - 'create': { - 'temp': 300 + "integration": { + "style": "npt", + "constraints": { + "temp": [300, 300, 100], + "iso": [0.0, 0.0, 1000.0], }, - 'group': 'all' - }] + }, + "max_number_steps": 5000, + "velocity": [{"create": {"temp": 300}, "group": "all"}], } - _parameters.structure = {'atom_style': 'atomic'} + _parameters.structure = {"atom_style": "atomic"} _parameters.potential = {} _parameters.thermo = { - 'printing_rate': 100, - 'thermo_printing': { - 'step': True, - 'pe': True, - 'ke': True, - 'press': True, - 'pxx': True, - 'pyy': True, - 'pzz': True, - } + "printing_rate": 100, + "thermo_printing": { + "step": True, + "pe": True, + "ke": True, + "press": True, + "pxx": True, + "pyy": True, + "pzz": True, + }, } - _parameters.dump = {'dump_rate': 1000} + _parameters.dump = {"dump_rate": 1000} PARAMETERS = orm.Dict(dict=_parameters) @@ -240,4 +210,4 @@ def main( code=CODE, ) - print(f'Calculation node: {submission_node}') + print(f"Calculation node: {submission_node}") diff --git a/examples/launch_lammps_combinate.py b/examples/launch_lammps_combinate.py index 939fd54..c29e99d 100644 --- a/examples/launch_lammps_combinate.py +++ b/examples/launch_lammps_combinate.py @@ -6,13 +6,13 @@ from aiida.plugins import CalculationFactory import numpy as np -if __name__ == '__main__': +if __name__ == "__main__": from aiida import load_profile # noqa: F401 load_profile() - codename = 'lammps_combinate@stern' + codename = "lammps_combinate@stern" ############################ # Define input parameters # @@ -21,7 +21,7 @@ a = 5.404 cell = [[a, 0, 0], [0, a, 0], [0, 0, a]] - symbols = ['Si'] * 8 + symbols = ["Si"] * 8 scaled_positions = [ (0.875, 0.875, 0.875), (0.875, 0.375, 0.375), @@ -37,25 +37,25 @@ positions = np.dot(scaled_positions, cell) for i, scaled_position in enumerate(scaled_positions): - structure.append_atom(position=np.dot(scaled_position, cell).tolist(), - symbols=symbols[i]) + structure.append_atom( + position=np.dot(scaled_position, cell).tolist(), symbols=symbols[i] + ) structure.store() # Silicon(C) Tersoff tersoff_si = { - 'Si Si Si ': - '3.0 1.0 1.7322 1.0039e5 16.218 -0.59826 0.78734 1.0999e-6 1.7322 471.18 2.85 0.15 2.4799 1830.8' + "Si Si Si ": "3.0 1.0 1.7322 1.0039e5 16.218 -0.59826 0.78734 1.0999e-6 1.7322 471.18 2.85 0.15 2.4799 1830.8" } - potential = {'pair_style': 'tersoff', 'data': tersoff_si} + potential = {"pair_style": "tersoff", "data": tersoff_si} dynaphopy_parameters = { - 'supercell': [[2, 0, 0], [0, 2, 0], [0, 0, 2]], - 'primitive': [[0.0, 0.5, 0.5], [0.5, 0.0, 0.5], [0.5, 0.5, 0.0]], - 'mesh': [40, 40, 40], - 'md_commensurate': False, - 'md_supercell': [2, 2, 2], + "supercell": [[2, 0, 0], [0, 2, 0], [0, 0, 2]], + "primitive": [[0.0, 0.5, 0.5], [0.5, 0.0, 0.5], [0.5, 0.5, 0.0]], + "mesh": [40, 40, 40], + "md_commensurate": False, + "md_supercell": [2, 2, 2], } from aiida.orm import load_node @@ -64,33 +64,29 @@ 38 ) # Loads node that contains the harmonic force constants (Array data) - machine = { - 'num_machines': 1, - 'parallel_env': 'mpi*', - 'tot_num_mpiprocs': 16 - } + machine = {"num_machines": 1, "parallel_env": "mpi*", "tot_num_mpiprocs": 16} parameters_md = { - 'timestep': 0.001, - 'temperature': 300, - 'thermostat_variable': 0.5, - 'equilibrium_steps': 2000, - 'total_steps': 2000, - 'dump_rate': 1, + "timestep": 0.001, + "temperature": 300, + "thermostat_variable": 0.5, + "equilibrium_steps": 2000, + "total_steps": 2000, + "dump_rate": 1, } - CombinateCalculation = CalculationFactory('lammps.force') + CombinateCalculation = CalculationFactory("lammps.force") inputs = CombinateCalculation.get_builder() # Computer options options = AttributeDict() - options.account = '' - options.qos = '' + options.account = "" + options.qos = "" options.resources = { - 'num_machines': 1, - 'num_mpiprocs_per_machine': 1, - 'parallel_env': 'localmpi', - 'tot_num_mpiprocs': 1, + "num_machines": 1, + "num_mpiprocs_per_machine": 1, + "parallel_env": "localmpi", + "tot_num_mpiprocs": 1, } # options.queue_name = 'iqtc04.q' options.max_wallclock_seconds = 3600 @@ -107,8 +103,8 @@ # run calculation result, node = run_get_node(CombinateCalculation, **inputs) - print('results:', result) - print('node:', node) + print("results:", result) + print("node:", node) # submit to deamon # submit(LammpsOptimizeCalculation, **inputs) diff --git a/examples/launch_lammps_force_gan.py b/examples/launch_lammps_force_gan.py index 4a99b15..c3bf7cb 100644 --- a/examples/launch_lammps_force_gan.py +++ b/examples/launch_lammps_force_gan.py @@ -6,13 +6,13 @@ from aiida_lammps.data.potential import EmpiricalPotential -if __name__ == '__main__': +if __name__ == "__main__": from aiida import load_profile # noqa: F401 load_profile() - codename = 'lammps_force@stern' + codename = "lammps_force@stern" ############################ # Define input parameters # @@ -32,52 +32,45 @@ (0.3333331, 0.6666663, 0.8750000), ] - symbols = ['Ga', 'Ga', 'N', 'N'] + symbols = ["Ga", "Ga", "N", "N"] structure = StructureData(cell=cell) positions = np.dot(scaled_positions, cell) for i, scaled_position in enumerate(scaled_positions): - structure.append_atom(position=np.dot(scaled_position, cell).tolist(), - symbols=symbols[i]) + structure.append_atom( + position=np.dot(scaled_position, cell).tolist(), symbols=symbols[i] + ) # GaN Tersoff tersoff_gan = { - 'Ga Ga Ga': - '1.0 0.007874 1.846 1.918000 0.75000 -0.301300 1.0 1.0 1.44970 410.132 2.87 0.15 1.60916 535.199', - 'N N N': - '1.0 0.766120 0.000 0.178493 0.20172 -0.045238 1.0 1.0 2.38426 423.769 2.20 0.20 3.55779 1044.77', - 'Ga Ga N': - '1.0 0.001632 0.000 65.20700 2.82100 -0.518000 1.0 0.0 0.00000 0.00000 2.90 0.20 0.00000 0.00000', - 'Ga N N': - '1.0 0.001632 0.000 65.20700 2.82100 -0.518000 1.0 1.0 2.63906 3864.27 2.90 0.20 2.93516 6136.44', - 'N Ga Ga': - '1.0 0.001632 0.000 65.20700 2.82100 -0.518000 1.0 1.0 2.63906 3864.27 2.90 0.20 2.93516 6136.44', - 'N Ga N ': - '1.0 0.766120 0.000 0.178493 0.20172 -0.045238 1.0 0.0 0.00000 0.00000 2.20 0.20 0.00000 0.00000', - 'N N Ga': - '1.0 0.001632 0.000 65.20700 2.82100 -0.518000 1.0 0.0 0.00000 0.00000 2.90 0.20 0.00000 0.00000', - 'Ga N Ga': - '1.0 0.007874 1.846 1.918000 0.75000 -0.301300 1.0 0.0 0.00000 0.00000 2.87 0.15 0.00000 0.00000', + "Ga Ga Ga": "1.0 0.007874 1.846 1.918000 0.75000 -0.301300 1.0 1.0 1.44970 410.132 2.87 0.15 1.60916 535.199", + "N N N": "1.0 0.766120 0.000 0.178493 0.20172 -0.045238 1.0 1.0 2.38426 423.769 2.20 0.20 3.55779 1044.77", + "Ga Ga N": "1.0 0.001632 0.000 65.20700 2.82100 -0.518000 1.0 0.0 0.00000 0.00000 2.90 0.20 0.00000 0.00000", + "Ga N N": "1.0 0.001632 0.000 65.20700 2.82100 -0.518000 1.0 1.0 2.63906 3864.27 2.90 0.20 2.93516 6136.44", + "N Ga Ga": "1.0 0.001632 0.000 65.20700 2.82100 -0.518000 1.0 1.0 2.63906 3864.27 2.90 0.20 2.93516 6136.44", + "N Ga N ": "1.0 0.766120 0.000 0.178493 0.20172 -0.045238 1.0 0.0 0.00000 0.00000 2.20 0.20 0.00000 0.00000", + "N N Ga": "1.0 0.001632 0.000 65.20700 2.82100 -0.518000 1.0 0.0 0.00000 0.00000 2.90 0.20 0.00000 0.00000", + "Ga N Ga": "1.0 0.007874 1.846 1.918000 0.75000 -0.301300 1.0 0.0 0.00000 0.00000 2.87 0.15 0.00000 0.00000", } # Silicon(C) Tersoff # tersoff_si = {'Si Si Si ': '3.0 1.0 1.7322 1.0039e5 16.218 -0.59826 0.78734 1.0999e-6 1.7322 471.18 2.85 0.15 2.4799 1830.8'} - potential = {'pair_style': 'tersoff', 'data': tersoff_gan} + potential = {"pair_style": "tersoff", "data": tersoff_gan} - LammpsForceCalculation = CalculationFactory('lammps.force') + LammpsForceCalculation = CalculationFactory("lammps.force") inputs = LammpsForceCalculation.get_builder() # Computer options options = AttributeDict() - options.account = '' - options.qos = '' + options.account = "" + options.qos = "" options.resources = { - 'num_machines': 1, - 'num_mpiprocs_per_machine': 1, - 'parallel_env': 'localmpi', - 'tot_num_mpiprocs': 1, + "num_machines": 1, + "num_mpiprocs_per_machine": 1, + "parallel_env": "localmpi", + "tot_num_mpiprocs": 1, } # options.queue_name = 'iqtc04.q' options.max_wallclock_seconds = 3600 @@ -88,13 +81,14 @@ # setup nodes inputs.structure = structure - inputs.potential = EmpiricalPotential(type=potential['pair_style'], - data=potential['data']) + inputs.potential = EmpiricalPotential( + type=potential["pair_style"], data=potential["data"] + ) # run calculation result, node = run_get_node(LammpsForceCalculation, **inputs) - print('results:', result) - print('node:', node) + print("results:", result) + print("node:", node) # submit to deamon # submit(LammpsForceCalculation, **inputs) diff --git a/examples/launch_lammps_md_si.py b/examples/launch_lammps_md_si.py index d61bb8e..ea2b1f0 100644 --- a/examples/launch_lammps_md_si.py +++ b/examples/launch_lammps_md_si.py @@ -7,11 +7,11 @@ from aiida_lammps.data.potential import EmpiricalPotential -if __name__ == '__main__': +if __name__ == "__main__": load_profile() - codename = 'lammps_md@stern' + codename = "lammps_md@stern" ############################ # Define input parameters # @@ -20,7 +20,7 @@ a = 5.404 cell = [[a, 0, 0], [0, a, 0], [0, 0, a]] - symbols = ['Si'] * 8 + symbols = ["Si"] * 8 scaled_positions = [ (0.875, 0.875, 0.875), (0.875, 0.375, 0.375), @@ -36,57 +36,44 @@ positions = np.dot(scaled_positions, cell) for i, scaled_position in enumerate(scaled_positions): - structure.append_atom(position=np.dot(scaled_position, cell).tolist(), - symbols=symbols[i]) + structure.append_atom( + position=np.dot(scaled_position, cell).tolist(), symbols=symbols[i] + ) structure.store() # Silicon(C) Tersoff tersoff_si = { - 'Si Si Si ': - '3.0 1.0 1.7322 1.0039e5 16.218 -0.59826 0.78734 1.0999e-6 1.7322 471.18 2.85 0.15 2.4799 1830.8' + "Si Si Si ": "3.0 1.0 1.7322 1.0039e5 16.218 -0.59826 0.78734 1.0999e-6 1.7322 471.18 2.85 0.15 2.4799 1830.8" } - potential = {'pair_style': 'tersoff', 'data': tersoff_si} + potential = {"pair_style": "tersoff", "data": tersoff_si} - lammps_machine = { - 'num_machines': 1, - 'parallel_env': 'mpi*', - 'tot_num_mpiprocs': 16 - } + lammps_machine = {"num_machines": 1, "parallel_env": "mpi*", "tot_num_mpiprocs": 16} parameters_md = { - 'units': 'metal', - 'timestep': 0.001, - 'integration': { - 'style': 'nvt', - 'constraints': { - 'temp': [300, 300, 0.5] - } - }, - 'neighbor': [0.3, 'bin'], - 'neigh_modify': { - 'every': 1, - 'delay': 0, - 'check': False - }, - 'equilibrium_steps': 100, - 'total_steps': 2000, - 'dump_rate': 1, + "units": "metal", + "timestep": 0.001, + "integration": {"style": "nvt", "constraints": {"temp": [300, 300, 0.5]}}, + "neighbor": [0.3, "bin"], + "neigh_modify": {"every": 1, "delay": 0, "check": False}, + "equilibrium_steps": 100, + "total_steps": 2000, + "dump_rate": 1, } - LammpsMDCalculation = CalculationFactory('lammps.md') + LammpsMDCalculation = CalculationFactory("lammps.md") inputs = LammpsMDCalculation.get_builder() # Computer options options = AttributeDict() - options.account = '' - options.qos = '' + options.account = "" + options.qos = "" options.resources = { - 'num_machines': 1, - 'num_mpiprocs_per_machine': 1, - 'parallel_env': 'localmpi', - 'tot_num_mpiprocs': 1, + "num_machines": 1, + "num_mpiprocs_per_machine": 1, + "parallel_env": "localmpi", + "tot_num_mpiprocs": 1, } # options.queue_name = 'iqtc04.q' options.max_wallclock_seconds = 3600 @@ -97,15 +84,16 @@ # setup nodes inputs.structure = structure - inputs.potential = EmpiricalPotential(type=potential['pair_style'], - data=potential['data']) + inputs.potential = EmpiricalPotential( + type=potential["pair_style"], data=potential["data"] + ) inputs.parameters = Dict(dict=parameters_md) # run calculation result, node = run_get_node(LammpsMDCalculation, **inputs) - print('results:', result) - print('node:', node) + print("results:", result) + print("node:", node) # submit to deamon # submit(LammpsOptimizeCalculation, **inputs) diff --git a/examples/launch_lammps_optimization_fe.py b/examples/launch_lammps_optimization_fe.py index 6f17388..58cb852 100644 --- a/examples/launch_lammps_optimization_fe.py +++ b/examples/launch_lammps_optimization_fe.py @@ -6,13 +6,13 @@ from aiida_lammps.data.potential import EmpiricalPotential -if __name__ == '__main__': +if __name__ == "__main__": from aiida import load_profile # noqa: F401 load_profile() - codename = 'lammps_optimize@stern' + codename = "lammps_optimize@stern" ############################ # Define input parameters # @@ -30,56 +30,53 @@ (0.5000000, 0.5000000, 0.5000000), ] - symbols = ['Fe', 'Fe'] + symbols = ["Fe", "Fe"] structure = StructureData(cell=cell) positions = np.dot(scaled_positions, cell) for i, scaled_position in enumerate(scaled_positions): - structure.append_atom(position=np.dot(scaled_position, cell).tolist(), - symbols=symbols[i]) + structure.append_atom( + position=np.dot(scaled_position, cell).tolist(), symbols=symbols[i] + ) structure.store() - with open('Fe_mm.eam.fs') as handle: - eam_data = {'type': 'fs', 'file_contents': handle.readlines()} + with open("Fe_mm.eam.fs") as handle: + eam_data = {"type": "fs", "file_contents": handle.readlines()} - potential = {'pair_style': 'eam', 'data': eam_data} + potential = {"pair_style": "eam", "data": eam_data} - lammps_machine = { - 'num_machines': 1, - 'parallel_env': 'mpi*', - 'tot_num_mpiprocs': 16 - } + lammps_machine = {"num_machines": 1, "parallel_env": "mpi*", "tot_num_mpiprocs": 16} parameters_opt = { - 'units': 'metal', - 'relax': { - 'type': 'tri', # iso/aniso/tri - 'pressure': 0.0, # bars - 'vmax': 0.000001, # Angstrom^3 + "units": "metal", + "relax": { + "type": "tri", # iso/aniso/tri + "pressure": 0.0, # bars + "vmax": 0.000001, # Angstrom^3 }, - 'minimize': { - 'style': 'cg', - 'energy_tolerance': 1.0e-25, # eV - 'force_tolerance': 1.0e-25, # eV angstrom - 'max_evaluations': 100000, - 'max_iterations': 50000, + "minimize": { + "style": "cg", + "energy_tolerance": 1.0e-25, # eV + "force_tolerance": 1.0e-25, # eV angstrom + "max_evaluations": 100000, + "max_iterations": 50000, }, } - LammpsOptimizeCalculation = CalculationFactory('lammps.optimize') + LammpsOptimizeCalculation = CalculationFactory("lammps.optimize") inputs = LammpsOptimizeCalculation.get_builder() # Computer options options = AttributeDict() - options.account = '' - options.qos = '' + options.account = "" + options.qos = "" options.resources = { - 'num_machines': 1, - 'num_mpiprocs_per_machine': 1, - 'parallel_env': 'localmpi', - 'tot_num_mpiprocs': 1, + "num_machines": 1, + "num_mpiprocs_per_machine": 1, + "parallel_env": "localmpi", + "tot_num_mpiprocs": 1, } # options.queue_name = 'iqtc04.q' options.max_wallclock_seconds = 3600 @@ -90,8 +87,9 @@ # setup nodes inputs.structure = structure - inputs.potential = EmpiricalPotential(type=potential['pair_style'], - data=potential['data']) + inputs.potential = EmpiricalPotential( + type=potential["pair_style"], data=potential["data"] + ) print(inputs.potential.get_potential_file()) print(inputs.potential.atom_style) @@ -101,8 +99,8 @@ # run calculation result, node = run_get_node(LammpsOptimizeCalculation, **inputs) - print('results:', result) - print('node:', node) + print("results:", result) + print("node:", node) # submit to deamon # submit(LammpsOptimizeCalculation, **inputs) diff --git a/examples/launch_lammps_optimization_gan.py b/examples/launch_lammps_optimization_gan.py index 05091fb..5805b18 100644 --- a/examples/launch_lammps_optimization_gan.py +++ b/examples/launch_lammps_optimization_gan.py @@ -6,13 +6,13 @@ from aiida_lammps.data.potential import EmpiricalPotential -if __name__ == '__main__': +if __name__ == "__main__": from aiida import load_profile # noqa: F401 load_profile() - codename = 'lammps_optimize@stern' + codename = "lammps_optimize@stern" ############################ # Define input parameters # @@ -32,76 +32,65 @@ (0.3333331, 0.6666663, 0.8750000), ] - symbols = ['Ga', 'Ga', 'N', 'N'] + symbols = ["Ga", "Ga", "N", "N"] structure = StructureData(cell=cell) positions = np.dot(scaled_positions, cell) for i, scaled_position in enumerate(scaled_positions): - structure.append_atom(position=np.dot(scaled_position, cell).tolist(), - symbols=symbols[i]) + structure.append_atom( + position=np.dot(scaled_position, cell).tolist(), symbols=symbols[i] + ) structure.store() # GaN Tersoff tersoff_gan = { - 'Ga Ga Ga': - '1.0 0.007874 1.846 1.918000 0.75000 -0.301300 1.0 1.0 1.44970 410.132 2.87 0.15 1.60916 535.199', - 'N N N': - '1.0 0.766120 0.000 0.178493 0.20172 -0.045238 1.0 1.0 2.38426 423.769 2.20 0.20 3.55779 1044.77', - 'Ga Ga N': - '1.0 0.001632 0.000 65.20700 2.82100 -0.518000 1.0 0.0 0.00000 0.00000 2.90 0.20 0.00000 0.00000', - 'Ga N N': - '1.0 0.001632 0.000 65.20700 2.82100 -0.518000 1.0 1.0 2.63906 3864.27 2.90 0.20 2.93516 6136.44', - 'N Ga Ga': - '1.0 0.001632 0.000 65.20700 2.82100 -0.518000 1.0 1.0 2.63906 3864.27 2.90 0.20 2.93516 6136.44', - 'N Ga N ': - '1.0 0.766120 0.000 0.178493 0.20172 -0.045238 1.0 0.0 0.00000 0.00000 2.20 0.20 0.00000 0.00000', - 'N N Ga': - '1.0 0.001632 0.000 65.20700 2.82100 -0.518000 1.0 0.0 0.00000 0.00000 2.90 0.20 0.00000 0.00000', - 'Ga N Ga': - '1.0 0.007874 1.846 1.918000 0.75000 -0.301300 1.0 0.0 0.00000 0.00000 2.87 0.15 0.00000 0.00000', + "Ga Ga Ga": "1.0 0.007874 1.846 1.918000 0.75000 -0.301300 1.0 1.0 1.44970 410.132 2.87 0.15 1.60916 535.199", + "N N N": "1.0 0.766120 0.000 0.178493 0.20172 -0.045238 1.0 1.0 2.38426 423.769 2.20 0.20 3.55779 1044.77", + "Ga Ga N": "1.0 0.001632 0.000 65.20700 2.82100 -0.518000 1.0 0.0 0.00000 0.00000 2.90 0.20 0.00000 0.00000", + "Ga N N": "1.0 0.001632 0.000 65.20700 2.82100 -0.518000 1.0 1.0 2.63906 3864.27 2.90 0.20 2.93516 6136.44", + "N Ga Ga": "1.0 0.001632 0.000 65.20700 2.82100 -0.518000 1.0 1.0 2.63906 3864.27 2.90 0.20 2.93516 6136.44", + "N Ga N ": "1.0 0.766120 0.000 0.178493 0.20172 -0.045238 1.0 0.0 0.00000 0.00000 2.20 0.20 0.00000 0.00000", + "N N Ga": "1.0 0.001632 0.000 65.20700 2.82100 -0.518000 1.0 0.0 0.00000 0.00000 2.90 0.20 0.00000 0.00000", + "Ga N Ga": "1.0 0.007874 1.846 1.918000 0.75000 -0.301300 1.0 0.0 0.00000 0.00000 2.87 0.15 0.00000 0.00000", } # Silicon(C) Tersoff # tersoff_si = {'Si Si Si ': '3.0 1.0 1.7322 1.0039e5 16.218 -0.59826 0.78734 1.0999e-6 1.7322 471.18 2.85 0.15 2.4799 1830.8'} - potential = {'pair_style': 'tersoff', 'data': tersoff_gan} + potential = {"pair_style": "tersoff", "data": tersoff_gan} - lammps_machine = { - 'num_machines': 1, - 'parallel_env': 'mpi*', - 'tot_num_mpiprocs': 16 - } + lammps_machine = {"num_machines": 1, "parallel_env": "mpi*", "tot_num_mpiprocs": 16} parameters_opt = { - 'units': 'metal', - 'relax': { - 'type': 'tri', # iso/aniso/tri - 'pressure': 0.0, # bars - 'vmax': 0.000001, # Angstrom^3 + "units": "metal", + "relax": { + "type": "tri", # iso/aniso/tri + "pressure": 0.0, # bars + "vmax": 0.000001, # Angstrom^3 }, - 'minimize': { - 'style': 'cg', - 'energy_tolerance': 1.0e-25, # eV - 'force_tolerance': 1.0e-25, # eV angstrom - 'max_evaluations': 1000000, - 'max_iterations': 500000, + "minimize": { + "style": "cg", + "energy_tolerance": 1.0e-25, # eV + "force_tolerance": 1.0e-25, # eV angstrom + "max_evaluations": 1000000, + "max_iterations": 500000, }, } - LammpsOptimizeCalculation = CalculationFactory('lammps.optimize') + LammpsOptimizeCalculation = CalculationFactory("lammps.optimize") inputs = LammpsOptimizeCalculation.get_builder() # Computer options options = AttributeDict() - options.account = '' - options.qos = '' + options.account = "" + options.qos = "" options.resources = { - 'num_machines': 1, - 'num_mpiprocs_per_machine': 1, - 'parallel_env': 'localmpi', - 'tot_num_mpiprocs': 1, + "num_machines": 1, + "num_mpiprocs_per_machine": 1, + "parallel_env": "localmpi", + "tot_num_mpiprocs": 1, } # options.queue_name = 'iqtc04.q' options.max_wallclock_seconds = 3600 @@ -112,8 +101,9 @@ # setup nodes inputs.structure = structure - inputs.potential = EmpiricalPotential(type=potential['pair_style'], - data=potential['data']) + inputs.potential = EmpiricalPotential( + type=potential["pair_style"], data=potential["data"] + ) inputs.parameters = Dict(dict=parameters_opt) @@ -123,8 +113,8 @@ # run calculation result, node = run_get_node(LammpsOptimizeCalculation, **inputs) - print('results:', result) - print('node:', node) + print("results:", result) + print("node:", node) # submit to deamon # submit(LammpsOptimizeCalculation, **inputs) diff --git a/examples/launch_lammps_optimization_lj.py b/examples/launch_lammps_optimization_lj.py index 892c306..392bb1c 100644 --- a/examples/launch_lammps_optimization_lj.py +++ b/examples/launch_lammps_optimization_lj.py @@ -6,13 +6,13 @@ from aiida_lammps.data.potential import EmpiricalPotential -if __name__ == '__main__': +if __name__ == "__main__": from aiida import load_profile # noqa: F401 load_profile() - codename = 'lammps_optimize@stern' + codename = "lammps_optimize@stern" ############################ # Define input parameters # @@ -24,64 +24,60 @@ [0.000000, 0.000000, 6.538394], ] - symbols = ['Ar'] * 2 - scaled_positions = [(0.33333, 0.66666, 0.25000), - (0.66667, 0.33333, 0.75000)] + symbols = ["Ar"] * 2 + scaled_positions = [(0.33333, 0.66666, 0.25000), (0.66667, 0.33333, 0.75000)] structure = StructureData(cell=cell) positions = np.dot(scaled_positions, cell) for i, scaled_position in enumerate(scaled_positions): - structure.append_atom(position=np.dot(scaled_position, cell).tolist(), - symbols=symbols[i]) + structure.append_atom( + position=np.dot(scaled_position, cell).tolist(), symbols=symbols[i] + ) structure.store() # Example LJ parameters for Argon. These may not be accurate at all potential = { - 'pair_style': 'lennard_jones', + "pair_style": "lennard_jones", # epsilon, sigma, cutoff - 'data': { - '1 1': '0.01029 3.4 2.5', + "data": { + "1 1": "0.01029 3.4 2.5", # '2 2': '1.0 1.0 2.5', # '1 2': '1.0 1.0 2.5' }, } - lammps_machine = { - 'num_machines': 1, - 'parallel_env': 'mpi*', - 'tot_num_mpiprocs': 16 - } + lammps_machine = {"num_machines": 1, "parallel_env": "mpi*", "tot_num_mpiprocs": 16} parameters_opt = { - 'units': 'metal', - 'relax': { - 'type': 'tri', # iso/aniso/tri - 'pressure': 0.0, # bars - 'vmax': 0.000001, # Angstrom^3 + "units": "metal", + "relax": { + "type": "tri", # iso/aniso/tri + "pressure": 0.0, # bars + "vmax": 0.000001, # Angstrom^3 }, - 'minimize': { - 'style': 'cg', - 'energy_tolerance': 1.0e-25, # eV - 'force_tolerance': 1.0e-25, # eV angstrom - 'max_evaluations': 1000000, - 'max_iterations': 500000, + "minimize": { + "style": "cg", + "energy_tolerance": 1.0e-25, # eV + "force_tolerance": 1.0e-25, # eV angstrom + "max_evaluations": 1000000, + "max_iterations": 500000, }, } - LammpsOptimizeCalculation = CalculationFactory('lammps.optimize') + LammpsOptimizeCalculation = CalculationFactory("lammps.optimize") inputs = LammpsOptimizeCalculation.get_builder() # Computer options options = AttributeDict() - options.account = '' - options.qos = '' + options.account = "" + options.qos = "" options.resources = { - 'num_machines': 1, - 'num_mpiprocs_per_machine': 1, - 'parallel_env': 'localmpi', - 'tot_num_mpiprocs': 1, + "num_machines": 1, + "num_mpiprocs_per_machine": 1, + "parallel_env": "localmpi", + "tot_num_mpiprocs": 1, } # options.queue_name = 'iqtc04.q' options.max_wallclock_seconds = 3600 @@ -92,15 +88,16 @@ # setup nodes inputs.structure = structure - inputs.potential = EmpiricalPotential(type=potential['pair_style'], - data=potential['data']) + inputs.potential = EmpiricalPotential( + type=potential["pair_style"], data=potential["data"] + ) inputs.parameters = Dict(dict=parameters_opt) # run calculation result, node = run_get_node(LammpsOptimizeCalculation, **inputs) - print('results:', result) - print('node:', node) + print("results:", result) + print("node:", node) # submit to deamon # submit(LammpsOptimizeCalculation, **inputs) diff --git a/setup.py b/setup.py index 5fd04ba..485544e 100644 --- a/setup.py +++ b/setup.py @@ -4,19 +4,19 @@ from setuptools import find_packages, setup -if __name__ == '__main__': - FILENAME_SETUP_JSON = 'setup.json' - FILENAME_DESCRIPTION = 'README.md' +if __name__ == "__main__": + FILENAME_SETUP_JSON = "setup.json" + FILENAME_DESCRIPTION = "README.md" - with open(FILENAME_SETUP_JSON, 'r') as handle: + with open(FILENAME_SETUP_JSON, "r") as handle: setup_json = json.load(handle) - with open(FILENAME_DESCRIPTION, 'r') as handle: + with open(FILENAME_DESCRIPTION, "r") as handle: description = handle.read() setup( packages=find_packages(), long_description=description, - long_description_content_type='text/markdown', + long_description_content_type="text/markdown", **setup_json, ) From 92063e3f629adb21cbf79e060bfc811c8b8e332d Mon Sep 17 00:00:00 2001 From: Chris Sewell Date: Tue, 5 Apr 2022 21:14:21 +0200 Subject: [PATCH 64/70] Simplify pre-commit ci --- .github/workflows/cd.yml | 23 +++-------------------- .github/workflows/ci.yml | 23 +++-------------------- 2 files changed, 6 insertions(+), 40 deletions(-) diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index 93da81f..85f1b65 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -12,31 +12,14 @@ jobs: steps: - uses: actions/checkout@v2 - - name: Set up Python - uses: actions/setup-python@v1 - with: - python-version: 3.8 - id: cache-pip - - uses: actions/cache@v1 - with: - path: ~/.cache/pip - key: pip-${{ matrix.python-version }}-tests-${{ hashFiles('**/setup.json') }} - restore-keys: - pip-${{ matrix.python-version }}-tests - name: Set up Python uses: actions/setup-python@v2 with: - python-version: ${{ matrix.python }} + python-version: 3.8 - name: Upgrade pip - run: | - pip install --upgrade pip - pip --version - - name: Install wheel - run: pip install wheel + run: pip install --upgrade pip - name: Install AiiDA-LAMMPS - run: | - pip install -e .[testing,pre-commit] - pip freeze + run: pip install pre-commit - name: Run pre-commit run: pre-commit run --all-files || ( git diff; git status; exit 1; ) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f092092..4daa1d9 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -12,31 +12,14 @@ jobs: steps: - uses: actions/checkout@v2 - - name: Set up Python - uses: actions/setup-python@v1 - with: - python-version: 3.8 - id: cache-pip - - uses: actions/cache@v1 - with: - path: ~/.cache/pip - key: pip-${{ matrix.python-version }}-tests-${{ hashFiles('**/setup.json') }} - restore-keys: - pip-${{ matrix.python-version }}-tests - name: Set up Python uses: actions/setup-python@v2 with: - python-version: ${{ matrix.python }} + python-version: 3.8 - name: Upgrade pip - run: | - pip install --upgrade pip - pip --version - - name: Install wheel - run: pip install wheel + run: pip install --upgrade pip - name: Install AiiDA-LAMMPS - run: | - pip install -e .[testing,pre-commit] - pip freeze + run: pip install pre-commit - name: Run pre-commit run: pre-commit run --all-files || ( git diff; git status; exit 1; ) From 3e1a9e249fbf258d89cef7118e54163feb6480f6 Mon Sep 17 00:00:00 2001 From: Chris Sewell Date: Tue, 5 Apr 2022 21:16:19 +0200 Subject: [PATCH 65/70] Update .pre-commit-config.yaml --- .pre-commit-config.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 4191fd6..7e89a14 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -10,7 +10,7 @@ exclude: > repos: - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v3.2.0 + rev: v4.1.0 hooks: - id: check-json - id: check-yaml @@ -18,17 +18,17 @@ repos: - id: trailing-whitespace - repo: https://github.com/timothycrosley/isort - rev: 5.5.3 + rev: 5.10.1 hooks: - id: isort - repo: https://github.com/psf/black - rev: 20.8b1 + rev: 22.3.0 hooks: - id: black - repo: https://gitlab.com/pycqa/flake8 - rev: 3.8.3 + rev: 3.9.2 hooks: - id: flake8 # additional_dependencies: From 7456bc0c1a3e54c1708fc577070a52d3834d65a6 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 5 Apr 2022 19:16:55 +0000 Subject: [PATCH 66/70] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- aiida_lammps/tests/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aiida_lammps/tests/utils.py b/aiida_lammps/tests/utils.py index c5f5519..1eeefbb 100644 --- a/aiida_lammps/tests/utils.py +++ b/aiida_lammps/tests/utils.py @@ -144,7 +144,7 @@ def get_default_metadata( def recursive_round(check_object, precision, apply_lists=False): - """Map a function on to all values of a nested dictionary """ + """Map a function on to all values of a nested dictionary""" if isinstance(check_object, Mapping): return { k: recursive_round(v, precision, apply_lists) From b2350a394dfbd9714f2de91bea901b46c383aad7 Mon Sep 17 00:00:00 2001 From: Chris Sewell Date: Tue, 5 Apr 2022 22:07:04 +0200 Subject: [PATCH 67/70] Remove dynaphonopy code --- .pre-commit-config.yaml | 4 - README.md | 4 - aiida_lammps/calculations/dynaphopy.py | 225 ---------------- aiida_lammps/calculations/lammps/__init__.py | 37 --- aiida_lammps/calculations/lammps/combinate.py | 241 ------------------ aiida_lammps/common/generate_input_files.py | 92 ------- aiida_lammps/common/raw_parsers.py | 87 ------- aiida_lammps/parsers/dynaphopy.py | 120 --------- examples/launch_dynaphopy_si.py | 118 --------- examples/launch_lammps_combinate.py | 110 -------- setup.json | 9 +- 11 files changed, 2 insertions(+), 1045 deletions(-) delete mode 100644 aiida_lammps/calculations/dynaphopy.py delete mode 100644 aiida_lammps/calculations/lammps/combinate.py delete mode 100644 aiida_lammps/common/generate_input_files.py delete mode 100644 aiida_lammps/parsers/dynaphopy.py delete mode 100644 examples/launch_dynaphopy_si.py delete mode 100644 examples/launch_lammps_combinate.py diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 7e89a14..4416862 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -35,10 +35,6 @@ repos: # - flake8-bugbear==20.1.4 # - flake8-builtins==1.5.3 # - flake8-comprehensions==3.2.3 - exclude: > - (?x)^( - aiida_lammps/calculations/dynaphopy.py - )$ - repo: local hooks: diff --git a/README.md b/README.md index 08931a8..c9a060f 100644 --- a/README.md +++ b/README.md @@ -11,10 +11,6 @@ This plugin contains 4 code types: - `lammps.forces`: Atomic single-point forces calculation - `lammps.optimize`: Crystal structure optimization - `lammps.md`: Molecular dynamics calculation -- `lammps.combinate`: DynaPhoPy calculation using LAMMPS MD trajectory (currently untested) - -Note: `lammps.combinate` requires `aiida-phonopy` (https://github.com/abelcarreras/aiida-phonopy) -plugin to work, DynaPhoPy can be found in: https://github.com/abelcarreras/aiida-phonopy - [AiiDA LAMMPS plugin](#aiida-lammps-plugin) - [Installation](#installation) diff --git a/aiida_lammps/calculations/dynaphopy.py b/aiida_lammps/calculations/dynaphopy.py deleted file mode 100644 index 5fa3851..0000000 --- a/aiida_lammps/calculations/dynaphopy.py +++ /dev/null @@ -1,225 +0,0 @@ -"""Base dynaphopy calculation""" -# pylint: disable=too-many-instance-attributes, abstract-method -from aiida.common.datastructures import CalcInfo, CodeInfo -from aiida.common.exceptions import InputValidationError -from aiida.common.utils import classproperty -from aiida.engine import CalcJob -from aiida.orm import ArrayData, StructureData, TrajectoryData -from aiida_phonopy.common.raw_parsers import ( # pylint: disable=no-name-in-module, import-error - get_force_constants, - get_poscar_txt, -) - -from aiida_lammps.common.generate_input_files import ( - get_trajectory_txt, - parameters_to_input_file, -) - - -class DynaphopyCalculation(CalcJob): - """ - A basic plugin for calculating force constants using Phonopy. - - Requirement: the node should be able to import phonopy - """ - - def _init_internal_params(self): - super(DynaphopyCalculation, self)._init_internal_params() - - self._INPUT_FILE_NAME = "input_dynaphopy" # pylint: disable=invalid-name, attribute-defined-outside-init - self._INPUT_TRAJECTORY = ( - "trajectory" # pylint: disable=invalid-name, attribute-defined-outside-init - ) - self._INPUT_CELL = ( - "POSCAR" # pylint: disable=invalid-name, attribute-defined-outside-init - ) - self._INPUT_FORCE_CONSTANTS = "FORCE_CONSTANTS" # pylint: disable=invalid-name, attribute-defined-outside-init - - self._OUTPUT_FORCE_CONSTANTS = "FORCE_CONSTANTS_OUT" # pylint: disable=invalid-name, attribute-defined-outside-init - self._OUTPUT_FILE_NAME = ( - "OUTPUT" # pylint: disable=invalid-name, attribute-defined-outside-init - ) - self._OUTPUT_QUASIPARTICLES = "quasiparticles_data.yaml" # pylint: disable=invalid-name, attribute-defined-outside-init - - self._default_parser = ( - "dynaphopy" # pylint: disable=attribute-defined-outside-init - ) - - @classproperty - def _use_methods(cls): - """ - Additional use_* methods for the namelists class. - """ - # pylint: disable=no-self-argument, no-self-use - retdict = ( - JobCalculation._use_methods - ) # pylint: disable=protected-access, undefined-variable - retdict.update( - { - "parameters": { - "valid_types": ParameterData, # pylint: disable=undefined-variable - "additional_parameter": None, - "linkname": "parameters", - "docstring": ( - "Use a node that specifies the dynaphopy input " - "for the namelists" - ), - }, - "trajectory": { - "valid_types": TrajectoryData, - "additional_parameter": None, - "linkname": "trajectory", - "docstring": ( - "Use a node that specifies the trajectory data " - "for the namelists" - ), - }, - "force_constants": { - "valid_types": ArrayData, - "additional_parameter": None, - "linkname": "force_constants", - "docstring": ( - "Use a node that specifies the force_constants " - "for the namelists" - ), - }, - "structure": { - "valid_types": StructureData, - "additional_parameter": None, - "linkname": "structure", - "docstring": "Use a node for the structure", - }, - } - ) - return retdict - - def _prepare_for_submission(self, tempfolder, inputdict): - """ - This is the routine to be called when you want to create - the input files and related stuff with a plugin. - - :param tempfolder: a aiida.common.folders.Folder subclass where - the plugin should put all its files. - :param inputdict: a dictionary with the input nodes, as they would - be returned by get_inputdata_dict (without the Code!) - """ - # pylint: disable=too-many-locals, too-many-statements - try: - parameters_data = inputdict.pop(self.get_linkname("parameters")) - except KeyError: - pass - # raise InputValidationError("No parameters specified for this " - # "calculation") - if not isinstance( - parameters_data, ParameterData - ): # pylint: disable=undefined-variable - raise InputValidationError("parameters is not of type " "ParameterData") - - try: - structure = inputdict.pop(self.get_linkname("structure")) - except KeyError as key_error: - raise InputValidationError( - "no structure is specified for this calculation" - ) from key_error - - try: - trajectory = inputdict.pop(self.get_linkname("trajectory")) - except KeyError as key_error: - raise InputValidationError( - "trajectory is specified for this calculation" - ) from key_error - - try: - force_constants = inputdict.pop(self.get_linkname("force_constants")) - except KeyError as key_error: - raise InputValidationError( - "no force_constants is specified for this calculation" - ) from key_error - - try: - code = inputdict.pop(self.get_linkname("code")) - except KeyError as key_error: - raise InputValidationError( - "no code is specified for this calculation" - ) from key_error - - time_step = trajectory.get_times()[1] - trajectory.get_times()[0] - - ############################## - # END OF INITIAL INPUT CHECK # - ############################## - - # =================== prepare the python input files ===================== - - cell_txt = get_poscar_txt(structure) - input_txt = parameters_to_input_file(parameters_data) - force_constants_txt = get_force_constants(force_constants) - trajectory_txt = get_trajectory_txt(trajectory) - - # =========================== dump to file ============================= - - input_filename = tempfolder.get_abs_path(self._INPUT_FILE_NAME) - with open(input_filename, "w") as infile: - infile.write(input_txt) - - cell_filename = tempfolder.get_abs_path(self._INPUT_CELL) - with open(cell_filename, "w") as infile: - infile.write(cell_txt) - - force_constants_filename = tempfolder.get_abs_path(self._INPUT_FORCE_CONSTANTS) - with open(force_constants_filename, "w") as infile: - infile.write(force_constants_txt) - - trajectory_filename = tempfolder.get_abs_path(self._INPUT_TRAJECTORY) - with open(trajectory_filename, "w") as infile: - infile.write(trajectory_txt) - - # ============================ calcinfo ================================ - - local_copy_list = [] - remote_copy_list = [] - # additional_retrieve_list = settings_dict.pop("ADDITIONAL_RETRIEVE_LIST",[]) - - calcinfo = CalcInfo() - - calcinfo.uuid = self.uuid - # Empty command line by default - calcinfo.local_copy_list = local_copy_list - calcinfo.remote_copy_list = remote_copy_list - - # Retrieve files - calcinfo.retrieve_list = [ - self._OUTPUT_FILE_NAME, - self._OUTPUT_FORCE_CONSTANTS, - self._OUTPUT_QUASIPARTICLES, - ] - - codeinfo = CodeInfo() - codeinfo.cmdline_params = [ - self._INPUT_FILE_NAME, - self._INPUT_TRAJECTORY, - "-ts", - f"{time_step}", - "--silent", - "-sfc", - self._OUTPUT_FORCE_CONSTANTS, - "-thm", # '--resolution 0.01', - "-psm", - "2", - "--normalize_dos", - "-sdata", - ] - - if "temperature" in parameters_data.get_dict(): - codeinfo.cmdline_params.append("--temperature") - codeinfo.cmdline_params.append(f"{parameters_data.dict.temperature}") - - if "md_commensurate" in parameters_data.get_dict(): - if parameters_data.dict.md_commensurate: - codeinfo.cmdline_params.append("--MD_commensurate") - - codeinfo.stdout_name = self._OUTPUT_FILE_NAME - codeinfo.code_uuid = code.uuid - codeinfo.withmpi = False - calcinfo.codes_info = [codeinfo] - return calcinfo diff --git a/aiida_lammps/calculations/lammps/__init__.py b/aiida_lammps/calculations/lammps/__init__.py index 124bc94..905e402 100644 --- a/aiida_lammps/calculations/lammps/__init__.py +++ b/aiida_lammps/calculations/lammps/__init__.py @@ -95,43 +95,6 @@ def structure_to_poscar(structure: orm.StructureData) -> str: return poscar -def parameters_to_input_file(parameters_object: dict) -> str: - """Write input file for dynaphopy from the input parameters. - - :param parameters_object: input parameters for the dynaphopy calculation - :type parameters_object: dict - :return: input file in string format for dynaphopy - :rtype: str - """ - parameters = parameters_object.get_dict() - input_file = "STRUCTURE FILE POSCAR\nPOSCAR\n\n" - input_file += "FORCE CONSTANTS\nFORCE_CONSTANTS\n\n" - input_file += "PRIMITIVE MATRIX\n" - input_file += f'{np.array(parameters["primitive"])[0, 0]} ' - input_file += f'{np.array(parameters["primitive"])[0, 1]} ' - input_file += f'{np.array(parameters["primitive"])[0, 2]} \n' - input_file += f'{np.array(parameters["primitive"])[1, 0]} ' - input_file += f'{np.array(parameters["primitive"])[1, 1]} ' - input_file += f'{np.array(parameters["primitive"])[1, 2]} \n' - input_file += f'{np.array(parameters["primitive"])[2, 0]} ' - input_file += f'{np.array(parameters["primitive"])[2, 1]} ' - input_file += f'{np.array(parameters["primitive"])[2, 2]} \n' - input_file += "\n" - input_file += "SUPERCELL MATRIX PHONOPY\n" - input_file += f'{np.array(parameters["supercell"])[0, 0]} ' - input_file += f'{np.array(parameters["supercell"])[0, 1]} ' - input_file += f'{np.array(parameters["supercell"])[0, 2]} \n' - input_file += f'{np.array(parameters["supercell"])[1, 0]} ' - input_file += f'{np.array(parameters["supercell"])[1, 1]} ' - input_file += f'{np.array(parameters["supercell"])[1, 2]} \n' - input_file += f'{np.array(parameters["supercell"])[2, 0]} ' - input_file += f'{np.array(parameters["supercell"])[2, 1]} ' - input_file += f'{np.array(parameters["supercell"])[2, 2]} \n' - input_file += "\n" - - return input_file - - class BaseLammpsCalculation(CalcJob): """ A basic plugin for calculating force constants using Lammps. diff --git a/aiida_lammps/calculations/lammps/combinate.py b/aiida_lammps/calculations/lammps/combinate.py deleted file mode 100644 index f794430..0000000 --- a/aiida_lammps/calculations/lammps/combinate.py +++ /dev/null @@ -1,241 +0,0 @@ -"""Combined MD and Phonopy calculation""" -# Not working with Aiida 1.0 -# pylint: disable=no-name-in-module, duplicate-code -from aiida import orm -from aiida.common.exceptions import InputValidationError -from aiida_phonopy.common.raw_parsers import ( # pylint: disable=import-error - get_force_constants, - get_FORCE_SETS_txt, - get_poscar_txt, -) -import numpy as np - -from aiida_lammps.calculations.lammps import BaseLammpsCalculation - - -def generate_dynaphopy_input( - parameters_object, - poscar_name: str = "POSCAR", - force_constants_name: str = "FORCE_CONSTANTS", - force_sets_filename: str = "FORCE_SETS", - use_sets: bool = False, -) -> str: - """Generates the input needed for the dynaphopy calculation. - - :param parameters_object: input parameters dictionary - :type parameters_object: dict - :param poscar_name: name of the POSCAR file, defaults to 'POSCAR' - :type poscar_name: str, optional - :param force_constants_name: name of the file with the force constants, - defaults to 'FORCE_CONSTANTS' - :type force_constants_name: str, optional - :param force_sets_filename: name of the file with the force sets, - defaults to 'FORCE_SETS' - :type force_sets_filename: str, optional - :param use_sets: whether or not to use the force sets, defaults to False - :type use_sets: bool, optional - :return: dynaphopy input file - :rtype: str - """ - parameters = parameters_object.get_dict() - input_file = f"STRUCTURE FILE POSCAR\n{poscar_name}\n\n" - - if use_sets: - input_file += f"FORCE SETS\n{force_sets_filename}\n\n" - else: - input_file += f"FORCE CONSTANTS\n{force_constants_name}\n\n" - - input_file += "PRIMITIVE MATRIX\n" - input_file += f'{np.array(parameters["primitive"])[0, 0]} ' - input_file += f'{np.array(parameters["primitive"])[1, 1]} ' - input_file += f'{np.array(parameters["primitive"])[2, 2]} \n' - input_file += f'{np.array(parameters["primitive"])[0, 0]} ' - input_file += f'{np.array(parameters["primitive"])[1, 1]} ' - input_file += f'{np.array(parameters["primitive"])[2, 2]} \n' - input_file += f'{np.array(parameters["primitive"])[0, 0]} ' - input_file += f'{np.array(parameters["primitive"])[1, 1]} ' - input_file += f'{np.array(parameters["primitive"])[2, 2]} \n' - input_file += "\n" - input_file += "SUPERCELL MATRIX PHONOPY\n" - input_file += f'{np.array(parameters["supercell"])[0, 0]} ' - input_file += f'{np.array(parameters["supercell"])[0, 1]} ' - input_file += f'{np.array(parameters["supercell"])[0, 2]} \n' - input_file += f'{np.array(parameters["supercell"])[1, 0]} ' - input_file += f'{np.array(parameters["supercell"])[1, 1]} ' - input_file += f'{np.array(parameters["supercell"])[1, 2]} \n' - input_file += f'{np.array(parameters["supercell"])[2, 0]} ' - input_file += f'{np.array(parameters["supercell"])[2, 1]} ' - input_file += f'{np.array(parameters["supercell"])[2, 2]} \n' - input_file += "\n" - - return input_file - - -class CombinateCalculation(BaseLammpsCalculation): - """Combined MD and Phonopy calculation""" - - _POSCAR_NAME = "POSCAR" - _INPUT_FORCE_CONSTANTS = "FORCE_CONSTANTS" - _INPUT_FORCE_SETS = "FORCE_SETS" - _INPUT_FILE_NAME_DYNA = "input_dynaphopy" - _OUTPUT_FORCE_CONSTANTS = "FORCE_CONSTANTS_OUT" - _OUTPUT_QUASIPARTICLES = "quasiparticles_data.yaml" - _OUTPUT_FILE_NAME = "OUTPUT" - - # self._retrieve_list = [self._OUTPUT_QUASIPARTICLES, - # self._OUTPUT_FORCE_CONSTANTS, self._OUTPUT_FILE_NAME] - - @classmethod - def define(cls, spec): - super(CombinateCalculation, cls).define(spec) - spec.input( - "metadata.options.parser_name", - valid_type=str, - default="dynaphopy", - ) - spec.input( - "parameters_dynaphopy", - valid_type=orm.Dict, - help="dynaphopy parameters", - ) - spec.input( - "force_constants", - valid_type=orm.ArrayData, - help="harmonic force constants", - ) - spec.input( - "force_sets", - valid_type=orm.ArrayData, - help="phonopy force sets", - ) - - # spec.input('settings', valid_type=str, default='lammps.optimize') - - @staticmethod - def create_main_input_content( - parameter_data, - potential_data, - structure_data, - structure_filename, - trajectory_filename, - system_filename, - restart_filename, - ): - # pylint: disable=too-many-arguments, arguments-differ - random_number = np.random.randint(10000000) - - lammps_input_file = f"units {potential_data.default_units}\n" - lammps_input_file += "boundary p p p\n" - lammps_input_file += "box tilt large\n" - lammps_input_file += f"atom_style {potential_data.atom_style}\n" - lammps_input_file += f"read_data {structure_filename}\n" - - lammps_input_file += potential_data.get_input_lines(structure_data) - - lammps_input_file += "neighbor 0.3 bin\n" - lammps_input_file += "neigh_modify every 1 delay 0 check no\n" - - lammps_input_file += "velocity all create " - lammps_input_file += f"{parameter_data.dict.temperature} {random_number} " - lammps_input_file += "dist gaussian mom yes\n" - lammps_input_file += ( - f"velocity all scale {parameter_data.dict.temperature}\n" - ) - - lammps_input_file += "fix int all nvt temp " - lammps_input_file += f"{parameter_data.dict.temperature} " - lammps_input_file += f"{parameter_data.dict.temperature} " - lammps_input_file += f"{parameter_data.dict.thermostat_variable}\n" - - return lammps_input_file - - def prepare_extra_files(self, tempfolder, potential_object): - # pylint: disable=too-many-locals - if "fore_constants" in self.inputs: - force_constants = self.inputs.force_constants - else: - force_constants = None - - if "fore_constants" in self.inputs: - force_sets = self.inputs.force_sets - else: - force_sets = None - - cell_txt = get_poscar_txt(self.inputs.structure) - - cell_filename = tempfolder(self._POSCAR_NAME) - with open(cell_filename, "w") as infile: - infile.write(cell_txt) - - if force_constants is not None: - force_constants_txt = get_force_constants(force_constants) - force_constants_filename = tempfolder.get_abs_path( - self._INPUT_FORCE_CONSTANTS - ) - with open(force_constants_filename, "w") as infile: - infile.write(force_constants_txt) - - elif force_sets is not None: - force_sets_txt = get_FORCE_SETS_txt(force_sets) - force_sets_filename = tempfolder.get_abs_path(self._INPUT_FORCE_SETS) - with open(force_sets_filename, "w") as infile: - infile.write(force_sets_txt) - else: - raise InputValidationError( - "no force_sets nor force_constants are specified for this calculation" - ) - - try: - parameters_data_dynaphopy = orm.Dict.pop( # pylint: disable=no-member - self.get_linkname("parameters_dynaphopy") - ) - except KeyError as key_error: - raise InputValidationError( - "No dynaphopy parameters specified for this calculation" - ) from key_error - - parameters_dynaphopy_txt = generate_dynaphopy_input( - parameters_data_dynaphopy, - poscar_name=self._POSCAR_NAME, - force_constants_name=self._INPUT_FORCE_CONSTANTS, - force_sets_filename=self._INPUT_FORCE_SETS, - use_sets=force_sets is not None, - ) - - dynaphopy_filename = tempfolder.get_abs_path(self._INPUT_FILE_NAME_DYNA) - with open(dynaphopy_filename, "w") as infile: - infile.write(parameters_dynaphopy_txt) - - md_supercell = parameters_data_dynaphopy.dict.md_supercell - - time_step = self._parameters_data.dict.timestep - equilibrium_time = self._parameters_data.dict.equilibrium_steps * time_step - total_time = self._parameters_data.dict.total_steps * time_step - - self._cmdline_params = [ - self._INPUT_FILE_NAME_DYNA, - "--run_lammps", - self._INPUT_FILE_NAME, - f"{total_time}", - f"{time_step}", - f"{equilibrium_time}", - "--dim", - f"{md_supercell[0]}", - f"{md_supercell[1]}", - f"{md_supercell[2]}", - "--silent", - "-sfc", - self._OUTPUT_FORCE_CONSTANTS, - "-thm", # '--resolution 0.01', - "-psm", - "2", - "--normalize_dos", - "-sdata", - "--velocity_only", - "--temperature", - "{}".format(self._parameters_data.dict.temperature), - ] - - if "md_commensurate" in parameters_data_dynaphopy.get_dict(): - if parameters_data_dynaphopy.dict.md_commensurate: - self._cmdline_params.append("--MD_commensurate") diff --git a/aiida_lammps/common/generate_input_files.py b/aiida_lammps/common/generate_input_files.py deleted file mode 100644 index 88932cb..0000000 --- a/aiida_lammps/common/generate_input_files.py +++ /dev/null @@ -1,92 +0,0 @@ -"""Set of functions to generate dynaphopy compatible input files.""" -import numpy as np - - -def get_trajectory_txt(trajectory) -> str: - """Generate a trajectory file to be given to dynaphopy. - - :param trajectory: lammps trajectories - :type trajectory: LammpsTrajectory - :return: trajectory string for dynaphopy - :rtype: str - """ - # pylint: disable=too-many-locals - cell = trajectory.get_cells()[0] - - alat = np.linalg.norm(cell[0]) - blat = np.linalg.norm(cell[1]) - clat = np.linalg.norm(cell[2]) - - alpha = np.arccos(np.dot(cell[1], cell[2]) / (clat * blat)) - gamma = np.arccos(np.dot(cell[1], cell[0]) / (alat * blat)) - beta = np.arccos(np.dot(cell[2], cell[0]) / (alat * clat)) - - xhi = alat - xy_box = blat * np.cos(gamma) - xz_box = clat * np.cos(beta) - yhi = np.sqrt(pow(blat, 2) - pow(xy_box, 2)) - yz_box = (blat * clat * np.cos(alpha) - xy_box * xz_box) / yhi - zhi = np.sqrt(pow(clat, 2) - pow(xz_box, 2) - pow(yz_box, 2)) - - xhi = xhi + max(0, 0, xy_box, xz_box, xy_box + xz_box) - yhi = yhi + max(0, 0, yz_box) - - xlo_bound = np.min([0.0, xy_box, xz_box, xy_box + xz_box]) - xhi_bound = xhi + np.max([0.0, xy_box, xz_box, xy_box + xz_box]) - ylo_bound = np.min([0.0, yz_box]) - yhi_bound = yhi + np.max([0.0, yz_box]) - zlo_bound = 0 - zhi_bound = zhi - - ind = trajectory.get_array("steps") - lammps_data_file = "" - for i, position_step in enumerate(trajectory.get_positions()): - lammps_data_file += "ITEM: TIMESTEP\n" - lammps_data_file += f"{ind[i]}\n" - lammps_data_file += "ITEM: NUMBER OF ATOMS\n" - lammps_data_file += f"{len(position_step)}\n" - lammps_data_file += "ITEM: BOX BOUNDS xy xz yz pp pp pp\n" - lammps_data_file += f"{xlo_bound:20.10f} {xhi_bound:20.10f} {xy_box:20.10f}\n" - lammps_data_file += f"{ylo_bound:20.10f} {yhi_bound:20.10f} {yz_box:20.10f}\n" - lammps_data_file += f"{zlo_bound:20.10f} {zhi_bound:20.10f} {yz_box:20.10f}\n" - lammps_data_file += "ITEM: ATOMS x y z\n" - for position in position_step: - lammps_data_file += "{0:20.10f} {1:20.10f} {2:20.10f}\n".format(*position) - return lammps_data_file - - -def parameters_to_input_file(parameters_object: dict) -> str: - """Generate the input file for dynaphopy. - - :param parameters_object: dictionary with inputs for dynaphopy. - :type parameters_object: dict - :return: dynaphopy string input - :rtype: str - """ - parameters = parameters_object.get_dict() - input_file = "STRUCTURE FILE POSCAR\nPOSCAR\n\n" - input_file += "FORCE CONSTANTS\nFORCE_CONSTANTS\n\n" - input_file += "PRIMITIVE MATRIX\n" - input_file += f'{np.array(parameters["primitive"])[0, 0]} ' - input_file += f'{np.array(parameters["primitive"])[0, 1]} ' - input_file += f'{np.array(parameters["primitive"])[0, 2]} \n' - input_file += f'{np.array(parameters["primitive"])[1, 0]} ' - input_file += f'{np.array(parameters["primitive"])[1, 1]} ' - input_file += f'{np.array(parameters["primitive"])[1, 2]} \n' - input_file += f'{np.array(parameters["primitive"])[2, 0]} ' - input_file += f'{np.array(parameters["primitive"])[2, 1]} ' - input_file += f'{np.array(parameters["primitive"])[2, 2]} \n' - input_file += "\n" - input_file += "SUPERCELL MATRIX PHONOPY\n" - input_file += f'{np.array(parameters["supercell"])[0, 0]} ' - input_file += f'{np.array(parameters["supercell"])[0, 1]} ' - input_file += f'{np.array(parameters["supercell"])[0, 2]} \n' - input_file += f'{np.array(parameters["supercell"])[1, 0]} ' - input_file += f'{np.array(parameters["supercell"])[1, 1]} ' - input_file += f'{np.array(parameters["supercell"])[1, 2]} \n' - input_file += f'{np.array(parameters["supercell"])[2, 0]} ' - input_file += f'{np.array(parameters["supercell"])[2, 1]} ' - input_file += f'{np.array(parameters["supercell"])[2, 2]} \n' - input_file += "\n" - - return input_file diff --git a/aiida_lammps/common/raw_parsers.py b/aiida_lammps/common/raw_parsers.py index 7e92698..479b8ec 100644 --- a/aiida_lammps/common/raw_parsers.py +++ b/aiida_lammps/common/raw_parsers.py @@ -357,90 +357,3 @@ def convert_units(value, style, unit_type, out_units): raise NotImplementedError in_units = get_units_dict(style, [unit_type], "")[unit_type] return value * conversion[in_units] * (1.0 / conversion[out_units]) - - -def parse_quasiparticle_data(qp_file: str) -> dict: - """Parse quasiparticle information from dynaphopy. - - :param qp_file: file with the quasiparticle information - :type qp_file: str - :return: dictionary with the quasiparticle information - :rtype: dict - """ - - with open(qp_file, "r") as handle: - quasiparticle_data = yaml.load(handle) - - data_dict = {} - for i, data in enumerate(quasiparticle_data): - data_dict[f"q_point_{i}"] = data - - return data_dict - - -def parse_dynaphopy_output(filename: str) -> dict: - """Parse output from a dynaphopy calculation. - - :param filename: output file from the dynaphopy calculation. - :type file: str - :return: dictionary with the dynaphopy output - :rtype: dict - """ - # pylint: disable=too-many-locals - thermal_properties = None - - with open(filename, "r") as handle: - data_lines = handle.readlines() - - indices = [] - q_points = [] - for i, line in enumerate(data_lines): - if "Q-point" in line: - indices.append(i) - q_points.append( - np.array( - line.replace("]", "").replace("[", "").split()[4:8], - dtype=float, - ) - ) - - indices.append(len(data_lines)) - - phonons = {} - for i, _ in enumerate(indices[:-1]): - - fragment = data_lines[indices[i] : indices[i + 1]] - if "kipped" in fragment: - continue - phonon_modes = {} - for j, line in enumerate(fragment): - if "Peak" in line: - number = line.split()[2] - phonon_mode = { - "width": float(fragment[j + 2].split()[1]), - "positions": float(fragment[j + 3].split()[1]), - "shift": float(fragment[j + 12].split()[2]), - } - phonon_modes.update({number: phonon_mode}) - - if "Thermal" in line: - free_energy = float(fragment[j + 4].split()[4]) - entropy = float(fragment[j + 5].split()[3]) - specific_heat = float(fragment[j + 6].split()[3]) - total_energy = float(fragment[j + 7].split()[4]) - - temperature = float(fragment[j].split()[5].replace("(", "")) - - thermal_properties = { - "temperature": temperature, - "free_energy": free_energy, - "entropy": entropy, - "cv": specific_heat, - "total_energy": total_energy, - } - - phonon_modes.update({"q_point": q_points[i].tolist()}) - - phonons.update({"wave_vector_" + str(i): phonon_modes}) - - return thermal_properties diff --git a/aiida_lammps/parsers/dynaphopy.py b/aiida_lammps/parsers/dynaphopy.py deleted file mode 100644 index eacfb0e..0000000 --- a/aiida_lammps/parsers/dynaphopy.py +++ /dev/null @@ -1,120 +0,0 @@ -"""Parser for dynaphopy calculations.""" -# Not working with Aiida 1.0 -# pylint: disable=useless-super-delegation -from aiida.orm.data.parameter import ( - ParameterData, # pylint: disable=no-name-in-module, import-error -) -from aiida.parsers.parser import Parser -from aiida_phonopy.common.raw_parsers import ( - parse_FORCE_CONSTANTS, # pylint: disable=import-error -) - -from aiida_lammps.common.raw_parsers import ( - parse_dynaphopy_output, - parse_quasiparticle_data, -) - - -class DynaphopyParser(Parser): - """ - Simple Parser for LAMMPS. - """ - - def __init__(self, calc): - """ - Initialize the instance of LammpsParser - """ - super(DynaphopyParser, self).__init__(calc) - - def parse_with_retrieved(self, retrieved): - """ - Parses the datafolder, stores results. - """ - - # suppose at the start that the job is successful - successful = True - - # select the folder object - # Check that the retrieved folder is there - try: - out_folder = retrieved[ - self._calc._get_linkname_retrieved() - ] # pylint: disable=protected-access, no-member - except KeyError: - self.logger.error("No retrieved folder found") - return False, () - - # check what is inside the folder - # list_of_files = out_folder.get_folder_list() - - # OUTPUT file should exist - # if not self._calc._OUTPUT_FILE_NAME in list_of_files: - # successful = False - # self.logger.error("Output file not found") - # return successful, () - - # Get file and do the parsing - outfile = out_folder.get_abs_path( - self._calc._OUTPUT_FILE_NAME - ) # pylint: disable=no-member, protected-access - force_constants_file = out_folder.get_abs_path( - self._calc._OUTPUT_FORCE_CONSTANTS - ) # pylint: disable=no-member, protected-access - qp_file = out_folder.get_abs_path( - self._calc._OUTPUT_QUASIPARTICLES - ) # pylint: disable=no-member, protected-access - - try: - thermal_properties = parse_dynaphopy_output(outfile) - quasiparticle_data = parse_quasiparticle_data(qp_file) - except ValueError: - pass - - try: - force_constants = parse_FORCE_CONSTANTS(force_constants_file) - except Exception: # pylint: disable=broad-except - pass - - # look at warnings - warnings = [] - with open( - out_folder.get_abs_path(self._calc._SCHED_ERROR_FILE) - ) as _file: # pylint: disable=no-member, protected-access - errors = _file.read() - if errors: - warnings = [errors] - - # ====================== prepare the output node ====================== - - # save the outputs - new_nodes_list = [] - - # save phonon data into node - try: - new_nodes_list.append( - ("quasiparticle_data", ParameterData(dict=quasiparticle_data)) - ) - except KeyError: # keys not - pass - - try: - new_nodes_list.append( - ("thermal_properties", ParameterData(dict=thermal_properties)) - ) - except KeyError: # keys not - pass - - try: - new_nodes_list.append(("force_constants", force_constants)) - except KeyError: # keys not - pass - - # add the dictionary with warnings - new_nodes_list.append( - ( - self.get_linkname_outparams(), # pylint: disable=no-member - ParameterData(dict={"warnings": warnings}), - ) - ) - - return successful, new_nodes_list diff --git a/examples/launch_dynaphopy_si.py b/examples/launch_dynaphopy_si.py deleted file mode 100644 index eb0bab8..0000000 --- a/examples/launch_dynaphopy_si.py +++ /dev/null @@ -1,118 +0,0 @@ -from aiida.common.extendeddicts import AttributeDict -from aiida.engine import run_get_node -from aiida.orm import Code, Dict, StructureData -from aiida.plugins import CalculationFactory -import numpy as np - -if __name__ == "__main__": - - from aiida import load_profile # noqa: F401 - - load_profile() - - codename = "dynaphopy@stern" - - ############################ - # Define input parameters # - ############################ - - a = 5.404 - cell = [[a, 0, 0], [0, a, 0], [0, 0, a]] - - symbols = ["Si"] * 8 - scaled_positions = [ - (0.875, 0.875, 0.875), - (0.875, 0.375, 0.375), - (0.375, 0.875, 0.375), - (0.375, 0.375, 0.875), - (0.125, 0.125, 0.125), - (0.125, 0.625, 0.625), - (0.625, 0.125, 0.625), - (0.625, 0.625, 0.125), - ] - - structure = StructureData(cell=cell) - positions = np.dot(scaled_positions, cell) - - for i, scaled_position in enumerate(scaled_positions): - structure.append_atom( - position=np.dot(scaled_position, cell).tolist(), symbols=symbols[i] - ) - - structure.store() - - dynaphopy_parameters = { - "supercell": [[2, 0, 0], [0, 2, 0], [0, 0, 2]], - "primitive": [[1.0, 0.0, 0.0], [0.0, 1.0, 0.0], [0.0, 0.0, 1.0]], - "mesh": [40, 40, 40], - "md_commensurate": True, - "temperature": 300, - } # Temperature can be omitted (If ommited calculated from Max.-Boltz.) - - dynaphopy_machine = { - "num_machines": 1, - "parallel_env": "mpi*", - "tot_num_mpiprocs": 16, - } - - from aiida.orm import load_node - - force_constants = load_node( - 20569 - ) # Loads node that contains the harmonic force constants (Array data) - trajectory = load_node( - 20528 - ) # Loads node that constains the MD trajectory (TrajectoryData) - - codename = codename - code = Code.get_from_string(codename) - calc = code.new_calc(max_wallclock_seconds=3600, resources=dynaphopy_machine) - - calc.label = "test dynaphopy calculation" - calc.description = "A much longer description" - - calc.use_code(code) - - calc.use_structure(structure) - calc.use_parameters(Dict(dict=dynaphopy_parameters)) - calc.use_force_constants(force_constants) - calc.use_trajectory(trajectory) - - calc.store_all() - - calc.submit() - print("submitted calculation with PK={}".format(calc.dbnode.pk)) - - LammpsOptimizeCalculation = CalculationFactory("lammps.optimize") - inputs = LammpsOptimizeCalculation.get_builder() - - # Computer options - options = AttributeDict() - options.account = "" - options.qos = "" - options.resources = { - "num_machines": 1, - "num_mpiprocs_per_machine": 1, - "parallel_env": "localmpi", - "tot_num_mpiprocs": 1, - } - # options.queue_name = 'iqtc04.q' - options.max_wallclock_seconds = 3600 - inputs.metadata.options = options - - # Setup code - inputs.code = Code.get_from_string(codename) - - # setup nodes - inputs.structure = structure - inputs.parameters = Dict(dict=dynaphopy_parameters) - inputs.force_constants = force_constants - inputs.trajectory = trajectory - - # run calculation - result, node = run_get_node(LammpsOptimizeCalculation, **inputs) - print("results:", result) - print("node:", node) - - # submit to deamon - # submit(LammpsOptimizeCalculation, **inputs) diff --git a/examples/launch_lammps_combinate.py b/examples/launch_lammps_combinate.py deleted file mode 100644 index c29e99d..0000000 --- a/examples/launch_lammps_combinate.py +++ /dev/null @@ -1,110 +0,0 @@ -# This calculation requires also phonopy plugin to work - -from aiida.common.extendeddicts import AttributeDict -from aiida.engine import run_get_node -from aiida.orm import Code, Dict, StructureData -from aiida.plugins import CalculationFactory -import numpy as np - -if __name__ == "__main__": - - from aiida import load_profile # noqa: F401 - - load_profile() - - codename = "lammps_combinate@stern" - - ############################ - # Define input parameters # - ############################ - - a = 5.404 - cell = [[a, 0, 0], [0, a, 0], [0, 0, a]] - - symbols = ["Si"] * 8 - scaled_positions = [ - (0.875, 0.875, 0.875), - (0.875, 0.375, 0.375), - (0.375, 0.875, 0.375), - (0.375, 0.375, 0.875), - (0.125, 0.125, 0.125), - (0.125, 0.625, 0.625), - (0.625, 0.125, 0.625), - (0.625, 0.625, 0.125), - ] - - structure = StructureData(cell=cell) - positions = np.dot(scaled_positions, cell) - - for i, scaled_position in enumerate(scaled_positions): - structure.append_atom( - position=np.dot(scaled_position, cell).tolist(), symbols=symbols[i] - ) - - structure.store() - - # Silicon(C) Tersoff - tersoff_si = { - "Si Si Si ": "3.0 1.0 1.7322 1.0039e5 16.218 -0.59826 0.78734 1.0999e-6 1.7322 471.18 2.85 0.15 2.4799 1830.8" - } - - potential = {"pair_style": "tersoff", "data": tersoff_si} - - dynaphopy_parameters = { - "supercell": [[2, 0, 0], [0, 2, 0], [0, 0, 2]], - "primitive": [[0.0, 0.5, 0.5], [0.5, 0.0, 0.5], [0.5, 0.5, 0.0]], - "mesh": [40, 40, 40], - "md_commensurate": False, - "md_supercell": [2, 2, 2], - } - - from aiida.orm import load_node - - force_constants = load_node( - 38 - ) # Loads node that contains the harmonic force constants (Array data) - - machine = {"num_machines": 1, "parallel_env": "mpi*", "tot_num_mpiprocs": 16} - - parameters_md = { - "timestep": 0.001, - "temperature": 300, - "thermostat_variable": 0.5, - "equilibrium_steps": 2000, - "total_steps": 2000, - "dump_rate": 1, - } - - CombinateCalculation = CalculationFactory("lammps.force") - inputs = CombinateCalculation.get_builder() - - # Computer options - options = AttributeDict() - options.account = "" - options.qos = "" - options.resources = { - "num_machines": 1, - "num_mpiprocs_per_machine": 1, - "parallel_env": "localmpi", - "tot_num_mpiprocs": 1, - } - # options.queue_name = 'iqtc04.q' - options.max_wallclock_seconds = 3600 - inputs.metadata.options = options - - # Setup code - inputs.code = Code.get_from_string(codename) - - # setup nodes - inputs.structure = structure - inputs.potential = Dict(dict=potential) - inputs.force_constants(force_constants) - inputs.parameters_dynaphopy(Dict(dict=dynaphopy_parameters)) - - # run calculation - result, node = run_get_node(CombinateCalculation, **inputs) - print("results:", result) - print("node:", node) - - # submit to deamon - # submit(LammpsOptimizeCalculation, **inputs) diff --git a/setup.json b/setup.json index dc113ed..fda770b 100644 --- a/setup.json +++ b/setup.json @@ -36,16 +36,14 @@ "lammps.force = aiida_lammps.calculations.lammps.force:ForceCalculation", "lammps.md = aiida_lammps.calculations.lammps.md:MdCalculation", "lammps.md.multi = aiida_lammps.calculations.lammps.md_multi:MdMultiCalculation", - "lammps.optimize = aiida_lammps.calculations.lammps.optimize:OptimizeCalculation", - "dynaphopy = aiida_lammps.calculations.dynaphopy: DynaphopyCalculation" + "lammps.optimize = aiida_lammps.calculations.lammps.optimize:OptimizeCalculation" ], "aiida.parsers": [ "lammps.base = aiida_lammps.parsers.lammps.lammps_parser:LAMMPSBaseParser", "lammps.force = aiida_lammps.parsers.lammps.force:ForceParser", "lammps.md = aiida_lammps.parsers.lammps.md:MdParser", "lammps.md.multi = aiida_lammps.parsers.lammps.md_multi:MdMultiParser", - "lammps.optimize = aiida_lammps.parsers.lammps.optimize:OptimizeParser", - "dynaphopy = aiida_lammps.parsers.dynaphopy: DynaphopyParser" + "lammps.optimize = aiida_lammps.parsers.lammps.optimize:OptimizeParser" ], "aiida.data": [ "lammps.potential = aiida_lammps.data.potential:EmpiricalPotential", @@ -76,9 +74,6 @@ "myst-parser~=0.15.0", "sphinx-external-toc", "furo" - ], - "phonopy": [ - "dynaphopy" ] } } From 5c34a9b61db59fe7d38ab3fd77b7cfcdd34880a2 Mon Sep 17 00:00:00 2001 From: Chris Sewell Date: Tue, 5 Apr 2022 22:08:23 +0200 Subject: [PATCH 68/70] Move tests out of package --- .pre-commit-config.yaml | 4 +- .readthedocs.yml | 2 +- MANIFEST.in | 1 + README.md | 4 +- conftest.py | 19 +- docs/source/conf.py | 12 +- setup.json | 1 + {aiida_lammps/tests => tests}/__init__.py | 0 .../tests => tests}/input_files/__init__.py | 0 .../FeW_MO_737567242631_000.eam.alloy.yaml | 0 .../Fe_MO_137964310702_004.tersoff.yaml | 0 .../Fe_MO_331285495617_004.morse.yaml | 0 .../Fe_MO_492310898779_001.meam.yaml | 0 .../input_files/parsers/aiida_lammps.yaml | 0 .../input_files/parsers/log.lammps | 0 .../input_files/potentials/FeCrOSCH.reaxff | 0 .../FeW_MO_737567242631_000.eam.alloy | 0 .../potentials/Fe_MO_137964310702_004.tersoff | 0 .../potentials/Fe_MO_331285495617_004.morse | 0 .../potentials/Fe_MO_492310898779_001.meam | 0 .../input_files/potentials/Fe_mm.eam.fs | 0 .../input_files/potentials/cho.reaxff | 0 .../input_files/trajectory.lammpstrj | 0 .../tests => tests}/test_calculations.py | 2 +- .../test_force_process_eam_.yml | 0 .../test_force_process_lennard_jones_.yml | 0 .../test_force_process_reaxff_.yml | 0 .../test_force_process_tersoff_.yml | 0 .../test_input_creation_eam_lammps_md_.txt | 0 ...t_creation_lennard_jones_lammps_force_.txt | 0 .../test_input_creation_reaxff_lammps_md_.txt | 0 ...input_creation_reaxff_lammps_md_multi_.txt | 0 ...nput_creation_tersoff_lammps_optimize_.txt | 0 .../test_md_multi_process_eam_.yml | 0 .../test_md_multi_process_lennard_jones_.yml | 0 .../test_md_multi_process_reaxff_.yml | 0 .../test_md_multi_process_tersoff_.yml | 0 .../test_md_process-eam-2019.yml | 0 .../test_md_process-eam-2020.yml | 0 .../test_md_process-eam-2021.yml | 32 ++ .../test_md_process-lennard-jones-2019.yml | 0 .../test_md_process-lennard-jones-2020.yml | 0 .../test_md_process-lennard-jones-2021.yml | 32 ++ .../test_md_process-tersoff-2019.yml | 0 .../test_md_process-tersoff-2020.yml | 0 .../test_md_process-tersoff-2021.yml | 33 ++ .../test_optimize_process_eam_.yml | 0 .../test_optimize_process_lennard_jones_.yml | 0 .../test_optimize_process_reaxff_.yml | 0 .../test_optimize_process_tersoff_.yml | 0 .../tests => tests}/test_generate_inputs.py | 2 +- .../test_generate_inputs/md.yaml | 0 .../test_generate_inputs/parameters_md.yaml | 0 .../parameters_minimize.yaml | 0 .../test_generate_input_eam_alloy_md.txt | 0 ...test_generate_input_eam_alloy_minimize.txt | 0 .../test_generate_structure.py | 0 .../test_generate_Fe_.txt | 0 .../test_generate_fes_cubic_zincblende_.txt | 0 .../test_generate_greigite_.txt | 0 .../test_generate_pyrite_.txt | 0 .../test_init_eam_alloy.yaml | 0 .../test_init_eam_alloy_block.txt | 0 .../test_init_meam.yaml | 0 .../test_init_meam_block.txt | 0 .../test_init_morse.yaml | 0 .../test_init_morse_block.txt | 0 .../test_init_tersoff.yaml | 0 .../test_init_tersoff_block.txt | 0 {aiida_lammps/tests => tests}/test_parsers.py | 2 +- .../tests => tests}/test_potential_data.py | 2 +- .../test_potential_data/test_init.yml | 0 .../test_potential_data/test_init_eam_.yml | 0 .../test_init_lennard_jones_.yml | 0 .../test_potential_data/test_init_reaxff_.yml | 0 .../test_init_tersoff_.yml | 0 .../test_input_lines_eam_.txt | 0 .../test_input_lines_lennard_jones_.txt | 0 .../test_input_lines_reaxff_.txt | 0 .../test_input_lines_tersoff_.txt | 0 .../test_potential_files_tersoff_.txt | 0 .../test_raw_parsers/test_parse_log.yaml | 0 .../test_parse_trajectory_file.yml | 0 .../tests => tests}/test_reaxff_parse.py | 0 .../test_read_lammps_format.yml | 0 .../test_read_lammps_format2.yml | 0 .../test_round_trip_lammps_format.txt | 0 .../test_round_trip_lammps_format2.txt | 0 .../tests => tests}/test_trajectory.py | 2 +- .../test_trajectory/test_create_structure.yml | 0 .../test_iter_trajectories.yml | 0 .../test_lammps_trajectory_data.yml | 0 .../test_lammpstraj_get_step_string.txt | 0 .../test_lammpstraj_get_step_struct.yml | 0 tests/utils.py | 328 ++++++++++++++++++ 95 files changed, 447 insertions(+), 31 deletions(-) rename {aiida_lammps/tests => tests}/__init__.py (100%) rename {aiida_lammps/tests => tests}/input_files/__init__.py (100%) rename {aiida_lammps/tests => tests}/input_files/parameters/FeW_MO_737567242631_000.eam.alloy.yaml (100%) rename {aiida_lammps/tests => tests}/input_files/parameters/Fe_MO_137964310702_004.tersoff.yaml (100%) rename {aiida_lammps/tests => tests}/input_files/parameters/Fe_MO_331285495617_004.morse.yaml (100%) rename {aiida_lammps/tests => tests}/input_files/parameters/Fe_MO_492310898779_001.meam.yaml (100%) rename {aiida_lammps/tests => tests}/input_files/parsers/aiida_lammps.yaml (100%) rename {aiida_lammps/tests => tests}/input_files/parsers/log.lammps (100%) rename {aiida_lammps/tests => tests}/input_files/potentials/FeCrOSCH.reaxff (100%) rename {aiida_lammps/tests => tests}/input_files/potentials/FeW_MO_737567242631_000.eam.alloy (100%) rename {aiida_lammps/tests => tests}/input_files/potentials/Fe_MO_137964310702_004.tersoff (100%) rename {aiida_lammps/tests => tests}/input_files/potentials/Fe_MO_331285495617_004.morse (100%) rename {aiida_lammps/tests => tests}/input_files/potentials/Fe_MO_492310898779_001.meam (100%) rename {aiida_lammps/tests => tests}/input_files/potentials/Fe_mm.eam.fs (100%) rename {aiida_lammps/tests => tests}/input_files/potentials/cho.reaxff (100%) rename {aiida_lammps/tests => tests}/input_files/trajectory.lammpstrj (100%) rename {aiida_lammps/tests => tests}/test_calculations.py (99%) rename {aiida_lammps/tests => tests}/test_calculations/test_force_process_eam_.yml (100%) rename {aiida_lammps/tests => tests}/test_calculations/test_force_process_lennard_jones_.yml (100%) rename {aiida_lammps/tests => tests}/test_calculations/test_force_process_reaxff_.yml (100%) rename {aiida_lammps/tests => tests}/test_calculations/test_force_process_tersoff_.yml (100%) rename {aiida_lammps/tests => tests}/test_calculations/test_input_creation_eam_lammps_md_.txt (100%) rename {aiida_lammps/tests => tests}/test_calculations/test_input_creation_lennard_jones_lammps_force_.txt (100%) rename {aiida_lammps/tests => tests}/test_calculations/test_input_creation_reaxff_lammps_md_.txt (100%) rename {aiida_lammps/tests => tests}/test_calculations/test_input_creation_reaxff_lammps_md_multi_.txt (100%) rename {aiida_lammps/tests => tests}/test_calculations/test_input_creation_tersoff_lammps_optimize_.txt (100%) rename {aiida_lammps/tests => tests}/test_calculations/test_md_multi_process_eam_.yml (100%) rename {aiida_lammps/tests => tests}/test_calculations/test_md_multi_process_lennard_jones_.yml (100%) rename {aiida_lammps/tests => tests}/test_calculations/test_md_multi_process_reaxff_.yml (100%) rename {aiida_lammps/tests => tests}/test_calculations/test_md_multi_process_tersoff_.yml (100%) rename {aiida_lammps/tests => tests}/test_calculations/test_md_process-eam-2019.yml (100%) rename {aiida_lammps/tests => tests}/test_calculations/test_md_process-eam-2020.yml (100%) create mode 100644 tests/test_calculations/test_md_process-eam-2021.yml rename {aiida_lammps/tests => tests}/test_calculations/test_md_process-lennard-jones-2019.yml (100%) rename {aiida_lammps/tests => tests}/test_calculations/test_md_process-lennard-jones-2020.yml (100%) create mode 100644 tests/test_calculations/test_md_process-lennard-jones-2021.yml rename {aiida_lammps/tests => tests}/test_calculations/test_md_process-tersoff-2019.yml (100%) rename {aiida_lammps/tests => tests}/test_calculations/test_md_process-tersoff-2020.yml (100%) create mode 100644 tests/test_calculations/test_md_process-tersoff-2021.yml rename {aiida_lammps/tests => tests}/test_calculations/test_optimize_process_eam_.yml (100%) rename {aiida_lammps/tests => tests}/test_calculations/test_optimize_process_lennard_jones_.yml (100%) rename {aiida_lammps/tests => tests}/test_calculations/test_optimize_process_reaxff_.yml (100%) rename {aiida_lammps/tests => tests}/test_calculations/test_optimize_process_tersoff_.yml (100%) rename {aiida_lammps/tests => tests}/test_generate_inputs.py (98%) rename {aiida_lammps/tests => tests}/test_generate_inputs/md.yaml (100%) rename {aiida_lammps/tests => tests}/test_generate_inputs/parameters_md.yaml (100%) rename {aiida_lammps/tests => tests}/test_generate_inputs/parameters_minimize.yaml (100%) rename {aiida_lammps/tests => tests}/test_generate_inputs/test_generate_input_eam_alloy_md.txt (100%) rename {aiida_lammps/tests => tests}/test_generate_inputs/test_generate_input_eam_alloy_minimize.txt (100%) rename {aiida_lammps/tests => tests}/test_generate_structure.py (100%) rename {aiida_lammps/tests => tests}/test_generate_structure/test_generate_Fe_.txt (100%) rename {aiida_lammps/tests => tests}/test_generate_structure/test_generate_fes_cubic_zincblende_.txt (100%) rename {aiida_lammps/tests => tests}/test_generate_structure/test_generate_greigite_.txt (100%) rename {aiida_lammps/tests => tests}/test_generate_structure/test_generate_pyrite_.txt (100%) rename {aiida_lammps/tests => tests}/test_lammps_potential_data/test_init_eam_alloy.yaml (100%) rename {aiida_lammps/tests => tests}/test_lammps_potential_data/test_init_eam_alloy_block.txt (100%) rename {aiida_lammps/tests => tests}/test_lammps_potential_data/test_init_meam.yaml (100%) rename {aiida_lammps/tests => tests}/test_lammps_potential_data/test_init_meam_block.txt (100%) rename {aiida_lammps/tests => tests}/test_lammps_potential_data/test_init_morse.yaml (100%) rename {aiida_lammps/tests => tests}/test_lammps_potential_data/test_init_morse_block.txt (100%) rename {aiida_lammps/tests => tests}/test_lammps_potential_data/test_init_tersoff.yaml (100%) rename {aiida_lammps/tests => tests}/test_lammps_potential_data/test_init_tersoff_block.txt (100%) rename {aiida_lammps/tests => tests}/test_parsers.py (99%) rename {aiida_lammps/tests => tests}/test_potential_data.py (99%) rename {aiida_lammps/tests => tests}/test_potential_data/test_init.yml (100%) rename {aiida_lammps/tests => tests}/test_potential_data/test_init_eam_.yml (100%) rename {aiida_lammps/tests => tests}/test_potential_data/test_init_lennard_jones_.yml (100%) rename {aiida_lammps/tests => tests}/test_potential_data/test_init_reaxff_.yml (100%) rename {aiida_lammps/tests => tests}/test_potential_data/test_init_tersoff_.yml (100%) rename {aiida_lammps/tests => tests}/test_potential_data/test_input_lines_eam_.txt (100%) rename {aiida_lammps/tests => tests}/test_potential_data/test_input_lines_lennard_jones_.txt (100%) rename {aiida_lammps/tests => tests}/test_potential_data/test_input_lines_reaxff_.txt (100%) rename {aiida_lammps/tests => tests}/test_potential_data/test_input_lines_tersoff_.txt (100%) rename {aiida_lammps/tests => tests}/test_potential_data/test_potential_files_tersoff_.txt (100%) rename {aiida_lammps/tests => tests}/test_raw_parsers/test_parse_log.yaml (100%) rename {aiida_lammps/tests => tests}/test_raw_parsers/test_parse_trajectory_file.yml (100%) rename {aiida_lammps/tests => tests}/test_reaxff_parse.py (100%) rename {aiida_lammps/tests => tests}/test_reaxff_parse/test_read_lammps_format.yml (100%) rename {aiida_lammps/tests => tests}/test_reaxff_parse/test_read_lammps_format2.yml (100%) rename {aiida_lammps/tests => tests}/test_reaxff_parse/test_round_trip_lammps_format.txt (100%) rename {aiida_lammps/tests => tests}/test_reaxff_parse/test_round_trip_lammps_format2.txt (100%) rename {aiida_lammps/tests => tests}/test_trajectory.py (98%) rename {aiida_lammps/tests => tests}/test_trajectory/test_create_structure.yml (100%) rename {aiida_lammps/tests => tests}/test_trajectory/test_iter_trajectories.yml (100%) rename {aiida_lammps/tests => tests}/test_trajectory/test_lammps_trajectory_data.yml (100%) rename {aiida_lammps/tests => tests}/test_trajectory/test_lammpstraj_get_step_string.txt (100%) rename {aiida_lammps/tests => tests}/test_trajectory/test_lammpstraj_get_step_struct.yml (100%) create mode 100644 tests/utils.py diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 4416862..37dcb8c 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -3,8 +3,8 @@ exclude: > (?x)^( - aiida_lammps/tests/input_files/.*| - aiida_lammps/tests/.*txt + tests/input_files/.*| + tests/.*txt )$ repos: diff --git a/.readthedocs.yml b/.readthedocs.yml index 1863741..0d0b035 100644 --- a/.readthedocs.yml +++ b/.readthedocs.yml @@ -1,7 +1,7 @@ version: 2 python: - version: 3 + version: "3.8" install: - method: pip path: . diff --git a/MANIFEST.in b/MANIFEST.in index 6f2e1f5..2283504 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -2,3 +2,4 @@ include LICENSE include setup.json include aiida_lammps/tests/input_files/* include aiida_lammps/validation/schemas/*.json +include aiida_lammps/data/* diff --git a/README.md b/README.md index c9a060f..0ad3c67 100644 --- a/README.md +++ b/README.md @@ -49,9 +49,9 @@ and there are many test examples in **/aiida_lammps/tests/test_calculations**. ### Code Setup ```python -from aiida_lammps.tests.utils import ( +from tests.utils import ( get_or_create_local_computer, get_or_create_code) -from aiida_lammps.tests.utils import lammps_version +from tests.utils import lammps_version computer_local = get_or_create_local_computer('work_directory', 'localhost') code_lammps_force = get_or_create_code('lammps.force', computer_local, 'lammps') diff --git a/conftest.py b/conftest.py index f4decb4..6bec99e 100644 --- a/conftest.py +++ b/conftest.py @@ -1,7 +1,6 @@ """ initialise a test database and profile """ -# pylint: disable=fixme, redefined-outer-name from collections import namedtuple import io import os @@ -14,7 +13,7 @@ import yaml from aiida_lammps.common.reaxff_convert import filter_by_species, read_lammps_format -from aiida_lammps.tests.utils import TEST_DIR, AiidaTestApp +from tests.utils import TEST_DIR, AiidaTestApp pytest_plugins = ["aiida.manage.tests.pytest_fixtures"] @@ -355,14 +354,14 @@ def _get_lammps_potential_data(pkey): output_dict = {} if pkey == "eam_alloy": output_dict["filename"] = os.path.join( - "aiida_lammps/tests", + "tests", "input_files", "potentials", "FeW_MO_737567242631_000.eam.alloy", ) filename_parameters = os.path.join( - "aiida_lammps/tests", + "tests", "input_files", "parameters", "FeW_MO_737567242631_000.eam.alloy.yaml", @@ -377,14 +376,14 @@ def _get_lammps_potential_data(pkey): if pkey == "tersoff": output_dict["filename"] = os.path.join( - "aiida_lammps/tests", + "tests", "input_files", "potentials", "Fe_MO_137964310702_004.tersoff", ) filename_parameters = os.path.join( - "aiida_lammps/tests", + "tests", "input_files", "parameters", "Fe_MO_137964310702_004.tersoff.yaml", @@ -399,14 +398,14 @@ def _get_lammps_potential_data(pkey): if pkey == "meam": output_dict["filename"] = os.path.join( - "aiida_lammps/tests", + "tests", "input_files", "potentials", "Fe_MO_492310898779_001.meam", ) filename_parameters = os.path.join( - "aiida_lammps/tests", + "tests", "input_files", "parameters", "Fe_MO_492310898779_001.meam.yaml", @@ -421,14 +420,14 @@ def _get_lammps_potential_data(pkey): if pkey == "morse": output_dict["filename"] = os.path.join( - "aiida_lammps/tests", + "tests", "input_files", "potentials", "Fe_MO_331285495617_004.morse", ) filename_parameters = os.path.join( - "aiida_lammps/tests", + "tests", "input_files", "parameters", "Fe_MO_331285495617_004.morse.yaml", diff --git a/docs/source/conf.py b/docs/source/conf.py index 4c6c22a..a02d435 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -31,19 +31,8 @@ "sphinx_external_toc", "sphinx.ext.intersphinx", "sphinx.ext.autodoc", - "sphinx.ext.doctest", "sphinx.ext.viewcode", - "sphinx.ext.coverage", - "sphinx.ext.mathjax", - "sphinx.ext.ifconfig", - "sphinx.ext.todo", - "IPython.sphinxext.ipython_console_highlighting", - "IPython.sphinxext.ipython_directive", - "aiida.sphinxext", - "sphinx_panels", "sphinx_copybutton", - "sphinxext.rediraffe", - "notfound.extension", ] intersphinx_mapping = { @@ -123,6 +112,7 @@ def setup(app): # We should ignore any python built-in exception, for instance # Warnings to ignore when using the -n (nitpicky) option +nitpicky = True with open("nitpick-exceptions", "r") as handle: nitpick_ignore = [ tuple(line.strip().split(None, 1)) diff --git a/setup.json b/setup.json index fda770b..1e3fdf4 100644 --- a/setup.json +++ b/setup.json @@ -73,6 +73,7 @@ "docs": [ "myst-parser~=0.15.0", "sphinx-external-toc", + "sphinx-copybutton", "furo" ] } diff --git a/aiida_lammps/tests/__init__.py b/tests/__init__.py similarity index 100% rename from aiida_lammps/tests/__init__.py rename to tests/__init__.py diff --git a/aiida_lammps/tests/input_files/__init__.py b/tests/input_files/__init__.py similarity index 100% rename from aiida_lammps/tests/input_files/__init__.py rename to tests/input_files/__init__.py diff --git a/aiida_lammps/tests/input_files/parameters/FeW_MO_737567242631_000.eam.alloy.yaml b/tests/input_files/parameters/FeW_MO_737567242631_000.eam.alloy.yaml similarity index 100% rename from aiida_lammps/tests/input_files/parameters/FeW_MO_737567242631_000.eam.alloy.yaml rename to tests/input_files/parameters/FeW_MO_737567242631_000.eam.alloy.yaml diff --git a/aiida_lammps/tests/input_files/parameters/Fe_MO_137964310702_004.tersoff.yaml b/tests/input_files/parameters/Fe_MO_137964310702_004.tersoff.yaml similarity index 100% rename from aiida_lammps/tests/input_files/parameters/Fe_MO_137964310702_004.tersoff.yaml rename to tests/input_files/parameters/Fe_MO_137964310702_004.tersoff.yaml diff --git a/aiida_lammps/tests/input_files/parameters/Fe_MO_331285495617_004.morse.yaml b/tests/input_files/parameters/Fe_MO_331285495617_004.morse.yaml similarity index 100% rename from aiida_lammps/tests/input_files/parameters/Fe_MO_331285495617_004.morse.yaml rename to tests/input_files/parameters/Fe_MO_331285495617_004.morse.yaml diff --git a/aiida_lammps/tests/input_files/parameters/Fe_MO_492310898779_001.meam.yaml b/tests/input_files/parameters/Fe_MO_492310898779_001.meam.yaml similarity index 100% rename from aiida_lammps/tests/input_files/parameters/Fe_MO_492310898779_001.meam.yaml rename to tests/input_files/parameters/Fe_MO_492310898779_001.meam.yaml diff --git a/aiida_lammps/tests/input_files/parsers/aiida_lammps.yaml b/tests/input_files/parsers/aiida_lammps.yaml similarity index 100% rename from aiida_lammps/tests/input_files/parsers/aiida_lammps.yaml rename to tests/input_files/parsers/aiida_lammps.yaml diff --git a/aiida_lammps/tests/input_files/parsers/log.lammps b/tests/input_files/parsers/log.lammps similarity index 100% rename from aiida_lammps/tests/input_files/parsers/log.lammps rename to tests/input_files/parsers/log.lammps diff --git a/aiida_lammps/tests/input_files/potentials/FeCrOSCH.reaxff b/tests/input_files/potentials/FeCrOSCH.reaxff similarity index 100% rename from aiida_lammps/tests/input_files/potentials/FeCrOSCH.reaxff rename to tests/input_files/potentials/FeCrOSCH.reaxff diff --git a/aiida_lammps/tests/input_files/potentials/FeW_MO_737567242631_000.eam.alloy b/tests/input_files/potentials/FeW_MO_737567242631_000.eam.alloy similarity index 100% rename from aiida_lammps/tests/input_files/potentials/FeW_MO_737567242631_000.eam.alloy rename to tests/input_files/potentials/FeW_MO_737567242631_000.eam.alloy diff --git a/aiida_lammps/tests/input_files/potentials/Fe_MO_137964310702_004.tersoff b/tests/input_files/potentials/Fe_MO_137964310702_004.tersoff similarity index 100% rename from aiida_lammps/tests/input_files/potentials/Fe_MO_137964310702_004.tersoff rename to tests/input_files/potentials/Fe_MO_137964310702_004.tersoff diff --git a/aiida_lammps/tests/input_files/potentials/Fe_MO_331285495617_004.morse b/tests/input_files/potentials/Fe_MO_331285495617_004.morse similarity index 100% rename from aiida_lammps/tests/input_files/potentials/Fe_MO_331285495617_004.morse rename to tests/input_files/potentials/Fe_MO_331285495617_004.morse diff --git a/aiida_lammps/tests/input_files/potentials/Fe_MO_492310898779_001.meam b/tests/input_files/potentials/Fe_MO_492310898779_001.meam similarity index 100% rename from aiida_lammps/tests/input_files/potentials/Fe_MO_492310898779_001.meam rename to tests/input_files/potentials/Fe_MO_492310898779_001.meam diff --git a/aiida_lammps/tests/input_files/potentials/Fe_mm.eam.fs b/tests/input_files/potentials/Fe_mm.eam.fs similarity index 100% rename from aiida_lammps/tests/input_files/potentials/Fe_mm.eam.fs rename to tests/input_files/potentials/Fe_mm.eam.fs diff --git a/aiida_lammps/tests/input_files/potentials/cho.reaxff b/tests/input_files/potentials/cho.reaxff similarity index 100% rename from aiida_lammps/tests/input_files/potentials/cho.reaxff rename to tests/input_files/potentials/cho.reaxff diff --git a/aiida_lammps/tests/input_files/trajectory.lammpstrj b/tests/input_files/trajectory.lammpstrj similarity index 100% rename from aiida_lammps/tests/input_files/trajectory.lammpstrj rename to tests/input_files/trajectory.lammpstrj diff --git a/aiida_lammps/tests/test_calculations.py b/tests/test_calculations.py similarity index 99% rename from aiida_lammps/tests/test_calculations.py rename to tests/test_calculations.py index af86807..6e3d5f8 100644 --- a/aiida_lammps/tests/test_calculations.py +++ b/tests/test_calculations.py @@ -5,7 +5,7 @@ from aiida.plugins import CalculationFactory, DataFactory import pytest -import aiida_lammps.tests.utils as tests +from . import utils as tests def get_lammps_version(code): diff --git a/aiida_lammps/tests/test_calculations/test_force_process_eam_.yml b/tests/test_calculations/test_force_process_eam_.yml similarity index 100% rename from aiida_lammps/tests/test_calculations/test_force_process_eam_.yml rename to tests/test_calculations/test_force_process_eam_.yml diff --git a/aiida_lammps/tests/test_calculations/test_force_process_lennard_jones_.yml b/tests/test_calculations/test_force_process_lennard_jones_.yml similarity index 100% rename from aiida_lammps/tests/test_calculations/test_force_process_lennard_jones_.yml rename to tests/test_calculations/test_force_process_lennard_jones_.yml diff --git a/aiida_lammps/tests/test_calculations/test_force_process_reaxff_.yml b/tests/test_calculations/test_force_process_reaxff_.yml similarity index 100% rename from aiida_lammps/tests/test_calculations/test_force_process_reaxff_.yml rename to tests/test_calculations/test_force_process_reaxff_.yml diff --git a/aiida_lammps/tests/test_calculations/test_force_process_tersoff_.yml b/tests/test_calculations/test_force_process_tersoff_.yml similarity index 100% rename from aiida_lammps/tests/test_calculations/test_force_process_tersoff_.yml rename to tests/test_calculations/test_force_process_tersoff_.yml diff --git a/aiida_lammps/tests/test_calculations/test_input_creation_eam_lammps_md_.txt b/tests/test_calculations/test_input_creation_eam_lammps_md_.txt similarity index 100% rename from aiida_lammps/tests/test_calculations/test_input_creation_eam_lammps_md_.txt rename to tests/test_calculations/test_input_creation_eam_lammps_md_.txt diff --git a/aiida_lammps/tests/test_calculations/test_input_creation_lennard_jones_lammps_force_.txt b/tests/test_calculations/test_input_creation_lennard_jones_lammps_force_.txt similarity index 100% rename from aiida_lammps/tests/test_calculations/test_input_creation_lennard_jones_lammps_force_.txt rename to tests/test_calculations/test_input_creation_lennard_jones_lammps_force_.txt diff --git a/aiida_lammps/tests/test_calculations/test_input_creation_reaxff_lammps_md_.txt b/tests/test_calculations/test_input_creation_reaxff_lammps_md_.txt similarity index 100% rename from aiida_lammps/tests/test_calculations/test_input_creation_reaxff_lammps_md_.txt rename to tests/test_calculations/test_input_creation_reaxff_lammps_md_.txt diff --git a/aiida_lammps/tests/test_calculations/test_input_creation_reaxff_lammps_md_multi_.txt b/tests/test_calculations/test_input_creation_reaxff_lammps_md_multi_.txt similarity index 100% rename from aiida_lammps/tests/test_calculations/test_input_creation_reaxff_lammps_md_multi_.txt rename to tests/test_calculations/test_input_creation_reaxff_lammps_md_multi_.txt diff --git a/aiida_lammps/tests/test_calculations/test_input_creation_tersoff_lammps_optimize_.txt b/tests/test_calculations/test_input_creation_tersoff_lammps_optimize_.txt similarity index 100% rename from aiida_lammps/tests/test_calculations/test_input_creation_tersoff_lammps_optimize_.txt rename to tests/test_calculations/test_input_creation_tersoff_lammps_optimize_.txt diff --git a/aiida_lammps/tests/test_calculations/test_md_multi_process_eam_.yml b/tests/test_calculations/test_md_multi_process_eam_.yml similarity index 100% rename from aiida_lammps/tests/test_calculations/test_md_multi_process_eam_.yml rename to tests/test_calculations/test_md_multi_process_eam_.yml diff --git a/aiida_lammps/tests/test_calculations/test_md_multi_process_lennard_jones_.yml b/tests/test_calculations/test_md_multi_process_lennard_jones_.yml similarity index 100% rename from aiida_lammps/tests/test_calculations/test_md_multi_process_lennard_jones_.yml rename to tests/test_calculations/test_md_multi_process_lennard_jones_.yml diff --git a/aiida_lammps/tests/test_calculations/test_md_multi_process_reaxff_.yml b/tests/test_calculations/test_md_multi_process_reaxff_.yml similarity index 100% rename from aiida_lammps/tests/test_calculations/test_md_multi_process_reaxff_.yml rename to tests/test_calculations/test_md_multi_process_reaxff_.yml diff --git a/aiida_lammps/tests/test_calculations/test_md_multi_process_tersoff_.yml b/tests/test_calculations/test_md_multi_process_tersoff_.yml similarity index 100% rename from aiida_lammps/tests/test_calculations/test_md_multi_process_tersoff_.yml rename to tests/test_calculations/test_md_multi_process_tersoff_.yml diff --git a/aiida_lammps/tests/test_calculations/test_md_process-eam-2019.yml b/tests/test_calculations/test_md_process-eam-2019.yml similarity index 100% rename from aiida_lammps/tests/test_calculations/test_md_process-eam-2019.yml rename to tests/test_calculations/test_md_process-eam-2019.yml diff --git a/aiida_lammps/tests/test_calculations/test_md_process-eam-2020.yml b/tests/test_calculations/test_md_process-eam-2020.yml similarity index 100% rename from aiida_lammps/tests/test_calculations/test_md_process-eam-2020.yml rename to tests/test_calculations/test_md_process-eam-2020.yml diff --git a/tests/test_calculations/test_md_process-eam-2021.yml b/tests/test_calculations/test_md_process-eam-2021.yml new file mode 100644 index 0000000..8ee9b9c --- /dev/null +++ b/tests/test_calculations/test_md_process-eam-2021.yml @@ -0,0 +1,32 @@ +results: + distance_units: Angstroms + energy: -8.1 + energy_units: eV + errors: [] + parser_class: MdParser + time_units: picoseconds + timestep_picoseconds: 0.001 + units_style: metal +system_data: + array|etotal: + - 101 + array|step: + - 101 + array|temp: + - 101 + units_style: metal +trajectory_data: + aliases: null + compression_method: 8 + elements: + - Fe + field_names: + - element + - x + - y + - z + number_atoms: 2 + number_steps: 101 + timestep_filename: timesteps.txt + trajectory_filename: trajectory.zip + zip_prefix: step- diff --git a/aiida_lammps/tests/test_calculations/test_md_process-lennard-jones-2019.yml b/tests/test_calculations/test_md_process-lennard-jones-2019.yml similarity index 100% rename from aiida_lammps/tests/test_calculations/test_md_process-lennard-jones-2019.yml rename to tests/test_calculations/test_md_process-lennard-jones-2019.yml diff --git a/aiida_lammps/tests/test_calculations/test_md_process-lennard-jones-2020.yml b/tests/test_calculations/test_md_process-lennard-jones-2020.yml similarity index 100% rename from aiida_lammps/tests/test_calculations/test_md_process-lennard-jones-2020.yml rename to tests/test_calculations/test_md_process-lennard-jones-2020.yml diff --git a/tests/test_calculations/test_md_process-lennard-jones-2021.yml b/tests/test_calculations/test_md_process-lennard-jones-2021.yml new file mode 100644 index 0000000..d84dfc4 --- /dev/null +++ b/tests/test_calculations/test_md_process-lennard-jones-2021.yml @@ -0,0 +1,32 @@ +results: + distance_units: Angstroms + energy: 0.1 + energy_units: eV + errors: [] + parser_class: MdParser + time_units: picoseconds + timestep_picoseconds: 0.001 + units_style: metal +system_data: + array|etotal: + - 101 + array|step: + - 101 + array|temp: + - 101 + units_style: metal +trajectory_data: + aliases: null + compression_method: 8 + elements: + - Ar + field_names: + - element + - x + - y + - z + number_atoms: 2 + number_steps: 101 + timestep_filename: timesteps.txt + trajectory_filename: trajectory.zip + zip_prefix: step- diff --git a/aiida_lammps/tests/test_calculations/test_md_process-tersoff-2019.yml b/tests/test_calculations/test_md_process-tersoff-2019.yml similarity index 100% rename from aiida_lammps/tests/test_calculations/test_md_process-tersoff-2019.yml rename to tests/test_calculations/test_md_process-tersoff-2019.yml diff --git a/aiida_lammps/tests/test_calculations/test_md_process-tersoff-2020.yml b/tests/test_calculations/test_md_process-tersoff-2020.yml similarity index 100% rename from aiida_lammps/tests/test_calculations/test_md_process-tersoff-2020.yml rename to tests/test_calculations/test_md_process-tersoff-2020.yml diff --git a/tests/test_calculations/test_md_process-tersoff-2021.yml b/tests/test_calculations/test_md_process-tersoff-2021.yml new file mode 100644 index 0000000..e1abc5e --- /dev/null +++ b/tests/test_calculations/test_md_process-tersoff-2021.yml @@ -0,0 +1,33 @@ +results: + distance_units: Angstroms + energy: -17.8 + energy_units: eV + errors: [] + parser_class: MdParser + time_units: picoseconds + timestep_picoseconds: 0.001 + units_style: metal +system_data: + array|etotal: + - 101 + array|step: + - 101 + array|temp: + - 101 + units_style: metal +trajectory_data: + aliases: null + compression_method: 8 + elements: + - Ga + - N + field_names: + - element + - x + - y + - z + number_atoms: 4 + number_steps: 101 + timestep_filename: timesteps.txt + trajectory_filename: trajectory.zip + zip_prefix: step- diff --git a/aiida_lammps/tests/test_calculations/test_optimize_process_eam_.yml b/tests/test_calculations/test_optimize_process_eam_.yml similarity index 100% rename from aiida_lammps/tests/test_calculations/test_optimize_process_eam_.yml rename to tests/test_calculations/test_optimize_process_eam_.yml diff --git a/aiida_lammps/tests/test_calculations/test_optimize_process_lennard_jones_.yml b/tests/test_calculations/test_optimize_process_lennard_jones_.yml similarity index 100% rename from aiida_lammps/tests/test_calculations/test_optimize_process_lennard_jones_.yml rename to tests/test_calculations/test_optimize_process_lennard_jones_.yml diff --git a/aiida_lammps/tests/test_calculations/test_optimize_process_reaxff_.yml b/tests/test_calculations/test_optimize_process_reaxff_.yml similarity index 100% rename from aiida_lammps/tests/test_calculations/test_optimize_process_reaxff_.yml rename to tests/test_calculations/test_optimize_process_reaxff_.yml diff --git a/aiida_lammps/tests/test_calculations/test_optimize_process_tersoff_.yml b/tests/test_calculations/test_optimize_process_tersoff_.yml similarity index 100% rename from aiida_lammps/tests/test_calculations/test_optimize_process_tersoff_.yml rename to tests/test_calculations/test_optimize_process_tersoff_.yml diff --git a/aiida_lammps/tests/test_generate_inputs.py b/tests/test_generate_inputs.py similarity index 98% rename from aiida_lammps/tests/test_generate_inputs.py rename to tests/test_generate_inputs.py index 6d8139b..8584b05 100644 --- a/aiida_lammps/tests/test_generate_inputs.py +++ b/tests/test_generate_inputs.py @@ -8,7 +8,7 @@ from aiida_lammps.common import input_generator from aiida_lammps.data.lammps_potential import LammpsPotentialData -from aiida_lammps.tests.utils import TEST_DIR +from .utils import TEST_DIR @pytest.mark.parametrize( diff --git a/aiida_lammps/tests/test_generate_inputs/md.yaml b/tests/test_generate_inputs/md.yaml similarity index 100% rename from aiida_lammps/tests/test_generate_inputs/md.yaml rename to tests/test_generate_inputs/md.yaml diff --git a/aiida_lammps/tests/test_generate_inputs/parameters_md.yaml b/tests/test_generate_inputs/parameters_md.yaml similarity index 100% rename from aiida_lammps/tests/test_generate_inputs/parameters_md.yaml rename to tests/test_generate_inputs/parameters_md.yaml diff --git a/aiida_lammps/tests/test_generate_inputs/parameters_minimize.yaml b/tests/test_generate_inputs/parameters_minimize.yaml similarity index 100% rename from aiida_lammps/tests/test_generate_inputs/parameters_minimize.yaml rename to tests/test_generate_inputs/parameters_minimize.yaml diff --git a/aiida_lammps/tests/test_generate_inputs/test_generate_input_eam_alloy_md.txt b/tests/test_generate_inputs/test_generate_input_eam_alloy_md.txt similarity index 100% rename from aiida_lammps/tests/test_generate_inputs/test_generate_input_eam_alloy_md.txt rename to tests/test_generate_inputs/test_generate_input_eam_alloy_md.txt diff --git a/aiida_lammps/tests/test_generate_inputs/test_generate_input_eam_alloy_minimize.txt b/tests/test_generate_inputs/test_generate_input_eam_alloy_minimize.txt similarity index 100% rename from aiida_lammps/tests/test_generate_inputs/test_generate_input_eam_alloy_minimize.txt rename to tests/test_generate_inputs/test_generate_input_eam_alloy_minimize.txt diff --git a/aiida_lammps/tests/test_generate_structure.py b/tests/test_generate_structure.py similarity index 100% rename from aiida_lammps/tests/test_generate_structure.py rename to tests/test_generate_structure.py diff --git a/aiida_lammps/tests/test_generate_structure/test_generate_Fe_.txt b/tests/test_generate_structure/test_generate_Fe_.txt similarity index 100% rename from aiida_lammps/tests/test_generate_structure/test_generate_Fe_.txt rename to tests/test_generate_structure/test_generate_Fe_.txt diff --git a/aiida_lammps/tests/test_generate_structure/test_generate_fes_cubic_zincblende_.txt b/tests/test_generate_structure/test_generate_fes_cubic_zincblende_.txt similarity index 100% rename from aiida_lammps/tests/test_generate_structure/test_generate_fes_cubic_zincblende_.txt rename to tests/test_generate_structure/test_generate_fes_cubic_zincblende_.txt diff --git a/aiida_lammps/tests/test_generate_structure/test_generate_greigite_.txt b/tests/test_generate_structure/test_generate_greigite_.txt similarity index 100% rename from aiida_lammps/tests/test_generate_structure/test_generate_greigite_.txt rename to tests/test_generate_structure/test_generate_greigite_.txt diff --git a/aiida_lammps/tests/test_generate_structure/test_generate_pyrite_.txt b/tests/test_generate_structure/test_generate_pyrite_.txt similarity index 100% rename from aiida_lammps/tests/test_generate_structure/test_generate_pyrite_.txt rename to tests/test_generate_structure/test_generate_pyrite_.txt diff --git a/aiida_lammps/tests/test_lammps_potential_data/test_init_eam_alloy.yaml b/tests/test_lammps_potential_data/test_init_eam_alloy.yaml similarity index 100% rename from aiida_lammps/tests/test_lammps_potential_data/test_init_eam_alloy.yaml rename to tests/test_lammps_potential_data/test_init_eam_alloy.yaml diff --git a/aiida_lammps/tests/test_lammps_potential_data/test_init_eam_alloy_block.txt b/tests/test_lammps_potential_data/test_init_eam_alloy_block.txt similarity index 100% rename from aiida_lammps/tests/test_lammps_potential_data/test_init_eam_alloy_block.txt rename to tests/test_lammps_potential_data/test_init_eam_alloy_block.txt diff --git a/aiida_lammps/tests/test_lammps_potential_data/test_init_meam.yaml b/tests/test_lammps_potential_data/test_init_meam.yaml similarity index 100% rename from aiida_lammps/tests/test_lammps_potential_data/test_init_meam.yaml rename to tests/test_lammps_potential_data/test_init_meam.yaml diff --git a/aiida_lammps/tests/test_lammps_potential_data/test_init_meam_block.txt b/tests/test_lammps_potential_data/test_init_meam_block.txt similarity index 100% rename from aiida_lammps/tests/test_lammps_potential_data/test_init_meam_block.txt rename to tests/test_lammps_potential_data/test_init_meam_block.txt diff --git a/aiida_lammps/tests/test_lammps_potential_data/test_init_morse.yaml b/tests/test_lammps_potential_data/test_init_morse.yaml similarity index 100% rename from aiida_lammps/tests/test_lammps_potential_data/test_init_morse.yaml rename to tests/test_lammps_potential_data/test_init_morse.yaml diff --git a/aiida_lammps/tests/test_lammps_potential_data/test_init_morse_block.txt b/tests/test_lammps_potential_data/test_init_morse_block.txt similarity index 100% rename from aiida_lammps/tests/test_lammps_potential_data/test_init_morse_block.txt rename to tests/test_lammps_potential_data/test_init_morse_block.txt diff --git a/aiida_lammps/tests/test_lammps_potential_data/test_init_tersoff.yaml b/tests/test_lammps_potential_data/test_init_tersoff.yaml similarity index 100% rename from aiida_lammps/tests/test_lammps_potential_data/test_init_tersoff.yaml rename to tests/test_lammps_potential_data/test_init_tersoff.yaml diff --git a/aiida_lammps/tests/test_lammps_potential_data/test_init_tersoff_block.txt b/tests/test_lammps_potential_data/test_init_tersoff_block.txt similarity index 100% rename from aiida_lammps/tests/test_lammps_potential_data/test_init_tersoff_block.txt rename to tests/test_lammps_potential_data/test_init_tersoff_block.txt diff --git a/aiida_lammps/tests/test_parsers.py b/tests/test_parsers.py similarity index 99% rename from aiida_lammps/tests/test_parsers.py rename to tests/test_parsers.py index e0e7fde..b97c42c 100644 --- a/aiida_lammps/tests/test_parsers.py +++ b/tests/test_parsers.py @@ -12,7 +12,7 @@ import yaml from aiida_lammps.common.raw_parsers import parse_final_data, parse_logfile -from aiida_lammps.tests.utils import TEST_DIR +from .utils import TEST_DIR def get_log(): diff --git a/aiida_lammps/tests/test_potential_data.py b/tests/test_potential_data.py similarity index 99% rename from aiida_lammps/tests/test_potential_data.py rename to tests/test_potential_data.py index dc210a9..98bbf71 100644 --- a/aiida_lammps/tests/test_potential_data.py +++ b/tests/test_potential_data.py @@ -9,7 +9,7 @@ from aiida_lammps.common import input_generator from aiida_lammps.data.lammps_potential import LammpsPotentialData from aiida_lammps.data.potential import EmpiricalPotential -from aiida_lammps.tests.utils import TEST_DIR +from .utils import TEST_DIR def test_list_potentials(): diff --git a/aiida_lammps/tests/test_potential_data/test_init.yml b/tests/test_potential_data/test_init.yml similarity index 100% rename from aiida_lammps/tests/test_potential_data/test_init.yml rename to tests/test_potential_data/test_init.yml diff --git a/aiida_lammps/tests/test_potential_data/test_init_eam_.yml b/tests/test_potential_data/test_init_eam_.yml similarity index 100% rename from aiida_lammps/tests/test_potential_data/test_init_eam_.yml rename to tests/test_potential_data/test_init_eam_.yml diff --git a/aiida_lammps/tests/test_potential_data/test_init_lennard_jones_.yml b/tests/test_potential_data/test_init_lennard_jones_.yml similarity index 100% rename from aiida_lammps/tests/test_potential_data/test_init_lennard_jones_.yml rename to tests/test_potential_data/test_init_lennard_jones_.yml diff --git a/aiida_lammps/tests/test_potential_data/test_init_reaxff_.yml b/tests/test_potential_data/test_init_reaxff_.yml similarity index 100% rename from aiida_lammps/tests/test_potential_data/test_init_reaxff_.yml rename to tests/test_potential_data/test_init_reaxff_.yml diff --git a/aiida_lammps/tests/test_potential_data/test_init_tersoff_.yml b/tests/test_potential_data/test_init_tersoff_.yml similarity index 100% rename from aiida_lammps/tests/test_potential_data/test_init_tersoff_.yml rename to tests/test_potential_data/test_init_tersoff_.yml diff --git a/aiida_lammps/tests/test_potential_data/test_input_lines_eam_.txt b/tests/test_potential_data/test_input_lines_eam_.txt similarity index 100% rename from aiida_lammps/tests/test_potential_data/test_input_lines_eam_.txt rename to tests/test_potential_data/test_input_lines_eam_.txt diff --git a/aiida_lammps/tests/test_potential_data/test_input_lines_lennard_jones_.txt b/tests/test_potential_data/test_input_lines_lennard_jones_.txt similarity index 100% rename from aiida_lammps/tests/test_potential_data/test_input_lines_lennard_jones_.txt rename to tests/test_potential_data/test_input_lines_lennard_jones_.txt diff --git a/aiida_lammps/tests/test_potential_data/test_input_lines_reaxff_.txt b/tests/test_potential_data/test_input_lines_reaxff_.txt similarity index 100% rename from aiida_lammps/tests/test_potential_data/test_input_lines_reaxff_.txt rename to tests/test_potential_data/test_input_lines_reaxff_.txt diff --git a/aiida_lammps/tests/test_potential_data/test_input_lines_tersoff_.txt b/tests/test_potential_data/test_input_lines_tersoff_.txt similarity index 100% rename from aiida_lammps/tests/test_potential_data/test_input_lines_tersoff_.txt rename to tests/test_potential_data/test_input_lines_tersoff_.txt diff --git a/aiida_lammps/tests/test_potential_data/test_potential_files_tersoff_.txt b/tests/test_potential_data/test_potential_files_tersoff_.txt similarity index 100% rename from aiida_lammps/tests/test_potential_data/test_potential_files_tersoff_.txt rename to tests/test_potential_data/test_potential_files_tersoff_.txt diff --git a/aiida_lammps/tests/test_raw_parsers/test_parse_log.yaml b/tests/test_raw_parsers/test_parse_log.yaml similarity index 100% rename from aiida_lammps/tests/test_raw_parsers/test_parse_log.yaml rename to tests/test_raw_parsers/test_parse_log.yaml diff --git a/aiida_lammps/tests/test_raw_parsers/test_parse_trajectory_file.yml b/tests/test_raw_parsers/test_parse_trajectory_file.yml similarity index 100% rename from aiida_lammps/tests/test_raw_parsers/test_parse_trajectory_file.yml rename to tests/test_raw_parsers/test_parse_trajectory_file.yml diff --git a/aiida_lammps/tests/test_reaxff_parse.py b/tests/test_reaxff_parse.py similarity index 100% rename from aiida_lammps/tests/test_reaxff_parse.py rename to tests/test_reaxff_parse.py diff --git a/aiida_lammps/tests/test_reaxff_parse/test_read_lammps_format.yml b/tests/test_reaxff_parse/test_read_lammps_format.yml similarity index 100% rename from aiida_lammps/tests/test_reaxff_parse/test_read_lammps_format.yml rename to tests/test_reaxff_parse/test_read_lammps_format.yml diff --git a/aiida_lammps/tests/test_reaxff_parse/test_read_lammps_format2.yml b/tests/test_reaxff_parse/test_read_lammps_format2.yml similarity index 100% rename from aiida_lammps/tests/test_reaxff_parse/test_read_lammps_format2.yml rename to tests/test_reaxff_parse/test_read_lammps_format2.yml diff --git a/aiida_lammps/tests/test_reaxff_parse/test_round_trip_lammps_format.txt b/tests/test_reaxff_parse/test_round_trip_lammps_format.txt similarity index 100% rename from aiida_lammps/tests/test_reaxff_parse/test_round_trip_lammps_format.txt rename to tests/test_reaxff_parse/test_round_trip_lammps_format.txt diff --git a/aiida_lammps/tests/test_reaxff_parse/test_round_trip_lammps_format2.txt b/tests/test_reaxff_parse/test_round_trip_lammps_format2.txt similarity index 100% rename from aiida_lammps/tests/test_reaxff_parse/test_round_trip_lammps_format2.txt rename to tests/test_reaxff_parse/test_round_trip_lammps_format2.txt diff --git a/aiida_lammps/tests/test_trajectory.py b/tests/test_trajectory.py similarity index 98% rename from aiida_lammps/tests/test_trajectory.py rename to tests/test_trajectory.py index cee8786..7c80a5a 100644 --- a/aiida_lammps/tests/test_trajectory.py +++ b/tests/test_trajectory.py @@ -4,7 +4,7 @@ from aiida_lammps.common.parse_trajectory import create_structure, iter_trajectories from aiida_lammps.data.trajectory import LammpsTrajectory -from aiida_lammps.tests.utils import TEST_DIR, recursive_round +from .utils import TEST_DIR, recursive_round def test_iter_trajectories(data_regression): diff --git a/aiida_lammps/tests/test_trajectory/test_create_structure.yml b/tests/test_trajectory/test_create_structure.yml similarity index 100% rename from aiida_lammps/tests/test_trajectory/test_create_structure.yml rename to tests/test_trajectory/test_create_structure.yml diff --git a/aiida_lammps/tests/test_trajectory/test_iter_trajectories.yml b/tests/test_trajectory/test_iter_trajectories.yml similarity index 100% rename from aiida_lammps/tests/test_trajectory/test_iter_trajectories.yml rename to tests/test_trajectory/test_iter_trajectories.yml diff --git a/aiida_lammps/tests/test_trajectory/test_lammps_trajectory_data.yml b/tests/test_trajectory/test_lammps_trajectory_data.yml similarity index 100% rename from aiida_lammps/tests/test_trajectory/test_lammps_trajectory_data.yml rename to tests/test_trajectory/test_lammps_trajectory_data.yml diff --git a/aiida_lammps/tests/test_trajectory/test_lammpstraj_get_step_string.txt b/tests/test_trajectory/test_lammpstraj_get_step_string.txt similarity index 100% rename from aiida_lammps/tests/test_trajectory/test_lammpstraj_get_step_string.txt rename to tests/test_trajectory/test_lammpstraj_get_step_string.txt diff --git a/aiida_lammps/tests/test_trajectory/test_lammpstraj_get_step_struct.yml b/tests/test_trajectory/test_lammpstraj_get_step_struct.yml similarity index 100% rename from aiida_lammps/tests/test_trajectory/test_lammpstraj_get_step_struct.yml rename to tests/test_trajectory/test_lammpstraj_get_step_struct.yml diff --git a/tests/utils.py b/tests/utils.py new file mode 100644 index 0000000..1eeefbb --- /dev/null +++ b/tests/utils.py @@ -0,0 +1,328 @@ +"""Set of functions to test the aiida-lammps functionality.""" +from collections.abc import Mapping +from contextlib import contextmanager +import distutils.spawn +import os +import re +import subprocess +import sys + +from aiida.common import NotExistent +from aiida.common.folders import SandboxFolder +from aiida.common.links import LinkType +from aiida.engine.utils import instantiate_process +from aiida.manage.manager import get_manager +from aiida.orm import CalcJobNode, Code, Computer +from aiida.plugins import CalculationFactory, DataFactory, ParserFactory +from aiida.plugins.entry_point import format_entry_point_string + +TEST_DIR = os.path.dirname(os.path.realpath(__file__)) + + +def lammps_version(executable="lammps"): + """Get the version of lammps. + + we assume `lammps -h` returns e.g. 'LAMMPS (10 Feb 2015)' or + 'Large-scale Atomic/Molecular Massively Parallel Simulator - 5 Jun 2019' + """ + out_text = subprocess.check_output([executable, "-h"]).decode("utf8") + match = re.search(r"LAMMPS \((.*)\)", out_text) + if match: + return match.group(1) + regex = re.compile( + r"^Large-scale Atomic/Molecular Massively Parallel Simulator - (.*)$", + re.MULTILINE, + ) + match = re.search(regex, out_text) + if match: + return match.group(1).strip() + + raise IOError("Could not find version from `{} -h`".format(executable)) + + +def get_path_to_executable(executable): + """Get path to local executable. + + :param executable: Name of executable in the $PATH variable + :type executable: str + + :return: path to executable + :rtype: str + + """ + path = None + + # issue with distutils finding scripts within the python path + # (i.e. those created by pip install) + script_path = os.path.join(os.path.dirname(sys.executable), executable) + if os.path.exists(script_path): + path = script_path + if path is None: + path = distutils.spawn.find_executable(executable) + if path is None: + raise ValueError("{} executable not found in PATH.".format(executable)) + + return os.path.abspath(path) + + +def get_or_create_local_computer(work_directory, name="localhost"): + """Retrieve or setup a local computer + + :param work_directory: str path to a local directory for running computations in + :param name: str name of the computer + + :return: aiida.orm.computers.Computer + + """ + + try: + computer = Computer.objects.get(label=name) + except NotExistent: + computer = Computer( + label=name, + hostname="localhost", + description=("localhost computer, " "set up by aiida_lammps tests"), + transport_type="local", + scheduler_type="direct", + workdir=os.path.abspath(work_directory), + ) + computer.store() + computer.configure() + + return computer + + +def get_or_create_code(entry_point, computer, executable, exec_path=None): + """Setup code on localhost computer""" + + if isinstance(computer, str): + computer = Computer.objects.get(label=computer) + + try: + code = Code.objects.get( # pylint: disable=no-member + label=f"{entry_point}-{executable}-{computer.label}" + ) + except NotExistent: + if exec_path is None: + exec_path = get_path_to_executable(executable) + code = Code( + input_plugin_name=entry_point, remote_computer_exec=[computer, exec_path] + ) + code.label = f"{entry_point}-{executable}-{computer.label}" + code.store() + + return code + + +def get_default_metadata( + max_num_machines=1, + max_wallclock_seconds=1800, + with_mpi=False, + num_mpiprocs_per_machine=1, +): + """ + Return an instance of the metadata dictionary with the minimally required parameters + for a CalcJob and set to default values unless overridden + + :param max_num_machines: set the number of nodes, default=1 + :param max_wallclock_seconds: set the maximum number of wallclock seconds, default=1800 + :param with_mpi: whether to run the calculation with MPI enabled + :param num_mpiprocs_per_machine: set the number of cpus per node, default=1 + + :rtype: dict + """ + return { + "options": { + "resources": { + "num_machines": int(max_num_machines), + "num_mpiprocs_per_machine": int(num_mpiprocs_per_machine), + }, + "max_wallclock_seconds": int(max_wallclock_seconds), + "withmpi": with_mpi, + } + } + + +def recursive_round(check_object, precision, apply_lists=False): + """Map a function on to all values of a nested dictionary""" + if isinstance(check_object, Mapping): + return { + k: recursive_round(v, precision, apply_lists) + for k, v in check_object.items() + } + if apply_lists and isinstance(check_object, (list, tuple)): + return [recursive_round(v, precision, apply_lists) for v in check_object] + if isinstance(check_object, float): + return round(check_object, precision) + return check_object + + +class AiidaTestApp(object): + """A class providing methods for testing purposes""" + + # pylint: disable=useless-object-inheritance + def __init__(self, work_directory, executable_map, environment=None): + """a class providing methods for testing purposes + + :param work_directory: str path to a local work directory (used when creating computers) + :param executable_map: dict mapping of computation entry points to the executable name + :param environment: None or aiida.manage.fixtures.FixtureManager manager + of a temporary AiiDA environment + + """ + self._environment = environment + self._work_directory = work_directory + self._executables = executable_map + + @property + def work_directory(self): + """return path to the work directory""" + return self._work_directory + + @property + def environment(self): + """return manager of a temporary AiiDA environment""" + return self._environment + + def get_or_create_computer(self, name="localhost"): + """Setup localhost computer""" + return get_or_create_local_computer(self.work_directory, name) + + def get_or_create_code(self, entry_point, computer_name="localhost"): + """Setup code on localhost computer""" + + computer = self.get_or_create_computer(computer_name) + + try: + executable = self._executables[entry_point] + except KeyError as key_error: + raise KeyError( + f"Entry point {entry_point} not recognized. " + f"Allowed values: {self._executables.keys()}" + ) from key_error + + return get_or_create_code(entry_point, computer, executable) + + @staticmethod + def get_default_metadata( + max_num_machines=1, + max_wallclock_seconds=1800, + with_mpi=False, + ): + """Get the metadata for a calculation""" + return get_default_metadata( + max_num_machines, + max_wallclock_seconds, + with_mpi, + ) + + @staticmethod + def get_parser_cls(entry_point_name): + """load a parser class + + :param entry_point_name: str entry point name of the parser class + + :return: aiida.parsers.parser.Parser + """ + + return ParserFactory(entry_point_name) + + @staticmethod + def get_data_node(entry_point_name, **kwargs): + """load a data node instance + + :param entry_point_name: str entry point name of the data node class + + :return: aiida.orm.nodes.data.Data + """ + + return DataFactory(entry_point_name)(**kwargs) + + @staticmethod + def get_calc_cls(entry_point_name): + """load a data node class + + :param entry_point_name: str entry point name of the data node class + + """ + + return CalculationFactory(entry_point_name) + + def generate_calcjob_node( + self, + entry_point_name, + retrieved, + computer_name="localhost", + attributes=None, + ): + """Fixture to generate a mock `CalcJobNode` for testing parsers. + + :param entry_point_name: str entry point name of the calculation class + :param retrieved: aiida.orm.FolderData containing the file(s) to be parsed + :param computer_name: str used to get or create a ``Computer``, by default 'localhost' + :param attributes: None or dict any additional attributes to set on the node + + :return: aiida.orm.CalcJobNode instance with the `retrieved` node linked as outgoing + """ + + process = self.get_calc_cls(entry_point_name) + computer = self.get_or_create_computer(computer_name) + entry_point = format_entry_point_string("aiida.calculations", entry_point_name) + + node = CalcJobNode(computer=computer, process_type=entry_point) + node.set_options( + { + k: v.default() if callable(v.default) else v.default + for k, v in process.spec_options.items() + if v.has_default() + } + ) + node.set_option("resources", {"num_machines": 1, "num_mpiprocs_per_machine": 1}) + node.set_option("max_wallclock_seconds", 1800) + + if attributes: + node.set_attributes(attributes) # pylint: disable=no-member + + node.store() + + retrieved.add_incoming( + node, + link_type=LinkType.CREATE, + link_label="retrieved", + ) + retrieved.store() + + return node + + @contextmanager + def sandbox_folder(self): # pylint: disable=no-self-use + """AiiDA folder object context. + + :return: aiida.common.folders.SandboxFolder + """ + + with SandboxFolder() as folder: + yield folder + + @staticmethod + def generate_calcinfo(entry_point_name, folder, inputs=None): + """generate a `CalcInfo` instance for testing calculation jobs. + + A new `CalcJob` process instance is instantiated, + and `prepare_for_submission` is called to populate the supplied folder, + with raw inputs. + + :param entry_point_name: str + :param folder: aiida.common.folders.Folder + :param inputs: dict or None + """ + + manager = get_manager() + runner = manager.get_runner() + + process_class = CalculationFactory(entry_point_name) + process = instantiate_process(runner, process_class, **inputs) + + calc_info = process.prepare_for_submission(folder) + + return calc_info From 46408b31b0256d06aa00a884e22dff2bf1d123f2 Mon Sep 17 00:00:00 2001 From: Chris Sewell Date: Tue, 5 Apr 2022 22:32:33 +0200 Subject: [PATCH 69/70] Fix docs --- aiida_lammps/data/lammps_potential.py | 2 +- docs/source/conf.py | 2 + docs/source/nitpick-exceptions | 178 +++----------------------- pyproject.toml | 2 +- tox.ini | 3 +- 5 files changed, 22 insertions(+), 165 deletions(-) diff --git a/aiida_lammps/data/lammps_potential.py b/aiida_lammps/data/lammps_potential.py index 9fe2624..0e13c52 100644 --- a/aiida_lammps/data/lammps_potential.py +++ b/aiida_lammps/data/lammps_potential.py @@ -578,7 +578,7 @@ def source_citations(self) -> typing.Union[str, list]: corresponding to primary published work(s) describing the KIM Item. :return: the citation where the potential was originally published. - :rtype: typing.Union[str, list]. + :rtype: typing.Union[str, list] """ return self.get_attribute("source_citations") diff --git a/docs/source/conf.py b/docs/source/conf.py index a02d435..88d0679 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -47,6 +47,8 @@ "pymatgen": ("https://pymatgen.org/", None), } +suppress_warnings = ["etoc.toctree"] + html_theme = "furo" # pylint: disable=invalid-name html_title = f"v{__version__}" # pylint: disable=invalid-name html_logo = "static/logo.png" # pylint: disable=invalid-name diff --git a/docs/source/nitpick-exceptions b/docs/source/nitpick-exceptions index 9138c58..4e0fc9a 100644 --- a/docs/source/nitpick-exceptions +++ b/docs/source/nitpick-exceptions @@ -1,163 +1,17 @@ -### python builtins - -# note: there doesn't seem to be a standard way of indicating a callable in python3 -# https://stackoverflow.com/questions/23571253/how-to-define-a-callable-parameter-in-a-python-docstring -py:class callable - -# For some reason, "filter" does not seem to be found -py:class filter - +py:class collections.namedtuple +py:class list of str py:class optional - -py:class unittest.case.TestCase -py:class unittest.runner.TextTestRunner - -# required for metaclasses(?) -py:class builtins.bool -py:class builtins.float -py:class builtins.int -py:class builtins.object -py:class builtins.str -py:class builtins.dict - -# typing -py:class asyncio.events.AbstractEventLoop -py:class EntityType -py:class function -py:class IO -py:class traceback - -### AiiDA - -# issues with order of object processing and type hinting -py:class aiida.engine.runners.ResultAndNode -py:class aiida.engine.runners.ResultAndPk -py:class aiida.engine.processes.workchains.workchain.WorkChainSpec -py:class aiida.manage.manager.Manager -py:class aiida.orm.nodes.node.WarnWhenNotEntered -py:class aiida.orm.utils.links.LinkQuadruple -py:class aiida.tools.importexport.dbexport.ExportReport -py:class aiida.tools.importexport.dbexport.ArchiveData -py:class aiida.tools.groups.paths.WalkNodeResult -py:class aiida.orm.Float -py:class aiida.orm.Dict -py:class aiida.orm.StructureData - -py:class Backend -py:class BackendEntity -py:class BackendNode -py:class AuthInfo -py:class CalcJob -py:class CalcJobNode -py:class Data -py:class ExitCode -py:class File -py:class FolderData -py:class JobInfo -py:class JobState -py:class Node -py:class Parser -py:class PersistenceError -py:class Process -py:class ProcessBuilder -py:class ProcessNode -py:class ProcessSpec -py:class Port -py:class PortNamespace -py:class Runner -py:class Transport -py:class TransportQueue -py:class WorkChainSpec - -py:class kiwipy.communications.Communicator -py:class plumpy.process_states.State -py:class plumpy.workchains._If -py:class plumpy.workchains._While - -### python packages -# Note: These exceptions are needed if -# * the objects are referenced e.g. as param/return types types in method docstrings (without intersphinx mapping) -# * the documentation linked via intersphinx lists the objects at a different (usually lower) import hierarchy -py:class click.core.Group -py:class click.core.Option -py:class click.types.ParamType -py:class click.types.Choice -py:class click.types.IntParamType -py:class click.types.StringParamType -py:class click.types.Path -py:class click.types.File -py:meth click.Option.get_default - -py:class concurrent.futures._base.TimeoutError - -py:class sphinx.util.docutils.SphinxDirective - -py:class frozenset - -py:class numpy.bool_ - -py:class paramiko.proxy.ProxyCommand - -# These can be removed once they are properly included in the `__all__` in `plumpy` -py:class plumpy.ports.PortNamespace -py:class plumpy.utils.AttributesDict - -py:class _asyncio.Future - -py:class tqdm.std.tqdm - -py:class IPython.core.magic.Magics - -py:class HTMLParser.HTMLParser -py:class html.parser.HTMLParser - -py:class django.contrib.auth.base_user.AbstractBaseUser -py:class django.contrib.auth.base_user.BaseUserManager -py:class django.contrib.auth.models.AbstractBaseUser -py:class django.contrib.auth.models.BaseUserManager -py:class django.contrib.auth.models.PermissionsMixin -py:class django.core.exceptions.MultipleObjectsReturned -py:class django.core.exceptions.ObjectDoesNotExist -py:class django.db.models.base.Model -py:class django.db.models.manager.Manager -py:class django.db.models.query.QuerySet -py:class django.db.migrations.migration.Migration - -py:class flask.app.Flask - -py:class sqlalchemy.ext.declarative.api.Base -py:class sqlalchemy.ext.declarative.api.Model -py:class sqlalchemy.sql.functions.FunctionElement -py:class sqlalchemy.orm.query.Query -py:class sqlalchemy.orm.util.AliasedClass -py:class sqlalchemy.orm.session.Session -py:exc sqlalchemy.orm.exc.MultipleResultsFound - -py:class sphinx.ext.autodoc.ClassDocumenter - -py:class yaml.Dumper -py:class yaml.Loader -py:class yaml.dumper.Dumper -py:class yaml.loader.Loader -py:class yaml.FullLoader -py:class yaml.loader.FullLoader -py:class uuid.UUID - -py:class psycopg2.extensions.cursor - -py:class aldjemy.orm.DbNode -py:class aldjemy.orm.DbLink -py:class aldjemy.orm.DbComputer -py:class aldjemy.orm.DbUser -py:class aldjemy.orm.DbGroup -py:class aldjemy.orm.DbAuthInfo -py:class aldjemy.orm.DbComment -py:class aldjemy.orm.DbLog -py:class aldjemy.orm.DbSetting - -py:class alembic.config.Config - -py:class pgsu.PGSU -py:meth pgsu.PGSU.__init__ - -py:class jsonschema.exceptions._Error +py:class namedtuple +py:class numpy.array +py:class np.array +py:class State +py:class EVENT_CALLBACK_TYPE +py:class orm.ArrayData +py:class orm.Dict +py:class orm.ProcessNode +py:class orm.StructureData +py:class utils.AttributesFrozendict +py:exc jsonschema.exceptions.ValidationError +py:exc jsonschema.exceptions.SchemaError +py:exc InputValidationError +py:class aiida_lammps.common.parse_trajectory.TRAJ_BLOCK diff --git a/pyproject.toml b/pyproject.toml index 653cf83..a765e3c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -10,7 +10,7 @@ force_sort_within_sections = true no_lines_before = ["LOCALFOLDER"] # Configure isort to work without access to site-packages -known_first_party = ["aiida_lammos"] +known_first_party = ["aiida_lammps"] # Settings for Black compatibility profile = "black" diff --git a/tox.ini b/tox.ini index a3b8fad..e7a2c14 100644 --- a/tox.ini +++ b/tox.ini @@ -11,7 +11,7 @@ envlist = py37 [testenv] -use_develop = true +usedevelop = true [testenv:py{37,38,39}] extras = testing @@ -29,6 +29,7 @@ allowlist_externals = echo commands = clean: rm -rf docs/_build + clean: rm -rf docs/source/reference/apidoc sphinx-build -n -W --keep-going -c docs/source docs/source docs/_build commands_post = echo "open docs/_build/index.html" From 48e2c0eee046ee51a2ca8ef6b1574586b9318bd0 Mon Sep 17 00:00:00 2001 From: Chris Sewell Date: Tue, 5 Apr 2022 22:45:55 +0200 Subject: [PATCH 70/70] Delete utils.py --- aiida_lammps/tests/utils.py | 328 ------------------------------------ 1 file changed, 328 deletions(-) delete mode 100644 aiida_lammps/tests/utils.py diff --git a/aiida_lammps/tests/utils.py b/aiida_lammps/tests/utils.py deleted file mode 100644 index 1eeefbb..0000000 --- a/aiida_lammps/tests/utils.py +++ /dev/null @@ -1,328 +0,0 @@ -"""Set of functions to test the aiida-lammps functionality.""" -from collections.abc import Mapping -from contextlib import contextmanager -import distutils.spawn -import os -import re -import subprocess -import sys - -from aiida.common import NotExistent -from aiida.common.folders import SandboxFolder -from aiida.common.links import LinkType -from aiida.engine.utils import instantiate_process -from aiida.manage.manager import get_manager -from aiida.orm import CalcJobNode, Code, Computer -from aiida.plugins import CalculationFactory, DataFactory, ParserFactory -from aiida.plugins.entry_point import format_entry_point_string - -TEST_DIR = os.path.dirname(os.path.realpath(__file__)) - - -def lammps_version(executable="lammps"): - """Get the version of lammps. - - we assume `lammps -h` returns e.g. 'LAMMPS (10 Feb 2015)' or - 'Large-scale Atomic/Molecular Massively Parallel Simulator - 5 Jun 2019' - """ - out_text = subprocess.check_output([executable, "-h"]).decode("utf8") - match = re.search(r"LAMMPS \((.*)\)", out_text) - if match: - return match.group(1) - regex = re.compile( - r"^Large-scale Atomic/Molecular Massively Parallel Simulator - (.*)$", - re.MULTILINE, - ) - match = re.search(regex, out_text) - if match: - return match.group(1).strip() - - raise IOError("Could not find version from `{} -h`".format(executable)) - - -def get_path_to_executable(executable): - """Get path to local executable. - - :param executable: Name of executable in the $PATH variable - :type executable: str - - :return: path to executable - :rtype: str - - """ - path = None - - # issue with distutils finding scripts within the python path - # (i.e. those created by pip install) - script_path = os.path.join(os.path.dirname(sys.executable), executable) - if os.path.exists(script_path): - path = script_path - if path is None: - path = distutils.spawn.find_executable(executable) - if path is None: - raise ValueError("{} executable not found in PATH.".format(executable)) - - return os.path.abspath(path) - - -def get_or_create_local_computer(work_directory, name="localhost"): - """Retrieve or setup a local computer - - :param work_directory: str path to a local directory for running computations in - :param name: str name of the computer - - :return: aiida.orm.computers.Computer - - """ - - try: - computer = Computer.objects.get(label=name) - except NotExistent: - computer = Computer( - label=name, - hostname="localhost", - description=("localhost computer, " "set up by aiida_lammps tests"), - transport_type="local", - scheduler_type="direct", - workdir=os.path.abspath(work_directory), - ) - computer.store() - computer.configure() - - return computer - - -def get_or_create_code(entry_point, computer, executable, exec_path=None): - """Setup code on localhost computer""" - - if isinstance(computer, str): - computer = Computer.objects.get(label=computer) - - try: - code = Code.objects.get( # pylint: disable=no-member - label=f"{entry_point}-{executable}-{computer.label}" - ) - except NotExistent: - if exec_path is None: - exec_path = get_path_to_executable(executable) - code = Code( - input_plugin_name=entry_point, remote_computer_exec=[computer, exec_path] - ) - code.label = f"{entry_point}-{executable}-{computer.label}" - code.store() - - return code - - -def get_default_metadata( - max_num_machines=1, - max_wallclock_seconds=1800, - with_mpi=False, - num_mpiprocs_per_machine=1, -): - """ - Return an instance of the metadata dictionary with the minimally required parameters - for a CalcJob and set to default values unless overridden - - :param max_num_machines: set the number of nodes, default=1 - :param max_wallclock_seconds: set the maximum number of wallclock seconds, default=1800 - :param with_mpi: whether to run the calculation with MPI enabled - :param num_mpiprocs_per_machine: set the number of cpus per node, default=1 - - :rtype: dict - """ - return { - "options": { - "resources": { - "num_machines": int(max_num_machines), - "num_mpiprocs_per_machine": int(num_mpiprocs_per_machine), - }, - "max_wallclock_seconds": int(max_wallclock_seconds), - "withmpi": with_mpi, - } - } - - -def recursive_round(check_object, precision, apply_lists=False): - """Map a function on to all values of a nested dictionary""" - if isinstance(check_object, Mapping): - return { - k: recursive_round(v, precision, apply_lists) - for k, v in check_object.items() - } - if apply_lists and isinstance(check_object, (list, tuple)): - return [recursive_round(v, precision, apply_lists) for v in check_object] - if isinstance(check_object, float): - return round(check_object, precision) - return check_object - - -class AiidaTestApp(object): - """A class providing methods for testing purposes""" - - # pylint: disable=useless-object-inheritance - def __init__(self, work_directory, executable_map, environment=None): - """a class providing methods for testing purposes - - :param work_directory: str path to a local work directory (used when creating computers) - :param executable_map: dict mapping of computation entry points to the executable name - :param environment: None or aiida.manage.fixtures.FixtureManager manager - of a temporary AiiDA environment - - """ - self._environment = environment - self._work_directory = work_directory - self._executables = executable_map - - @property - def work_directory(self): - """return path to the work directory""" - return self._work_directory - - @property - def environment(self): - """return manager of a temporary AiiDA environment""" - return self._environment - - def get_or_create_computer(self, name="localhost"): - """Setup localhost computer""" - return get_or_create_local_computer(self.work_directory, name) - - def get_or_create_code(self, entry_point, computer_name="localhost"): - """Setup code on localhost computer""" - - computer = self.get_or_create_computer(computer_name) - - try: - executable = self._executables[entry_point] - except KeyError as key_error: - raise KeyError( - f"Entry point {entry_point} not recognized. " - f"Allowed values: {self._executables.keys()}" - ) from key_error - - return get_or_create_code(entry_point, computer, executable) - - @staticmethod - def get_default_metadata( - max_num_machines=1, - max_wallclock_seconds=1800, - with_mpi=False, - ): - """Get the metadata for a calculation""" - return get_default_metadata( - max_num_machines, - max_wallclock_seconds, - with_mpi, - ) - - @staticmethod - def get_parser_cls(entry_point_name): - """load a parser class - - :param entry_point_name: str entry point name of the parser class - - :return: aiida.parsers.parser.Parser - """ - - return ParserFactory(entry_point_name) - - @staticmethod - def get_data_node(entry_point_name, **kwargs): - """load a data node instance - - :param entry_point_name: str entry point name of the data node class - - :return: aiida.orm.nodes.data.Data - """ - - return DataFactory(entry_point_name)(**kwargs) - - @staticmethod - def get_calc_cls(entry_point_name): - """load a data node class - - :param entry_point_name: str entry point name of the data node class - - """ - - return CalculationFactory(entry_point_name) - - def generate_calcjob_node( - self, - entry_point_name, - retrieved, - computer_name="localhost", - attributes=None, - ): - """Fixture to generate a mock `CalcJobNode` for testing parsers. - - :param entry_point_name: str entry point name of the calculation class - :param retrieved: aiida.orm.FolderData containing the file(s) to be parsed - :param computer_name: str used to get or create a ``Computer``, by default 'localhost' - :param attributes: None or dict any additional attributes to set on the node - - :return: aiida.orm.CalcJobNode instance with the `retrieved` node linked as outgoing - """ - - process = self.get_calc_cls(entry_point_name) - computer = self.get_or_create_computer(computer_name) - entry_point = format_entry_point_string("aiida.calculations", entry_point_name) - - node = CalcJobNode(computer=computer, process_type=entry_point) - node.set_options( - { - k: v.default() if callable(v.default) else v.default - for k, v in process.spec_options.items() - if v.has_default() - } - ) - node.set_option("resources", {"num_machines": 1, "num_mpiprocs_per_machine": 1}) - node.set_option("max_wallclock_seconds", 1800) - - if attributes: - node.set_attributes(attributes) # pylint: disable=no-member - - node.store() - - retrieved.add_incoming( - node, - link_type=LinkType.CREATE, - link_label="retrieved", - ) - retrieved.store() - - return node - - @contextmanager - def sandbox_folder(self): # pylint: disable=no-self-use - """AiiDA folder object context. - - :return: aiida.common.folders.SandboxFolder - """ - - with SandboxFolder() as folder: - yield folder - - @staticmethod - def generate_calcinfo(entry_point_name, folder, inputs=None): - """generate a `CalcInfo` instance for testing calculation jobs. - - A new `CalcJob` process instance is instantiated, - and `prepare_for_submission` is called to populate the supplied folder, - with raw inputs. - - :param entry_point_name: str - :param folder: aiida.common.folders.Folder - :param inputs: dict or None - """ - - manager = get_manager() - runner = manager.get_runner() - - process_class = CalculationFactory(entry_point_name) - process = instantiate_process(runner, process_class, **inputs) - - calc_info = process.prepare_for_submission(folder) - - return calc_info