From 558a356ceee260e26cf477a8a0788f6e189c0ea8 Mon Sep 17 00:00:00 2001 From: HTP-tools Developers Date: Tue, 19 Mar 2024 06:45:43 +0000 Subject: [PATCH] Deploy docs to v1.0.0 by GitHub Actions triggered by 1cbb5e8a165df077a595e99d9342d638d845b1f4 --- manual/v1.0.0/en/cif2x-usersguide.pdf | Bin 0 -> 81155 bytes manual/v1.0.0/en/html/.buildinfo | 4 + .../html/_sources/cif2x/about/index.rst.txt | 76 ++ .../_sources/cif2x/appendix/index.rst.txt | 47 + .../html/_sources/cif2x/basic-usage.rst.txt | 115 +++ .../html/_sources/cif2x/command/index.rst.txt | 56 ++ .../_sources/cif2x/filespec/index.rst.txt | 300 ++++++ .../en/html/_sources/cif2x/index.rst.txt | 15 + .../_sources/cif2x/tutorial/index.rst.txt | 67 ++ manual/v1.0.0/en/html/_sources/index.rst.txt | 20 + manual/v1.0.0/en/html/_static/alabaster.css | 708 ++++++++++++++ manual/v1.0.0/en/html/_static/basic.css | 925 ++++++++++++++++++ manual/v1.0.0/en/html/_static/custom.css | 1 + manual/v1.0.0/en/html/_static/doctools.js | 156 +++ .../en/html/_static/documentation_options.js | 13 + manual/v1.0.0/en/html/_static/file.png | Bin 0 -> 286 bytes .../v1.0.0/en/html/_static/language_data.js | 199 ++++ manual/v1.0.0/en/html/_static/minus.png | Bin 0 -> 90 bytes manual/v1.0.0/en/html/_static/plus.png | Bin 0 -> 90 bytes manual/v1.0.0/en/html/_static/pygments.css | 75 ++ manual/v1.0.0/en/html/_static/searchtools.js | 574 +++++++++++ .../en/html/_static/sphinx_highlight.js | 154 +++ manual/v1.0.0/en/html/cif2x/about/index.html | 173 ++++ .../v1.0.0/en/html/cif2x/appendix/index.html | 148 +++ manual/v1.0.0/en/html/cif2x/basic-usage.html | 228 +++++ .../v1.0.0/en/html/cif2x/command/index.html | 166 ++++ .../v1.0.0/en/html/cif2x/filespec/index.html | 394 ++++++++ manual/v1.0.0/en/html/cif2x/index.html | 151 +++ .../v1.0.0/en/html/cif2x/tutorial/index.html | 216 ++++ manual/v1.0.0/en/html/genindex.html | 103 ++ manual/v1.0.0/en/html/index.html | 120 +++ manual/v1.0.0/en/html/objects.inv | 5 + manual/v1.0.0/en/html/search.html | 122 +++ manual/v1.0.0/en/html/searchindex.js | 1 + manual/v1.0.0/ja/cif2x-usersguide.pdf | Bin 0 -> 84975 bytes manual/v1.0.0/ja/html/.buildinfo | 4 + .../html/_sources/cif2x/about/index.rst.txt | 79 ++ .../_sources/cif2x/appendix/index.rst.txt | 50 + .../html/_sources/cif2x/basic-usage.rst.txt | 114 +++ .../html/_sources/cif2x/command/index.rst.txt | 57 ++ .../_sources/cif2x/filespec/index.rst.txt | 291 ++++++ .../ja/html/_sources/cif2x/index.rst.txt | 15 + .../_sources/cif2x/tutorial/index.rst.txt | 65 ++ manual/v1.0.0/ja/html/_sources/index.rst.txt | 20 + manual/v1.0.0/ja/html/_static/alabaster.css | 708 ++++++++++++++ manual/v1.0.0/ja/html/_static/basic.css | 925 ++++++++++++++++++ manual/v1.0.0/ja/html/_static/custom.css | 1 + manual/v1.0.0/ja/html/_static/doctools.js | 156 +++ .../ja/html/_static/documentation_options.js | 13 + manual/v1.0.0/ja/html/_static/file.png | Bin 0 -> 286 bytes .../v1.0.0/ja/html/_static/language_data.js | 26 + manual/v1.0.0/ja/html/_static/minus.png | Bin 0 -> 90 bytes manual/v1.0.0/ja/html/_static/plus.png | Bin 0 -> 90 bytes manual/v1.0.0/ja/html/_static/pygments.css | 75 ++ manual/v1.0.0/ja/html/_static/searchtools.js | 574 +++++++++++ .../ja/html/_static/sphinx_highlight.js | 154 +++ manual/v1.0.0/ja/html/_static/translations.js | 60 ++ manual/v1.0.0/ja/html/cif2x/about/index.html | 176 ++++ .../v1.0.0/ja/html/cif2x/appendix/index.html | 152 +++ manual/v1.0.0/ja/html/cif2x/basic-usage.html | 228 +++++ .../v1.0.0/ja/html/cif2x/command/index.html | 167 ++++ .../v1.0.0/ja/html/cif2x/filespec/index.html | 393 ++++++++ manual/v1.0.0/ja/html/cif2x/index.html | 152 +++ .../v1.0.0/ja/html/cif2x/tutorial/index.html | 216 ++++ manual/v1.0.0/ja/html/genindex.html | 104 ++ manual/v1.0.0/ja/html/index.html | 121 +++ manual/v1.0.0/ja/html/objects.inv | Bin 0 -> 561 bytes manual/v1.0.0/ja/html/search.html | 122 +++ manual/v1.0.0/ja/html/searchindex.js | 1 + 69 files changed, 10551 insertions(+) create mode 100644 manual/v1.0.0/en/cif2x-usersguide.pdf create mode 100644 manual/v1.0.0/en/html/.buildinfo create mode 100644 manual/v1.0.0/en/html/_sources/cif2x/about/index.rst.txt create mode 100644 manual/v1.0.0/en/html/_sources/cif2x/appendix/index.rst.txt create mode 100644 manual/v1.0.0/en/html/_sources/cif2x/basic-usage.rst.txt create mode 100644 manual/v1.0.0/en/html/_sources/cif2x/command/index.rst.txt create mode 100644 manual/v1.0.0/en/html/_sources/cif2x/filespec/index.rst.txt create mode 100644 manual/v1.0.0/en/html/_sources/cif2x/index.rst.txt create mode 100644 manual/v1.0.0/en/html/_sources/cif2x/tutorial/index.rst.txt create mode 100644 manual/v1.0.0/en/html/_sources/index.rst.txt create mode 100644 manual/v1.0.0/en/html/_static/alabaster.css create mode 100644 manual/v1.0.0/en/html/_static/basic.css create mode 100644 manual/v1.0.0/en/html/_static/custom.css create mode 100644 manual/v1.0.0/en/html/_static/doctools.js create mode 100644 manual/v1.0.0/en/html/_static/documentation_options.js create mode 100644 manual/v1.0.0/en/html/_static/file.png create mode 100644 manual/v1.0.0/en/html/_static/language_data.js create mode 100644 manual/v1.0.0/en/html/_static/minus.png create mode 100644 manual/v1.0.0/en/html/_static/plus.png create mode 100644 manual/v1.0.0/en/html/_static/pygments.css create mode 100644 manual/v1.0.0/en/html/_static/searchtools.js create mode 100644 manual/v1.0.0/en/html/_static/sphinx_highlight.js create mode 100644 manual/v1.0.0/en/html/cif2x/about/index.html create mode 100644 manual/v1.0.0/en/html/cif2x/appendix/index.html create mode 100644 manual/v1.0.0/en/html/cif2x/basic-usage.html create mode 100644 manual/v1.0.0/en/html/cif2x/command/index.html create mode 100644 manual/v1.0.0/en/html/cif2x/filespec/index.html create mode 100644 manual/v1.0.0/en/html/cif2x/index.html create mode 100644 manual/v1.0.0/en/html/cif2x/tutorial/index.html create mode 100644 manual/v1.0.0/en/html/genindex.html create mode 100644 manual/v1.0.0/en/html/index.html create mode 100644 manual/v1.0.0/en/html/objects.inv create mode 100644 manual/v1.0.0/en/html/search.html create mode 100644 manual/v1.0.0/en/html/searchindex.js create mode 100644 manual/v1.0.0/ja/cif2x-usersguide.pdf create mode 100644 manual/v1.0.0/ja/html/.buildinfo create mode 100644 manual/v1.0.0/ja/html/_sources/cif2x/about/index.rst.txt create mode 100644 manual/v1.0.0/ja/html/_sources/cif2x/appendix/index.rst.txt create mode 100644 manual/v1.0.0/ja/html/_sources/cif2x/basic-usage.rst.txt create mode 100644 manual/v1.0.0/ja/html/_sources/cif2x/command/index.rst.txt create mode 100644 manual/v1.0.0/ja/html/_sources/cif2x/filespec/index.rst.txt create mode 100644 manual/v1.0.0/ja/html/_sources/cif2x/index.rst.txt create mode 100644 manual/v1.0.0/ja/html/_sources/cif2x/tutorial/index.rst.txt create mode 100644 manual/v1.0.0/ja/html/_sources/index.rst.txt create mode 100644 manual/v1.0.0/ja/html/_static/alabaster.css create mode 100644 manual/v1.0.0/ja/html/_static/basic.css create mode 100644 manual/v1.0.0/ja/html/_static/custom.css create mode 100644 manual/v1.0.0/ja/html/_static/doctools.js create mode 100644 manual/v1.0.0/ja/html/_static/documentation_options.js create mode 100644 manual/v1.0.0/ja/html/_static/file.png create mode 100644 manual/v1.0.0/ja/html/_static/language_data.js create mode 100644 manual/v1.0.0/ja/html/_static/minus.png create mode 100644 manual/v1.0.0/ja/html/_static/plus.png create mode 100644 manual/v1.0.0/ja/html/_static/pygments.css create mode 100644 manual/v1.0.0/ja/html/_static/searchtools.js create mode 100644 manual/v1.0.0/ja/html/_static/sphinx_highlight.js create mode 100644 manual/v1.0.0/ja/html/_static/translations.js create mode 100644 manual/v1.0.0/ja/html/cif2x/about/index.html create mode 100644 manual/v1.0.0/ja/html/cif2x/appendix/index.html create mode 100644 manual/v1.0.0/ja/html/cif2x/basic-usage.html create mode 100644 manual/v1.0.0/ja/html/cif2x/command/index.html create mode 100644 manual/v1.0.0/ja/html/cif2x/filespec/index.html create mode 100644 manual/v1.0.0/ja/html/cif2x/index.html create mode 100644 manual/v1.0.0/ja/html/cif2x/tutorial/index.html create mode 100644 manual/v1.0.0/ja/html/genindex.html create mode 100644 manual/v1.0.0/ja/html/index.html create mode 100644 manual/v1.0.0/ja/html/objects.inv create mode 100644 manual/v1.0.0/ja/html/search.html create mode 100644 manual/v1.0.0/ja/html/searchindex.js diff --git a/manual/v1.0.0/en/cif2x-usersguide.pdf b/manual/v1.0.0/en/cif2x-usersguide.pdf new file mode 100644 index 0000000000000000000000000000000000000000..153778a8e546bfb8a21f6c72d8e1f31c130b3b75 GIT binary patch literal 81155 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 qS%f*Nh4%zit;`_, `Quantum ESPRESSO `_, `OpenMX `_, and `AkaiKKR `_. + +License +---------------------------------------------------------------- + +The distribution of the program package and the source codes for cif2x follow GNU General Public License version 3 (GPL v3) or later. + +Contributors +---------------------------------------------------------------- + +This software was developed by the following contributors. + +- ver.1.0.0 (Released on 2024/03/XX) + +- ver.1.0-alpha (Released on 2023/12/28) + + - Developers + + - Kazuyoshi Yoshimi (The Instutite for Solid State Physics, The University of Tokyo) + + - Tatsumi Aoyama (The Instutite for Solid State Physics, The University of Tokyo) + + - Yuichi Motoyama (The Instutite for Solid State Physics, The University of Tokyo) + + - Masahiro Fukuda (The Instutite for Solid State Physics, The University of Tokyo) + + - Kota Ido (The Instutite for Solid State Physics, The University of Tokyo) + + - Tetsuya Fukushima (The National Institute of Advanced Industrial Science and Technology (AIST)) + + - Shusuke Kasamatsu (Yamagata University) + + - Takashi Koretsune (Tohoku University) + + - Project Corrdinator + + - Taisuke Ozaki (The Instutite for Solid State Physics, The University of Tokyo) + + +Copyright +---------------------------------------------------------------- + +.. only:: html + + |copy| *2023- The University of Tokyo. All rights reserved.* + + .. |copy| unicode:: 0xA9 .. copyright sign + +.. only:: latex + + :math:`\copyright` *2023- The University of Tokyo. All rights reserved.* + + +This software was developed with the support of "Project for advancement of software usability in materials science" of The Institute for Solid State Physics, The University of Tokyo. + +Operating environment +---------------------------------------------------------------- + +This tool was tested on the following platforms: + +- Ubuntu Linux + python3 + diff --git a/manual/v1.0.0/en/html/_sources/cif2x/appendix/index.rst.txt b/manual/v1.0.0/en/html/_sources/cif2x/appendix/index.rst.txt new file mode 100644 index 0000000..9aabd23 --- /dev/null +++ b/manual/v1.0.0/en/html/_sources/cif2x/appendix/index.rst.txt @@ -0,0 +1,47 @@ +.. _sec-cif2x-appendix: + +================================================================ +Extension guide +================================================================ + +Adding modes of Quantum ESPRESSO +---------------------------------------------------------------- + +In order to add supports to modes of Quantum ESPRESSO, the mapping between the modes and the transformation classes should be added to ``create_modeproc()`` function in ``src/cif2x/qe/calc_mode.py``. + +.. code-block:: python + + def create_modeproc(mode, qe): + if mode in ["scf", "nscf"]: + modeproc = QEmode_pw(qe) + else: + modeproc = QEmode_generic(qe) + return modeproc + + +The transformation functionality for each mode is provided as a derived class of ``QEmode_base`` class. This class implements methods ``update_namelist()`` for updating the namelist block, and ``update_cards()`` for generating data of card blocks. +In the current version, two classes are provided: ``QEmode_pw`` class for scf and nscf calculations of pw.x, and ``QEmode_generic`` class for generating output as-is. + +.. code-block:: python + + class QEmode_base: + def __init__(self, qe): + def update_namelist(self, content): + def update_cards(self, content): + + +For the namelist, the transformation class generates values for blank entries from crystal structure data and other sources. It may also force to set values such as the lattice parameters that are determined from the crystal structure data, or those that must be specified consistently with other parameters. The functions are provided for each mode separately. + +For card blocks, a function is provided for each card, and the mapping between the card type and the function is given in the ``card_table`` variable. +The method ``update_cards()`` in the base class picks up and runs the function associated to the card, and updates the content of the card. Of course, a new ``update_cards()`` function may be defined. + +.. code-block:: python + + self.card_table = { + 'CELL_PARAMETERS': generate_cell_parameters, + 'ATOMIC_SPECIES': generate_atomic_species, + 'ATOMIC_POSITIONS': generate_atomic_positions, + 'K_POINTS': generate_k_points, + } + +The functions for cards are gathered in ``src/cif2x/qe/cards.py`` with the function names as ``generate_{card name}``. These functions takes parameters for card blocks as argument, and returns a dictionary containing the card name, the options, and the data field. diff --git a/manual/v1.0.0/en/html/_sources/cif2x/basic-usage.rst.txt b/manual/v1.0.0/en/html/_sources/cif2x/basic-usage.rst.txt new file mode 100644 index 0000000..9aabaf6 --- /dev/null +++ b/manual/v1.0.0/en/html/_sources/cif2x/basic-usage.rst.txt @@ -0,0 +1,115 @@ +Installation and basic usage +================================================================ + +**Prerequisite** + + Input file generator for first-principles calculation ``cif2x`` included in HTP-tools requires the following programs and libraries: + + - python 3.x + - pymatgen module + - ruamel.yaml module + - f90nml module + - qe-tools module + - numpy module + - pandas module + - monty module + - OpenBabel module (optional) + - AkaiKKRPythonUtil module + +**Official pages** + + - `GitHub repository `_ + +**Downloads** + + cif2x can be downloaded by the following command with git: + + .. code-block:: bash + + $ git clone https://github.com/issp-center-dev/cif2x.git + +**Installation** + + Once the source files are obtained, you can install cif2x by running the following command. The required libraries will also be installed automatically at the same time. + + .. code-block:: bash + + $ cd ./cif2x + $ python3 -m pip install . + + The executable file ``cif2x`` will be installed. + You may need to add ``--user`` option next to ``install`` keyword above in case you are not allowed to install packages system-wide. + + AkaiKKRPythonUtil module need to be installed separately. The source package is available from `the repository `_. Then follow the steps below to install the module along with the required seaborn module: + + .. code-block:: bash + + $ git clone https://github.com/AkaiKKRteam/AkaiKKRPythonUtil.git + $ cd ./AkaiKKRPythonUtil/library/PyAkaiKKR + $ python3 -m pip install . + $ python3 -m pip install seaborn + + +**Directory structure** + + :: + + . + |-- LICENSE + |-- README.md + |-- pyproject.toml + |-- docs/ + | |-- ja/ + | |-- en/ + | |-- tutorial/ + |-- src/ + | |-- cif2x/ + | |-- __init__.py + | |-- main.py + | |-- cif2struct.py + | |-- struct2qe.py + | |-- qe/ + | | |-- __init__.py + | | |-- calc_mode.py + | | |-- cards.py + | | |-- content.py + | | |-- qeutils.py + | | |-- tools.py + | |-- struct2vasp.py + | |-- struct2openmx.py + | |-- openmx/ + | | |-- __init__.py + | | |-- vps_table.py + | |-- struct2akaikkr.py + | |-- akaikkr/ + | | |-- make_input.py + | | |-- read_input.py + | | |-- run_cif2kkr.py + | |-- utils.py + |-- sample/ + + +**Basic usage** + + ``cif2x`` is a tool to generate a set of input files for first-principles calculation software. It takes an input parameter file as a template, and generates parameter items that may vary by materials and calculation conditions from crystallographic data. In the present version, ``cif2x`` supports Quantum ESPRESSO, VASP, OpenMX, and AkaiKKR. + + #. Prepare input parameter file + + First, you need to create an input parameter file in YAML format that describes contents of the input file to be generated for the first-principles calculation software. + + #. Prepare crystal structure files and pseudo-potential files + + The crystal structure data need to be prepared for the target materials. The file format is CIF, POSCAR, xfs, or those supported by pymatgen. + + For Quantum ESPRESSO, the pseudo-potential files and the index file in CSV format need to be placed. Their locations are specified in the input parameter file. + + For VASP, the location of the pseudo-potential files will be specified in a file ``~/.config/.pmgrc.yaml`` or by an environment variable. It may be specified in the input parameter file. + + #. Run command + + Run ``cif2x`` command with the input parameter file and the crystal structure data as arguments. To generate input files for Quantum ESPRESSO, the target option ``-t QE`` should be specified. The option turns to ``-t VASP`` for VASP, ``-t OpenMX`` for OpenMX, and ``-t AkaiKKR`` for AkaiKKR. + + .. code-block:: bash + + $ cif2x -t QE input.yaml material.cif + diff --git a/manual/v1.0.0/en/html/_sources/cif2x/command/index.rst.txt b/manual/v1.0.0/en/html/_sources/cif2x/command/index.rst.txt new file mode 100644 index 0000000..2aa37a0 --- /dev/null +++ b/manual/v1.0.0/en/html/_sources/cif2x/command/index.rst.txt @@ -0,0 +1,56 @@ +Command reference +================================================================ + +cif2x +---------------------------------------------------------------- + + Generate input files for first-principles calculation software + +SYNOPSIS: + + .. code-block:: bash + + cif2x [-v][-q] -t target input_yaml material.cif + cif2x -h + cif2x --version + +DESCRIPTION: + + This program reads an input parameter file specified by ``input_yaml`` and a crystal data file specified by ``material.cif``, and generates a set of input files for first-principles calculation software. In the current version, the supported software includes Quantum ESPRESSO, VASP, and OpenMX. + It takes the following command line options. + + - ``-v`` + + increases verbosity of the runtime messages. When specified multiple times, the program becomes more verbose. + + - ``-q`` + + decreases verbosity of the runtime messages. It cancels the effect of ``-v`` option, and when specified multiple times, the program becomes more quiet. + + - ``-t`` *target* + + specifies the target first-principles calculation software. The supported software for *target* is listed as follows: + + - ``QE``, ``espresso``, ``quantum_espresso``: generates input files for Quantum ESPRESSO. + + - ``VASP``: generates input files for VASP. + + - ``OpenMX``: generates input files for OpenMX. + + - ``AkaiKKR``: generates input files for AkaiKKR. + + - ``input_yaml`` + + specifies an input parameter file in YAML format. + + - ``material.cif`` + + specifies crystal structure data file. It is in CIF (Crystallographic Information Framework) format, or other format supported by pymatgen. + + - ``-h`` + + displays help and exits. + + - ``--version`` + + displays version information. diff --git a/manual/v1.0.0/en/html/_sources/cif2x/filespec/index.rst.txt b/manual/v1.0.0/en/html/_sources/cif2x/filespec/index.rst.txt new file mode 100644 index 0000000..c99d2c5 --- /dev/null +++ b/manual/v1.0.0/en/html/_sources/cif2x/filespec/index.rst.txt @@ -0,0 +1,300 @@ +.. _sec-cif2x-fileformat: + +====================== +File format +====================== + +Input parameter file +====================== + +An input parameter file describes information necessary to generate input files for first-principles calculation software by ``cif2x``. It should be given in YAML format, and consist of the following sections. + + 1. structure section: describes how to handle crystal structure data. + + 2. optional section: describes pseudo-potential files, and symbol definitions for reference feature of YAML. + + 3. tasks section: describes contents of input files. + + +structure +--------- + + ``use_ibrav`` (default value: ``false``) + + This parameter specifies whether ``ibrav`` parameter is used for Quantum ESPRESSO as the input of the crystal structure. When it is set to ``true``, the lattice is transformed to match the convention of Quantum ESPRESSO, and the lattice parameters ``a``, ``b``, ``c``, ``cosab``, ``cosac``, and ``cosbc`` are written to the input file as needed. + + ``tolerance`` (default value: 0.01) + + This parameter specifies the tolerance in the difference between the reconstructed Structure data and the original data when ``use_ibrav`` is set to ``true``. + + ``supercell`` (default value: none) + + This parameter specifies the size of supercell, when it is adopted, in the form of [:math:`n_x`, :math:`n_y`, :math:`n_z`]. + + +optional +-------- +This section contains global settings needed for the first-principles calculation software. The available parameters are described in the corresponding sections below. + +tasks +----- +This section defines contents of the input files. It is organized as a list of blocks, each corresponding to an input file, to allow for generating a set of input files for an input. The terms described in each block are explained in the following. + + + ``mode`` (Quantum ESPRESSO) + + This parameter specifies the type of calculation. In the current version, the supported mode includes ``scf`` and ``nscf`` for pw.x of Quantum ESPRESSO. If an unsupported mode is specified, the settings in ``content`` will be exported as is. + + ``output_file`` (Quantum ESPRESSO) + + This parameter specifies the file name of the output. + + ``output_dir`` + + This parameter specifies the directory name of the output. The default value is the current directory. + + ``content`` + + This parameter describes the content of the output. + For Quantum ESPRESSO, it contains the namelist data (blocks starting from ``&system``, ``&control``, etc.) in ``namelist`` block, and other card data (such as ``K_POINTS``) as individual blocks. Some card data may take parameters. + + ``template`` (Quantum ESPRESSO) + + ``template_dir`` (VASP) + + These parameters specifies the template file and the template directory for the input files, respectively. If they are not given, templates will not be used. The content of the template file is merged with those of ``content``. The entries in the template file will be superseded by those of ``content`` if the entries of the same keys appear both. + + +Specifying parameter set +---------------------------------------- +An input parameter may be given a list or range of parameters. In this case, a separate directory is created for every combination of parameters to store the generated input files. A special syntax ``${...}`` is used to specify the parameter set as follows: + +- a list: ``${[ A, B, ... ]}`` + + a set of parameter values is described as a Python list. Each entry may be a scalar value, or a list of values. + +- a range: ``${range(N)}``, ``${range(start, end, step)}`` + + a range of parameter is given by the keyword ``range``. The former specifies the values from ``0`` to ``N-1``, and the latter from ``start`` to ``end`` with every ``step``. (If ``step`` is omitted, it is assumed to be ``1``.) + + +Parameters for Quantum ESPRESSO +=============================== + +The entries of ``optional`` section and ``content`` part of the ``tasks`` section specific to Quantum ESPRESSO are explained below. +In the current version, ``scf`` mode and ``nscf`` mode of ``pw.x`` are supported. + +optional section +------------------ + + ``pp_file`` + + This parameter specifies the index file in CSV format that relates the element type and the pseudo-potential file. This file contains the following columns: element name, type of pseudo-potential, nexclude, orbitals. An example line is given as: + + .. code-block:: + + Fe,pbe-spn-rrkjus_psl.0.2.1,4,spd + + The name of the pseudo-potential file corresponding to the above example reads + Fe.pbe-spn-rrkjus_psl.0.2.1.UPF . + + ``cutoff_file`` + + This parameter specifies the index file in CSV format that relates the pseudo-potential file and the cutoff values. This file contains the following columns: name of pseudo-potential file, ``ecutwfc`` value, ``ecutrho`` value. + + ``pseudo_dir`` + + This parameter specifies the name of the directory that holds pseudo-potential files. It is used when the cutoff values are obtained from the pseudo-potential files. + It is indenepent from the ``pseudo_dir`` parameter in the input files for Quantum ESPRESSO. + + +content +-------- + + **namelist** + + - The lattice specifications in ``&system`` block will be superseded according to ``use_ibrav`` parameter in the ``structure`` section. + + - ``use_ibrav = false``: + ``ibrav`` is set to ``0``, and the lattice parameters including ``a``, ``b``, ``c``, ``cosab``, ``cosac``, ``cosbc``, ``celldm`` are removed. + + - ``use_ibrav = true``: + ``ibrab`` is set to the index of Bravais lattices obtained from the crystal structure data. The Structure data will be reconstructed to match the convention of Quantum ESPRESSO. + + - ``nat`` (the number of atoms) and ``ntyp`` (the number of element types) will be superseded by the values obtained from the crystal structure data. + + - The cutoff values ``ecutwfc`` and ``ecutrho`` are obtained from the pseudo-potential files if these parameters are left blank. + + **CELL_PARAMETERS** + + - This block will not be generated if ``use_ibrav`` is set to ``true``. Otherwise, the lattice vectors are exported in units of angstrom. + + - The information of the lattice vectors are obtained from the crystal structure data. When the ``data`` field is defined and contains a 3x3 matrix, that value will be used for the set of lattice vectors instead. + + **ATOMIC_SPECIES** + + - This block exports a list of atom species, atomic mass, and the file name of the pseudo-potential data. + + - The information of the atoms are obtained from the crystal structure data. The file names of the pseudo-potential data are referred from the CSV-formatted index file specified by ``pp_list`` parameter. + + - When the ``data`` field is defined and contains the required data, these values will be used instead. + + **ATOMIC_POSITIONS** + + - This block exports the atomic species and their fractional coordinates. + + - When ``ignore_species`` is given to specify an atomic species or a list of species, the values of ``if_pos`` for these species will be set to ``0``. It is used for MD or structure relaxations. + + - When the ``data`` field is defined and contains the required data, these values will be used instead. + + **K_POINTS** + + - This block exports the information of k points. The type of the output is specified by the ``option`` parameter that takes one of the following: + + - ``gamma``: uses :math:`\Gamma` point. + + - ``crystal``: generates a list of k points in mesh pattern. The mesh width is given by the ``grid`` parameter, or derived from the ``vol_density`` or ``k_resolution`` parameters. + + - ``automatic``: generates a mesh of k points. It is given by the ``grid`` parameter, or derived from the ``vol_density`` or ``k_resolution`` parameters. The shift is obtained from the ``kshifts`` parameter. + + - The mesh width is determined in the following order: + + - the ``grid`` parameter, specified by a list of :math:`n_x, n_y, n_z`, or a scalar value :math:`n`. For the latter, :math:`n_x = n_y = n_z = n` is assumed. + - derived from the ``vol_density`` parameter. + - derived from the ``k_resolution`` parameter, whose default value is 0.15. + + - When the ``data`` field is defined and contains the required data, these values will be used. + + +Parameters for VASP +=============================== + +The entries of ``optional`` section and ``content`` part of the ``tasks`` section specific to VASP are explained below. + +optional +-------- + +The type and the location of pseudo-potential files are specified. + +According to pymatgen, the pseudo-potential files are obtained from +``PMG_VASP_PSP_DIR``/*functional*/POTCAR.{element}(.gz) or +``PMG_VASP_PSP_DIR``/*functional*/{element}/POTCAR, +where +``PMG_VASP_PSP_DIR`` points to the directory and it is given in the configuration file +``~/.config/.pmgrc.yaml`` or by the environment variable of the same name. +*functional* refers to the type of the pseudo-potential, whose value is predefined as +``POT_GGA_PAW_PBE``, ``POT_LDA_PAW``, etc. + + + ``pseudo_functional`` + + This parameter specifies the type of the pseudo-potential. The relation to the *functional* value above is defined in the table of pymatgen, for example, by ``PBE`` to ``POT_GGA_PAW_PBE``, or by ``LDA`` to ``POT_LDA_PAW``, or in a similar manner. + + +When the ``pseudo_dir`` parameter is specified, it is used as the directory that holds the pseudo-potential files, ignoring the convention of pymatgen. + + ``psuedo_dir`` + + This parameter specifies the directory that holds the pseudo-potential files. The paths to the pseudo-potential file turn to ``pseudo_dir``/POTCAR.{element}(.gz), or ``pseudo_dir``/{element}/POTCAR. + +tasks +----- + +The template files are assumed to be placed in the directory specified by the ``template_dir`` parameter by the names ``INCAR``, ``KPOINTS``, ``POSCAR``, and ``POTCAR``. The missing files will be ignored. + + + +content +------- + + **incar** + + - This block contains parameters described in the INCAR file + + **kpoints** + + - ``type`` + + The ``type`` parameter describes how KPOINTS are specified. The following values are allowed, with some types accepting parameters. See pymatgen.io.vasp manual for further details. + + - ``automatic`` + + parameter: ``grid`` + + - ``gamma_automatic`` + + parameter: ``grid``, ``shift`` + + - ``monkhorst_automatic`` + + parameter: ``grid``, ``shift`` + + - ``automatic_density`` + + parameter: ``kppa``, ``force_gamma`` + + - ``automatic_gamma_density`` + + parameter: ``grid_density`` + + - ``automatic_density_by_vol`` + + parameter: ``grid_density``, ``force_gamma`` + + - ``automatic_density_by_lengths`` + + parameter: ``length_density``, ``force_gamma`` + + - ``automatic_linemode`` + + parameter: ``division``, ``path_type`` (corresponding to the ``path_type`` parameter of HighSymmKpath.) + + +Parameters for OpenMX +=============================== + +The entries of ``optional`` section and ``content`` part of the ``tasks`` section specific to OpenMX are explained below. + +optional +-------- + + ``data_path`` + + This parameter specifies the name of directory that holds files for pseudo-atomic orbitals and pseudo-potentials. It corresponds to the ``DATA.PATH`` parameter. + +content +-------- + + ``precision`` + + This parameter specifies the set of pseudo-atomic orbitals listed in Tables 1 and 2 of Section 10.6 of the OpenMX manual. It is one of ``quick``, ``standard``, or ``precise``. The default value is ``quick``. + +Parameters for AkaiKKR +=============================== + +The entries of ``optional`` section and ``content`` part of the ``tasks`` section specific to AkaiKKR are explained below. + +optional +-------- + + ``workdir`` + + This parameter specifies the directory in which temporal files are stored. If it is not given, ``/tmp`` or the value of the environment variable ``TMPDIR`` is used. + + +content +-------- + +The ``content`` part contains the input parameters of AkaiKKR. +A blank is written to the input file for an unspecified parameter, to which the default value defined in AkaiKKR will be assumed. +The parameter values listed below are replaced by the values obtained from the crystal structure data. + +- ``brvtyp``, except when it is set to ``aux`` (or a string that contains ``aux``). + +- lattice parameters, ``a``, ``c/a``, ``b/a``, ``alpha``, ``beta``, ``gamma``, ``r1``, ``r2``, ``r3``. + +- type information, ``ntyp``, ``type``, ``ncmp``, ``rmt``, ``field``, ``mxl``, ``anclr``, ``conc``. + +- element information, ``natm``, ``atmicx``, ``atmtyp``. + +For ``rmt`` and ``field``, the values specified in the input parameter file will be used only when they are lists having the same number of elements as ``ntyp``. diff --git a/manual/v1.0.0/en/html/_sources/cif2x/index.rst.txt b/manual/v1.0.0/en/html/_sources/cif2x/index.rst.txt new file mode 100644 index 0000000..24694f7 --- /dev/null +++ b/manual/v1.0.0/en/html/_sources/cif2x/index.rst.txt @@ -0,0 +1,15 @@ +**************************************************************** +Input file generator for first-principles calculations (cif2x) +**************************************************************** + + +.. toctree:: + :maxdepth: 2 + :numbered: 2 + + about/index + basic-usage + tutorial/index + command/index + filespec/index + appendix/index diff --git a/manual/v1.0.0/en/html/_sources/cif2x/tutorial/index.rst.txt b/manual/v1.0.0/en/html/_sources/cif2x/tutorial/index.rst.txt new file mode 100644 index 0000000..5abdf05 --- /dev/null +++ b/manual/v1.0.0/en/html/_sources/cif2x/tutorial/index.rst.txt @@ -0,0 +1,67 @@ +.. _sec-cif2x-tutorial: + +Tutorial +================================================================ + +The procedure to use the input file generator ``cif2x`` for first-principles calculation software consists of preparing an input parameter file, crystal structure data, and pseudo-potential files, and running the program ``cif2x``. +In the current version, the supported software includes Quantum ESPRESSO, VASP, OpenMX, and AkaiKKR. +In this tutorial, we will explain the steps along a sample for Quantum ESPRESSO in ``docs/tutorial/cif2x``. + + +Prepare an input parameter file +---------------------------------------------------------------- + +An input parameter file describes the content of input files for the first-principles calculation software. +An example is presented below. It is a text file in YAML format that contains options to crystal structure data, and contents of the input file used as an input for the first-principle calculation. See :ref:`file format ` section for the details of specification. + +In YAML format, parameters are given in dictionary form as ``keyword: value``, where ``value`` is a scalar such as a number or a string, or a set of values enclosed in ``[ ]`` or listed in itemized form, or a nested dictionary. + +.. literalinclude:: ../../../../tutorial/cif2x/input.yaml + :language: yaml + + +The input parameter file consists of ``structure``, ``optional``, and ``tasks`` sections. +The ``structure`` section specifies options to the crystal structure data. +The ``optional`` section holds global settings concerning the pseudo-potentials. + +The ``tasks`` section describes inputs for the first-principles calculations. In case of generating multiple files for a series of calculations, the ``tasks`` section takes a list of parameter sets. +For each set, the calculation type is specified by the ``mode`` parameter: ``scf`` and ``nscf`` are supported as modes, as well as arbitrary modes for generic output. + +The content of the output is given in ``content`` section. +The input files of Quantum ESPRESSO are composed of the parts in namelist format of Fortran90 starting from ``&keyword``, and the blocks called cards that start with keywords such as ``K_POINTS`` and end with blank lines. The ``content`` block holds namelist and cards in a form of nested dictionary. +Basically, the specified items are written to the input files as-is, except for several cases. If a keyword is left blank, its value will be obtained form the crystal structure data or other sources. + +Besides, templates of the input files can be used. The content of the file given by the ``template`` keyword is considered as input data along with the entries in ``content`` block. When the entries of the same keywords appear both, those of the input parameter files will be used. Therefore, it is possible to use template files and overwrite some entries by the input parameter file as needed. +In the present example, the file (``scf.in_tmpl``) shown below is read as a template, and the entries on cutoff parameters as well as cards of CELL_PARAMETER, ATOMIC_SPECIES, ATOMIC_POSITIONS, K_POINTS are generated from the crystal structure data and pseudo-potential files. It is noted that the values of ``ecutwfc`` and ``ecutrho`` are overwritten by the empty lines. + +.. literalinclude:: ../../../../tutorial/cif2x/scf.in_tmpl + :language: fortran + + +Generating input files +---------------------------------------------------------------- + +The program ``cif2x`` is executed with the input parameter file (``input.yaml``) and crystal structure data (``Co3SnS2_nosym.cif``) as follows. + +.. code-block:: bash + + $ cif2x -t QE input.yaml Co3SnS2_nosym.cif + +The required pseudo-potential files should be placed in the directory ``./pseudo``, and the index file for the pseudo-potential should be prepared as ``./psudo/pp_psl_pbe_rrkjus.csv``. + +Run ``cif2x`` and a set of input files for Quantum ESPRESSO will be created. The output file is specified by ``output_file`` parameter of the input parameter file, and stored in the directory given by ``output_dir``. In this example, the input file for SCF calculation is created as ``./scf/scf.in``. + + +Specifying parameter sets +---------------------------------------------------------------- + +In some cases, a series of input files should be generated with varying their parameter values. For example, the convergence is examined by modifying the cutoff values or grid resolution of k points. The input parameter can be given a list or a range of values, and the input files for every combination from the choices of parameter values are generated and stored in separate directories. To specify parameter set, a special syntax ``${...}`` is adopted. + +.. code-block:: yaml + + content: + K_POINTS: + option: automatic + grid: ${ [ [4,4,4], [8,8,8], [12,12,12] ] } + +When ``K_POINTS`` is given as above, the input files having the ``grid`` value to be ``[4,4,4]``, ``[8,8,8]``, ``[12,12,12]`` will be generated in the sub-directories, ``4x4x4/``, ``8x8x8/``, ``12x12x12/``, respectively. diff --git a/manual/v1.0.0/en/html/_sources/index.rst.txt b/manual/v1.0.0/en/html/_sources/index.rst.txt new file mode 100644 index 0000000..0176a5c --- /dev/null +++ b/manual/v1.0.0/en/html/_sources/index.rst.txt @@ -0,0 +1,20 @@ +.. HTP-tools documentation master file, created by + sphinx-quickstart on Fri Jun 30 11:02:31 2023. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Cif2x Users Guide +===================================== + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + cif2x/index + +.. Indices and tables +.. ================== + +.. * :ref:`genindex` +.. * :ref:`modindex` +.. * :ref:`search` diff --git a/manual/v1.0.0/en/html/_static/alabaster.css b/manual/v1.0.0/en/html/_static/alabaster.css new file mode 100644 index 0000000..55f9cb1 --- /dev/null +++ b/manual/v1.0.0/en/html/_static/alabaster.css @@ -0,0 +1,708 @@ +@import url("basic.css"); + +/* -- page layout ----------------------------------------------------------- */ + +body { + font-family: Georgia; + font-size: 17px; + background-color: #fff; + color: #000; + margin: 0; + padding: 0; +} + + +div.document { + width: 940px; + margin: 30px auto 0 auto; +} + +div.documentwrapper { + float: left; + width: 100%; +} + +div.bodywrapper { + margin: 0 0 0 220px; +} + +div.sphinxsidebar { + width: 220px; + font-size: 14px; + line-height: 1.5; +} + +hr { + border: 1px solid #B1B4B6; +} + +div.body { + background-color: #fff; + color: #3E4349; + padding: 0 30px 0 30px; +} + +div.body > .section { + text-align: left; +} + +div.footer { + width: 940px; + margin: 20px auto 30px auto; + font-size: 14px; + color: #888; + text-align: right; +} + +div.footer a { + color: #888; +} + +p.caption { + font-family: inherit; + font-size: inherit; +} + + +div.relations { + display: none; +} + + +div.sphinxsidebar { + max-height: 100%; + overflow-y: auto; +} + +div.sphinxsidebar a { + color: #444; + text-decoration: none; + border-bottom: 1px dotted #999; +} + +div.sphinxsidebar a:hover { + border-bottom: 1px solid #999; +} + +div.sphinxsidebarwrapper { + padding: 18px 10px; +} + +div.sphinxsidebarwrapper p.logo { + padding: 0; + margin: -10px 0 0 0px; + text-align: center; +} + +div.sphinxsidebarwrapper h1.logo { + margin-top: -10px; + text-align: center; + margin-bottom: 5px; + text-align: left; +} + +div.sphinxsidebarwrapper h1.logo-name { + margin-top: 0px; +} + +div.sphinxsidebarwrapper p.blurb { + margin-top: 0; + font-style: normal; +} + +div.sphinxsidebar h3, +div.sphinxsidebar h4 { + font-family: Georgia; + color: #444; + font-size: 24px; + font-weight: normal; + margin: 0 0 5px 0; + padding: 0; +} + +div.sphinxsidebar h4 { + font-size: 20px; +} + +div.sphinxsidebar h3 a { + color: #444; +} + +div.sphinxsidebar p.logo a, +div.sphinxsidebar h3 a, +div.sphinxsidebar p.logo a:hover, +div.sphinxsidebar h3 a:hover { + border: none; +} + +div.sphinxsidebar p { + color: #555; + margin: 10px 0; +} + +div.sphinxsidebar ul { + margin: 10px 0; + padding: 0; + color: #000; +} + +div.sphinxsidebar ul li.toctree-l1 > a { + font-size: 120%; +} + +div.sphinxsidebar ul li.toctree-l2 > a { + font-size: 110%; +} + +div.sphinxsidebar input { + border: 1px solid #CCC; + font-family: Georgia; + font-size: 1em; +} + +div.sphinxsidebar #searchbox input[type="text"] { + width: 160px; +} + +div.sphinxsidebar .search > div { + display: table-cell; +} + +div.sphinxsidebar hr { + border: none; + height: 1px; + color: #AAA; + background: #AAA; + + text-align: left; + margin-left: 0; + width: 50%; +} + +div.sphinxsidebar .badge { + border-bottom: none; +} + +div.sphinxsidebar .badge:hover { + border-bottom: none; +} + +/* To address an issue with donation coming after search */ +div.sphinxsidebar h3.donation { + margin-top: 10px; +} + +/* -- body styles ----------------------------------------------------------- */ + +a { + color: #004B6B; + text-decoration: underline; +} + +a:hover { + color: #6D4100; + text-decoration: underline; +} + +div.body h1, +div.body h2, +div.body h3, +div.body h4, +div.body h5, +div.body h6 { + font-family: Georgia; + font-weight: normal; + margin: 30px 0px 10px 0px; + padding: 0; +} + +div.body h1 { margin-top: 0; padding-top: 0; font-size: 240%; } +div.body h2 { font-size: 180%; } +div.body h3 { font-size: 150%; } +div.body h4 { font-size: 130%; } +div.body h5 { font-size: 100%; } +div.body h6 { font-size: 100%; } + +a.headerlink { + color: #DDD; + padding: 0 4px; + text-decoration: none; +} + +a.headerlink:hover { + color: #444; + background: #EAEAEA; +} + +div.body p, div.body dd, div.body li { + line-height: 1.4em; +} + +div.admonition { + margin: 20px 0px; + padding: 10px 30px; + background-color: #EEE; + border: 1px solid #CCC; +} + +div.admonition tt.xref, div.admonition code.xref, div.admonition a tt { + background-color: #FBFBFB; + border-bottom: 1px solid #fafafa; +} + +div.admonition p.admonition-title { + font-family: Georgia; + font-weight: normal; + font-size: 24px; + margin: 0 0 10px 0; + padding: 0; + line-height: 1; +} + +div.admonition p.last { + margin-bottom: 0; +} + +div.highlight { + background-color: #fff; +} + +dt:target, .highlight { + background: #FAF3E8; +} + +div.warning { + background-color: #FCC; + border: 1px solid #FAA; +} + +div.danger { + background-color: #FCC; + border: 1px solid #FAA; + -moz-box-shadow: 2px 2px 4px #D52C2C; + -webkit-box-shadow: 2px 2px 4px #D52C2C; + box-shadow: 2px 2px 4px #D52C2C; +} + +div.error { + background-color: #FCC; + border: 1px solid #FAA; + -moz-box-shadow: 2px 2px 4px #D52C2C; + -webkit-box-shadow: 2px 2px 4px #D52C2C; + box-shadow: 2px 2px 4px #D52C2C; +} + +div.caution { + background-color: #FCC; + border: 1px solid #FAA; +} + +div.attention { + background-color: #FCC; + border: 1px solid #FAA; +} + +div.important { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.note { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.tip { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.hint { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.seealso { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.topic { + background-color: #EEE; +} + +p.admonition-title { + display: inline; +} + +p.admonition-title:after { + content: ":"; +} + +pre, tt, code { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; + font-size: 0.9em; +} + +.hll { + background-color: #FFC; + margin: 0 -12px; + padding: 0 12px; + display: block; +} + +img.screenshot { +} + +tt.descname, tt.descclassname, code.descname, code.descclassname { + font-size: 0.95em; +} + +tt.descname, code.descname { + padding-right: 0.08em; +} + +img.screenshot { + -moz-box-shadow: 2px 2px 4px #EEE; + -webkit-box-shadow: 2px 2px 4px #EEE; + box-shadow: 2px 2px 4px #EEE; +} + +table.docutils { + border: 1px solid #888; + -moz-box-shadow: 2px 2px 4px #EEE; + -webkit-box-shadow: 2px 2px 4px #EEE; + box-shadow: 2px 2px 4px #EEE; +} + +table.docutils td, table.docutils th { + border: 1px solid #888; + padding: 0.25em 0.7em; +} + +table.field-list, table.footnote { + border: none; + -moz-box-shadow: none; + -webkit-box-shadow: none; + box-shadow: none; +} + +table.footnote { + margin: 15px 0; + width: 100%; + border: 1px solid #EEE; + background: #FDFDFD; + font-size: 0.9em; +} + +table.footnote + table.footnote { + margin-top: -15px; + border-top: none; +} + +table.field-list th { + padding: 0 0.8em 0 0; +} + +table.field-list td { + padding: 0; +} + +table.field-list p { + margin-bottom: 0.8em; +} + +/* Cloned from + * https://github.com/sphinx-doc/sphinx/commit/ef60dbfce09286b20b7385333d63a60321784e68 + */ +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +table.footnote td.label { + width: .1px; + padding: 0.3em 0 0.3em 0.5em; +} + +table.footnote td { + padding: 0.3em 0.5em; +} + +dl { + margin-left: 0; + margin-right: 0; + margin-top: 0; + padding: 0; +} + +dl dd { + margin-left: 30px; +} + +blockquote { + margin: 0 0 0 30px; + padding: 0; +} + +ul, ol { + /* Matches the 30px from the narrow-screen "li > ul" selector below */ + margin: 10px 0 10px 30px; + padding: 0; +} + +pre { + background: #EEE; + padding: 7px 30px; + margin: 15px 0px; + line-height: 1.3em; +} + +div.viewcode-block:target { + background: #ffd; +} + +dl pre, blockquote pre, li pre { + margin-left: 0; + padding-left: 30px; +} + +tt, code { + background-color: #ecf0f3; + color: #222; + /* padding: 1px 2px; */ +} + +tt.xref, code.xref, a tt { + background-color: #FBFBFB; + border-bottom: 1px solid #fff; +} + +a.reference { + text-decoration: none; + border-bottom: 1px dotted #004B6B; +} + +/* Don't put an underline on images */ +a.image-reference, a.image-reference:hover { + border-bottom: none; +} + +a.reference:hover { + border-bottom: 1px solid #6D4100; +} + +a.footnote-reference { + text-decoration: none; + font-size: 0.7em; + vertical-align: top; + border-bottom: 1px dotted #004B6B; +} + +a.footnote-reference:hover { + border-bottom: 1px solid #6D4100; +} + +a:hover tt, a:hover code { + background: #EEE; +} + + +@media screen and (max-width: 870px) { + + div.sphinxsidebar { + display: none; + } + + div.document { + width: 100%; + + } + + div.documentwrapper { + margin-left: 0; + margin-top: 0; + margin-right: 0; + margin-bottom: 0; + } + + div.bodywrapper { + margin-top: 0; + margin-right: 0; + margin-bottom: 0; + margin-left: 0; + } + + ul { + margin-left: 0; + } + + li > ul { + /* Matches the 30px from the "ul, ol" selector above */ + margin-left: 30px; + } + + .document { + width: auto; + } + + .footer { + width: auto; + } + + .bodywrapper { + margin: 0; + } + + .footer { + width: auto; + } + + .github { + display: none; + } + + + +} + + + +@media screen and (max-width: 875px) { + + body { + margin: 0; + padding: 20px 30px; + } + + div.documentwrapper { + float: none; + background: #fff; + } + + div.sphinxsidebar { + display: block; + float: none; + width: 102.5%; + margin: 50px -30px -20px -30px; + padding: 10px 20px; + background: #333; + color: #FFF; + } + + div.sphinxsidebar h3, div.sphinxsidebar h4, div.sphinxsidebar p, + div.sphinxsidebar h3 a { + color: #fff; + } + + div.sphinxsidebar a { + color: #AAA; + } + + div.sphinxsidebar p.logo { + display: none; + } + + div.document { + width: 100%; + margin: 0; + } + + div.footer { + display: none; + } + + div.bodywrapper { + margin: 0; + } + + div.body { + min-height: 0; + padding: 0; + } + + .rtd_doc_footer { + display: none; + } + + .document { + width: auto; + } + + .footer { + width: auto; + } + + .footer { + width: auto; + } + + .github { + display: none; + } +} + + +/* misc. */ + +.revsys-inline { + display: none!important; +} + +/* Hide ugly table cell borders in ..bibliography:: directive output */ +table.docutils.citation, table.docutils.citation td, table.docutils.citation th { + border: none; + /* Below needed in some edge cases; if not applied, bottom shadows appear */ + -moz-box-shadow: none; + -webkit-box-shadow: none; + box-shadow: none; +} + + +/* relbar */ + +.related { + line-height: 30px; + width: 100%; + font-size: 0.9rem; +} + +.related.top { + border-bottom: 1px solid #EEE; + margin-bottom: 20px; +} + +.related.bottom { + border-top: 1px solid #EEE; +} + +.related ul { + padding: 0; + margin: 0; + list-style: none; +} + +.related li { + display: inline; +} + +nav#rellinks { + float: right; +} + +nav#rellinks li+li:before { + content: "|"; +} + +nav#breadcrumbs li+li:before { + content: "\00BB"; +} + +/* Hide certain items when printing */ +@media print { + div.related { + display: none; + } +} \ No newline at end of file diff --git a/manual/v1.0.0/en/html/_static/basic.css b/manual/v1.0.0/en/html/_static/basic.css new file mode 100644 index 0000000..4157edf --- /dev/null +++ b/manual/v1.0.0/en/html/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: inherit; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/manual/v1.0.0/en/html/_static/custom.css b/manual/v1.0.0/en/html/_static/custom.css new file mode 100644 index 0000000..2a924f1 --- /dev/null +++ b/manual/v1.0.0/en/html/_static/custom.css @@ -0,0 +1 @@ +/* This file intentionally left blank. */ diff --git a/manual/v1.0.0/en/html/_static/doctools.js b/manual/v1.0.0/en/html/_static/doctools.js new file mode 100644 index 0000000..d06a71d --- /dev/null +++ b/manual/v1.0.0/en/html/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/manual/v1.0.0/en/html/_static/documentation_options.js b/manual/v1.0.0/en/html/_static/documentation_options.js new file mode 100644 index 0000000..89435bb --- /dev/null +++ b/manual/v1.0.0/en/html/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '1.0.0', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/manual/v1.0.0/en/html/_static/file.png b/manual/v1.0.0/en/html/_static/file.png new file mode 100644 index 0000000000000000000000000000000000000000..a858a410e4faa62ce324d814e4b816fff83a6fb3 GIT binary patch literal 286 zcmV+(0pb3MP)s`hMrGg#P~ix$^RISR_I47Y|r1 z_CyJOe}D1){SET-^Amu_i71Lt6eYfZjRyw@I6OQAIXXHDfiX^GbOlHe=Ae4>0m)d(f|Me07*qoM6N<$f}vM^LjV8( literal 0 HcmV?d00001 diff --git a/manual/v1.0.0/en/html/_static/language_data.js b/manual/v1.0.0/en/html/_static/language_data.js new file mode 100644 index 0000000..250f566 --- /dev/null +++ b/manual/v1.0.0/en/html/_static/language_data.js @@ -0,0 +1,199 @@ +/* + * language_data.js + * ~~~~~~~~~~~~~~~~ + * + * This script contains the language-specific data used by searchtools.js, + * namely the list of stopwords, stemmer, scorer and splitter. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +var stopwords = ["a", "and", "are", "as", "at", "be", "but", "by", "for", "if", "in", "into", "is", "it", "near", "no", "not", "of", "on", "or", "such", "that", "the", "their", "then", "there", "these", "they", "this", "to", "was", "will", "with"]; + + +/* Non-minified version is copied as a separate JS file, is available */ + +/** + * Porter Stemmer + */ +var Stemmer = function() { + + var step2list = { + ational: 'ate', + tional: 'tion', + enci: 'ence', + anci: 'ance', + izer: 'ize', + bli: 'ble', + alli: 'al', + entli: 'ent', + eli: 'e', + ousli: 'ous', + ization: 'ize', + ation: 'ate', + ator: 'ate', + alism: 'al', + iveness: 'ive', + fulness: 'ful', + ousness: 'ous', + aliti: 'al', + iviti: 'ive', + biliti: 'ble', + logi: 'log' + }; + + var step3list = { + icate: 'ic', + ative: '', + alize: 'al', + iciti: 'ic', + ical: 'ic', + ful: '', + ness: '' + }; + + var c = "[^aeiou]"; // consonant + var v = "[aeiouy]"; // vowel + var C = c + "[^aeiouy]*"; // consonant sequence + var V = v + "[aeiou]*"; // vowel sequence + + var mgr0 = "^(" + C + ")?" + V + C; // [C]VC... is m>0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/manual/v1.0.0/en/html/_static/minus.png b/manual/v1.0.0/en/html/_static/minus.png new file mode 100644 index 0000000000000000000000000000000000000000..d96755fdaf8bb2214971e0db9c1fd3077d7c419d GIT binary patch literal 90 zcmeAS@N?(olHy`uVBq!ia0vp^+#t*WBp7;*Yy1LIik>cxAr*|t7R?Mi>2?kWtu=nj kDsEF_5m^0CR;1wuP-*O&G^0G}KYk!hp00i_>zopr08q^qX#fBK literal 0 HcmV?d00001 diff --git a/manual/v1.0.0/en/html/_static/plus.png b/manual/v1.0.0/en/html/_static/plus.png new file mode 100644 index 0000000000000000000000000000000000000000..7107cec93a979b9a5f64843235a16651d563ce2d GIT binary patch literal 90 zcmeAS@N?(olHy`uVBq!ia0vp^+#t*WBp7;*Yy1LIik>cxAr*|t7R?Mi>2?kWtu>-2 m3q%Vub%g%s<8sJhVPMczOq}xhg9DJoz~JfX=d#Wzp$Pyb1r*Kz literal 0 HcmV?d00001 diff --git a/manual/v1.0.0/en/html/_static/pygments.css b/manual/v1.0.0/en/html/_static/pygments.css new file mode 100644 index 0000000..0d49244 --- /dev/null +++ b/manual/v1.0.0/en/html/_static/pygments.css @@ -0,0 +1,75 @@ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #ffffcc } +.highlight { background: #eeffcc; } +.highlight .c { color: #408090; font-style: italic } /* Comment */ +.highlight .err { border: 1px solid #FF0000 } /* Error */ +.highlight .k { color: #007020; font-weight: bold } /* Keyword */ +.highlight .o { color: #666666 } /* Operator */ +.highlight .ch { color: #408090; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #408090; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #007020 } /* Comment.Preproc */ +.highlight .cpf { color: #408090; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #408090; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #408090; background-color: #fff0f0 } /* Comment.Special */ +.highlight .gd { color: #A00000 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +.highlight .gr { color: #FF0000 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #00A000 } /* Generic.Inserted */ +.highlight .go { color: #333333 } /* Generic.Output */ +.highlight .gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #0044DD } /* Generic.Traceback */ +.highlight .kc { color: #007020; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #007020; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #007020; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #007020 } /* Keyword.Pseudo */ +.highlight .kr { color: #007020; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #902000 } /* Keyword.Type */ +.highlight .m { color: #208050 } /* Literal.Number */ +.highlight .s { color: #4070a0 } /* Literal.String */ +.highlight .na { color: #4070a0 } /* Name.Attribute */ +.highlight .nb { color: #007020 } /* Name.Builtin */ +.highlight .nc { color: #0e84b5; font-weight: bold } /* Name.Class */ +.highlight .no { color: #60add5 } /* Name.Constant */ +.highlight .nd { color: #555555; font-weight: bold } /* Name.Decorator */ +.highlight .ni { color: #d55537; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #007020 } /* Name.Exception */ +.highlight .nf { color: #06287e } /* Name.Function */ +.highlight .nl { color: #002070; font-weight: bold } /* Name.Label */ +.highlight .nn { color: #0e84b5; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #062873; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #bb60d5 } /* Name.Variable */ +.highlight .ow { color: #007020; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mb { color: #208050 } /* Literal.Number.Bin */ +.highlight .mf { color: #208050 } /* Literal.Number.Float */ +.highlight .mh { color: #208050 } /* Literal.Number.Hex */ +.highlight .mi { color: #208050 } /* Literal.Number.Integer */ +.highlight .mo { color: #208050 } /* Literal.Number.Oct */ +.highlight .sa { color: #4070a0 } /* Literal.String.Affix */ +.highlight .sb { color: #4070a0 } /* Literal.String.Backtick */ +.highlight .sc { color: #4070a0 } /* Literal.String.Char */ +.highlight .dl { color: #4070a0 } /* Literal.String.Delimiter */ +.highlight .sd { color: #4070a0; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #4070a0 } /* Literal.String.Double */ +.highlight .se { color: #4070a0; font-weight: bold } /* Literal.String.Escape */ +.highlight .sh { color: #4070a0 } /* Literal.String.Heredoc */ +.highlight .si { color: #70a0d0; font-style: italic } /* Literal.String.Interpol */ +.highlight .sx { color: #c65d09 } /* Literal.String.Other */ +.highlight .sr { color: #235388 } /* Literal.String.Regex */ +.highlight .s1 { color: #4070a0 } /* Literal.String.Single */ +.highlight .ss { color: #517918 } /* Literal.String.Symbol */ +.highlight .bp { color: #007020 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #06287e } /* Name.Function.Magic */ +.highlight .vc { color: #bb60d5 } /* Name.Variable.Class */ +.highlight .vg { color: #bb60d5 } /* Name.Variable.Global */ +.highlight .vi { color: #bb60d5 } /* Name.Variable.Instance */ +.highlight .vm { color: #bb60d5 } /* Name.Variable.Magic */ +.highlight .il { color: #208050 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/manual/v1.0.0/en/html/_static/searchtools.js b/manual/v1.0.0/en/html/_static/searchtools.js new file mode 100644 index 0000000..7918c3f --- /dev/null +++ b/manual/v1.0.0/en/html/_static/searchtools.js @@ -0,0 +1,574 @@ +/* + * searchtools.js + * ~~~~~~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for the full-text search. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // or matches in the last dotted part of the object name + objPartialMatch: 6, + // Additive scores depending on the priority of the object + objPrio: { + 0: 15, // used to be importantResults + 1: 5, // used to be objectResults + 2: -5, // used to be unimportantResults + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +const _removeChildren = (element) => { + while (element && element.lastChild) element.removeChild(element.lastChild); +}; + +/** + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping + */ +const _escapeRegExp = (string) => + string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string + +const _displayItem = (item, searchTerms, highlightTerms) => { + const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; + const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; + const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; + const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; + const contentRoot = document.documentElement.dataset.content_root; + + const [docName, title, anchor, descr, score, _filename] = item; + + let listItem = document.createElement("li"); + let requestUrl; + let linkUrl; + if (docBuilder === "dirhtml") { + // dirhtml builder + let dirname = docName + "/"; + if (dirname.match(/\/index\/$/)) + dirname = dirname.substring(0, dirname.length - 6); + else if (dirname === "index/") dirname = ""; + requestUrl = contentRoot + dirname; + linkUrl = requestUrl; + } else { + // normal html builders + requestUrl = contentRoot + docName + docFileSuffix; + linkUrl = docName + docLinkSuffix; + } + let linkEl = listItem.appendChild(document.createElement("a")); + linkEl.href = linkUrl + anchor; + linkEl.dataset.score = score; + linkEl.innerHTML = title; + if (descr) { + listItem.appendChild(document.createElement("span")).innerHTML = + " (" + descr + ")"; + // highlight search terms in the description + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + } + else if (showSearchSummary) + fetch(requestUrl) + .then((responseData) => responseData.text()) + .then((data) => { + if (data) + listItem.appendChild( + Search.makeSearchSummary(data, searchTerms) + ); + // highlight search terms in the summary + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + }); + Search.output.appendChild(listItem); +}; +const _finishSearch = (resultCount) => { + Search.stopPulse(); + Search.title.innerText = _("Search Results"); + if (!resultCount) + Search.status.innerText = Documentation.gettext( + "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories." + ); + else + Search.status.innerText = _( + `Search finished, found ${resultCount} page(s) matching the search query.` + ); +}; +const _displayNextItem = ( + results, + resultCount, + searchTerms, + highlightTerms, +) => { + // results left, load the summary and display it + // this is intended to be dynamic (don't sub resultsCount) + if (results.length) { + _displayItem(results.pop(), searchTerms, highlightTerms); + setTimeout( + () => _displayNextItem(results, resultCount, searchTerms, highlightTerms), + 5 + ); + } + // search finished, update title and status message + else _finishSearch(resultCount); +}; + +/** + * Default splitQuery function. Can be overridden in ``sphinx.search`` with a + * custom function per language. + * + * The regular expression works by splitting the string on consecutive characters + * that are not Unicode letters, numbers, underscores, or emoji characters. + * This is the same as ``\W+`` in Python, preserving the surrogate pair area. + */ +if (typeof splitQuery === "undefined") { + var splitQuery = (query) => query + .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu) + .filter(term => term) // remove remaining empty strings +} + +/** + * Search Module + */ +const Search = { + _index: null, + _queued_query: null, + _pulse_status: -1, + + htmlToText: (htmlString) => { + const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); + htmlElement.querySelectorAll(".headerlink").forEach((el) => { el.remove() }); + const docContent = htmlElement.querySelector('[role="main"]'); + if (docContent !== undefined) return docContent.textContent; + console.warn( + "Content block not found. Sphinx search tries to obtain it via '[role=main]'. Could you check your theme or template." + ); + return ""; + }, + + init: () => { + const query = new URLSearchParams(window.location.search).get("q"); + document + .querySelectorAll('input[name="q"]') + .forEach((el) => (el.value = query)); + if (query) Search.performSearch(query); + }, + + loadIndex: (url) => + (document.body.appendChild(document.createElement("script")).src = url), + + setIndex: (index) => { + Search._index = index; + if (Search._queued_query !== null) { + const query = Search._queued_query; + Search._queued_query = null; + Search.query(query); + } + }, + + hasIndex: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + Search.dots.innerText = ".".repeat(Search._pulse_status); + if (Search._pulse_status >= 0) window.setTimeout(pulse, 500); + }; + pulse(); + }, + + /** + * perform a search for something (or wait until index is loaded) + */ + performSearch: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + /** + * execute search (requires search index to be loaded) + */ + query: (query) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + // array of [docname, title, anchor, descr, score, filename] + let results = []; + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + let score = Math.round(100 * queryLower.length / title.length) + results.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id] of foundEntries) { + let score = Math.round(100 * queryLower.length / entry.length) + results.push([ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // lookup as object + objectTerms.forEach((term) => + results.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + results.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) results.forEach((item) => (item[4] = Scorer.score(item))); + + // now sort the results by score (in opposite order of appearance, since the + // display function below uses pop() to retrieve items) and then + // alphabetically + results.sort((a, b) => { + const leftScore = a[4]; + const rightScore = b[4]; + if (leftScore === rightScore) { + // same score: sort alphabetically + const leftTitle = a[1].toLowerCase(); + const rightTitle = b[1].toLowerCase(); + if (leftTitle === rightTitle) return 0; + return leftTitle > rightTitle ? -1 : 1; // inverted is intentional + } + return leftScore > rightScore ? 1 : -1; + }); + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + results = results.reverse(); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms, highlightTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord) && !terms[word]) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord) && !titleTerms[word]) + arr.push({ files: titleTerms[word], score: Scorer.partialTitle }); + }); + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (fileMap.has(file) && fileMap.get(file).indexOf(word) === -1) + fileMap.get(file).push(word); + else fileMap.set(file, [word]); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords) => { + const text = Search.htmlToText(htmlText); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/manual/v1.0.0/en/html/_static/sphinx_highlight.js b/manual/v1.0.0/en/html/_static/sphinx_highlight.js new file mode 100644 index 0000000..8a96c69 --- /dev/null +++ b/manual/v1.0.0/en/html/_static/sphinx_highlight.js @@ -0,0 +1,154 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + const rest = document.createTextNode(val.substr(pos + text.length)); + parent.insertBefore( + span, + parent.insertBefore( + rest, + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + /* There may be more occurrences of search term in this node. So call this + * function recursively on the remaining fragment. + */ + _highlight(rest, addItems, text, className); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute("class", className); + addItems.push({ parent: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(() => { + /* Do not call highlightSearchWords() when we are on the search page. + * It will highlight words from the *previous* search query. + */ + if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords(); + SphinxHighlight.initEscapeListener(); +}); diff --git a/manual/v1.0.0/en/html/cif2x/about/index.html b/manual/v1.0.0/en/html/cif2x/about/index.html new file mode 100644 index 0000000..efe9cde --- /dev/null +++ b/manual/v1.0.0/en/html/cif2x/about/index.html @@ -0,0 +1,173 @@ + + + + + + + + 1. Introduction — cif2x Users Guide 1.0.0 documentation + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

1. Introduction

+
+

1.1. What is cif2x?

+

In recent years, the use of machine learning for predicting material properties and designing substances (known as materials informatics) has gained considerable attention. +The accuracy of machine learning depends heavily on the preparation of appropriate training data. +Therefore, the development of tools and environments for the rapid generation of training data is expected to contribute significantly to the advancement of research in materials informatics.

+

Cif2x is a tool that generates input files for first-principles calculations from cif files. +It constructs parts that vary depending on the type of material and computational conditions from crystal structure data, using input parameters as a template. +It is capable of generating multiple input files tailored to specific computational conditions. +Currently, it supports VASP, Quantum ESPRESSO, OpenMX, and AkaiKKR.

+
+
+

1.2. License

+

The distribution of the program package and the source codes for cif2x follow GNU General Public License version 3 (GPL v3) or later.

+
+
+

1.3. Contributors

+

This software was developed by the following contributors.

+
    +
  • ver.1.0.0 (Released on 2024/03/XX)

  • +
  • ver.1.0-alpha (Released on 2023/12/28)

    +
      +
    • Developers

      +
        +
      • Kazuyoshi Yoshimi (The Instutite for Solid State Physics, The University of Tokyo)

      • +
      • Tatsumi Aoyama (The Instutite for Solid State Physics, The University of Tokyo)

      • +
      • Yuichi Motoyama (The Instutite for Solid State Physics, The University of Tokyo)

      • +
      • Masahiro Fukuda (The Instutite for Solid State Physics, The University of Tokyo)

      • +
      • Kota Ido (The Instutite for Solid State Physics, The University of Tokyo)

      • +
      • Tetsuya Fukushima (The National Institute of Advanced Industrial Science and Technology (AIST))

      • +
      • Shusuke Kasamatsu (Yamagata University)

      • +
      • Takashi Koretsune (Tohoku University)

      • +
      +
    • +
    • Project Corrdinator

      +
        +
      • Taisuke Ozaki (The Instutite for Solid State Physics, The University of Tokyo)

      • +
      +
    • +
    +
  • +
+
+ +
+

1.5. Operating environment

+

This tool was tested on the following platforms:

+
    +
  • Ubuntu Linux + python3

  • +
+
+
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/manual/v1.0.0/en/html/cif2x/appendix/index.html b/manual/v1.0.0/en/html/cif2x/appendix/index.html new file mode 100644 index 0000000..dbff56c --- /dev/null +++ b/manual/v1.0.0/en/html/cif2x/appendix/index.html @@ -0,0 +1,148 @@ + + + + + + + + 6. Extension guide — cif2x Users Guide 1.0.0 documentation + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

6. Extension guide

+
+

6.1. Adding modes of Quantum ESPRESSO

+

In order to add supports to modes of Quantum ESPRESSO, the mapping between the modes and the transformation classes should be added to create_modeproc() function in src/cif2x/qe/calc_mode.py.

+
def create_modeproc(mode, qe):
+    if mode in ["scf", "nscf"]:
+        modeproc = QEmode_pw(qe)
+    else:
+        modeproc = QEmode_generic(qe)
+    return modeproc
+
+
+

The transformation functionality for each mode is provided as a derived class of QEmode_base class. This class implements methods update_namelist() for updating the namelist block, and update_cards() for generating data of card blocks. +In the current version, two classes are provided: QEmode_pw class for scf and nscf calculations of pw.x, and QEmode_generic class for generating output as-is.

+
class QEmode_base:
+    def __init__(self, qe):
+    def update_namelist(self, content):
+    def update_cards(self, content):
+
+
+

For the namelist, the transformation class generates values for blank entries from crystal structure data and other sources. It may also force to set values such as the lattice parameters that are determined from the crystal structure data, or those that must be specified consistently with other parameters. The functions are provided for each mode separately.

+

For card blocks, a function is provided for each card, and the mapping between the card type and the function is given in the card_table variable. +The method update_cards() in the base class picks up and runs the function associated to the card, and updates the content of the card. Of course, a new update_cards() function may be defined.

+
self.card_table = {
+    'CELL_PARAMETERS': generate_cell_parameters,
+    'ATOMIC_SPECIES': generate_atomic_species,
+    'ATOMIC_POSITIONS': generate_atomic_positions,
+    'K_POINTS': generate_k_points,
+}
+
+
+

The functions for cards are gathered in src/cif2x/qe/cards.py with the function names as generate_{card name}. These functions takes parameters for card blocks as argument, and returns a dictionary containing the card name, the options, and the data field.

+
+
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/manual/v1.0.0/en/html/cif2x/basic-usage.html b/manual/v1.0.0/en/html/cif2x/basic-usage.html new file mode 100644 index 0000000..5fd9b27 --- /dev/null +++ b/manual/v1.0.0/en/html/cif2x/basic-usage.html @@ -0,0 +1,228 @@ + + + + + + + + 2. Installation and basic usage — cif2x Users Guide 1.0.0 documentation + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

2. Installation and basic usage

+

Prerequisite

+
+

Input file generator for first-principles calculation cif2x included in HTP-tools requires the following programs and libraries:

+
    +
  • python 3.x

  • +
  • pymatgen module

  • +
  • ruamel.yaml module

  • +
  • f90nml module

  • +
  • qe-tools module

  • +
  • numpy module

  • +
  • pandas module

  • +
  • monty module

  • +
  • OpenBabel module (optional)

  • +
  • AkaiKKRPythonUtil module

  • +
+
+

Official pages

+
+
+

Downloads

+
+

cif2x can be downloaded by the following command with git:

+
$ git clone https://github.com/issp-center-dev/cif2x.git
+
+
+
+

Installation

+
+

Once the source files are obtained, you can install cif2x by running the following command. The required libraries will also be installed automatically at the same time.

+
$ cd ./cif2x
+$ python3 -m pip install .
+
+
+

The executable file cif2x will be installed. +You may need to add --user option next to install keyword above in case you are not allowed to install packages system-wide.

+

AkaiKKRPythonUtil module need to be installed separately. The source package is available from the repository. Then follow the steps below to install the module along with the required seaborn module:

+
$ git clone https://github.com/AkaiKKRteam/AkaiKKRPythonUtil.git
+$ cd ./AkaiKKRPythonUtil/library/PyAkaiKKR
+$ python3 -m pip install .
+$ python3 -m pip install seaborn
+
+
+
+

Directory structure

+
+
.
+|-- LICENSE
+|-- README.md
+|-- pyproject.toml
+|-- docs/
+|   |-- ja/
+|   |-- en/
+|   |-- tutorial/
+|-- src/
+|   |-- cif2x/
+|       |-- __init__.py
+|       |-- main.py
+|       |-- cif2struct.py
+|       |-- struct2qe.py
+|       |-- qe/
+|       |   |-- __init__.py
+|       |   |-- calc_mode.py
+|       |   |-- cards.py
+|       |   |-- content.py
+|       |   |-- qeutils.py
+|       |   |-- tools.py
+|       |-- struct2vasp.py
+|       |-- struct2openmx.py
+|       |-- openmx/
+|       |   |-- __init__.py
+|       |   |-- vps_table.py
+|       |-- struct2akaikkr.py
+|       |-- akaikkr/
+|       |   |-- make_input.py
+|       |   |-- read_input.py
+|       |   |-- run_cif2kkr.py
+|       |-- utils.py
+|-- sample/
+
+
+
+

Basic usage

+
+

cif2x is a tool to generate a set of input files for first-principles calculation software. It takes an input parameter file as a template, and generates parameter items that may vary by materials and calculation conditions from crystallographic data. In the present version, cif2x supports Quantum ESPRESSO, VASP, OpenMX, and AkaiKKR.

+
    +
  1. Prepare input parameter file

    +
    +

    First, you need to create an input parameter file in YAML format that describes contents of the input file to be generated for the first-principles calculation software.

    +
    +
  2. +
  3. Prepare crystal structure files and pseudo-potential files

    +
    +

    The crystal structure data need to be prepared for the target materials. The file format is CIF, POSCAR, xfs, or those supported by pymatgen.

    +

    For Quantum ESPRESSO, the pseudo-potential files and the index file in CSV format need to be placed. Their locations are specified in the input parameter file.

    +

    For VASP, the location of the pseudo-potential files will be specified in a file ~/.config/.pmgrc.yaml or by an environment variable. It may be specified in the input parameter file.

    +
    +
  4. +
  5. Run command

    +
    +

    Run cif2x command with the input parameter file and the crystal structure data as arguments. To generate input files for Quantum ESPRESSO, the target option -t QE should be specified. The option turns to -t VASP for VASP, -t OpenMX for OpenMX, and -t AkaiKKR for AkaiKKR.

    +
    $ cif2x -t QE input.yaml material.cif
    +
    +
    +
    +
  6. +
+
+
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/manual/v1.0.0/en/html/cif2x/command/index.html b/manual/v1.0.0/en/html/cif2x/command/index.html new file mode 100644 index 0000000..980873b --- /dev/null +++ b/manual/v1.0.0/en/html/cif2x/command/index.html @@ -0,0 +1,166 @@ + + + + + + + + 4. Command reference — cif2x Users Guide 1.0.0 documentation + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

4. Command reference

+
+

4.1. cif2x

+
+

Generate input files for first-principles calculation software

+
+

SYNOPSIS:

+
+
cif2x [-v][-q] -t target input_yaml material.cif
+cif2x -h
+cif2x --version
+
+
+
+

DESCRIPTION:

+
+

This program reads an input parameter file specified by input_yaml and a crystal data file specified by material.cif, and generates a set of input files for first-principles calculation software. In the current version, the supported software includes Quantum ESPRESSO, VASP, and OpenMX. +It takes the following command line options.

+
    +
  • -v

    +

    increases verbosity of the runtime messages. When specified multiple times, the program becomes more verbose.

    +
  • +
  • -q

    +

    decreases verbosity of the runtime messages. It cancels the effect of -v option, and when specified multiple times, the program becomes more quiet.

    +
  • +
  • -t target

    +

    specifies the target first-principles calculation software. The supported software for target is listed as follows:

    +
      +
    • QE, espresso, quantum_espresso: generates input files for Quantum ESPRESSO.

    • +
    • VASP: generates input files for VASP.

    • +
    • OpenMX: generates input files for OpenMX.

    • +
    • AkaiKKR: generates input files for AkaiKKR.

    • +
    +
  • +
  • input_yaml

    +

    specifies an input parameter file in YAML format.

    +
  • +
  • material.cif

    +

    specifies crystal structure data file. It is in CIF (Crystallographic Information Framework) format, or other format supported by pymatgen.

    +
  • +
  • -h

    +

    displays help and exits.

    +
  • +
  • --version

    +

    displays version information.

    +
  • +
+
+
+
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/manual/v1.0.0/en/html/cif2x/filespec/index.html b/manual/v1.0.0/en/html/cif2x/filespec/index.html new file mode 100644 index 0000000..56bca00 --- /dev/null +++ b/manual/v1.0.0/en/html/cif2x/filespec/index.html @@ -0,0 +1,394 @@ + + + + + + + + 5. File format — cif2x Users Guide 1.0.0 documentation + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

5. File format

+
+

5.1. Input parameter file

+

An input parameter file describes information necessary to generate input files for first-principles calculation software by cif2x. It should be given in YAML format, and consist of the following sections.

+
+
    +
  1. structure section: describes how to handle crystal structure data.

  2. +
  3. optional section: describes pseudo-potential files, and symbol definitions for reference feature of YAML.

  4. +
  5. tasks section: describes contents of input files.

  6. +
+
+
+

structure

+
+

use_ibrav (default value: false)

+
+

This parameter specifies whether ibrav parameter is used for Quantum ESPRESSO as the input of the crystal structure. When it is set to true, the lattice is transformed to match the convention of Quantum ESPRESSO, and the lattice parameters a, b, c, cosab, cosac, and cosbc are written to the input file as needed.

+
+

tolerance (default value: 0.01)

+
+

This parameter specifies the tolerance in the difference between the reconstructed Structure data and the original data when use_ibrav is set to true.

+
+

supercell (default value: none)

+
+

This parameter specifies the size of supercell, when it is adopted, in the form of [\(n_x\), \(n_y\), \(n_z\)].

+
+
+
+
+

optional

+

This section contains global settings needed for the first-principles calculation software. The available parameters are described in the corresponding sections below.

+
+
+

tasks

+

This section defines contents of the input files. It is organized as a list of blocks, each corresponding to an input file, to allow for generating a set of input files for an input. The terms described in each block are explained in the following.

+
+

mode (Quantum ESPRESSO)

+
+

This parameter specifies the type of calculation. In the current version, the supported mode includes scf and nscf for pw.x of Quantum ESPRESSO. If an unsupported mode is specified, the settings in content will be exported as is.

+
+

output_file (Quantum ESPRESSO)

+
+

This parameter specifies the file name of the output.

+
+

output_dir

+
+

This parameter specifies the directory name of the output. The default value is the current directory.

+
+

content

+
+

This parameter describes the content of the output. +For Quantum ESPRESSO, it contains the namelist data (blocks starting from &system, &control, etc.) in namelist block, and other card data (such as K_POINTS) as individual blocks. Some card data may take parameters.

+
+

template (Quantum ESPRESSO)

+

template_dir (VASP)

+
+

These parameters specifies the template file and the template directory for the input files, respectively. If they are not given, templates will not be used. The content of the template file is merged with those of content. The entries in the template file will be superseded by those of content if the entries of the same keys appear both.

+
+
+
+
+

Specifying parameter set

+

An input parameter may be given a list or range of parameters. In this case, a separate directory is created for every combination of parameters to store the generated input files. A special syntax ${...} is used to specify the parameter set as follows:

+
    +
  • a list: ${[ A, B, ... ]}

    +

    a set of parameter values is described as a Python list. Each entry may be a scalar value, or a list of values.

    +
  • +
  • a range: ${range(N)}, ${range(start, end, step)}

    +

    a range of parameter is given by the keyword range. The former specifies the values from 0 to N-1, and the latter from start to end with every step. (If step is omitted, it is assumed to be 1.)

    +
  • +
+
+
+
+

5.2. Parameters for Quantum ESPRESSO

+

The entries of optional section and content part of the tasks section specific to Quantum ESPRESSO are explained below. +In the current version, scf mode and nscf mode of pw.x are supported.

+
+

optional section

+
+

pp_file

+
+

This parameter specifies the index file in CSV format that relates the element type and the pseudo-potential file. This file contains the following columns: element name, type of pseudo-potential, nexclude, orbitals. An example line is given as:

+
Fe,pbe-spn-rrkjus_psl.0.2.1,4,spd
+
+
+

The name of the pseudo-potential file corresponding to the above example reads +Fe.pbe-spn-rrkjus_psl.0.2.1.UPF .

+
+

cutoff_file

+
+

This parameter specifies the index file in CSV format that relates the pseudo-potential file and the cutoff values. This file contains the following columns: name of pseudo-potential file, ecutwfc value, ecutrho value.

+
+

pseudo_dir

+
+

This parameter specifies the name of the directory that holds pseudo-potential files. It is used when the cutoff values are obtained from the pseudo-potential files. +It is indenepent from the pseudo_dir parameter in the input files for Quantum ESPRESSO.

+
+
+
+
+

content

+
+

namelist

+
    +
  • The lattice specifications in &system block will be superseded according to use_ibrav parameter in the structure section.

    +
      +
    • use_ibrav = false: +ibrav is set to 0, and the lattice parameters including a, b, c, cosab, cosac, cosbc, celldm are removed.

    • +
    • use_ibrav = true: +ibrab is set to the index of Bravais lattices obtained from the crystal structure data. The Structure data will be reconstructed to match the convention of Quantum ESPRESSO.

    • +
    +
  • +
  • nat (the number of atoms) and ntyp (the number of element types) will be superseded by the values obtained from the crystal structure data.

  • +
  • The cutoff values ecutwfc and ecutrho are obtained from the pseudo-potential files if these parameters are left blank.

  • +
+

CELL_PARAMETERS

+
    +
  • This block will not be generated if use_ibrav is set to true. Otherwise, the lattice vectors are exported in units of angstrom.

  • +
  • The information of the lattice vectors are obtained from the crystal structure data. When the data field is defined and contains a 3x3 matrix, that value will be used for the set of lattice vectors instead.

  • +
+

ATOMIC_SPECIES

+
    +
  • This block exports a list of atom species, atomic mass, and the file name of the pseudo-potential data.

  • +
  • The information of the atoms are obtained from the crystal structure data. The file names of the pseudo-potential data are referred from the CSV-formatted index file specified by pp_list parameter.

  • +
  • When the data field is defined and contains the required data, these values will be used instead.

  • +
+

ATOMIC_POSITIONS

+
    +
  • This block exports the atomic species and their fractional coordinates.

  • +
  • When ignore_species is given to specify an atomic species or a list of species, the values of if_pos for these species will be set to 0. It is used for MD or structure relaxations.

  • +
  • When the data field is defined and contains the required data, these values will be used instead.

  • +
+

K_POINTS

+
    +
  • This block exports the information of k points. The type of the output is specified by the option parameter that takes one of the following:

    +
      +
    • gamma: uses \(\Gamma\) point.

    • +
    • crystal: generates a list of k points in mesh pattern. The mesh width is given by the grid parameter, or derived from the vol_density or k_resolution parameters.

    • +
    • automatic: generates a mesh of k points. It is given by the grid parameter, or derived from the vol_density or k_resolution parameters. The shift is obtained from the kshifts parameter.

    • +
    +
  • +
  • The mesh width is determined in the following order:

    +
      +
    • the grid parameter, specified by a list of \(n_x, n_y, n_z\), or a scalar value \(n\). For the latter, \(n_x = n_y = n_z = n\) is assumed.

    • +
    • derived from the vol_density parameter.

    • +
    • derived from the k_resolution parameter, whose default value is 0.15.

    • +
    +
  • +
  • When the data field is defined and contains the required data, these values will be used.

  • +
+
+
+
+
+

5.3. Parameters for VASP

+

The entries of optional section and content part of the tasks section specific to VASP are explained below.

+
+

optional

+

The type and the location of pseudo-potential files are specified.

+

According to pymatgen, the pseudo-potential files are obtained from +PMG_VASP_PSP_DIR/functional/POTCAR.{element}(.gz) or +PMG_VASP_PSP_DIR/functional/{element}/POTCAR, +where +PMG_VASP_PSP_DIR points to the directory and it is given in the configuration file +~/.config/.pmgrc.yaml or by the environment variable of the same name. +functional refers to the type of the pseudo-potential, whose value is predefined as +POT_GGA_PAW_PBE, POT_LDA_PAW, etc.

+
+

pseudo_functional

+
+

This parameter specifies the type of the pseudo-potential. The relation to the functional value above is defined in the table of pymatgen, for example, by PBE to POT_GGA_PAW_PBE, or by LDA to POT_LDA_PAW, or in a similar manner.

+
+
+

When the pseudo_dir parameter is specified, it is used as the directory that holds the pseudo-potential files, ignoring the convention of pymatgen.

+
+

psuedo_dir

+
+

This parameter specifies the directory that holds the pseudo-potential files. The paths to the pseudo-potential file turn to pseudo_dir/POTCAR.{element}(.gz), or pseudo_dir/{element}/POTCAR.

+
+
+
+
+

tasks

+

The template files are assumed to be placed in the directory specified by the template_dir parameter by the names INCAR, KPOINTS, POSCAR, and POTCAR. The missing files will be ignored.

+
+
+

content

+
+

incar

+
    +
  • This block contains parameters described in the INCAR file

  • +
+

kpoints

+
    +
  • type

    +

    The type parameter describes how KPOINTS are specified. The following values are allowed, with some types accepting parameters. See pymatgen.io.vasp manual for further details.

    +
      +
    • automatic

      +

      parameter: grid

      +
    • +
    • gamma_automatic

      +

      parameter: grid, shift

      +
    • +
    • monkhorst_automatic

      +

      parameter: grid, shift

      +
    • +
    • automatic_density

      +

      parameter: kppa, force_gamma

      +
    • +
    • automatic_gamma_density

      +

      parameter: grid_density

      +
    • +
    • automatic_density_by_vol

      +

      parameter: grid_density, force_gamma

      +
    • +
    • automatic_density_by_lengths

      +

      parameter: length_density, force_gamma

      +
    • +
    • automatic_linemode

      +

      parameter: division, path_type (corresponding to the path_type parameter of HighSymmKpath.)

      +
    • +
    +
  • +
+
+
+
+
+

5.4. Parameters for OpenMX

+

The entries of optional section and content part of the tasks section specific to OpenMX are explained below.

+
+

optional

+
+

data_path

+
+

This parameter specifies the name of directory that holds files for pseudo-atomic orbitals and pseudo-potentials. It corresponds to the DATA.PATH parameter.

+
+
+
+
+

content

+
+

precision

+
+

This parameter specifies the set of pseudo-atomic orbitals listed in Tables 1 and 2 of Section 10.6 of the OpenMX manual. It is one of quick, standard, or precise. The default value is quick.

+
+
+
+
+
+

5.5. Parameters for AkaiKKR

+

The entries of optional section and content part of the tasks section specific to AkaiKKR are explained below.

+
+

optional

+
+

workdir

+
+

This parameter specifies the directory in which temporal files are stored. If it is not given, /tmp or the value of the environment variable TMPDIR is used.

+
+
+
+
+

content

+

The content part contains the input parameters of AkaiKKR. +A blank is written to the input file for an unspecified parameter, to which the default value defined in AkaiKKR will be assumed. +The parameter values listed below are replaced by the values obtained from the crystal structure data.

+
    +
  • brvtyp, except when it is set to aux (or a string that contains aux).

  • +
  • lattice parameters, a, c/a, b/a, alpha, beta, gamma, r1, r2, r3.

  • +
  • type information, ntyp, type, ncmp, rmt, field, mxl, anclr, conc.

  • +
  • element information, natm, atmicx, atmtyp.

  • +
+

For rmt and field, the values specified in the input parameter file will be used only when they are lists having the same number of elements as ntyp.

+
+
+
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/manual/v1.0.0/en/html/cif2x/index.html b/manual/v1.0.0/en/html/cif2x/index.html new file mode 100644 index 0000000..ff983b6 --- /dev/null +++ b/manual/v1.0.0/en/html/cif2x/index.html @@ -0,0 +1,151 @@ + + + + + + + + Input file generator for first-principles calculations (cif2x) — cif2x Users Guide 1.0.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/manual/v1.0.0/en/html/cif2x/tutorial/index.html b/manual/v1.0.0/en/html/cif2x/tutorial/index.html new file mode 100644 index 0000000..2718b0d --- /dev/null +++ b/manual/v1.0.0/en/html/cif2x/tutorial/index.html @@ -0,0 +1,216 @@ + + + + + + + + 3. Tutorial — cif2x Users Guide 1.0.0 documentation + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

3. Tutorial

+

The procedure to use the input file generator cif2x for first-principles calculation software consists of preparing an input parameter file, crystal structure data, and pseudo-potential files, and running the program cif2x. +In the current version, the supported software includes Quantum ESPRESSO, VASP, OpenMX, and AkaiKKR. +In this tutorial, we will explain the steps along a sample for Quantum ESPRESSO in docs/tutorial/cif2x.

+
+

3.1. Prepare an input parameter file

+

An input parameter file describes the content of input files for the first-principles calculation software. +An example is presented below. It is a text file in YAML format that contains options to crystal structure data, and contents of the input file used as an input for the first-principle calculation. See file format section for the details of specification.

+

In YAML format, parameters are given in dictionary form as keyword: value, where value is a scalar such as a number or a string, or a set of values enclosed in [ ] or listed in itemized form, or a nested dictionary.

+
structure:
+  use_ibrav: false
+  tolerance: 0.05
+
+optional:
+  pseudo_dir: ./pseudo
+  pp_file: ./pseudo/pp_psl_pbe_rrkjus.csv
+
+tasks:
+  - mode: scf
+    output_file: scf.in
+    output_dir: scf
+    template: scf.in_tmpl
+    content:
+      namelist:
+        control:
+          prefix: pwscf
+          pseudo_dir:
+          outdir: ./work
+        system:
+          ecutwfc:
+          ecutrho:
+      CELL_PARAMETERS:
+      ATOMIC_SPECIES:
+      ATOMIC_POSITIONS:
+        option: crystal
+      K_POINTS:
+        option: automatic
+        grid: [8,8,8]
+
+
+

The input parameter file consists of structure, optional, and tasks sections. +The structure section specifies options to the crystal structure data. +The optional section holds global settings concerning the pseudo-potentials.

+

The tasks section describes inputs for the first-principles calculations. In case of generating multiple files for a series of calculations, the tasks section takes a list of parameter sets. +For each set, the calculation type is specified by the mode parameter: scf and nscf are supported as modes, as well as arbitrary modes for generic output.

+

The content of the output is given in content section. +The input files of Quantum ESPRESSO are composed of the parts in namelist format of Fortran90 starting from &keyword, and the blocks called cards that start with keywords such as K_POINTS and end with blank lines. The content block holds namelist and cards in a form of nested dictionary. +Basically, the specified items are written to the input files as-is, except for several cases. If a keyword is left blank, its value will be obtained form the crystal structure data or other sources.

+

Besides, templates of the input files can be used. The content of the file given by the template keyword is considered as input data along with the entries in content block. When the entries of the same keywords appear both, those of the input parameter files will be used. Therefore, it is possible to use template files and overwrite some entries by the input parameter file as needed. +In the present example, the file (scf.in_tmpl) shown below is read as a template, and the entries on cutoff parameters as well as cards of CELL_PARAMETER, ATOMIC_SPECIES, ATOMIC_POSITIONS, K_POINTS are generated from the crystal structure data and pseudo-potential files. It is noted that the values of ecutwfc and ecutrho are overwritten by the empty lines.

+
&control
+    calculation = 'scf'
+    prefix = 'pwscf'
+    pseudo_dir = './pseudo'
+    outdir = './work'
+    tstress = .true.
+    tprnfor = .true.
+/
+
+&system
+    ibrav = 0
+    nat = 7
+    ntyp = 3
+    ecutwfc = 36.0
+    ecutrho = 180.0
+    occupations = 'smearing'
+    smearing = 'm-p'
+    degauss = 0.01
+    noncolin = .true.
+    nspin = 2
+/
+
+&electrons
+    missing_beta = 0.1
+    conv_thr = 1e-08
+/
+
+
+
+
+

3.2. Generating input files

+

The program cif2x is executed with the input parameter file (input.yaml) and crystal structure data (Co3SnS2_nosym.cif) as follows.

+
$ cif2x -t QE input.yaml Co3SnS2_nosym.cif
+
+
+

The required pseudo-potential files should be placed in the directory ./pseudo, and the index file for the pseudo-potential should be prepared as ./psudo/pp_psl_pbe_rrkjus.csv.

+

Run cif2x and a set of input files for Quantum ESPRESSO will be created. The output file is specified by output_file parameter of the input parameter file, and stored in the directory given by output_dir. In this example, the input file for SCF calculation is created as ./scf/scf.in.

+
+
+

3.3. Specifying parameter sets

+

In some cases, a series of input files should be generated with varying their parameter values. For example, the convergence is examined by modifying the cutoff values or grid resolution of k points. The input parameter can be given a list or a range of values, and the input files for every combination from the choices of parameter values are generated and stored in separate directories. To specify parameter set, a special syntax ${...} is adopted.

+
content:
+  K_POINTS:
+    option: automatic
+    grid:   ${ [ [4,4,4], [8,8,8], [12,12,12] ] }
+
+
+

When K_POINTS is given as above, the input files having the grid value to be [4,4,4], [8,8,8], [12,12,12] will be generated in the sub-directories, 4x4x4/, 8x8x8/, 12x12x12/, respectively.

+
+
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/manual/v1.0.0/en/html/genindex.html b/manual/v1.0.0/en/html/genindex.html new file mode 100644 index 0000000..49339d2 --- /dev/null +++ b/manual/v1.0.0/en/html/genindex.html @@ -0,0 +1,103 @@ + + + + + + + Index — cif2x Users Guide 1.0.0 documentation + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ + +

Index

+ +
+ +
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/manual/v1.0.0/en/html/index.html b/manual/v1.0.0/en/html/index.html new file mode 100644 index 0000000..53554fc --- /dev/null +++ b/manual/v1.0.0/en/html/index.html @@ -0,0 +1,120 @@ + + + + + + + + Cif2x Users Guide — cif2x Users Guide 1.0.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+
+ + + + + + + \ No newline at end of file diff --git a/manual/v1.0.0/en/html/objects.inv b/manual/v1.0.0/en/html/objects.inv new file mode 100644 index 0000000..90ce70c --- /dev/null +++ b/manual/v1.0.0/en/html/objects.inv @@ -0,0 +1,5 @@ +# Sphinx inventory version 2 +# Project: cif2x Users Guide +# Version: 1.0 +# The remainder of this file is compressed using zlib. +xڅN AuGF7L6QtO}{Rlqx#f`>.aZ^j <+>C]gDAXZaQ:ԞpRDj(>0X0ހIٚ3%a5/N*3j׳0Q6  %uRsipx̯p76!K2կs㯩MU2j+S#<Fp)B6~PBv3Šr{dkceg֏)/y3~NSZ6|s{晕F[ іIeekuw?c \ No newline at end of file diff --git a/manual/v1.0.0/en/html/search.html b/manual/v1.0.0/en/html/search.html new file mode 100644 index 0000000..79195e0 --- /dev/null +++ b/manual/v1.0.0/en/html/search.html @@ -0,0 +1,122 @@ + + + + + + + Search — cif2x Users Guide 1.0.0 documentation + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +

Search

+ + + + +

+ Searching for multiple words only shows matches that contain + all words. +

+ + +
+ + + +
+ + + +
+ +
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/manual/v1.0.0/en/html/searchindex.js b/manual/v1.0.0/en/html/searchindex.js new file mode 100644 index 0000000..45ce60e --- /dev/null +++ b/manual/v1.0.0/en/html/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"docnames": ["cif2x/about/index", "cif2x/appendix/index", "cif2x/basic-usage", "cif2x/command/index", "cif2x/filespec/index", "cif2x/index", "cif2x/tutorial/index", "index"], "filenames": ["cif2x/about/index.rst", "cif2x/appendix/index.rst", "cif2x/basic-usage.rst", "cif2x/command/index.rst", "cif2x/filespec/index.rst", "cif2x/index.rst", "cif2x/tutorial/index.rst", "index.rst"], "titles": ["1. Introduction", "6. Extension guide", "2. Installation and basic usage", "4. Command reference", "5. File format", "Input file generator for first-principles calculations (cif2x)", "3. Tutorial", "Cif2x Users Guide"], "terms": {"In": [0, 1, 2, 3, 4, 6], "recent": 0, "year": 0, "us": [0, 4, 6], "machin": 0, "learn": 0, "predict": 0, "materi": [0, 2, 3], "properti": 0, "design": 0, "substanc": 0, "known": 0, "informat": 0, "ha": 0, "gain": 0, "consider": 0, "attent": 0, "The": [0, 1, 2, 3, 4, 6], "accuraci": 0, "depend": 0, "heavili": 0, "prepar": [0, 2, 5], "appropri": 0, "train": 0, "data": [0, 1, 2, 3, 4, 6], "therefor": [0, 6], "develop": 0, "tool": [0, 2], "rapid": 0, "gener": [0, 1, 2, 3, 4, 7], "expect": 0, "contribut": 0, "significantli": 0, "advanc": 0, "research": 0, "input": [0, 2, 3, 7], "file": [0, 2, 3, 7], "first": [0, 2, 3, 4, 6, 7], "principl": [0, 2, 3, 4, 6, 7], "calcul": [0, 1, 2, 3, 4, 6, 7], "from": [0, 1, 2, 4, 6], "cif": [0, 2, 3, 6], "It": [0, 1, 2, 3, 4, 6], "construct": 0, "part": [0, 4, 6], "vari": [0, 2, 6], "type": [0, 1, 4, 6], "comput": 0, "condit": [0, 2], "crystal": [0, 1, 2, 3, 4, 6], "structur": [0, 1, 2, 3, 6], "paramet": [0, 1, 2, 3, 5], "templat": [0, 2, 4, 6], "capabl": 0, "multipl": [0, 3, 6], "tailor": 0, "specif": [0, 4, 6], "current": [0, 1, 3, 4, 6], "support": [0, 1, 2, 3, 4, 6], "vasp": [0, 2, 3, 5, 6], "quantum": [0, 2, 3, 5, 6], "espresso": [0, 2, 3, 5, 6], "openmx": [0, 2, 3, 5, 6], "akaikkr": [0, 2, 3, 5, 6], "distribut": 0, "program": [0, 2, 3, 6], "packag": [0, 2], "sourc": [0, 1, 2, 6], "code": 0, "follow": [0, 2, 3, 4, 6], "gnu": 0, "public": 0, "version": [0, 1, 2, 3, 4, 6], "3": [0, 2, 6], "gpl": 0, "v3": 0, "later": 0, "thi": [0, 1, 3, 4, 6], "softwar": [0, 2, 3, 4, 6], "wa": 0, "ver": 0, "1": [0, 4, 6], "0": [0, 4, 6], "releas": 0, "2024": 0, "03": 0, "xx": 0, "alpha": [0, 4], "2023": 0, "12": [0, 6], "28": 0, "kazuyoshi": 0, "yoshimi": 0, "instutit": 0, "solid": 0, "state": 0, "physic": 0, "univers": 0, "tokyo": 0, "tatsumi": 0, "aoyama": 0, "yuichi": 0, "motoyama": 0, "masahiro": 0, "fukuda": 0, "kota": 0, "ido": 0, "tetsuya": 0, "fukushima": 0, "nation": 0, "institut": 0, "industri": 0, "scienc": 0, "technologi": 0, "aist": 0, "shusuk": 0, "kasamatsu": 0, "yamagata": 0, "takashi": 0, "koretsun": 0, "tohoku": 0, "project": 0, "corrdin": 0, "taisuk": 0, "ozaki": 0, "all": 0, "right": 0, "reserv": 0, "usabl": 0, "test": 0, "platform": 0, "ubuntu": 0, "linux": 0, "python3": [0, 2], "order": [1, 4], "add": [1, 2], "map": 1, "between": [1, 4], "transform": [1, 4], "class": 1, "should": [1, 2, 4, 6], "create_modeproc": 1, "function": [1, 4], "src": [1, 2], "cif2x": [1, 2, 4, 6], "qe": [1, 2, 3, 6], "calc_mod": [1, 2], "py": [1, 2], "def": 1, "scf": [1, 4, 6], "nscf": [1, 4, 6], "modeproc": 1, "qemode_pw": 1, "els": 1, "qemode_gener": 1, "return": 1, "each": [1, 4, 6], "i": [1, 2, 3, 4, 5, 6], "provid": 1, "deriv": [1, 4], "qemode_bas": 1, "implement": 1, "method": 1, "update_namelist": 1, "updat": 1, "namelist": [1, 4, 6], "block": [1, 4, 6], "update_card": 1, "card": [1, 2, 4, 6], "two": 1, "ar": [1, 2, 4, 6], "pw": [1, 4], "x": [1, 2, 4], "output": [1, 4, 6], "__init__": [1, 2], "self": 1, "content": [1, 2, 6], "For": [1, 2, 4, 6], "valu": [1, 4, 6], "blank": [1, 4, 6], "entri": [1, 4, 6], "other": [1, 3, 4, 6], "mai": [1, 2, 4], "also": [1, 2], "forc": 1, "set": [1, 2, 3, 5], "lattic": [1, 4], "determin": [1, 4], "those": [1, 2, 4, 6], "must": 1, "specifi": [1, 2, 3, 5], "consist": [1, 4, 6], "separ": [1, 2, 4, 6], "given": [1, 4, 6], "card_tabl": 1, "variabl": [1, 2, 4], "base": 1, "pick": 1, "up": 1, "run": [1, 2, 6], "associ": 1, "Of": 1, "cours": 1, "new": 1, "defin": [1, 4], "cell_paramet": [1, 4, 6], "generate_cell_paramet": 1, "atomic_speci": [1, 4, 6], "generate_atomic_speci": 1, "atomic_posit": [1, 4, 6], "generate_atomic_posit": 1, "k_point": [1, 4, 6], "generate_k_point": 1, "gather": 1, "name": [1, 4], "generate_": 1, "These": [1, 4], "take": [1, 2, 3, 4, 6], "argument": [1, 2], "dictionari": [1, 6], "contain": [1, 4, 6], "option": [1, 2, 3, 6], "field": [1, 4], "prerequisit": 2, "includ": [2, 3, 4, 6], "htp": 2, "requir": [2, 4, 6], "librari": 2, "python": [2, 4], "pymatgen": [2, 3, 4], "modul": 2, "ruamel": 2, "yaml": [2, 3, 4, 6], "f90nml": 2, "numpi": 2, "panda": 2, "monti": 2, "openbabel": 2, "akaikkrpythonutil": 2, "offici": 2, "page": 2, "github": 2, "repositori": 2, "download": 2, "can": [2, 6], "command": [2, 5, 7], "git": 2, "clone": 2, "http": 2, "com": 2, "issp": 2, "center": 2, "dev": 2, "onc": 2, "obtain": [2, 4, 6], "you": 2, "automat": [2, 4, 6], "same": [2, 4, 6], "time": [2, 3], "cd": 2, "m": [2, 6], "pip": 2, "execut": [2, 6], "need": [2, 4, 6], "user": 2, "next": 2, "keyword": [2, 4, 6], "abov": [2, 4, 6], "case": [2, 4, 6], "allow": [2, 4], "system": [2, 4, 6], "wide": 2, "avail": [2, 4], "Then": 2, "step": [2, 4, 6], "below": [2, 4, 6], "along": [2, 6], "seaborn": 2, "akaikkrteam": 2, "pyakaikkr": 2, "directori": [2, 4, 6], "licens": [2, 5], "readm": 2, "md": [2, 4], "pyproject": 2, "toml": 2, "doc": [2, 6], "ja": 2, "en": 2, "tutori": [2, 5, 7], "main": 2, "cif2struct": 2, "struct2q": 2, "qeutil": 2, "struct2vasp": 2, "struct2openmx": 2, "vps_tabl": 2, "struct2akaikkr": 2, "make_input": 2, "read_input": 2, "run_cif2kkr": 2, "util": 2, "sampl": [2, 6], "an": [2, 3, 4, 5], "item": [2, 6], "crystallograph": [2, 3], "present": [2, 6], "creat": [2, 4, 6], "format": [2, 3, 5, 6, 7], "describ": [2, 4, 6], "pseudo": [2, 4, 6], "potenti": [2, 4, 6], "target": [2, 3], "poscar": [2, 4], "xf": 2, "index": [2, 4, 6], "csv": [2, 4, 6], "place": [2, 4, 6], "Their": 2, "locat": [2, 4], "config": [2, 4], "pmgrc": [2, 4], "environ": [2, 4, 5], "To": [2, 6], "t": [2, 3, 6], "turn": [2, 4], "synopsi": 3, "v": 3, "q": 3, "input_yaml": 3, "h": 3, "descript": 3, "read": [3, 4, 6], "line": [3, 4, 6], "increas": 3, "verbos": 3, "runtim": 3, "messag": 3, "when": [3, 4, 6], "becom": 3, "more": 3, "decreas": 3, "cancel": 3, "effect": 3, "quiet": 3, "list": [3, 4, 6], "quantum_espresso": 3, "inform": [3, 4], "framework": 3, "displai": 3, "help": 3, "exit": 3, "necessari": 4, "how": 4, "handl": 4, "symbol": 4, "definit": 4, "refer": [4, 5, 7], "featur": 4, "use_ibrav": [4, 6], "default": 4, "fals": [4, 6], "whether": 4, "ibrav": [4, 6], "true": [4, 6], "match": 4, "convent": 4, "b": 4, "c": 4, "cosab": 4, "cosac": 4, "cosbc": 4, "written": [4, 6], "toler": [4, 6], "01": [4, 6], "differ": 4, "reconstruct": 4, "origin": 4, "supercel": 4, "none": 4, "size": 4, "adopt": [4, 6], "form": [4, 6], "n_x": 4, "n_y": 4, "n_z": 4, "global": [4, 6], "correspond": 4, "organ": 4, "term": 4, "explain": [4, 6], "mode": [4, 5, 6], "If": [4, 6], "unsupport": 4, "export": 4, "output_fil": [4, 6], "output_dir": [4, 6], "start": [4, 6], "control": [4, 6], "etc": 4, "individu": 4, "some": [4, 6], "template_dir": 4, "respect": [4, 6], "thei": 4, "merg": 4, "supersed": 4, "kei": 4, "appear": [4, 6], "both": [4, 6], "rang": [4, 6], "everi": [4, 6], "combin": [4, 6], "store": [4, 6], "A": 4, "special": [4, 6], "syntax": [4, 6], "scalar": [4, 6], "n": 4, "end": [4, 6], "former": 4, "latter": 4, "omit": 4, "assum": 4, "pp_file": [4, 6], "relat": 4, "element": 4, "column": 4, "nexclud": 4, "orbit": 4, "exampl": [4, 6], "fe": 4, "pbe": 4, "spn": 4, "rrkjus_psl": 4, "2": [4, 6], "4": [4, 6], "spd": 4, "upf": 4, "cutoff_fil": 4, "cutoff": [4, 6], "ecutwfc": [4, 6], "ecutrho": [4, 6], "pseudo_dir": [4, 6], "hold": [4, 6], "indenep": 4, "accord": 4, "celldm": 4, "remov": 4, "ibrab": 4, "bravai": 4, "nat": [4, 6], "number": [4, 6], "atom": 4, "ntyp": [4, 6], "left": [4, 6], "otherwis": 4, "vector": 4, "unit": 4, "angstrom": 4, "3x3": 4, "matrix": 4, "instead": 4, "speci": 4, "mass": 4, "pp_list": 4, "fraction": 4, "coordin": 4, "ignore_speci": 4, "if_po": 4, "relax": 4, "k": [4, 6], "point": [4, 6], "one": 4, "gamma": 4, "mesh": 4, "pattern": 4, "width": 4, "grid": [4, 6], "vol_dens": 4, "k_resolut": 4, "shift": 4, "kshift": 4, "whose": 4, "15": 4, "pmg_vasp_psp_dir": 4, "potcar": 4, "gz": 4, "where": [4, 6], "configur": 4, "predefin": 4, "pot_gga_paw_pb": 4, "pot_lda_paw": 4, "pseudo_funct": 4, "tabl": 4, "lda": 4, "similar": 4, "manner": 4, "ignor": 4, "psuedo_dir": 4, "path": 4, "incar": 4, "kpoint": 4, "miss": 4, "accept": 4, "see": [4, 6], "io": 4, "manual": 4, "further": 4, "detail": [4, 6], "gamma_automat": 4, "monkhorst_automat": 4, "automatic_dens": 4, "kppa": 4, "force_gamma": 4, "automatic_gamma_dens": 4, "grid_dens": 4, "automatic_density_by_vol": 4, "automatic_density_by_length": 4, "length_dens": 4, "automatic_linemod": 4, "divis": 4, "path_typ": 4, "highsymmkpath": 4, "data_path": 4, "precis": 4, "10": 4, "6": 4, "quick": 4, "standard": 4, "workdir": 4, "which": 4, "tempor": 4, "tmp": 4, "tmpdir": 4, "unspecifi": 4, "replac": 4, "brvtyp": 4, "except": [4, 6], "aux": 4, "string": [4, 6], "beta": 4, "r1": 4, "r2": 4, "r3": 4, "ncmp": 4, "rmt": 4, "mxl": 4, "anclr": 4, "conc": 4, "natm": 4, "atmicx": 4, "atmtyp": 4, "onli": 4, "have": [4, 6], "introduct": [5, 7], "what": 5, "contributor": 5, "copyright": 5, "oper": 5, "instal": [5, 7], "basic": [5, 6, 7], "usag": [5, 7], "extens": [5, 7], "guid": 5, "ad": 5, "procedur": 6, "we": 6, "text": 6, "section": 6, "enclos": 6, "nest": 6, "05": 6, "pp_psl_pbe_rrkju": 6, "task": 6, "in_tmpl": 6, "prefix": 6, "pwscf": 6, "outdir": 6, "work": 6, "8": 6, "concern": 6, "seri": 6, "well": 6, "arbitrari": 6, "compos": 6, "fortran90": 6, "call": 6, "sever": 6, "its": 6, "besid": 6, "consid": 6, "possibl": 6, "overwrit": 6, "shown": 6, "note": 6, "overwritten": 6, "empti": 6, "tstress": 6, "tprnfor": 6, "7": 6, "36": 6, "180": 6, "occup": 6, "smear": 6, "p": 6, "degauss": 6, "noncolin": 6, "nspin": 6, "electron": 6, "missing_beta": 6, "conv_thr": 6, "1e": 6, "08": 6, "co3sns2_nosym": 6, "psudo": 6, "converg": 6, "examin": 6, "modifi": 6, "resolut": 6, "choic": 6, "sub": 6, "4x4x4": 6, "8x8x8": 6, "12x12x12": 6}, "objects": {}, "objtypes": {}, "objnames": {}, "titleterms": {"introduct": 0, "what": 0, "i": 0, "cif2x": [0, 3, 5, 7], "licens": 0, "contributor": 0, "copyright": 0, "oper": 0, "environ": 0, "extens": 1, "guid": [1, 7], "ad": 1, "mode": 1, "quantum": [1, 4], "espresso": [1, 4], "instal": 2, "basic": 2, "usag": 2, "command": 3, "refer": 3, "file": [4, 5, 6], "format": 4, "input": [4, 5, 6], "paramet": [4, 6], "structur": 4, "option": 4, "task": 4, "specifi": [4, 6], "set": [4, 6], "section": 4, "content": [4, 7], "vasp": 4, "openmx": 4, "akaikkr": 4, "gener": [5, 6], "first": 5, "principl": 5, "calcul": 5, "tutori": 6, "prepar": 6, "an": 6, "user": 7}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx": 60}, "alltitles": {"Introduction": [[0, "introduction"]], "What is cif2x?": [[0, "what-is-cif2x"]], "License": [[0, "license"]], "Contributors": [[0, "contributors"]], "Copyright": [[0, "copyright"]], "Operating environment": [[0, "operating-environment"]], "Extension guide": [[1, "extension-guide"]], "Adding modes of Quantum ESPRESSO": [[1, "adding-modes-of-quantum-espresso"]], "Installation and basic usage": [[2, "installation-and-basic-usage"]], "Command reference": [[3, "command-reference"]], "cif2x": [[3, "cif2x"]], "File format": [[4, "file-format"]], "Input parameter file": [[4, "input-parameter-file"]], "structure": [[4, "structure"]], "optional": [[4, "optional"], [4, "id1"], [4, "id4"], [4, "id6"]], "tasks": [[4, "tasks"], [4, "id2"]], "Specifying parameter set": [[4, "specifying-parameter-set"]], "Parameters for Quantum ESPRESSO": [[4, "parameters-for-quantum-espresso"]], "optional section": [[4, "optional-section"]], "content": [[4, "content"], [4, "id3"], [4, "id5"], [4, "id7"]], "Parameters for VASP": [[4, "parameters-for-vasp"]], "Parameters for OpenMX": [[4, "parameters-for-openmx"]], "Parameters for AkaiKKR": [[4, "parameters-for-akaikkr"]], "Input file generator for first-principles calculations (cif2x)": [[5, "input-file-generator-for-first-principles-calculations-cif2x"]], "Tutorial": [[6, "tutorial"]], "Prepare an input parameter file": [[6, "prepare-an-input-parameter-file"]], "Generating input files": [[6, "generating-input-files"]], "Specifying parameter sets": [[6, "specifying-parameter-sets"]], "Cif2x Users Guide": [[7, "cif2x-users-guide"]], "Contents:": [[7, null]]}, "indexentries": {}}) \ No newline at end of file diff --git a/manual/v1.0.0/ja/cif2x-usersguide.pdf b/manual/v1.0.0/ja/cif2x-usersguide.pdf new file mode 100644 index 0000000000000000000000000000000000000000..6e4f684294f700e5483fcc5455c3e0d788b8ffb1 GIT binary patch literal 84975 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ⅆGfJ7PT6hA1}2>1n~0~ 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, `Quantum ESPRESSO `_, `OpenMX `_, `AkaiKKR `_ に対応しています。 + + +ライセンス +---------------------------------------------------------------- + +本ソフトウェアのプログラムパッケージおよびソースコード一式はGNU General Public License version 3 (GPL v3) に準じて配布されています。 + +開発貢献者 +---------------------------------------------------------------- + +本ソフトウェアは以下の開発貢献者により開発されています。 + +- ver.1.0.0 (2024/03/XXリリース) + +- ver.1.0-alpha (2023/12/28リリース) + + - 開発者 + + - 吉見 一慶 (東京大学 物性研究所) + + - 青山 龍美 (東京大学 物性研究所) + + - 本山 裕一 (東京大学 物性研究所) + + - 福田 将大 (東京大学 物性研究所) + + - 井戸 康太 (東京大学 物性研究所) + + - 福島 鉄也 (産業技術総合研究所) + + - 笠松 秀輔 (山形大学 学術研究院(理学部主担当)) + + - 是常 隆  (東北大学大学院理学研究科) + + - プロジェクトコーディネーター + + - 尾崎 泰助 (東京大学 物性研究所) + + +コピーライト +---------------------------------------------------------------- + +.. only:: html + + |copy| *2023- The University of Tokyo. All rights reserved.* + + .. |copy| unicode:: 0xA9 .. copyright sign + +.. only:: latex + + :math:`\copyright` *2023- The University of Tokyo. All rights reserved.* + + +本ソフトウェアは2023年度 東京大学物性研究所 ソフトウェア高度化プロジェクトの支援を受け開発されており、その著作権は東京大学が所持しています。 + +動作環境 +---------------------------------------------------------------- + +以下の環境で動作することを確認しています。 + +- Ubuntu Linux + python3 + diff --git a/manual/v1.0.0/ja/html/_sources/cif2x/appendix/index.rst.txt b/manual/v1.0.0/ja/html/_sources/cif2x/appendix/index.rst.txt new file mode 100644 index 0000000..1355827 --- /dev/null +++ b/manual/v1.0.0/ja/html/_sources/cif2x/appendix/index.rst.txt @@ -0,0 +1,50 @@ +.. _sec-cif2x-appendix: + +================================================================ +拡張ガイド +================================================================ + +Quantum ESPRESSO の mode を追加する +---------------------------------------------------------------- + +Quantum ESPRESSO の計算モードへの対応を追加するには、 ``src/cif2x/qe/calc_mode.py`` の ``create_modeproc()`` 関数に mode と変換クラスの対応付けを記述します。 + +.. code-block:: python + + def create_modeproc(mode, qe): + if mode in ["scf", "nscf"]: + modeproc = QEmode_pw(qe) + else: + modeproc = QEmode_generic(qe) + return modeproc + + +modeごとの変換機能は ``QEmode_base`` の派生クラスとしてまとめられています。 +このクラスは +``update_namelist()`` で namelist ブロックの更新と、 +``update_cards()`` で cards ブロックのデータ生成を行います。 +現在は pw.x の scf および nscf に対応する ``QEmode_pw`` クラスと、変換せずそのまま出力する ``QEmode_generic`` クラスが用意されています。 + +.. code-block:: python + + class QEmode_base: + def __init__(self, qe): + def update_namelist(self, content): + def update_cards(self, content): + + +namelist については、空欄の値を結晶構造データ等から生成して代入するほか、格子パラメータなど Structure から決まる値や、他のパラメータとの整合性をとる必要のある値を強制的にセットする場合があります。処理内容はモードごとに個別に対応します。 + +cards ブロックについては、card の種類ごとに関数を用意し、card名と関数の対応付けを ``card_table`` 変数に列挙します。 +基底クラスの ``update_cards()`` では、card名から対応する関数を取得して実行し、card の情報を更新します。もちろん、全く独自に ``update_cards()`` 関数を作成することもできます。 + +.. code-block:: python + + self.card_table = { + 'CELL_PARAMETERS': generate_cell_parameters, + 'ATOMIC_SPECIES': generate_atomic_species, + 'ATOMIC_POSITIONS': generate_atomic_positions, + 'K_POINTS': generate_k_points, + } + +cardごとの関数は ``scr/cif2x/qe/cards.py`` にまとめられており、関数名は ``generate_{card名}`` としています。この関数は card ブロックのパラメータを引数に取り、card名、option、dataフィールドからなる辞書データを返します。 diff --git a/manual/v1.0.0/ja/html/_sources/cif2x/basic-usage.rst.txt b/manual/v1.0.0/ja/html/_sources/cif2x/basic-usage.rst.txt new file mode 100644 index 0000000..06796ba --- /dev/null +++ b/manual/v1.0.0/ja/html/_sources/cif2x/basic-usage.rst.txt @@ -0,0 +1,114 @@ +インストールと基本的な使い方 +================================================================ + +**必要なライブラリ・環境** + + HTP-tools に含まれる第一原理計算入力ファイル生成ツール cif2x を利用するには、以下のプログラムとライブラリが必要です。 + + - python 3.x + - pymatgen モジュール + - ruamel.yaml モジュール + - f90nml モジュール + - qe-tools モジュール + - numpy モジュール + - pandas モジュール + - monty モジュール + - OpenBabel モジュール (オプション) + - AkaiKKRPythonUtil モジュール + +**ソースコード配布サイト** + + - `GitHubリポジトリ `_ + +**ダウンロード方法** + + gitを利用できる場合は、以下のコマンドでcif2xをダウンロードできます。 + + .. code-block:: bash + + $ git clone https://github.com/issp-center-dev/cif2x.git + +**インストール方法** + + cif2xをダウンロード後、以下のコマンドを実行してインストールします。cif2xが利用するライブラリも必要に応じてインストールされます。 + + .. code-block:: bash + + $ cd ./cif2x + $ python3 -m pip install . + + 実行プログラム ``cif2x`` がインストールされます。 + + なお、AkaiKKRPythonUtil モジュールは別途インストールが必要です。 + 以下の手順で `配布サイト `_ からソースコードを取得しインストールします。また、必要な seaborn モジュールもインストールしておきます。 + + .. code-block:: bash + + $ git clone https://github.com/AkaiKKRteam/AkaiKKRPythonUtil.git + $ cd ./AkaiKKRPythonUtil/library/PyAkaiKKR + $ python3 -m pip install . + $ python3 -m pip install seaborn + + +**ディレクトリ構成** + + :: + + . + |-- LICENSE + |-- README.md + |-- pyproject.toml + |-- docs/ + | |-- ja/ + | |-- tutorial/ + |-- src/ + | |-- cif2x/ + | |-- __init__.py + | |-- main.py + | |-- cif2struct.py + | |-- struct2qe.py + | |-- qe/ + | | |-- __init__.py + | | |-- calc_mode.py + | | |-- cards.py + | | |-- content.py + | | |-- qeutils.py + | | |-- tools.py + | |-- struct2vasp.py + | |-- struct2openmx.py + | |-- openmx/ + | | |-- __init__.py + | | |-- vps_table.py + | |-- struct2akaikkr.py + | |-- akaikkr/ + | | |-- make_input.py + | | |-- read_input.py + | | |-- run_cif2kkr.py + | |-- utils.py + |-- sample/ + + +**基本的な使用方法** + + cif2xは第一原理計算プログラムのための入力ファイルを生成するツールです。入力パラメータを雛形として、物質の種類や計算条件によって変わる箇所を結晶構造データなどから構成します。現在は Quantum ESPRESSO, VASP, OpenMX, および AkaiKKR の入力ファイル形式に対応しています。 + + #. 入力パラメータファイルの作成 + + cif2xを使用するには、まず、生成する入力ファイルの内容を記述したパラメータファイルをYAML形式で作成します。詳細についてはファイルフォーマットの章を参照してください。 + + #. 結晶構造ファイルと擬ポテンシャルファイルの配置 + + 対象となる物質の結晶構造を記述したファイルを用意します。ファイル形式は CIF または pymatgen が扱える POSCAR や xfs 形式に対応しています。 + + Quantum ESPRESSO の場合、利用する擬ポテンシャルファイルと、CSV形式のインデックスファイルを配置します。擬ポテンシャルファイルの配置先などは入力パラメータファイル内に指定します。 + + VASP の場合、擬ポテンシャルファイルの格納場所を ``~/.config/.pmgrc.yaml`` ファイルに記述するか環境変数にセットします。入力パラメータファイル内で指定することもできます。 + + #. コマンドの実行 + + 作成した入力パラメータファイルおよび結晶構造データファイルを入力としてcif2xプログラムを実行します。Quantum ESPRESSO用の入力ファイルを生成する場合はターゲットオプションに ``-t QE`` を指定します。VASPの場合は ``-t VASP``, OpenMX の場合は ``-t OpenMX``, AkaiKKR の場合は ``-t akaikkr`` を指定します。 + + .. code-block:: bash + + $ cif2x -t QE input.yaml material.cif + diff --git a/manual/v1.0.0/ja/html/_sources/cif2x/command/index.rst.txt b/manual/v1.0.0/ja/html/_sources/cif2x/command/index.rst.txt new file mode 100644 index 0000000..c414ad9 --- /dev/null +++ b/manual/v1.0.0/ja/html/_sources/cif2x/command/index.rst.txt @@ -0,0 +1,57 @@ +コマンドリファレンス +================================================================ + +cif2x +---------------------------------------------------------------- + + 第一原理計算のための入力ファイルを生成する + +書式: + + .. code-block:: bash + + cif2x [-v][-q] -t target input_yaml material.cif + cif2x -h + cif2x --version + +説明: + + input_yaml に指定した入力パラメータファイルと material.cif に指定した結晶構造データを読み込み、第一原理計算プログラム用の入力ファイルを生成します。現在は Quantum ESPRESSO, VASP, OpenMX に対応しています。 + 以下のオプションを受け付けます。 + + - ``-v`` + + 実行時に表示されるメッセージを冗長にします。複数回指定すると冗長度が上がります。 + + - ``-q`` + + 実行時に表示されるメッセージの冗長度を下げます。 ``-v`` の効果を打ち消します。複数回の指定が可能です。 + + - ``-t`` *target* + + 対象となる第一原理計算プログラムを指定します。 *target* として指定可能な値は以下のとおりです。大文字小文字は区別しません。 + + - ``QE``, ``espresso``, ``quantum_espresso``: Quantum ESPRESSO向け入力ファイルを生成します。 + + - ``VASP``: VASP向け入力ファイルを生成します。 + + - ``OpenMX``: OpenMX向け入力ファイルを生成します。 + + - ``AkaiKKR``: AkaiKKR向け入力ファイルを生成します。 + + - ``input_yaml`` + + 入力パラメータファイルを指定します。形式は YAML format です。 + + - ``material.cif`` + + 結晶構造データファイルを指定します。形式は CIF の他、pymatgen で扱える形式のファイルを指定できます。 + + - ``-h`` + + ヘルプを表示します。 + + - ``--version`` + + バージョン情報を表示します。 + diff --git a/manual/v1.0.0/ja/html/_sources/cif2x/filespec/index.rst.txt b/manual/v1.0.0/ja/html/_sources/cif2x/filespec/index.rst.txt new file mode 100644 index 0000000..67557fe --- /dev/null +++ b/manual/v1.0.0/ja/html/_sources/cif2x/filespec/index.rst.txt @@ -0,0 +1,291 @@ +.. _sec-cif2x-fileformat: + +====================== + ファイルフォーマット +====================== + +入力パラメータファイル +====================== + +入力パラメータファイルでは、cif2x で第一原理計算入力ファイルを生成するための設定情報を YAML形式で記述します。本ファイルは以下の部分から構成されます。 + + 1. structureセクション: 結晶構造データの扱いについてのオプションを記述します。 + + 2. optionalセクション: 擬ポテンシャルファイルの指定や、YAMLの参照機能を利用する場合のシンボル定義を行います。 + + 3. tasksセクション: 入力ファイルの内容を記述します。 + + +structure +--------- + + ``use_ibrav`` (デフォルト値: ``false``) + + 結晶構造の入力に Quantum ESPRESSO の ``ibrav`` パラメータを利用します。 ``true`` の場合、格子のとり方を Quantum ESPRESSO の convention に合うように変換します。入力ファイルにはあわせて格子に関するパラメータ ``a``, ``b``, ``c``, ``cosab``, ``cosac``, ``cosbc`` が(必要に応じて)書き出されます。 + + ``tolerance`` (デフォルト値: 0.01) + + ``use_ibrav = true`` の場合に、再構成した Structure データと元データとの一致を評価する際の許容度を指定します。 + + ``supercell`` (デフォルト値: なし) + + supercell を設定する場合に supercell のサイズを [:math:`n_x`, :math:`n_y`, :math:`n_z`] で指定します。 + +optional +-------- +第一原理計算プログラムごとに必要な global な設定を行います。記述する内容は以下の各節に記述します。 + +tasks +----- +入力ファイルの内容を記述します。複数の入力ファイルに対応するため、 ``tasks`` には各入力ファイルごとのブロックからなるリスト形式をとります。各ブロックに記述する項目は以下のとおりです。 + + ``mode`` (Quantum ESPRESSO) + + 入力ファイルの計算内容を指定します。 + 現時点では Quantum ESPRESSO の pw.x 向けに ``scf`` と ``nscf`` に対応しています。対応していない mode については、 ``content`` の内容をそのまま出力します。 + + ``output_file`` (Quantum ESPRESSO) + + 出力ファイル名を指定します。 + + ``output_dir`` + + 出力先のディレクトリ名を指定します。デフォルト値はカレントディレクトリです。 + + ``content`` + + 出力内容を指定します。Quantum ESPRESSO の場合は ``namelist`` ブロックに namelist データ (``&system`` や ``&control`` など) を記述し、 ``K_POINTS`` 等の card データを個別のブロックとして記述します。card データはパラメータをとるものがあります。 + + ``template`` (Quantum ESPRESSO) + + ``template_dir`` (VASP) + + 出力内容のテンプレートファイルを指定します。指定がない場合はテンプレートを利用しません。 + このファイルの内容を ``content`` に追加します。同じデータがある場合は後者を優先します。 + +パラメータセット指定 +-------------------- +入力パラメータには値のリストや範囲を指定することができ、値の組み合わせごとに個別のディレクトリを作成して入力ファイルを生成します。パラメータセットの指定には特別な構文 ``${...}`` を用います。 +指定方法は次の通りです: + +- リスト ``${[ A, B, ... ]}`` + + パラメータセットを Python のリストとして列挙します。各項目はスカラー値やリストを指定できます。 + +- 範囲指定 ``${range(N)}``, ``${range(start, end, step)}`` + + パラメータの範囲を指定します。それぞれ 0〜N-1, start〜end を step 刻み (step を省略した場合は 1) です。 ``N``, ``start``, ``end``, ``step`` は int または float です。 + +Quantum ESPRESSO 向けパラメータ +=============================== + +``optional`` セクションおよび ``tasks`` セクションの ``content`` に記載する内容について、Quantum ESPRESSO 固有の内容を記述します。 +現時点では pw.x の ``scf`` および ``nscf`` に対応しています。 + +optionalセクション +------------------ + + ``pp_file`` + + 元素種と擬ポテンシャルを対応付けるCSV形式のインデックスファイルを指定します。 + ファイルの書式は、元素種、擬ポテンシャルファイルのタイプ、nexclude、orbitals です。例: + + .. code-block:: + + Fe,pbe-spn-rrkjus_psl.0.2.1,4,spd + + 擬ポテンシャルファイルのファイル名は Fe.pbe-spn-rrkjus_psl.0.2.1.UPF に対応します。 + + ``cutoff_file`` + + 擬ポテンシャルファイルとカットオフを対応付けるCSV形式のインデックスファイルを指定します。 + ファイルの書式は、擬ポテンシャルファイル、ecutwfcの値、ecutrhoの値 です。 + + ``pseudo_dir`` + + 擬ポテンシャルファイルを格納するディレクトリ名を指定します。カットオフの値を擬ポテンシャルファイルから取得する場合に使用します。Quantum ESPRESSO の ``pseudo_dir`` パラメータとは独立に指定します。 + + +content +-------- + + **namelist** + + - ``structure`` セクションの ``use_ibrav`` パラメータに応じて、 ``&system`` の格子情報の指定が上書きされます。 + + - ``use_ibrav = false``: + ``ibrav`` は 0 にセットされます。また、格子パラメータに関する ``a``, ``b``, ``c``, ``cosab``, ``cosac``, ``cosbc``, ``celldm`` は削除されます。 + + - ``use_ibrav = true``: + ``ibrav`` は結晶構造データから取得された Bravais 格子のインデックスがセットされます。また、Structure データは基本格子のとり方など Quantum ESPRESSO の convention に合わせて再構成されます。 + + - ``nat`` (原子数) および ``ntyp`` (元素種の数)は結晶構造データから取得される値で上書きされます。 + + - カットオフ ``ecutwfc`` および ``ecutrho`` の情報は、パラメータの値が空欄の場合は擬ポテンシャルファイルから取得します。 + + **CELL_PARAMETERS** + + - ``structure`` セクションの ``use_ibrav`` パラメータが true の場合は出力されません。false の場合は格子ベクトルが出力されます。単位は angstrom です。 + + - 格子ベクトルの情報は結晶構造データから取得されます。 ``data`` フィールドに 3x3 の行列を直接指定した場合はその値が用いられます。 + + **ATOMIC_SPECIES** + + - 原子種・原子量・擬ポテンシャルファイル名のリストを出力します。 + + - 原子種の情報は結晶構造データから取得されます。擬ポテンシャルのファイル名は ``pp_list`` で指定するCSV形式のインデックスファイルを参照します。 + + - ``data`` フィールドに必要なデータを指定した場合はその値が用いられます。 + + **ATOMIC_POSITIONS** + + - 原子種と原子座標(fractional coordinate)のリストを出力します。 + + - ``ignore_species`` に原子種または原子種のリストを指定した場合、その原子種については ``if_pos`` の値が 0 にセットされます。MDや構造最適化の際に使われます。 + + - ``data`` フィールドに必要なデータを指定した場合はその値が用いられます。 + + **K_POINTS** + + - k点の情報を出力します。 ``option`` に出力タイプを指定します。 + + - ``gamma``: :math:`\Gamma` 点を用います。 + + - ``crystal``: メッシュ状の k点のリストを出力します。メッシュの指定は ``grid`` パラメータまたは ``vol_density`` や ``k_resolution`` から導出される値が用いられます。 + + - ``automatic``: k点のメッシュを指定します。メッシュの指定は ``grid`` パラメータまたは ``vol_density`` や ``k_resolution`` から導出される値が用いられます。 シフトの指定は ``kshifts`` パラメータを参照します。 + + - メッシュの指定は以下の順序で決定されます。 + + - ``grid`` パラメータの指定。grid の値は :math:`n_x, n_y, n_z` の配列またはスカラー値 :math:`n` です。後者の場合は :math:`n_x = n_y = n_z = n` と仮定します。 + - ``vol_density`` パラメータから自動導出。 + - ``k_resolution`` パラメータから自動導出。``k_resolution`` のデフォルトは 0.15 です。 + + - ``data`` フィールドに必要なデータを指定した場合はその値が用いられます。 + + +VASP 向けパラメータ +=============================== + +``optional`` セクションおよび ``tasks`` セクションの ``content`` に記載する内容について、VASP 固有の内容を記述します。 + +optional +-------- + +擬ポテンシャルのタイプや格納場所を指定します。 + +pymatgen では、擬ポテンシャルファイルを +``PMG_VASP_PSP_DIR``/*functional*/POTCAR. *element* (.gz) または +``PMG_VASP_PSP_DIR``/*functional*/ *element* /POTCAR から取得します。 +``PMG_VASP_PSP_DIR`` はディレクトリの指定で、設定ファイル ``~/.config/.pmgrc.yaml`` に記載するか、同名の環境変数に指定します。また、 *functional* は擬ポテンシャルのタイプで、 ``POT_GGA_PAW_PBE`` や ``POT_LDA_PAW`` などが決められています。 + + ``pseudo_functional`` + + 擬ポテンシャルのタイプを指定します。タイプの指定と上記の *functional* の対応は pymatgen 内のテーブルに定義され、 ``PBE`` → ``POT_GGA_PAW_PBE``,  ``LDA`` → ``POT_LDA_PAW`` などのようになっています。 + +以下の ``pseudo_dir`` を指定した場合は pymatgen の流儀を無視して擬ポテンシャルの格納ディレクトリを探します。 + + ``psuedo_dir`` + + 擬ポテンシャルの格納ディレクトリを指定します。擬ポテンシャルファイルのファイル名は ``pseudo_dir``/POTCAR. *element* (.gz) または ``pseudo_dir``/*element*/POTCAR です。 + + +tasks +----- + +テンプレートファイルは、 ``template_dir`` で指定するディレクトリ内に ``INCAR``, ``KPOINTS``, ``POSCAR``, ``POTCAR`` ファイルを配置します。ファイルがない項目は無視されます。 + +content +------- + + **incar** + + - INCAR ファイルに記述するパラメータを列挙します。 + + **kpoints** + + - ``type`` + + KPOINTS の指定方法を記述します。以下の値に対応しています。タイプによりパラメータが指定可能なものがあります。詳細は pymatgen.io.vasp のマニュアルを参照してください。 + + - ``automatic`` + + parameter: ``grid`` + + - ``gamma_automatic`` + + parameter: ``grid``, ``shift`` + + - ``monkhorst_automatic`` + + parameter: ``grid``, ``shift`` + + - ``automatic_density`` + + parameter: ``kppa``, ``force_gamma`` + + - ``automatic_gamma_density`` + + parameter: ``grid_density`` + + - ``automatic_density_by_vol`` + + parameter: ``grid_density``, ``force_gamma`` + + - ``automatic_density_by_lengths`` + + parameter: ``length_density``, ``force_gamma`` + + - ``automatic_linemode`` + + parameter: ``division``, ``path_type`` (HighSymmKpath の path_type に対応) + + +OpenMX 向けパラメータ +=============================== + +``optional`` セクションおよび ``tasks`` セクションの ``content`` に記載する内容について、OpenMX 固有の内容を記述します。 + +optional +-------- + + ``data_path`` + + 擬原子軌道および擬ポテンシャルのファイルを格納するディレクトリを指定します。入力ファイルの ``DATA.PATH`` パラメータに対応します。 + +content +-------- + + ``precision`` + + 擬原子軌道を OpenMXマニュアル 10.6 章の Table 1, 2 にしたがって選択します。 ``quick``, ``standard``, ``precise`` のいずれかの値を取ります。デフォルト値は ``quick`` です。 + +AkaiKKR 向けパラメータ +=============================== + +``optional`` セクションおよび ``tasks`` セクションの ``content`` に記載する内容について、AkaiKKR 固有の内容を記述します。 + +optional +-------- + + ``workdir`` + + 一時ファイルの出力先を指定します。指定しない場合は ``/tmp`` または ``TMPDIR`` 環境変数の値を利用します。 + + +content +-------- + +``content`` には AkaiKKR の入力パラメータの内容を記述します。指定のない項目は空欄が出力され、AkaiKKR内部のデフォルト値が使われます。 +以下のパラメータは結晶構造データから決まる値で置き換えられます。 + +- ``brvtyp``: + ただし、 ``brvtyp`` に ``aux`` (を含む)値が指定されている場合は上書きされません。 + +- 格子パラメータ: ``a``, ``c/a``, ``b/a``, ``alpha``, ``beta``, ``gamma``, ``r1``, ``r2``, ``r3`` + +- タイプ情報: ``ntyp``, ``type``, ``ncmp``, ``rmt``, ``field``, ``mxl``, ``anclr``, ``conc`` + +- 元素種の情報: ``natm``, ``atmicx``, ``atmtyp`` + +なお、 ``rmt`` と ``field`` の値は、入力パラメータファイル内で ``ntyp`` 個の要素からなるリストとして指定されている場合のみ、入力パラメータファイルの値が使われます。 diff --git a/manual/v1.0.0/ja/html/_sources/cif2x/index.rst.txt b/manual/v1.0.0/ja/html/_sources/cif2x/index.rst.txt new file mode 100644 index 0000000..82d4180 --- /dev/null +++ b/manual/v1.0.0/ja/html/_sources/cif2x/index.rst.txt @@ -0,0 +1,15 @@ +**************************************************************** +第一原理計算入力ファイル生成ツール (cif2x) +**************************************************************** + + +.. toctree:: + :maxdepth: 2 + :numbered: 2 + + about/index + basic-usage + tutorial/index + command/index + filespec/index + appendix/index diff --git a/manual/v1.0.0/ja/html/_sources/cif2x/tutorial/index.rst.txt b/manual/v1.0.0/ja/html/_sources/cif2x/tutorial/index.rst.txt new file mode 100644 index 0000000..6a20ee7 --- /dev/null +++ b/manual/v1.0.0/ja/html/_sources/cif2x/tutorial/index.rst.txt @@ -0,0 +1,65 @@ +.. _sec-cif2x-tutorial: + +チュートリアル +================================================================ + +第一原理計算入力ファイル生成ツール cif2x を使うには、入力パラメータファイルと結晶構造データおよび擬ポテンシャルファイルを用意した後、プログラム cif2x を実行します。現在は Quantum ESPRESSO, VASP, OpenMX, AkaiKKR の入力ファイル生成に対応しています。以下では、 ``docs/tutorial/cif2x`` ディレクトリにある Quantum ESPRESSO 向けサンプルを例にチュートリアルを実施します。 + +入力パラメータファイルを作成する +---------------------------------------------------------------- + +入力パラメータファイルには、第一原理計算プログラムに与える入力ファイルの内容を記述します。 + +以下に入力パラメータファイルのサンプルを記載します。このファイルは YAML形式のテキストファイルで、結晶構造データに対するオプションの指定や、出力する第一原理計算入力ファイルの内容を記述します。仕様の詳細については :ref:`ファイルフォーマット ` の章を参照してください。 + +YAMLフォーマットでは、 ``keyword: value`` の辞書形式でパラメータを記述します。 ``value`` には数値や文字列などのスカラー値や、複数の値を ``[ ]`` または箇条書きの形式で列挙するリスト型、または辞書型を入れ子にすることができます。 + +.. literalinclude:: ../../../../tutorial/cif2x/input.yaml + :language: yaml + + +入力パラメータファイルは ``structure``, ``optional``, ``tasks`` のブロックから構成されます。 +``structure`` は結晶構造データに関するオプションを指定します。 +``optional`` は擬ポテンシャルに関する global な設定などを行います。 + +``tasks`` は出力する第一原理計算入力ファイルの内容を指定します。一連の計算に対応して複数のファイルを生成できるよう、tasks は配列の値を取ります。 +各出力について、計算内容は ``mode`` パラメータで指定します。SCF計算の ``scf`` や NSCF計算の ``nscf`` に対応するほか、一般的な出力を行う任意の出力モードを指定できます。 +ファイルは ``output_dir`` および ``output_file`` で指定するファイルに書き出されます。 + +出力内容は ``content`` に記載します。 +Quantum ESPRESSO の入力ファイルは、 ``&keyword`` で始まる Fortran90 の namelist 形式と、 ``K_POINTS`` などのキーワードで始まり空行で分割される cards と呼ばれるブロックからなります。 ``content`` には namelist と cards を入れ子の辞書形式で指定します。 +いくつかの例外を除いて、指定された内容が基本的にはそのまま入力ファイルに書き出されます。値が空欄のキーワードは、結晶構造データなどから求めた値が代入されます。 + +また、template として入力ファイルの雛形を指定することもできます。 ``template`` に指定したファイルの内容と ``content`` のデータを合わせたものを入力データとして扱います。同じキーワードのデータが存在する場合は ``content`` の指定が優先されます。従って、既存の入力ファイルを元に必要な箇所を入力パラメータファイルで上書きする使い方が可能です。上記の例では次のファイル(``scf.in_tmpl``)を template として取り込み、カットオフと CELL_PARAMETER, ATOMIC_SPECIES, ATOMIC_POSITIONS, K_POINT の箇所を結晶構造等から決めます。 ``ecutwfc`` と ``ecutrho`` が空欄で上書きされていることに留意してください。 + +.. literalinclude:: ../../../../tutorial/cif2x/scf.in_tmpl + :language: fortran + + +第一原理計算入力ファイルを生成する +---------------------------------------------------------------- + +入力パラメータファイル(input.yaml)と結晶構造データ(Co3SnS2_nosym.cif)を入力として cif2x を実行します。 + +.. code-block:: bash + + $ cif2x -t QE input.yaml Co3SnS2_nosym.cif + +予め必要な擬ポテンシャルのファイルを ``./pseudo`` ディレクトリに配置し、擬ポテンシャルのインデックスファイルを ``./pseudo/pp_psl_pbe_rrkjus.csv`` に作成しておきます。 + +``cif2x`` を実行すると Quantum ESPRESSO用の入力ファイルが生成され出力されます。出力先は入力パラメータファイル内のパラメータで指定するディレクトリ(``output_dir``)およびファイル(``output_file``)です。この例では ``./scf/scf.in`` に SCF計算用の入力ファイルが書き出されます。 + +パラメータセットを指定する +---------------------------------------------------------------- + +入力パラメータ内の値をいくつか変えながら一連の入力ファイルを生成したいことがあります。例えばカットオフの値やk点の数を変えて収束性を評価するなどの場合です。入力パラメータには値のリストや範囲を指定することができ、値の組み合わせごとに個別のディレクトリを作成して入力ファイルを生成します。 +パラメータセットの指定は特別な構文 ``${...}`` を用います。 + +.. code-block:: yaml + + content: + K_POINTS: + option: automatic + grid: ${ [ [4,4,4], [8,8,8], [12,12,12] ] } + +例えば上記のように ``K_POINTS`` を指定すると、 ``grid`` の値が ``[4,4,4]``, ``[8,8,8]``, ``[12,12,12]`` の入力ファイルがそれぞれ ``4x4x4/``, ``8x8x8/``, ``12x12x12/`` サブディレクトリ内に作成されます。 diff --git a/manual/v1.0.0/ja/html/_sources/index.rst.txt b/manual/v1.0.0/ja/html/_sources/index.rst.txt new file mode 100644 index 0000000..0176a5c --- /dev/null +++ b/manual/v1.0.0/ja/html/_sources/index.rst.txt @@ -0,0 +1,20 @@ +.. HTP-tools documentation master file, created by + sphinx-quickstart on Fri Jun 30 11:02:31 2023. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Cif2x Users Guide +===================================== + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + cif2x/index + +.. Indices and tables +.. ================== + +.. * :ref:`genindex` +.. * :ref:`modindex` +.. * :ref:`search` diff --git a/manual/v1.0.0/ja/html/_static/alabaster.css b/manual/v1.0.0/ja/html/_static/alabaster.css new file mode 100644 index 0000000..55f9cb1 --- /dev/null +++ b/manual/v1.0.0/ja/html/_static/alabaster.css @@ -0,0 +1,708 @@ +@import url("basic.css"); + +/* -- page layout ----------------------------------------------------------- */ + +body { + font-family: Georgia; + font-size: 17px; + background-color: #fff; + color: #000; + margin: 0; + padding: 0; +} + + +div.document { + width: 940px; + margin: 30px auto 0 auto; +} + +div.documentwrapper { + float: left; + width: 100%; +} + +div.bodywrapper { + margin: 0 0 0 220px; +} + +div.sphinxsidebar { + width: 220px; + font-size: 14px; + line-height: 1.5; +} + +hr { + border: 1px solid #B1B4B6; +} + +div.body { + background-color: #fff; + color: #3E4349; + padding: 0 30px 0 30px; +} + +div.body > .section { + text-align: left; +} + +div.footer { + width: 940px; + margin: 20px auto 30px auto; + font-size: 14px; + color: #888; + text-align: right; +} + +div.footer a { + color: #888; +} + +p.caption { + font-family: inherit; + font-size: inherit; +} + + +div.relations { + display: none; +} + + +div.sphinxsidebar { + max-height: 100%; + overflow-y: auto; +} + +div.sphinxsidebar a { + color: #444; + text-decoration: none; + border-bottom: 1px dotted #999; +} + +div.sphinxsidebar a:hover { + border-bottom: 1px solid #999; +} + +div.sphinxsidebarwrapper { + padding: 18px 10px; +} + +div.sphinxsidebarwrapper p.logo { + padding: 0; + margin: -10px 0 0 0px; + text-align: center; +} + +div.sphinxsidebarwrapper h1.logo { + margin-top: -10px; + text-align: center; + margin-bottom: 5px; + text-align: left; +} + +div.sphinxsidebarwrapper h1.logo-name { + margin-top: 0px; +} + +div.sphinxsidebarwrapper p.blurb { + margin-top: 0; + font-style: normal; +} + +div.sphinxsidebar h3, +div.sphinxsidebar h4 { + font-family: Georgia; + color: #444; + font-size: 24px; + font-weight: normal; + margin: 0 0 5px 0; + padding: 0; +} + +div.sphinxsidebar h4 { + font-size: 20px; +} + +div.sphinxsidebar h3 a { + color: #444; +} + +div.sphinxsidebar p.logo a, +div.sphinxsidebar h3 a, +div.sphinxsidebar p.logo a:hover, +div.sphinxsidebar h3 a:hover { + border: none; +} + +div.sphinxsidebar p { + color: #555; + margin: 10px 0; +} + +div.sphinxsidebar ul { + margin: 10px 0; + padding: 0; + color: #000; +} + +div.sphinxsidebar ul li.toctree-l1 > a { + font-size: 120%; +} + +div.sphinxsidebar ul li.toctree-l2 > a { + font-size: 110%; +} + +div.sphinxsidebar input { + border: 1px solid #CCC; + font-family: Georgia; + font-size: 1em; +} + +div.sphinxsidebar #searchbox input[type="text"] { + width: 160px; +} + +div.sphinxsidebar .search > div { + display: table-cell; +} + +div.sphinxsidebar hr { + border: none; + height: 1px; + color: #AAA; + background: #AAA; + + text-align: left; + margin-left: 0; + width: 50%; +} + +div.sphinxsidebar .badge { + border-bottom: none; +} + +div.sphinxsidebar .badge:hover { + border-bottom: none; +} + +/* To address an issue with donation coming after search */ +div.sphinxsidebar h3.donation { + margin-top: 10px; +} + +/* -- body styles ----------------------------------------------------------- */ + +a { + color: #004B6B; + text-decoration: underline; +} + +a:hover { + color: #6D4100; + text-decoration: underline; +} + +div.body h1, +div.body h2, +div.body h3, +div.body h4, +div.body h5, +div.body h6 { + font-family: Georgia; + font-weight: normal; + margin: 30px 0px 10px 0px; + padding: 0; +} + +div.body h1 { margin-top: 0; padding-top: 0; font-size: 240%; } +div.body h2 { font-size: 180%; } +div.body h3 { font-size: 150%; } +div.body h4 { font-size: 130%; } +div.body h5 { font-size: 100%; } +div.body h6 { font-size: 100%; } + +a.headerlink { + color: #DDD; + padding: 0 4px; + text-decoration: none; +} + +a.headerlink:hover { + color: #444; + background: #EAEAEA; +} + +div.body p, div.body dd, div.body li { + line-height: 1.4em; +} + +div.admonition { + margin: 20px 0px; + padding: 10px 30px; + background-color: #EEE; + border: 1px solid #CCC; +} + +div.admonition tt.xref, div.admonition code.xref, div.admonition a tt { + background-color: #FBFBFB; + border-bottom: 1px solid #fafafa; +} + +div.admonition p.admonition-title { + font-family: Georgia; + font-weight: normal; + font-size: 24px; + margin: 0 0 10px 0; + padding: 0; + line-height: 1; +} + +div.admonition p.last { + margin-bottom: 0; +} + +div.highlight { + background-color: #fff; +} + +dt:target, .highlight { + background: #FAF3E8; +} + +div.warning { + background-color: #FCC; + border: 1px solid #FAA; +} + +div.danger { + background-color: #FCC; + border: 1px solid #FAA; + -moz-box-shadow: 2px 2px 4px #D52C2C; + -webkit-box-shadow: 2px 2px 4px #D52C2C; + box-shadow: 2px 2px 4px #D52C2C; +} + +div.error { + background-color: #FCC; + border: 1px solid #FAA; + -moz-box-shadow: 2px 2px 4px #D52C2C; + -webkit-box-shadow: 2px 2px 4px #D52C2C; + box-shadow: 2px 2px 4px #D52C2C; +} + +div.caution { + background-color: #FCC; + border: 1px solid #FAA; +} + +div.attention { + background-color: #FCC; + border: 1px solid #FAA; +} + +div.important { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.note { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.tip { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.hint { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.seealso { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.topic { + background-color: #EEE; +} + +p.admonition-title { + display: inline; +} + +p.admonition-title:after { + content: ":"; +} + +pre, tt, code { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; + font-size: 0.9em; +} + +.hll { + background-color: #FFC; + margin: 0 -12px; + padding: 0 12px; + display: block; +} + +img.screenshot { +} + +tt.descname, tt.descclassname, code.descname, code.descclassname { + font-size: 0.95em; +} + +tt.descname, code.descname { + padding-right: 0.08em; +} + +img.screenshot { + -moz-box-shadow: 2px 2px 4px #EEE; + -webkit-box-shadow: 2px 2px 4px #EEE; + box-shadow: 2px 2px 4px #EEE; +} + +table.docutils { + border: 1px solid #888; + -moz-box-shadow: 2px 2px 4px #EEE; + -webkit-box-shadow: 2px 2px 4px #EEE; + box-shadow: 2px 2px 4px #EEE; +} + +table.docutils td, table.docutils th { + border: 1px solid #888; + padding: 0.25em 0.7em; +} + +table.field-list, table.footnote { + border: none; + -moz-box-shadow: none; + -webkit-box-shadow: none; + box-shadow: none; +} + +table.footnote { + margin: 15px 0; + width: 100%; + border: 1px solid #EEE; + background: #FDFDFD; + font-size: 0.9em; +} + +table.footnote + table.footnote { + margin-top: -15px; + border-top: none; +} + +table.field-list th { + padding: 0 0.8em 0 0; +} + +table.field-list td { + padding: 0; +} + +table.field-list p { + margin-bottom: 0.8em; +} + +/* Cloned from + * https://github.com/sphinx-doc/sphinx/commit/ef60dbfce09286b20b7385333d63a60321784e68 + */ +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +table.footnote td.label { + width: .1px; + padding: 0.3em 0 0.3em 0.5em; +} + +table.footnote td { + padding: 0.3em 0.5em; +} + +dl { + margin-left: 0; + margin-right: 0; + margin-top: 0; + padding: 0; +} + +dl dd { + margin-left: 30px; +} + +blockquote { + margin: 0 0 0 30px; + padding: 0; +} + +ul, ol { + /* Matches the 30px from the narrow-screen "li > ul" selector below */ + margin: 10px 0 10px 30px; + padding: 0; +} + +pre { + background: #EEE; + padding: 7px 30px; + margin: 15px 0px; + line-height: 1.3em; +} + +div.viewcode-block:target { + background: #ffd; +} + +dl pre, blockquote pre, li pre { + margin-left: 0; + padding-left: 30px; +} + +tt, code { + background-color: #ecf0f3; + color: #222; + /* padding: 1px 2px; */ +} + +tt.xref, code.xref, a tt { + background-color: #FBFBFB; + border-bottom: 1px solid #fff; +} + +a.reference { + text-decoration: none; + border-bottom: 1px dotted #004B6B; +} + +/* Don't put an underline on images */ +a.image-reference, a.image-reference:hover { + border-bottom: none; +} + +a.reference:hover { + border-bottom: 1px solid #6D4100; +} + +a.footnote-reference { + text-decoration: none; + font-size: 0.7em; + vertical-align: top; + border-bottom: 1px dotted #004B6B; +} + +a.footnote-reference:hover { + border-bottom: 1px solid #6D4100; +} + +a:hover tt, a:hover code { + background: #EEE; +} + + +@media screen and (max-width: 870px) { + + div.sphinxsidebar { + display: none; + } + + div.document { + width: 100%; + + } + + div.documentwrapper { + margin-left: 0; + margin-top: 0; + margin-right: 0; + margin-bottom: 0; + } + + div.bodywrapper { + margin-top: 0; + margin-right: 0; + margin-bottom: 0; + margin-left: 0; + } + + ul { + margin-left: 0; + } + + li > ul { + /* Matches the 30px from the "ul, ol" selector above */ + margin-left: 30px; + } + + .document { + width: auto; + } + + .footer { + width: auto; + } + + .bodywrapper { + margin: 0; + } + + .footer { + width: auto; + } + + .github { + display: none; + } + + + +} + + + +@media screen and (max-width: 875px) { + + body { + margin: 0; + padding: 20px 30px; + } + + div.documentwrapper { + float: none; + background: #fff; + } + + div.sphinxsidebar { + display: block; + float: none; + width: 102.5%; + margin: 50px -30px -20px -30px; + padding: 10px 20px; + background: #333; + color: #FFF; + } + + div.sphinxsidebar h3, div.sphinxsidebar h4, div.sphinxsidebar p, + div.sphinxsidebar h3 a { + color: #fff; + } + + div.sphinxsidebar a { + color: #AAA; + } + + div.sphinxsidebar p.logo { + display: none; + } + + div.document { + width: 100%; + margin: 0; + } + + div.footer { + display: none; + } + + div.bodywrapper { + margin: 0; + } + + div.body { + min-height: 0; + padding: 0; + } + + .rtd_doc_footer { + display: none; + } + + .document { + width: auto; + } + + .footer { + width: auto; + } + + .footer { + width: auto; + } + + .github { + display: none; + } +} + + +/* misc. */ + +.revsys-inline { + display: none!important; +} + +/* Hide ugly table cell borders in ..bibliography:: directive output */ +table.docutils.citation, table.docutils.citation td, table.docutils.citation th { + border: none; + /* Below needed in some edge cases; if not applied, bottom shadows appear */ + -moz-box-shadow: none; + -webkit-box-shadow: none; + box-shadow: none; +} + + +/* relbar */ + +.related { + line-height: 30px; + width: 100%; + font-size: 0.9rem; +} + +.related.top { + border-bottom: 1px solid #EEE; + margin-bottom: 20px; +} + +.related.bottom { + border-top: 1px solid #EEE; +} + +.related ul { + padding: 0; + margin: 0; + list-style: none; +} + +.related li { + display: inline; +} + +nav#rellinks { + float: right; +} + +nav#rellinks li+li:before { + content: "|"; +} + +nav#breadcrumbs li+li:before { + content: "\00BB"; +} + +/* Hide certain items when printing */ +@media print { + div.related { + display: none; + } +} \ No newline at end of file diff --git a/manual/v1.0.0/ja/html/_static/basic.css b/manual/v1.0.0/ja/html/_static/basic.css new file mode 100644 index 0000000..4157edf --- /dev/null +++ b/manual/v1.0.0/ja/html/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: inherit; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/manual/v1.0.0/ja/html/_static/custom.css b/manual/v1.0.0/ja/html/_static/custom.css new file mode 100644 index 0000000..2a924f1 --- /dev/null +++ b/manual/v1.0.0/ja/html/_static/custom.css @@ -0,0 +1 @@ +/* This file intentionally left blank. */ diff --git a/manual/v1.0.0/ja/html/_static/doctools.js b/manual/v1.0.0/ja/html/_static/doctools.js new file mode 100644 index 0000000..d06a71d --- /dev/null +++ b/manual/v1.0.0/ja/html/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/manual/v1.0.0/ja/html/_static/documentation_options.js b/manual/v1.0.0/ja/html/_static/documentation_options.js new file mode 100644 index 0000000..026c2e5 --- /dev/null +++ b/manual/v1.0.0/ja/html/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '1.0.0', + LANGUAGE: 'ja', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/manual/v1.0.0/ja/html/_static/file.png b/manual/v1.0.0/ja/html/_static/file.png new file mode 100644 index 0000000000000000000000000000000000000000..a858a410e4faa62ce324d814e4b816fff83a6fb3 GIT binary patch literal 286 zcmV+(0pb3MP)s`hMrGg#P~ix$^RISR_I47Y|r1 z_CyJOe}D1){SET-^Amu_i71Lt6eYfZjRyw@I6OQAIXXHDfiX^GbOlHe=Ae4>0m)d(f|Me07*qoM6N<$f}vM^LjV8( literal 0 HcmV?d00001 diff --git a/manual/v1.0.0/ja/html/_static/language_data.js b/manual/v1.0.0/ja/html/_static/language_data.js new file mode 100644 index 0000000..b368127 --- /dev/null +++ b/manual/v1.0.0/ja/html/_static/language_data.js @@ -0,0 +1,26 @@ +/* + * language_data.js + * ~~~~~~~~~~~~~~~~ + * + * This script contains the language-specific data used by searchtools.js, + * namely the list of stopwords, stemmer, scorer and splitter. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +var stopwords = []; + + +/* Non-minified version is copied as a separate JS file, is available */ + +/** + * Dummy stemmer for languages without stemming rules. + */ +var Stemmer = function() { + this.stemWord = function(w) { + return w; + } +} + diff --git a/manual/v1.0.0/ja/html/_static/minus.png b/manual/v1.0.0/ja/html/_static/minus.png new file mode 100644 index 0000000000000000000000000000000000000000..d96755fdaf8bb2214971e0db9c1fd3077d7c419d GIT binary patch literal 90 zcmeAS@N?(olHy`uVBq!ia0vp^+#t*WBp7;*Yy1LIik>cxAr*|t7R?Mi>2?kWtu=nj kDsEF_5m^0CR;1wuP-*O&G^0G}KYk!hp00i_>zopr08q^qX#fBK literal 0 HcmV?d00001 diff --git a/manual/v1.0.0/ja/html/_static/plus.png b/manual/v1.0.0/ja/html/_static/plus.png new file mode 100644 index 0000000000000000000000000000000000000000..7107cec93a979b9a5f64843235a16651d563ce2d GIT binary patch literal 90 zcmeAS@N?(olHy`uVBq!ia0vp^+#t*WBp7;*Yy1LIik>cxAr*|t7R?Mi>2?kWtu>-2 m3q%Vub%g%s<8sJhVPMczOq}xhg9DJoz~JfX=d#Wzp$Pyb1r*Kz literal 0 HcmV?d00001 diff --git a/manual/v1.0.0/ja/html/_static/pygments.css b/manual/v1.0.0/ja/html/_static/pygments.css new file mode 100644 index 0000000..0d49244 --- /dev/null +++ b/manual/v1.0.0/ja/html/_static/pygments.css @@ -0,0 +1,75 @@ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #ffffcc } +.highlight { background: #eeffcc; } +.highlight .c { color: #408090; font-style: italic } /* Comment */ +.highlight .err { border: 1px solid #FF0000 } /* Error */ +.highlight .k { color: #007020; font-weight: bold } /* Keyword */ +.highlight .o { color: #666666 } /* Operator */ +.highlight .ch { color: #408090; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #408090; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #007020 } /* Comment.Preproc */ +.highlight .cpf { color: #408090; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #408090; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #408090; background-color: #fff0f0 } /* Comment.Special */ +.highlight .gd { color: #A00000 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +.highlight .gr { color: #FF0000 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #00A000 } /* Generic.Inserted */ +.highlight .go { color: #333333 } /* Generic.Output */ +.highlight .gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #0044DD } /* Generic.Traceback */ +.highlight .kc { color: #007020; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #007020; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #007020; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #007020 } /* Keyword.Pseudo */ +.highlight .kr { color: #007020; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #902000 } /* Keyword.Type */ +.highlight .m { color: #208050 } /* Literal.Number */ +.highlight .s { color: #4070a0 } /* Literal.String */ +.highlight .na { color: #4070a0 } /* Name.Attribute */ +.highlight .nb { color: #007020 } /* Name.Builtin */ +.highlight .nc { color: #0e84b5; font-weight: bold } /* Name.Class */ +.highlight .no { color: #60add5 } /* Name.Constant */ +.highlight .nd { color: #555555; font-weight: bold } /* Name.Decorator */ +.highlight .ni { color: #d55537; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #007020 } /* Name.Exception */ +.highlight .nf { color: #06287e } /* Name.Function */ +.highlight .nl { color: #002070; font-weight: bold } /* Name.Label */ +.highlight .nn { color: #0e84b5; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #062873; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #bb60d5 } /* Name.Variable */ +.highlight .ow { color: #007020; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mb { color: #208050 } /* Literal.Number.Bin */ +.highlight .mf { color: #208050 } /* Literal.Number.Float */ +.highlight .mh { color: #208050 } /* Literal.Number.Hex */ +.highlight .mi { color: #208050 } /* Literal.Number.Integer */ +.highlight .mo { color: #208050 } /* Literal.Number.Oct */ +.highlight .sa { color: #4070a0 } /* Literal.String.Affix */ +.highlight .sb { color: #4070a0 } /* Literal.String.Backtick */ +.highlight .sc { color: #4070a0 } /* Literal.String.Char */ +.highlight .dl { color: #4070a0 } /* Literal.String.Delimiter */ +.highlight .sd { color: #4070a0; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #4070a0 } /* Literal.String.Double */ +.highlight .se { color: #4070a0; font-weight: bold } /* Literal.String.Escape */ +.highlight .sh { color: #4070a0 } /* Literal.String.Heredoc */ +.highlight .si { color: #70a0d0; font-style: italic } /* Literal.String.Interpol */ +.highlight .sx { color: #c65d09 } /* Literal.String.Other */ +.highlight .sr { color: #235388 } /* Literal.String.Regex */ +.highlight .s1 { color: #4070a0 } /* Literal.String.Single */ +.highlight .ss { color: #517918 } /* Literal.String.Symbol */ +.highlight .bp { color: #007020 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #06287e } /* Name.Function.Magic */ +.highlight .vc { color: #bb60d5 } /* Name.Variable.Class */ +.highlight .vg { color: #bb60d5 } /* Name.Variable.Global */ +.highlight .vi { color: #bb60d5 } /* Name.Variable.Instance */ +.highlight .vm { color: #bb60d5 } /* Name.Variable.Magic */ +.highlight .il { color: #208050 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/manual/v1.0.0/ja/html/_static/searchtools.js b/manual/v1.0.0/ja/html/_static/searchtools.js new file mode 100644 index 0000000..7918c3f --- /dev/null +++ b/manual/v1.0.0/ja/html/_static/searchtools.js @@ -0,0 +1,574 @@ +/* + * searchtools.js + * ~~~~~~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for the full-text search. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // or matches in the last dotted part of the object name + objPartialMatch: 6, + // Additive scores depending on the priority of the object + objPrio: { + 0: 15, // used to be importantResults + 1: 5, // used to be objectResults + 2: -5, // used to be unimportantResults + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +const _removeChildren = (element) => { + while (element && element.lastChild) element.removeChild(element.lastChild); +}; + +/** + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping + */ +const _escapeRegExp = (string) => + string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string + +const _displayItem = (item, searchTerms, highlightTerms) => { + const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; + const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; + const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; + const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; + const contentRoot = document.documentElement.dataset.content_root; + + const [docName, title, anchor, descr, score, _filename] = item; + + let listItem = document.createElement("li"); + let requestUrl; + let linkUrl; + if (docBuilder === "dirhtml") { + // dirhtml builder + let dirname = docName + "/"; + if (dirname.match(/\/index\/$/)) + dirname = dirname.substring(0, dirname.length - 6); + else if (dirname === "index/") dirname = ""; + requestUrl = contentRoot + dirname; + linkUrl = requestUrl; + } else { + // normal html builders + requestUrl = contentRoot + docName + docFileSuffix; + linkUrl = docName + docLinkSuffix; + } + let linkEl = listItem.appendChild(document.createElement("a")); + linkEl.href = linkUrl + anchor; + linkEl.dataset.score = score; + linkEl.innerHTML = title; + if (descr) { + listItem.appendChild(document.createElement("span")).innerHTML = + " (" + descr + ")"; + // highlight search terms in the description + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + } + else if (showSearchSummary) + fetch(requestUrl) + .then((responseData) => responseData.text()) + .then((data) => { + if (data) + listItem.appendChild( + Search.makeSearchSummary(data, searchTerms) + ); + // highlight search terms in the summary + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + }); + Search.output.appendChild(listItem); +}; +const _finishSearch = (resultCount) => { + Search.stopPulse(); + Search.title.innerText = _("Search Results"); + if (!resultCount) + Search.status.innerText = Documentation.gettext( + "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories." + ); + else + Search.status.innerText = _( + `Search finished, found ${resultCount} page(s) matching the search query.` + ); +}; +const _displayNextItem = ( + results, + resultCount, + searchTerms, + highlightTerms, +) => { + // results left, load the summary and display it + // this is intended to be dynamic (don't sub resultsCount) + if (results.length) { + _displayItem(results.pop(), searchTerms, highlightTerms); + setTimeout( + () => _displayNextItem(results, resultCount, searchTerms, highlightTerms), + 5 + ); + } + // search finished, update title and status message + else _finishSearch(resultCount); +}; + +/** + * Default splitQuery function. Can be overridden in ``sphinx.search`` with a + * custom function per language. + * + * The regular expression works by splitting the string on consecutive characters + * that are not Unicode letters, numbers, underscores, or emoji characters. + * This is the same as ``\W+`` in Python, preserving the surrogate pair area. + */ +if (typeof splitQuery === "undefined") { + var splitQuery = (query) => query + .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu) + .filter(term => term) // remove remaining empty strings +} + +/** + * Search Module + */ +const Search = { + _index: null, + _queued_query: null, + _pulse_status: -1, + + htmlToText: (htmlString) => { + const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); + htmlElement.querySelectorAll(".headerlink").forEach((el) => { el.remove() }); + const docContent = htmlElement.querySelector('[role="main"]'); + if (docContent !== undefined) return docContent.textContent; + console.warn( + "Content block not found. Sphinx search tries to obtain it via '[role=main]'. Could you check your theme or template." + ); + return ""; + }, + + init: () => { + const query = new URLSearchParams(window.location.search).get("q"); + document + .querySelectorAll('input[name="q"]') + .forEach((el) => (el.value = query)); + if (query) Search.performSearch(query); + }, + + loadIndex: (url) => + (document.body.appendChild(document.createElement("script")).src = url), + + setIndex: (index) => { + Search._index = index; + if (Search._queued_query !== null) { + const query = Search._queued_query; + Search._queued_query = null; + Search.query(query); + } + }, + + hasIndex: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + Search.dots.innerText = ".".repeat(Search._pulse_status); + if (Search._pulse_status >= 0) window.setTimeout(pulse, 500); + }; + pulse(); + }, + + /** + * perform a search for something (or wait until index is loaded) + */ + performSearch: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + /** + * execute search (requires search index to be loaded) + */ + query: (query) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + // array of [docname, title, anchor, descr, score, filename] + let results = []; + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + let score = Math.round(100 * queryLower.length / title.length) + results.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id] of foundEntries) { + let score = Math.round(100 * queryLower.length / entry.length) + results.push([ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // lookup as object + objectTerms.forEach((term) => + results.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + results.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) results.forEach((item) => (item[4] = Scorer.score(item))); + + // now sort the results by score (in opposite order of appearance, since the + // display function below uses pop() to retrieve items) and then + // alphabetically + results.sort((a, b) => { + const leftScore = a[4]; + const rightScore = b[4]; + if (leftScore === rightScore) { + // same score: sort alphabetically + const leftTitle = a[1].toLowerCase(); + const rightTitle = b[1].toLowerCase(); + if (leftTitle === rightTitle) return 0; + return leftTitle > rightTitle ? -1 : 1; // inverted is intentional + } + return leftScore > rightScore ? 1 : -1; + }); + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + results = results.reverse(); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms, highlightTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord) && !terms[word]) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord) && !titleTerms[word]) + arr.push({ files: titleTerms[word], score: Scorer.partialTitle }); + }); + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (fileMap.has(file) && fileMap.get(file).indexOf(word) === -1) + fileMap.get(file).push(word); + else fileMap.set(file, [word]); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords) => { + const text = Search.htmlToText(htmlText); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/manual/v1.0.0/ja/html/_static/sphinx_highlight.js b/manual/v1.0.0/ja/html/_static/sphinx_highlight.js new file mode 100644 index 0000000..8a96c69 --- /dev/null +++ b/manual/v1.0.0/ja/html/_static/sphinx_highlight.js @@ -0,0 +1,154 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + const rest = document.createTextNode(val.substr(pos + text.length)); + parent.insertBefore( + span, + parent.insertBefore( + rest, + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + /* There may be more occurrences of search term in this node. So call this + * function recursively on the remaining fragment. + */ + _highlight(rest, addItems, text, className); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute("class", className); + addItems.push({ parent: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(() => { + /* Do not call highlightSearchWords() when we are on the search page. + * It will highlight words from the *previous* search query. + */ + if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords(); + SphinxHighlight.initEscapeListener(); +}); diff --git a/manual/v1.0.0/ja/html/_static/translations.js b/manual/v1.0.0/ja/html/_static/translations.js new file mode 100644 index 0000000..817b128 --- /dev/null +++ b/manual/v1.0.0/ja/html/_static/translations.js @@ -0,0 +1,60 @@ +Documentation.addTranslations({ + "locale": "ja", + "messages": { + "%(filename)s — %(docstitle)s": "%(filename)s — %(docstitle)s", + "© %(copyright_prefix)s %(copyright)s.": "", + ", in ": ", in ", + "About these documents": "\u3053\u306e\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u306b\u3064\u3044\u3066", + "Automatically generated list of changes in version %(version)s": "\u30d0\u30fc\u30b8\u30e7\u30f3 %(version)s \u306e\u5909\u66f4\u70b9\uff08\u3053\u306e\u30ea\u30b9\u30c8\u306f\u81ea\u52d5\u751f\u6210\u3055\u308c\u3066\u3044\u307e\u3059\uff09", + "C API changes": "C API \u306b\u95a2\u3059\u308b\u5909\u66f4", + "Changes in Version %(version)s — %(docstitle)s": "\u30d0\u30fc\u30b8\u30e7\u30f3 %(version)s \u306e\u5909\u66f4\u70b9 — %(docstitle)s", + "Collapse sidebar": "\u30b5\u30a4\u30c9\u30d0\u30fc\u3092\u305f\u305f\u3080", + "Complete Table of Contents": "\u7dcf\u5408\u76ee\u6b21", + "Contents": "\u30b3\u30f3\u30c6\u30f3\u30c4", + "Copyright": "\u8457\u4f5c\u6a29", + "Created using Sphinx %(sphinx_version)s.": "", + "Expand sidebar": "\u30b5\u30a4\u30c9\u30d0\u30fc\u3092\u5c55\u958b", + "Full index on one page": "\u7dcf\u7d22\u5f15", + "General Index": "\u7dcf\u5408\u7d22\u5f15", + "Global Module Index": "\u30e2\u30b8\u30e5\u30fc\u30eb\u7dcf\u7d22\u5f15", + "Go": "\u691c\u7d22", + "Hide Search Matches": "\u691c\u7d22\u7d50\u679c\u3092\u96a0\u3059", + "Index": "\u7d22\u5f15", + "Index – %(key)s": "\u7d22\u5f15 – %(key)s", + "Index pages by letter": "\u982d\u6587\u5b57\u5225\u7d22\u5f15", + "Indices and tables:": "\u7d22\u5f15\u3068\u8868\u4e00\u89a7:", + "Last updated on %(last_updated)s.": "\u6700\u7d42\u66f4\u65b0: %(last_updated)s", + "Library changes": "\u30e9\u30a4\u30d6\u30e9\u30ea\u306b\u95a2\u3059\u308b\u5909\u66f4", + "Navigation": "\u30ca\u30d3\u30b2\u30fc\u30b7\u30e7\u30f3", + "Next topic": "\u6b21\u306e\u30c8\u30d4\u30c3\u30af\u3078", + "Other changes": "\u305d\u306e\u4ed6\u306e\u5909\u66f4", + "Overview": "\u6982\u8981", + "Please activate JavaScript to enable the search\n functionality.": "\u691c\u7d22\u6a5f\u80fd\u3092\u4f7f\u3046\u306b\u306f JavaScript \u3092\u6709\u52b9\u306b\u3057\u3066\u304f\u3060\u3055\u3044\u3002", + "Preparing search...": "\u691c\u7d22\u3092\u6e96\u5099\u3057\u3066\u3044\u307e\u3059...", + "Previous topic": "\u524d\u306e\u30c8\u30d4\u30c3\u30af\u3078", + "Quick search": "\u30af\u30a4\u30c3\u30af\u691c\u7d22", + "Search": "\u691c\u7d22", + "Search Page": "\u691c\u7d22\u30da\u30fc\u30b8", + "Search Results": "\u691c\u7d22\u7d50\u679c", + "Search finished, found ${resultCount} page(s) matching the search query.": "", + "Search within %(docstitle)s": "%(docstitle)s \u5185\u3092\u691c\u7d22", + "Searching": "\u691c\u7d22\u4e2d", + "Searching for multiple words only shows matches that contain\n all words.": "\u8907\u6570\u306e\u5358\u8a9e\u3092\u691c\u7d22\u3059\u308b\u3068\u3001\u6b21\u3092\u542b\u3080\u4e00\u81f4\u306e\u307f\u304c\u8868\u793a\u3055\u308c\u307e\u3059\n \u00a0\u00a0\u00a0 \u3059\u3079\u3066\u306e\u7528\u8a9e\u3002", + "Show Source": "\u30bd\u30fc\u30b9\u30b3\u30fc\u30c9\u3092\u8868\u793a", + "Table of Contents": "\u76ee\u6b21", + "This Page": "\u3053\u306e\u30da\u30fc\u30b8", + "Welcome! This is": "Welcome! This is", + "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "\u691c\u7d22\u3057\u305f\u6587\u5b57\u5217\u306f\u3069\u306e\u6587\u66f8\u306b\u3082\u898b\u3064\u304b\u308a\u307e\u305b\u3093\u3067\u3057\u305f\u3002\u3059\u3079\u3066\u306e\u5358\u8a9e\u304c\u6b63\u78ba\u306b\u8a18\u8ff0\u3055\u308c\u3066\u3044\u308b\u304b\u3001\u3042\u308b\u3044\u306f\u3001\u5341\u5206\u306a\u30ab\u30c6\u30b4\u30ea\u30fc\u304c\u9078\u629e\u3055\u308c\u3066\u3044\u308b\u304b\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002", + "all functions, classes, terms": "\u95a2\u6570\u3001\u30af\u30e9\u30b9\u304a\u3088\u3073\u7528\u8a9e\u7dcf\u89a7", + "can be huge": "\u5927\u304d\u3044\u5834\u5408\u304c\u3042\u308b\u306e\u3067\u6ce8\u610f", + "last updated": "\u6700\u7d42\u66f4\u65b0", + "lists all sections and subsections": "\u7ae0\uff0f\u7bc0\u4e00\u89a7", + "next chapter": "\u6b21\u306e\u7ae0\u3078", + "previous chapter": "\u524d\u306e\u7ae0\u3078", + "quick access to all modules": "\u5168\u30e2\u30b8\u30e5\u30fc\u30eb\u65e9\u898b\u8868", + "search": "\u691c\u7d22", + "search this documentation": "\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u3092\u691c\u7d22", + "the documentation for": "the documentation for" + }, + "plural_expr": "0" +}); \ No newline at end of file diff --git a/manual/v1.0.0/ja/html/cif2x/about/index.html b/manual/v1.0.0/ja/html/cif2x/about/index.html new file mode 100644 index 0000000..3a5ecb4 --- /dev/null +++ b/manual/v1.0.0/ja/html/cif2x/about/index.html @@ -0,0 +1,176 @@ + + + + + + + + 1. 概要 — cif2x Users Guide 1.0.0 ドキュメント + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

1. 概要

+
+

1.1. cif2xとは?

+

近年、機械学習を活用した物性予測や物質設計(マテリアルズインフォマティクス)が注目されています。 +機械学習の精度は、適切な教師データの準備に大きく依存しています。 +そのため、迅速に教師データを生成するためのツールや環境の整備は、 +マテリアルズインフォマティクスの研究進展に大きく貢献すると期待されます。

+

cif2xは、cifファイルから第一原理計算用の入力ファイルを生成するツールです。 +入力パラメータを雛形として、物質の種類や計算条件によって変わる箇所を結晶構造データなどから構成します。 +特定の計算条件に応じた複数の入力ファイルを生成することが可能です。 +現在は、 +VASP, Quantum ESPRESSO, OpenMX, AkaiKKR に対応しています。

+
+
+

1.2. ライセンス

+

本ソフトウェアのプログラムパッケージおよびソースコード一式はGNU General Public License version 3 (GPL v3) に準じて配布されています。

+
+
+

1.3. 開発貢献者

+

本ソフトウェアは以下の開発貢献者により開発されています。

+
    +
  • ver.1.0.0 (2024/03/XXリリース)

  • +
  • ver.1.0-alpha (2023/12/28リリース)

    +
      +
    • 開発者

      +
        +
      • 吉見 一慶 (東京大学 物性研究所)

      • +
      • 青山 龍美 (東京大学 物性研究所)

      • +
      • 本山 裕一 (東京大学 物性研究所)

      • +
      • 福田 将大 (東京大学 物性研究所)

      • +
      • 井戸 康太 (東京大学 物性研究所)

      • +
      • 福島 鉄也 (産業技術総合研究所)

      • +
      • 笠松 秀輔 (山形大学 学術研究院(理学部主担当))

      • +
      • 是常 隆  (東北大学大学院理学研究科)

      • +
      +
    • +
    • プロジェクトコーディネーター

      +
        +
      • 尾崎 泰助 (東京大学 物性研究所)

      • +
      +
    • +
    +
  • +
+
+
+

1.4. コピーライト

+

© 2023- The University of Tokyo. All rights reserved.

+

本ソフトウェアは2023年度 東京大学物性研究所 ソフトウェア高度化プロジェクトの支援を受け開発されており、その著作権は東京大学が所持しています。

+
+
+

1.5. 動作環境

+

以下の環境で動作することを確認しています。

+
    +
  • Ubuntu Linux + python3

  • +
+
+
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/manual/v1.0.0/ja/html/cif2x/appendix/index.html b/manual/v1.0.0/ja/html/cif2x/appendix/index.html new file mode 100644 index 0000000..8a25381 --- /dev/null +++ b/manual/v1.0.0/ja/html/cif2x/appendix/index.html @@ -0,0 +1,152 @@ + + + + + + + + 6. 拡張ガイド — cif2x Users Guide 1.0.0 ドキュメント + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

6. 拡張ガイド

+
+

6.1. Quantum ESPRESSO の mode を追加する

+

Quantum ESPRESSO の計算モードへの対応を追加するには、 src/cif2x/qe/calc_mode.pycreate_modeproc() 関数に mode と変換クラスの対応付けを記述します。

+
def create_modeproc(mode, qe):
+    if mode in ["scf", "nscf"]:
+        modeproc = QEmode_pw(qe)
+    else:
+        modeproc = QEmode_generic(qe)
+    return modeproc
+
+
+

modeごとの変換機能は QEmode_base の派生クラスとしてまとめられています。 +このクラスは +update_namelist() で namelist ブロックの更新と、 +update_cards() で cards ブロックのデータ生成を行います。 +現在は pw.x の scf および nscf に対応する QEmode_pw クラスと、変換せずそのまま出力する QEmode_generic クラスが用意されています。

+
class QEmode_base:
+    def __init__(self, qe):
+    def update_namelist(self, content):
+    def update_cards(self, content):
+
+
+

namelist については、空欄の値を結晶構造データ等から生成して代入するほか、格子パラメータなど Structure から決まる値や、他のパラメータとの整合性をとる必要のある値を強制的にセットする場合があります。処理内容はモードごとに個別に対応します。

+

cards ブロックについては、card の種類ごとに関数を用意し、card名と関数の対応付けを card_table 変数に列挙します。 +基底クラスの update_cards() では、card名から対応する関数を取得して実行し、card の情報を更新します。もちろん、全く独自に update_cards() 関数を作成することもできます。

+
self.card_table = {
+    'CELL_PARAMETERS': generate_cell_parameters,
+    'ATOMIC_SPECIES': generate_atomic_species,
+    'ATOMIC_POSITIONS': generate_atomic_positions,
+    'K_POINTS': generate_k_points,
+}
+
+
+

cardごとの関数は scr/cif2x/qe/cards.py にまとめられており、関数名は generate_{card名} としています。この関数は card ブロックのパラメータを引数に取り、card名、option、dataフィールドからなる辞書データを返します。

+
+
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/manual/v1.0.0/ja/html/cif2x/basic-usage.html b/manual/v1.0.0/ja/html/cif2x/basic-usage.html new file mode 100644 index 0000000..8e424ae --- /dev/null +++ b/manual/v1.0.0/ja/html/cif2x/basic-usage.html @@ -0,0 +1,228 @@ + + + + + + + + 2. インストールと基本的な使い方 — cif2x Users Guide 1.0.0 ドキュメント + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

2. インストールと基本的な使い方

+

必要なライブラリ・環境

+
+

HTP-tools に含まれる第一原理計算入力ファイル生成ツール cif2x を利用するには、以下のプログラムとライブラリが必要です。

+
    +
  • python 3.x

  • +
  • pymatgen モジュール

  • +
  • ruamel.yaml モジュール

  • +
  • f90nml モジュール

  • +
  • qe-tools モジュール

  • +
  • numpy モジュール

  • +
  • pandas モジュール

  • +
  • monty モジュール

  • +
  • OpenBabel モジュール (オプション)

  • +
  • AkaiKKRPythonUtil モジュール

  • +
+
+

ソースコード配布サイト

+
+
+

ダウンロード方法

+
+

gitを利用できる場合は、以下のコマンドでcif2xをダウンロードできます。

+
$ git clone https://github.com/issp-center-dev/cif2x.git
+
+
+
+

インストール方法

+
+

cif2xをダウンロード後、以下のコマンドを実行してインストールします。cif2xが利用するライブラリも必要に応じてインストールされます。

+
$ cd ./cif2x
+$ python3 -m pip install .
+
+
+

実行プログラム cif2x がインストールされます。

+

なお、AkaiKKRPythonUtil モジュールは別途インストールが必要です。 +以下の手順で 配布サイト からソースコードを取得しインストールします。また、必要な seaborn モジュールもインストールしておきます。

+
$ git clone https://github.com/AkaiKKRteam/AkaiKKRPythonUtil.git
+$ cd ./AkaiKKRPythonUtil/library/PyAkaiKKR
+$ python3 -m pip install .
+$ python3 -m pip install seaborn
+
+
+
+

ディレクトリ構成

+
+
.
+|-- LICENSE
+|-- README.md
+|-- pyproject.toml
+|-- docs/
+|   |-- ja/
+|   |-- tutorial/
+|-- src/
+|   |-- cif2x/
+|       |-- __init__.py
+|       |-- main.py
+|       |-- cif2struct.py
+|       |-- struct2qe.py
+|       |-- qe/
+|       |   |-- __init__.py
+|       |   |-- calc_mode.py
+|       |   |-- cards.py
+|       |   |-- content.py
+|       |   |-- qeutils.py
+|       |   |-- tools.py
+|       |-- struct2vasp.py
+|       |-- struct2openmx.py
+|       |-- openmx/
+|       |   |-- __init__.py
+|       |   |-- vps_table.py
+|       |-- struct2akaikkr.py
+|       |-- akaikkr/
+|       |   |-- make_input.py
+|       |   |-- read_input.py
+|       |   |-- run_cif2kkr.py
+|       |-- utils.py
+|-- sample/
+
+
+
+

基本的な使用方法

+
+

cif2xは第一原理計算プログラムのための入力ファイルを生成するツールです。入力パラメータを雛形として、物質の種類や計算条件によって変わる箇所を結晶構造データなどから構成します。現在は Quantum ESPRESSO, VASP, OpenMX, および AkaiKKR の入力ファイル形式に対応しています。

+
    +
  1. 入力パラメータファイルの作成

    +
    +

    cif2xを使用するには、まず、生成する入力ファイルの内容を記述したパラメータファイルをYAML形式で作成します。詳細についてはファイルフォーマットの章を参照してください。

    +
    +
  2. +
  3. 結晶構造ファイルと擬ポテンシャルファイルの配置

    +
    +

    対象となる物質の結晶構造を記述したファイルを用意します。ファイル形式は CIF または pymatgen が扱える POSCAR や xfs 形式に対応しています。

    +

    Quantum ESPRESSO の場合、利用する擬ポテンシャルファイルと、CSV形式のインデックスファイルを配置します。擬ポテンシャルファイルの配置先などは入力パラメータファイル内に指定します。

    +

    VASP の場合、擬ポテンシャルファイルの格納場所を ~/.config/.pmgrc.yaml ファイルに記述するか環境変数にセットします。入力パラメータファイル内で指定することもできます。

    +
    +
  4. +
  5. コマンドの実行

    +
    +

    作成した入力パラメータファイルおよび結晶構造データファイルを入力としてcif2xプログラムを実行します。Quantum ESPRESSO用の入力ファイルを生成する場合はターゲットオプションに -t QE を指定します。VASPの場合は -t VASP, OpenMX の場合は -t OpenMX, AkaiKKR の場合は -t akaikkr を指定します。

    +
    $ cif2x -t QE input.yaml material.cif
    +
    +
    +
    +
  6. +
+
+
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/manual/v1.0.0/ja/html/cif2x/command/index.html b/manual/v1.0.0/ja/html/cif2x/command/index.html new file mode 100644 index 0000000..d7c3cb1 --- /dev/null +++ b/manual/v1.0.0/ja/html/cif2x/command/index.html @@ -0,0 +1,167 @@ + + + + + + + + 4. コマンドリファレンス — cif2x Users Guide 1.0.0 ドキュメント + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

4. コマンドリファレンス

+
+

4.1. cif2x

+
+

第一原理計算のための入力ファイルを生成する

+
+

書式:

+
+
cif2x [-v][-q] -t target input_yaml material.cif
+cif2x -h
+cif2x --version
+
+
+
+

説明:

+
+

input_yaml に指定した入力パラメータファイルと material.cif に指定した結晶構造データを読み込み、第一原理計算プログラム用の入力ファイルを生成します。現在は Quantum ESPRESSO, VASP, OpenMX に対応しています。 +以下のオプションを受け付けます。

+
    +
  • -v

    +

    実行時に表示されるメッセージを冗長にします。複数回指定すると冗長度が上がります。

    +
  • +
  • -q

    +

    実行時に表示されるメッセージの冗長度を下げます。 -v の効果を打ち消します。複数回の指定が可能です。

    +
  • +
  • -t target

    +

    対象となる第一原理計算プログラムを指定します。 target として指定可能な値は以下のとおりです。大文字小文字は区別しません。

    +
      +
    • QE, espresso, quantum_espresso: Quantum ESPRESSO向け入力ファイルを生成します。

    • +
    • VASP: VASP向け入力ファイルを生成します。

    • +
    • OpenMX: OpenMX向け入力ファイルを生成します。

    • +
    • AkaiKKR: AkaiKKR向け入力ファイルを生成します。

    • +
    +
  • +
  • input_yaml

    +

    入力パラメータファイルを指定します。形式は YAML format です。

    +
  • +
  • material.cif

    +

    結晶構造データファイルを指定します。形式は CIF の他、pymatgen で扱える形式のファイルを指定できます。

    +
  • +
  • -h

    +

    ヘルプを表示します。

    +
  • +
  • --version

    +

    バージョン情報を表示します。

    +
  • +
+
+
+
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/manual/v1.0.0/ja/html/cif2x/filespec/index.html b/manual/v1.0.0/ja/html/cif2x/filespec/index.html new file mode 100644 index 0000000..4d95c69 --- /dev/null +++ b/manual/v1.0.0/ja/html/cif2x/filespec/index.html @@ -0,0 +1,393 @@ + + + + + + + + 5. ファイルフォーマット — cif2x Users Guide 1.0.0 ドキュメント + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

5. ファイルフォーマット

+
+

5.1. 入力パラメータファイル

+

入力パラメータファイルでは、cif2x で第一原理計算入力ファイルを生成するための設定情報を YAML形式で記述します。本ファイルは以下の部分から構成されます。

+
+
    +
  1. structureセクション: 結晶構造データの扱いについてのオプションを記述します。

  2. +
  3. optionalセクション: 擬ポテンシャルファイルの指定や、YAMLの参照機能を利用する場合のシンボル定義を行います。

  4. +
  5. tasksセクション: 入力ファイルの内容を記述します。

  6. +
+
+
+

structure

+
+

use_ibrav (デフォルト値: false)

+
+

結晶構造の入力に Quantum ESPRESSO の ibrav パラメータを利用します。 true の場合、格子のとり方を Quantum ESPRESSO の convention に合うように変換します。入力ファイルにはあわせて格子に関するパラメータ a, b, c, cosab, cosac, cosbc が(必要に応じて)書き出されます。

+
+

tolerance (デフォルト値: 0.01)

+
+

use_ibrav = true の場合に、再構成した Structure データと元データとの一致を評価する際の許容度を指定します。

+
+

supercell (デフォルト値: なし)

+
+

supercell を設定する場合に supercell のサイズを [\(n_x\), \(n_y\), \(n_z\)] で指定します。

+
+
+
+
+

optional

+

第一原理計算プログラムごとに必要な global な設定を行います。記述する内容は以下の各節に記述します。

+
+
+

tasks

+

入力ファイルの内容を記述します。複数の入力ファイルに対応するため、 tasks には各入力ファイルごとのブロックからなるリスト形式をとります。各ブロックに記述する項目は以下のとおりです。

+
+

mode (Quantum ESPRESSO)

+
+

入力ファイルの計算内容を指定します。 +現時点では Quantum ESPRESSO の pw.x 向けに scfnscf に対応しています。対応していない mode については、 content の内容をそのまま出力します。

+
+

output_file (Quantum ESPRESSO)

+
+

出力ファイル名を指定します。

+
+

output_dir

+
+

出力先のディレクトリ名を指定します。デフォルト値はカレントディレクトリです。

+
+

content

+
+

出力内容を指定します。Quantum ESPRESSO の場合は namelist ブロックに namelist データ (&system&control など) を記述し、 K_POINTS 等の card データを個別のブロックとして記述します。card データはパラメータをとるものがあります。

+
+

template (Quantum ESPRESSO)

+

template_dir (VASP)

+
+

出力内容のテンプレートファイルを指定します。指定がない場合はテンプレートを利用しません。 +このファイルの内容を content に追加します。同じデータがある場合は後者を優先します。

+
+
+
+
+

パラメータセット指定

+

入力パラメータには値のリストや範囲を指定することができ、値の組み合わせごとに個別のディレクトリを作成して入力ファイルを生成します。パラメータセットの指定には特別な構文 ${...} を用います。 +指定方法は次の通りです:

+
    +
  • リスト ${[ A, B, ... ]}

    +

    パラメータセットを Python のリストとして列挙します。各項目はスカラー値やリストを指定できます。

    +
  • +
  • 範囲指定 ${range(N)}, ${range(start, end, step)}

    +

    パラメータの範囲を指定します。それぞれ 0〜N-1, start〜end を step 刻み (step を省略した場合は 1) です。 N, start, end, step は int または float です。

    +
  • +
+
+
+
+

5.2. Quantum ESPRESSO 向けパラメータ

+

optional セクションおよび tasks セクションの content に記載する内容について、Quantum ESPRESSO 固有の内容を記述します。 +現時点では pw.x の scf および nscf に対応しています。

+
+

optionalセクション

+
+

pp_file

+
+

元素種と擬ポテンシャルを対応付けるCSV形式のインデックスファイルを指定します。 +ファイルの書式は、元素種、擬ポテンシャルファイルのタイプ、nexclude、orbitals です。例:

+
Fe,pbe-spn-rrkjus_psl.0.2.1,4,spd
+
+
+

擬ポテンシャルファイルのファイル名は Fe.pbe-spn-rrkjus_psl.0.2.1.UPF に対応します。

+
+

cutoff_file

+
+

擬ポテンシャルファイルとカットオフを対応付けるCSV形式のインデックスファイルを指定します。 +ファイルの書式は、擬ポテンシャルファイル、ecutwfcの値、ecutrhoの値 です。

+
+

pseudo_dir

+
+

擬ポテンシャルファイルを格納するディレクトリ名を指定します。カットオフの値を擬ポテンシャルファイルから取得する場合に使用します。Quantum ESPRESSO の pseudo_dir パラメータとは独立に指定します。

+
+
+
+
+

content

+
+

namelist

+
    +
  • structure セクションの use_ibrav パラメータに応じて、 &system の格子情報の指定が上書きされます。

    +
      +
    • use_ibrav = false: +ibrav は 0 にセットされます。また、格子パラメータに関する a, b, c, cosab, cosac, cosbc, celldm は削除されます。

    • +
    • use_ibrav = true: +ibrav は結晶構造データから取得された Bravais 格子のインデックスがセットされます。また、Structure データは基本格子のとり方など Quantum ESPRESSO の convention に合わせて再構成されます。

    • +
    +
  • +
  • nat (原子数) および ntyp (元素種の数)は結晶構造データから取得される値で上書きされます。

  • +
  • カットオフ ecutwfc および ecutrho の情報は、パラメータの値が空欄の場合は擬ポテンシャルファイルから取得します。

  • +
+

CELL_PARAMETERS

+
    +
  • structure セクションの use_ibrav パラメータが true の場合は出力されません。false の場合は格子ベクトルが出力されます。単位は angstrom です。

  • +
  • 格子ベクトルの情報は結晶構造データから取得されます。 data フィールドに 3x3 の行列を直接指定した場合はその値が用いられます。

  • +
+

ATOMIC_SPECIES

+
    +
  • 原子種・原子量・擬ポテンシャルファイル名のリストを出力します。

  • +
  • 原子種の情報は結晶構造データから取得されます。擬ポテンシャルのファイル名は pp_list で指定するCSV形式のインデックスファイルを参照します。

  • +
  • data フィールドに必要なデータを指定した場合はその値が用いられます。

  • +
+

ATOMIC_POSITIONS

+
    +
  • 原子種と原子座標(fractional coordinate)のリストを出力します。

  • +
  • ignore_species に原子種または原子種のリストを指定した場合、その原子種については if_pos の値が 0 にセットされます。MDや構造最適化の際に使われます。

  • +
  • data フィールドに必要なデータを指定した場合はその値が用いられます。

  • +
+

K_POINTS

+
    +
  • k点の情報を出力します。 option に出力タイプを指定します。

    +
      +
    • gamma: \(\Gamma\) 点を用います。

    • +
    • crystal: メッシュ状の k点のリストを出力します。メッシュの指定は grid パラメータまたは vol_densityk_resolution から導出される値が用いられます。

    • +
    • automatic: k点のメッシュを指定します。メッシュの指定は grid パラメータまたは vol_densityk_resolution から導出される値が用いられます。 シフトの指定は kshifts パラメータを参照します。

    • +
    +
  • +
  • メッシュの指定は以下の順序で決定されます。

    +
      +
    • grid パラメータの指定。grid の値は \(n_x, n_y, n_z\) の配列またはスカラー値 \(n\) です。後者の場合は \(n_x = n_y = n_z = n\) と仮定します。

    • +
    • vol_density パラメータから自動導出。

    • +
    • k_resolution パラメータから自動導出。k_resolution のデフォルトは 0.15 です。

    • +
    +
  • +
  • data フィールドに必要なデータを指定した場合はその値が用いられます。

  • +
+
+
+
+
+

5.3. VASP 向けパラメータ

+

optional セクションおよび tasks セクションの content に記載する内容について、VASP 固有の内容を記述します。

+
+

optional

+

擬ポテンシャルのタイプや格納場所を指定します。

+

pymatgen では、擬ポテンシャルファイルを +PMG_VASP_PSP_DIR/functional/POTCAR. element (.gz) または +PMG_VASP_PSP_DIR/functional/ element /POTCAR から取得します。 +PMG_VASP_PSP_DIR はディレクトリの指定で、設定ファイル ~/.config/.pmgrc.yaml に記載するか、同名の環境変数に指定します。また、 functional は擬ポテンシャルのタイプで、 POT_GGA_PAW_PBEPOT_LDA_PAW などが決められています。

+
+

pseudo_functional

+
+

擬ポテンシャルのタイプを指定します。タイプの指定と上記の functional の対応は pymatgen 内のテーブルに定義され、 PBEPOT_GGA_PAW_PBE,  LDAPOT_LDA_PAW などのようになっています。

+
+
+

以下の pseudo_dir を指定した場合は pymatgen の流儀を無視して擬ポテンシャルの格納ディレクトリを探します。

+
+

psuedo_dir

+
+

擬ポテンシャルの格納ディレクトリを指定します。擬ポテンシャルファイルのファイル名は pseudo_dir/POTCAR. element (.gz) または pseudo_dir/element/POTCAR です。

+
+
+
+
+

tasks

+

テンプレートファイルは、 template_dir で指定するディレクトリ内に INCAR, KPOINTS, POSCAR, POTCAR ファイルを配置します。ファイルがない項目は無視されます。

+
+
+

content

+
+

incar

+
    +
  • INCAR ファイルに記述するパラメータを列挙します。

  • +
+

kpoints

+
    +
  • type

    +

    KPOINTS の指定方法を記述します。以下の値に対応しています。タイプによりパラメータが指定可能なものがあります。詳細は pymatgen.io.vasp のマニュアルを参照してください。

    +
      +
    • automatic

      +

      parameter: grid

      +
    • +
    • gamma_automatic

      +

      parameter: grid, shift

      +
    • +
    • monkhorst_automatic

      +

      parameter: grid, shift

      +
    • +
    • automatic_density

      +

      parameter: kppa, force_gamma

      +
    • +
    • automatic_gamma_density

      +

      parameter: grid_density

      +
    • +
    • automatic_density_by_vol

      +

      parameter: grid_density, force_gamma

      +
    • +
    • automatic_density_by_lengths

      +

      parameter: length_density, force_gamma

      +
    • +
    • automatic_linemode

      +

      parameter: division, path_type (HighSymmKpath の path_type に対応)

      +
    • +
    +
  • +
+
+
+
+
+

5.4. OpenMX 向けパラメータ

+

optional セクションおよび tasks セクションの content に記載する内容について、OpenMX 固有の内容を記述します。

+
+

optional

+
+

data_path

+
+

擬原子軌道および擬ポテンシャルのファイルを格納するディレクトリを指定します。入力ファイルの DATA.PATH パラメータに対応します。

+
+
+
+
+

content

+
+

precision

+
+

擬原子軌道を OpenMXマニュアル 10.6 章の Table 1, 2 にしたがって選択します。 quick, standard, precise のいずれかの値を取ります。デフォルト値は quick です。

+
+
+
+
+
+

5.5. AkaiKKR 向けパラメータ

+

optional セクションおよび tasks セクションの content に記載する内容について、AkaiKKR 固有の内容を記述します。

+
+

optional

+
+

workdir

+
+

一時ファイルの出力先を指定します。指定しない場合は /tmp または TMPDIR 環境変数の値を利用します。

+
+
+
+
+

content

+

content には AkaiKKR の入力パラメータの内容を記述します。指定のない項目は空欄が出力され、AkaiKKR内部のデフォルト値が使われます。 +以下のパラメータは結晶構造データから決まる値で置き換えられます。

+
    +
  • brvtyp: +ただし、 brvtypaux (を含む)値が指定されている場合は上書きされません。

  • +
  • 格子パラメータ: a, c/a, b/a, alpha, beta, gamma, r1, r2, r3

  • +
  • タイプ情報: ntyp, type, ncmp, rmt, field, mxl, anclr, conc

  • +
  • 元素種の情報: natm, atmicx, atmtyp

  • +
+

なお、 rmtfield の値は、入力パラメータファイル内で ntyp 個の要素からなるリストとして指定されている場合のみ、入力パラメータファイルの値が使われます。

+
+
+
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/manual/v1.0.0/ja/html/cif2x/index.html b/manual/v1.0.0/ja/html/cif2x/index.html new file mode 100644 index 0000000..d2d0efc --- /dev/null +++ b/manual/v1.0.0/ja/html/cif2x/index.html @@ -0,0 +1,152 @@ + + + + + + + + 第一原理計算入力ファイル生成ツール (cif2x) — cif2x Users Guide 1.0.0 ドキュメント + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/manual/v1.0.0/ja/html/cif2x/tutorial/index.html b/manual/v1.0.0/ja/html/cif2x/tutorial/index.html new file mode 100644 index 0000000..eb83566 --- /dev/null +++ b/manual/v1.0.0/ja/html/cif2x/tutorial/index.html @@ -0,0 +1,216 @@ + + + + + + + + 3. チュートリアル — cif2x Users Guide 1.0.0 ドキュメント + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

3. チュートリアル

+

第一原理計算入力ファイル生成ツール cif2x を使うには、入力パラメータファイルと結晶構造データおよび擬ポテンシャルファイルを用意した後、プログラム cif2x を実行します。現在は Quantum ESPRESSO, VASP, OpenMX, AkaiKKR の入力ファイル生成に対応しています。以下では、 docs/tutorial/cif2x ディレクトリにある Quantum ESPRESSO 向けサンプルを例にチュートリアルを実施します。

+
+

3.1. 入力パラメータファイルを作成する

+

入力パラメータファイルには、第一原理計算プログラムに与える入力ファイルの内容を記述します。

+

以下に入力パラメータファイルのサンプルを記載します。このファイルは YAML形式のテキストファイルで、結晶構造データに対するオプションの指定や、出力する第一原理計算入力ファイルの内容を記述します。仕様の詳細については ファイルフォーマット の章を参照してください。

+

YAMLフォーマットでは、 keyword: value の辞書形式でパラメータを記述します。 value には数値や文字列などのスカラー値や、複数の値を [ ] または箇条書きの形式で列挙するリスト型、または辞書型を入れ子にすることができます。

+
structure:
+  use_ibrav: false
+  tolerance: 0.05
+
+optional:
+  pseudo_dir: ./pseudo
+  pp_file: ./pseudo/pp_psl_pbe_rrkjus.csv
+
+tasks:
+  - mode: scf
+    output_file: scf.in
+    output_dir: scf
+    template: scf.in_tmpl
+    content:
+      namelist:
+        control:
+          prefix: pwscf
+          pseudo_dir:
+          outdir: ./work
+        system:
+          ecutwfc:
+          ecutrho:
+      CELL_PARAMETERS:
+      ATOMIC_SPECIES:
+      ATOMIC_POSITIONS:
+        option: crystal
+      K_POINTS:
+        option: automatic
+        grid: [8,8,8]
+
+
+

入力パラメータファイルは structure, optional, tasks のブロックから構成されます。 +structure は結晶構造データに関するオプションを指定します。 +optional は擬ポテンシャルに関する global な設定などを行います。

+

tasks は出力する第一原理計算入力ファイルの内容を指定します。一連の計算に対応して複数のファイルを生成できるよう、tasks は配列の値を取ります。 +各出力について、計算内容は mode パラメータで指定します。SCF計算の scf や NSCF計算の nscf に対応するほか、一般的な出力を行う任意の出力モードを指定できます。 +ファイルは output_dir および output_file で指定するファイルに書き出されます。

+

出力内容は content に記載します。 +Quantum ESPRESSO の入力ファイルは、 &keyword で始まる Fortran90 の namelist 形式と、 K_POINTS などのキーワードで始まり空行で分割される cards と呼ばれるブロックからなります。 content には namelist と cards を入れ子の辞書形式で指定します。 +いくつかの例外を除いて、指定された内容が基本的にはそのまま入力ファイルに書き出されます。値が空欄のキーワードは、結晶構造データなどから求めた値が代入されます。

+

また、template として入力ファイルの雛形を指定することもできます。 template に指定したファイルの内容と content のデータを合わせたものを入力データとして扱います。同じキーワードのデータが存在する場合は content の指定が優先されます。従って、既存の入力ファイルを元に必要な箇所を入力パラメータファイルで上書きする使い方が可能です。上記の例では次のファイル(scf.in_tmpl)を template として取り込み、カットオフと CELL_PARAMETER, ATOMIC_SPECIES, ATOMIC_POSITIONS, K_POINT の箇所を結晶構造等から決めます。 ecutwfcecutrho が空欄で上書きされていることに留意してください。

+
&control
+    calculation = 'scf'
+    prefix = 'pwscf'
+    pseudo_dir = './pseudo'
+    outdir = './work'
+    tstress = .true.
+    tprnfor = .true.
+/
+
+&system
+    ibrav = 0
+    nat = 7
+    ntyp = 3
+    ecutwfc = 36.0
+    ecutrho = 180.0
+    occupations = 'smearing'
+    smearing = 'm-p'
+    degauss = 0.01
+    noncolin = .true.
+    nspin = 2
+/
+
+&electrons
+    missing_beta = 0.1
+    conv_thr = 1e-08
+/
+
+
+
+
+

3.2. 第一原理計算入力ファイルを生成する

+

入力パラメータファイル(input.yaml)と結晶構造データ(Co3SnS2_nosym.cif)を入力として cif2x を実行します。

+
$ cif2x -t QE input.yaml Co3SnS2_nosym.cif
+
+
+

予め必要な擬ポテンシャルのファイルを ./pseudo ディレクトリに配置し、擬ポテンシャルのインデックスファイルを ./pseudo/pp_psl_pbe_rrkjus.csv に作成しておきます。

+

cif2x を実行すると Quantum ESPRESSO用の入力ファイルが生成され出力されます。出力先は入力パラメータファイル内のパラメータで指定するディレクトリ(output_dir)およびファイル(output_file)です。この例では ./scf/scf.in に SCF計算用の入力ファイルが書き出されます。

+
+
+

3.3. パラメータセットを指定する

+

入力パラメータ内の値をいくつか変えながら一連の入力ファイルを生成したいことがあります。例えばカットオフの値やk点の数を変えて収束性を評価するなどの場合です。入力パラメータには値のリストや範囲を指定することができ、値の組み合わせごとに個別のディレクトリを作成して入力ファイルを生成します。 +パラメータセットの指定は特別な構文 ${...} を用います。

+
content:
+  K_POINTS:
+    option: automatic
+    grid:   ${ [ [4,4,4], [8,8,8], [12,12,12] ] }
+
+
+

例えば上記のように K_POINTS を指定すると、 grid の値が [4,4,4], [8,8,8], [12,12,12] の入力ファイルがそれぞれ 4x4x4/, 8x8x8/, 12x12x12/ サブディレクトリ内に作成されます。

+
+
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/manual/v1.0.0/ja/html/genindex.html b/manual/v1.0.0/ja/html/genindex.html new file mode 100644 index 0000000..888baba --- /dev/null +++ b/manual/v1.0.0/ja/html/genindex.html @@ -0,0 +1,104 @@ + + + + + + + 索引 — cif2x Users Guide 1.0.0 ドキュメント + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ + +

索引

+ +
+ +
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/manual/v1.0.0/ja/html/index.html b/manual/v1.0.0/ja/html/index.html new file mode 100644 index 0000000..1869ea6 --- /dev/null +++ b/manual/v1.0.0/ja/html/index.html @@ -0,0 +1,121 @@ + + + + + + + + Cif2x Users Guide — cif2x Users Guide 1.0.0 ドキュメント + + + + + + + + + + + + + + + + + + + +
+ + +
+
+ + + + + + + \ No newline at end of file diff --git a/manual/v1.0.0/ja/html/objects.inv b/manual/v1.0.0/ja/html/objects.inv new file mode 100644 index 0000000000000000000000000000000000000000..f42ddf63258e27e51ea105689c802eba971039d9 GIT binary patch literal 561 zcmV-10?z#-AX9K?X>NERX>N99Zgg*Qc_4OWa&u{KZXhxWBOp+6Z)#;@bUGkoX=XBb zAXRf^a&sU@b!lW}3L_v^WpZ_Ab7^j8AbMe}jLo03AHFNI$&b`w! zoKQHc=GeTVYdJyYQI%FT{+w4hnmMJp|KdqWlSFzwGB+cGB5JveWL~Idb|-WKc<4FH zFEDK|2Y?%dlxJ0eV|0}*qFqc(3>iV|49o>!3-A)~6pXRc{a$x$w_OKgvikW2qrQG# z5Ims_u zu(u5XXYgVe*S1&l8|Sg>Ht#lL%l&w9ZimkOYaH)Bb=OuCa6P;u`Y50r6Aw+-l#0NL zS!PK+8r}dr3~-izD`wy0QbiH?1_ zN#Rq#NzI3 zKPC!)vN!W#931XEjV;R$QbDOmtd>SgiJ3>+6SOTn`q63Vln?~yv>5yW3H$C@AS3mY literal 0 HcmV?d00001 diff --git a/manual/v1.0.0/ja/html/search.html b/manual/v1.0.0/ja/html/search.html new file mode 100644 index 0000000..f98df87 --- /dev/null +++ b/manual/v1.0.0/ja/html/search.html @@ -0,0 +1,122 @@ + + + + + + + 検索 — cif2x Users Guide 1.0.0 ドキュメント + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +

検索

+ + + + +

+ 複数の単語を検索すると、次を含む一致のみが表示されます +     すべての用語。 +

+ + +
+ + + +
+ + + +
+ +
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/manual/v1.0.0/ja/html/searchindex.js b/manual/v1.0.0/ja/html/searchindex.js new file mode 100644 index 0000000..39e32bd --- /dev/null +++ b/manual/v1.0.0/ja/html/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"docnames": ["cif2x/about/index", "cif2x/appendix/index", "cif2x/basic-usage", "cif2x/command/index", "cif2x/filespec/index", "cif2x/index", "cif2x/tutorial/index", "index"], "filenames": ["cif2x/about/index.rst", "cif2x/appendix/index.rst", "cif2x/basic-usage.rst", "cif2x/command/index.rst", "cif2x/filespec/index.rst", "cif2x/index.rst", "cif2x/tutorial/index.rst", "index.rst"], "titles": ["1. \u6982\u8981", "6. \u62e1\u5f35\u30ac\u30a4\u30c9", "2. \u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3068\u57fa\u672c\u7684\u306a\u4f7f\u3044\u65b9", "4. \u30b3\u30de\u30f3\u30c9\u30ea\u30d5\u30a1\u30ec\u30f3\u30b9", "5. \u30d5\u30a1\u30a4\u30eb\u30d5\u30a9\u30fc\u30de\u30c3\u30c8", "\u7b2c\u4e00\u539f\u7406\u8a08\u7b97\u5165\u529b\u30d5\u30a1\u30a4\u30eb\u751f\u6210\u30c4\u30fc\u30eb (cif2x)", "3. \u30c1\u30e5\u30fc\u30c8\u30ea\u30a2\u30eb", "Cif2x Users Guide"], "terms": {"\u8fd1\u5e74": 0, "\u6a5f\u68b0": 0, "\u5b66\u7fd2": 0, "\u6d3b\u7528": 0, "\u7269\u6027": 0, "\u4e88\u6e2c": 0, "\u7269\u8cea": [0, 2], "\u8a2d\u8a08": 0, "\u30de\u30c6\u30ea\u30a2\u30eb\u30ba\u30a4\u30f3\u30d5\u30a9\u30de\u30c6\u30a3\u30af\u30b9": 0, "\u6ce8\u76ee": 0, "\u307e\u3059": [0, 1, 2, 3, 4, 6], "\u7cbe\u5ea6": 0, "\u9069\u5207": 0, "\u6559\u5e2b": 0, "\u30c7\u30fc\u30bf": [0, 1, 2, 3, 4, 6], "\u6e96\u5099": 0, "\u5927\u304d\u304f": 0, "\u4f9d\u5b58": 0, "\u305d\u306e": [0, 4, 6], "\u305f\u3081": [0, 2, 3, 4], "\u8fc5\u901f": 0, "\u751f\u6210": [0, 1, 2, 3, 4, 7], "\u3059\u308b": [0, 2, 3, 4, 5], "\u30c4\u30fc\u30eb": [0, 2, 6, 7], "\u6574\u5099": 0, "\u7814\u7a76": 0, "\u9032\u5c55": 0, "\u671f\u5f85": 0, "\u30d5\u30a1\u30a4\u30eb": [0, 2, 3, 4, 7], "\u304b\u3089": [0, 1, 2, 4, 6], "\u4e00\u539f": [0, 2, 3, 4, 6], "\u7406\u8a08": [0, 2, 3, 4, 6], "\u7b97\u7528": 0, "\u5165\u529b": [0, 2, 3, 5], "\u3067\u3059": [0, 2, 3, 4, 6], "\u30d1\u30e9\u30e1\u30fc\u30bf": [0, 1, 2, 5, 6], "\u96db\u5f62": [0, 2, 6], "\u3068\u3057\u3066": [0, 1, 2, 3, 4, 6], "\u7a2e\u985e": [0, 1, 2], "\u8a08\u7b97": [0, 1, 2, 3, 4, 6], "\u6761\u4ef6": [0, 2], "\u306b\u3088\u3063\u3066": [0, 2], "\u5909\u308f\u308b": [0, 2], "\u7b87\u6240": [0, 2, 6], "\u7d50\u6676": [0, 1, 2, 3, 4, 6], "\u69cb\u9020": [0, 1, 2, 3, 4, 6], "\u306a\u3069": [0, 1, 2, 4, 6], "\u69cb\u6210": [0, 2, 4, 6], "\u7279\u5b9a": 0, "\u5fdc\u3058": [0, 2, 4], "\u8907\u6570": [0, 3, 4, 6], "\u3053\u3068": [0, 1, 2, 4, 6], "\u53ef\u80fd": [0, 3, 4, 6], "\u73fe\u5728": [0, 1, 2, 3, 6], "vasp": [0, 2, 3, 5, 6], "quantum": [0, 2, 3, 5, 6], "espresso": [0, 2, 3, 5, 6], "openmx": [0, 2, 3, 5, 6], "akaikkr": [0, 2, 3, 5, 6], "\u306b\u5bfe\u5fdc": [0, 1, 3, 4, 6], "\u30bd\u30d5\u30c8\u30a6\u30a7\u30a2": 0, "\u30d7\u30ed\u30b0\u30e9\u30e0\u30d1\u30c3\u30b1\u30fc\u30b8": 0, "\u304a\u3088\u3073": [0, 1, 2, 4, 6], "\u30bd\u30fc\u30b9\u30b3\u30fc\u30c9": [0, 2], "\u4e00\u5f0f": 0, "gnu": 0, "general": 0, "public": 0, "license": [0, 2], "version": [0, 3], "gpl": 0, "\u6e96\u3058": 0, "\u914d\u5e03": [0, 2], "\u4ee5\u4e0b": [0, 2, 3, 4, 6], "\u306b\u3088\u308a": [0, 4], "ver": 0, "xx": 0, "\u30ea\u30ea\u30fc\u30b9": 0, "alpha": [0, 4], "\u5409\u898b": 0, "\u4e00\u6176": 0, "\u6771\u4eac": 0, "\u5927\u5b66": 0, "\u7814\u7a76\u6240": 0, "\u9752\u5c71": 0, "\u9f8d\u7f8e": 0, "\u672c\u5c71": 0, "\u88d5\u4e00": 0, "\u798f\u7530": 0, "\u5c06\u5927": 0, "\u4e95\u6238": 0, "\u5eb7\u592a": 0, "\u798f\u5cf6": 0, "\u9244\u4e5f": 0, "\u7523\u696d": 0, "\u6280\u8853": 0, "\u7dcf\u5408": 0, "\u7b20\u677e": 0, "\u79c0\u8f14": 0, "\u5c71\u5f62": 0, "\u5b66\u8853": 0, "\u7814\u7a76\u9662": 0, "\u7406\u5b66": 0, "\u90e8\u4e3b": 0, "\u62c5\u5f53": 0, "))": 0, "\u662f\u5e38": 0, "\u6771\u5317": 0, "\u5927\u5b66\u9662": 0, "\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u30b3\u30fc\u30c7\u30a3\u30cd\u30fc\u30bf\u30fc": 0, "\u5c3e\u5d0e": 0, "\u6cf0\u52a9": 0, "the": 0, "university": 0, "of": 0, "tokyo": 0, "all": 0, "rights": 0, "reserved": 0, "\u5e74\u5ea6": 0, "\u9ad8\u5ea6": 0, "\u30d7\u30ed\u30b8\u30a7\u30af\u30c8": 0, "\u652f\u63f4": 0, "\u53d7\u3051": [0, 3], "\u304a\u308a": [0, 1], "\u8457\u4f5c": 0, "\u6240\u6301": 0, "\u78ba\u8a8d": 0, "ubuntu": 0, "linux": 0, "python": [0, 2, 4], "\u30e2\u30fc\u30c9": [1, 6], "\u5bfe\u5fdc": [1, 2, 4, 6], "src": [1, 2], "/cif": [1, 2, 6], "2x": [1, 2, 4, 6], "/qe": 1, "/calc": 1, "_mode": [1, 2], ".py": [1, 2], "create": 1, "_modeproc": 1, "()": 1, "\u95a2\u6570": 1, "\u5909\u63db": [1, 4], "\u30af\u30e9\u30b9": 1, "\u4ed8\u3051": [1, 3], "\u8a18\u8ff0": [1, 2, 4, 6], "def": 1, "(mode": 1, "qe": [1, 2, 3, 6], "):": 1, "if": [1, 4], "in": 1, "scf": [1, 4, 6], "\",": 1, "nscf": [1, 4, 6], "\"]": 1, "modeproc": 1, "qemode": 1, "_pw": 1, "(qe": 1, "else": 1, "_generic": 1, "return": 1, "\u3054\u3068": [1, 4, 6], "\u6a5f\u80fd": [1, 4], "_base": 1, "\u6d3e\u751f": 1, "\u307e\u3068\u3081": 1, "\u3089\u308c": [1, 4], "\u3053\u306e": [1, 4, 6], "update": 1, "_namelist": 1, "namelist": [1, 4, 6], "\u30d6\u30ed\u30c3\u30af": [1, 4, 6], "\u66f4\u65b0": 1, "_cards": 1, "cards": [1, 2, 6], "\u884c\u3044": [1, 4, 6], "pw": [1, 4], ".x": [1, 4], "\u305a\u305d\u306e": 1, "\u307e\u307e": [1, 4, 6], "\u51fa\u529b": [1, 4, 6], "\u7528\u610f": [1, 2, 6], "class": 1, "init": [1, 2], "__": [1, 2], "self": 1, "(self": 1, "content": [1, 2, 6], "\u306b\u3064\u3044\u3066": [1, 2, 4, 6], "\u7a7a\u6b04": [1, 4, 6], "\u4ee3\u5165": [1, 6], "\u307b\u304b": [1, 6], "\u683c\u5b50": [1, 4], "structure": [1, 6], "\u6c7a\u307e\u308b": [1, 4], "\u5024\u3084": [1, 6], "\u6574\u5408": 1, "\u3068\u308b": [1, 4], "\u5fc5\u8981": [1, 2, 4, 6], "\u3042\u308b": [1, 4, 6], "\u5f37\u5236": 1, "\u30bb\u30c3\u30c8": [1, 2, 4], "\u5834\u5408": [1, 2, 4, 6], "\u3042\u308a": [1, 4, 6], "\u51e6\u7406": 1, "\u5185\u5bb9": [1, 2, 4, 6], "\u500b\u5225": [1, 4, 6], "card": [1, 4], "_table": [1, 2], "\u5909\u6570": [1, 2, 4], "\u5217\u6319": [1, 4, 6], "\u57fa\u5e95": 1, "\u53d6\u5f97": [1, 2, 4], "\u5b9f\u884c": [1, 2, 3, 6], "\u60c5\u5831": [1, 3, 4], "\u3082\u3061\u308d\u3093": 1, "\u5168\u304f": 1, "\u72ec\u81ea": 1, "\u4f5c\u6210": [1, 2, 4, 5], "\u3067\u304d": [1, 2, 3, 4, 6], ".card": 1, "cell": [1, 4, 6], "_parameters": [1, 4, 6], "':": 1, "generate": 1, "_cell": 1, "atomic": [1, 4, 6], "_species": [1, 4, 6], "_atomic": 1, "_positions": [1, 4, 6], "_points": [1, 4, 6], "_k": 1, "scr": 1, "/cards": 1, "\u306b\u307e\u3068\u3081": 1, "_{": 1, "\u3068\u3057": 1, "\u5f15\u6570": 1, "\u53d6\u308a": [1, 4, 6], "option": [1, 4, 6], "data": [1, 4], "\u30d5\u30a3\u30fc\u30eb\u30c9": [1, 4], "\u306a\u308b": [1, 2, 3, 4], "\u8f9e\u66f8": [1, 6], "\u8fd4\u3057": 1, "\u30e9\u30a4\u30d6\u30e9\u30ea": 2, "\u74b0\u5883": [2, 4, 5], "htp": 2, "-tools": 2, "\u542b\u307e\u308c\u308b": 2, "\u7b97\u5165": [2, 4, 7], "cif": [2, 4, 6], "\u5229\u7528": [2, 4], "\u30d7\u30ed\u30b0\u30e9\u30e0": [2, 3, 4, 6], "pymatgen": [2, 3, 4], "\u30e2\u30b8\u30e5\u30fc\u30eb": 2, "ruamel": 2, ".yaml": [2, 4, 6], "nml": 2, "numpy": 2, "pandas": 2, "monty": 2, "openbabel": 2, "\u30aa\u30d7\u30b7\u30e7\u30f3": [2, 3, 4, 6], "akaikkrpythonutil": 2, "\u30b5\u30a4\u30c8": 2, "github": 2, "\u30ea\u30dd\u30b8\u30c8\u30ea": 2, "\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9": 2, "\u65b9\u6cd5": [2, 4], "git": 2, "\u3067\u304d\u308b": [2, 6], "\u30b3\u30de\u30f3\u30c9": 2, "clone": 2, "https": 2, ":/": 2, ".com": 2, "/issp": 2, "-center": 2, "-dev": 2, ".git": 2, "\u3002cif": 2, "cd": 2, "pip": 2, "install": 2, "\u306a\u304a": [2, 4], "\u5225\u9014": 2, "\u624b\u9806": 2, "\u3002\u307e\u305f": [2, 4], "seaborn": 2, "\u304a\u304d": [2, 6], "/akaikkrteam": 2, "/akaikkrpythonutil": 2, "/library": 2, "/pyakaikkr": 2, "\u30c7\u30a3\u30ec\u30af\u30c8\u30ea": [2, 4, 6], "--": 2, "readme": 2, ".md": 2, "pyproject": 2, ".toml": 2, "docs": [2, 6], "|-": 2, "ja": 2, "tutorial": 2, "py": 2, "main": 2, "2struct": 2, "struct": 2, "2qe": 2, "calc": 2, "qeutils": 2, "tools": 2, "2vasp": 2, "2openmx": 2, "vps": 2, "2akaikkr": 2, "make": 2, "_input": 2, "read": 2, "run": 2, "_cif": 2, "2kkr": 2, "utils": 2, "sample": 2, "\u4f7f\u7528": [2, 4], "\u5f62\u5f0f": [2, 3, 4, 6], "\u30d1\u30e9\u30e1\u30fc\u30bf\u30d5\u30a1\u30a4\u30eb": [2, 3, 5], "\u307e\u305a": 2, "yaml": [2, 3, 4, 6], "\u8a73\u7d30": [2, 4, 6], "\u30d5\u30a1\u30a4\u30eb\u30d5\u30a9\u30fc\u30de\u30c3\u30c8": [2, 5, 6, 7], "\u53c2\u7167": [2, 4, 6], "\u304f\u3060": [2, 4, 6], "\u3055\u3044": [2, 4, 6], "\u30dd\u30c6\u30f3\u30b7\u30e3\u30eb\u30d5\u30a1\u30a4\u30eb": [2, 4, 6], "\u914d\u7f6e": [2, 4, 6], "\u5bfe\u8c61": [2, 3], "\u307e\u305f": [2, 4, 6], "\u6271\u3048\u308b": [2, 3], "poscar": [2, 4], "xfs": 2, "csv": [2, 4], "\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u30d5\u30a1\u30a4\u30eb": [2, 4, 6], "\u6307\u5b9a": [2, 3, 5], "\u64ec\u30dd\u30c6\u30f3\u30b7\u30e3\u30eb\u30d5\u30a1\u30a4\u30eb": [2, 4], "\u683c\u7d0d": [2, 4], "\u5834\u6240": [2, 4], "/.": [2, 4], "config": [2, 4], "pmgrc": [2, 4], "\u30c7\u30fc\u30bf\u30d5\u30a1\u30a4\u30eb": [2, 3], "\u3002quantum": [2, 4], "\u30bf\u30fc\u30b2\u30c3\u30c8\u30aa\u30d7\u30b7\u30e7\u30f3": 2, "-t": [2, 3], "\u3002vasp": 2, "input": [2, 3, 6], "material": [2, 3], ".cif": [2, 3, 6], "\u7b2c\u4e00\u539f\u7406": [3, 4, 6], "\u66f8\u5f0f": [3, 4], "-v": 3, "][": 3, "-q": 3, "target": 3, "_yaml": 3, "\u8aac\u660e": 3, "\u8aad\u307f\u8fbc\u307f": 3, "\u8868\u793a": 3, "\u308c\u308b": [3, 4, 6], "\u30e1\u30c3\u30bb\u30fc\u30b8": 3, "\u5197\u9577": 3, "\u56de\u6307\u5b9a": 3, "\u4e0a\u304c\u308a": 3, "\u4e0b\u3052": 3, "\u52b9\u679c": 3, "\u6253\u3061\u6d88\u3057": 3, "\u3068\u304a\u308a": [3, 4], "\u5927\u6587\u5b57": 3, "\u5c0f\u6587": 3, "\u533a\u5225": 3, "\u3057\u307e\u305b": 3, "_espresso": 3, "\u5411\u3051": [3, 5, 6], "format": 3, "-h": 3, "\u30d8\u30eb\u30d7": 3, "-version": 3, "\u30d0\u30fc\u30b8\u30e7\u30f3": 3, "\u8a2d\u5b9a": [4, 6], "\u90e8\u5206": 4, "\u6271\u3044": [4, 6], "\u30b7\u30f3\u30dc\u30eb": 4, "\u5b9a\u7fa9": 4, "use": [4, 6], "_ibrav": [4, 6], "\u30c7\u30d5\u30a9\u30eb\u30c8": 4, "false": [4, 6], "ibrav": [4, 6], "true": [4, 6], "\u3068\u308a": 4, "convention": 4, "\u5408\u3046": 4, "\u3088\u3046": [4, 6], "\u3042\u308f\u305b": 4, "\u306b\u95a2\u3059\u308b": [4, 6], "cosab": 4, "cosac": 4, "cosbc": 4, "\u66f8\u304d\u51fa\u3055": [4, 6], "tolerance": [4, 6], "\u518d\u69cb": 4, "\u4e00\u81f4": 4, "\u8a55\u4fa1": [4, 6], "\u8a31\u5bb9": 4, "supercell": 4, "\u306a\u3057": 4, "\u30b5\u30a4\u30ba": 4, "_x": 4, "_y": 4, "_z": 4, "global": [4, 6], "\u5404\u7bc0": 4, "\u5404\u5165": 4, "\u30ea\u30b9\u30c8": [4, 6], "\u9805\u76ee": 4, "mode": [4, 5, 6], "(quantum": 4, "\u73fe\u6642\u70b9": 4, "\u306a\u3044": 4, "output": [4, 6], "_file": [4, 6], "_dir": [4, 6], "\u51fa\u529b\u5148": 4, "\u30ab\u30ec\u30f3\u30c8\u30c7\u30a3\u30ec\u30af\u30c8\u30ea": 4, "&system": 4, "&control": [4, 6], "\u3002card": 4, "\u3082\u306e": [4, 6], "template": [4, 6], "(vasp": 4, "\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u30d5\u30a1\u30a4\u30eb": 4, "\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8": 4, "\u307e\u305b": 4, "\u8ffd\u52a0": [4, 5], "\u540c\u3058": [4, 6], "\u5f8c\u8005": 4, "\u512a\u5148": [4, 6], "\u7bc4\u56f2": [4, 6], "\u7d44\u307f\u5408\u308f": [4, 6], "\u7279\u5225": [4, 6], "\u69cb\u6587": [4, 6], "{..": [4, 6], ".}": [4, 6], "\u7528\u3044": [4, 6], "\u901a\u308a": 4, "{[": 4, "...": 4, "\u30b9\u30ab\u30e9\u30fc": [4, 6], "{range": 4, "(n": 4, ")}": 4, "(start": 4, "end": 4, "step": 4, "\u305d\u308c\u305e\u308c": [4, 6], "start": 4, "\u301cend": 4, "\u523b\u307f": 4, "\u7701\u7565": 4, "int": 4, "float": 4, "\u8a18\u8f09": [4, 6], "\u56fa\u6709": 4, "pp": [4, 6], "\u7d20\u7a2e": 4, "\u30dd\u30c6\u30f3\u30b7\u30e3\u30eb": [4, 6], "\u4ed8\u3051\u308b": 4, "\u5143\u7d20": 4, "\u30bf\u30a4\u30d7": 4, "nexclude": 4, "orbitals": 4, "\u3002\u4f8b": 4, "fe": 4, "pbe": 4, "-spn": 4, "-rrkjus": 4, "_psl": [4, 6], "spd": 4, ".pbe": 4, "upf": 4, "cutoff": 4, "\u30ab\u30c3\u30c8\u30aa\u30d5": [4, 6], "ecutwfc": [4, 6], "ecutrho": [4, 6], "pseudo": [4, 6], "\u72ec\u7acb": 4, "\u4e0a\u66f8\u304d": [4, 6], "celldm": 4, "\u524a\u9664": 4, "bravais": 4, "\u30a4\u30f3\u30c7\u30c3\u30af\u30b9": 4, "\u57fa\u672c": [4, 5, 6, 7], "\u5408\u308f\u305b": 4, "nat": [4, 6], "\u539f\u5b50": 4, "ntyp": [4, 6], "\u308c\u307e\u305b": 4, "\u30d9\u30af\u30c8\u30eb": 4, "\u5358\u4f4d": 4, "angstrom": 4, "3x": 4, "\u884c\u5217": 4, "\u76f4\u63a5": 4, "\u539f\u5b50\u7a2e": 4, "\u30fb\u539f\u5b50\u91cf": 4, "\u30fb\u64ec\u30dd\u30c6\u30f3\u30b7\u30e3\u30eb\u30d5\u30a1\u30a4\u30eb": 4, "_list": 4, "\u5ea7\u6a19": 4, "(fractional": 4, "coordinate": 4, "ignore": 4, "_pos": 4, "\u3002md": 4, "\u6700\u9069": 4, "\u4f7f\u308f": 4, "k\u70b9": 4, "gamma": 4, "\\gamma": 4, "crystal": [4, 6], "\u30e1\u30c3\u30b7\u30e5": 4, "grid": [4, 6], "vol": 4, "_density": 4, "_resolution": 4, "\u5c0e\u51fa": 4, "automatic": [4, 6], "\u30b7\u30d5\u30c8": 4, "kshifts": 4, "\u9806\u5e8f": 4, "\u6c7a\u5b9a": 4, "\u3002grid": 4, "\u914d\u5217": [4, 6], "\u4eee\u5b9a": 4, "\u81ea\u52d5": 4, "\u64ec\u30dd\u30c6\u30f3\u30b7\u30e3\u30eb": 4, "pmg": 4, "_vasp": 4, "_psp": 4, "functional": 4, "/potcar": 4, "element": 4, "(.": 4, "gz": 4, "\u540c\u540d": 4, "pot": 4, "_gga": 4, "_paw": 4, "_pbe": [4, 6], "_lda": 4, "\u6c7a\u3081": [4, 6], "_functional": 4, "\u4e0a\u8a18": [4, 6], "\u30c6\u30fc\u30d6\u30eb": 4, "lda": 4, "\u306a\u3063": 4, "\u6d41\u5100": 4, "\u7121\u8996": 4, "\u63a2\u3057": 4, "psuedo": 4, "incar": 4, "kpoints": 4, "potcar": 4, "type": 4, "\u306a\u3082\u306e": 4, ".io": 4, ".vasp": 4, "\u30de\u30cb\u30e5\u30a2\u30eb": 4, "parameter": 4, "_automatic": 4, "shift": 4, "monkhorst": 4, "kppa": 4, "force": 4, "_gamma": 4, "_by": 4, "_vol": 4, "_lengths": 4, "length": 4, "_linemode": 4, "division": 4, "path": 4, "_type": 4, "(highsymmkpath": 4, "_path": 4, "\u64ec\u539f\u5b50": 4, "\u8ecc\u9053": 4, ".path": 4, "precision": 4, "table": 4, "\u304c\u3063": 4, "\u9078\u629e": 4, "quick": 4, "standard": 4, "precise": 4, "\u306e\u3044\u305a\u308c\u304b": 4, "workdir": 4, "\u4e00\u6642\u30d5\u30a1\u30a4\u30eb": 4, "/tmp": 4, "tmpdir": 4, "\u5185\u90e8": 4, "\u7f6e\u304d": 4, "\u63db\u3048": 4, "brvtyp": 4, "\u305f\u3060\u3057": 4, "aux": 4, "\u542b\u3080": 4, "\u3044\u308b": [4, 6], "/a": 4, "beta": 4, "ncmp": 4, "rmt": 4, "field": 4, "mxl": 4, "anclr": 4, "conc": 4, "natm": 4, "atmicx": 4, "atmtyp": 4, "\u8981\u7d20": 4, "\u306e\u307f": 4, "\u6982\u8981": [5, 7], "\u30e9\u30a4\u30bb\u30f3\u30b9": 5, "\u958b\u767a": 5, "\u8ca2\u732e": 5, "\u30b3\u30d4\u30fc\u30e9\u30a4\u30c8": 5, "\u52d5\u4f5c": 5, "\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb": [5, 7], "\u4f7f\u3044\u65b9": [5, 7], "\u30c1\u30e5\u30fc\u30c8\u30ea\u30a2\u30eb": [5, 7], "\u30d1\u30e9\u30e1\u30fc\u30bf\u30bb\u30c3\u30c8": 5, "\u30b3\u30de\u30f3\u30c9\u30ea\u30d5\u30a1\u30ec\u30f3\u30b9": [5, 7], "\u62e1\u5f35": [5, 7], "\u30ac\u30a4\u30c9": [5, 7], "\u4f7f\u3046": 6, "/tutorial": 6, "\u30b5\u30f3\u30d7\u30eb": 6, "\u5b9f\u65bd": 6, "\u4e0e\u3048\u308b": 6, "\u30c6\u30ad\u30b9\u30c8\u30d5\u30a1\u30a4\u30eb": 6, "\u306b\u5bfe\u3059\u308b": 6, "\u4ed5\u69d8": 6, "\u30d5\u30a9\u30fc\u30de\u30c3\u30c8": 6, "keyword": 6, "value": 6, "\u6570\u5024": 6, "\u6587\u5b57\u5217": 6, "\u7b87\u6761": 6, "\u66f8\u304d": 6, "\u5165\u308c\u5b50": 6, "optional": 6, "./": 6, "/pp": 6, "_rrkjus": 6, ".csv": 6, "tasks": 6, ".in": 6, "_tmpl": 6, "control": 6, "prefix": 6, "pwscf": 6, "outdir": 6, "work": 6, "system": 6, "\u4e00\u9023": 6, "\u5404\u51fa\u529b": 6, "\u3002scf": 6, "\u4e00\u822c": 6, "\u884c\u3046": 6, "\u4efb\u610f": 6, "&keyword": 6, "\u59cb\u307e\u308b": 6, "fortran": 6, "\u30ad\u30fc\u30ef\u30fc\u30c9": 6, "\u59cb\u307e\u308a": 6, "\u7a7a\u884c": 6, "\u5206\u5272": 6, "\u547c\u3070": 6, "\u306a\u308a": 6, "\u3044\u304f\u3064\u304b": 6, "\u4f8b\u5916": 6, "\u9664\u3044": 6, "\u6c42\u3081": 6, "\u5408\u308f": 6, "\u5b58\u5728": 6, "\u5f93\u3063": 6, "\u65e2\u5b58": 6, "\u4f7f\u3044": 6, "\u53d6\u308a\u8fbc\u307f": 6, "_parameter": 6, "_point": 6, "\u7559\u610f": 6, "calculation": 6, "tstress": 6, "tprnfor": 6, "occupations": 6, "smearing": 6, "'m": 6, "-p": 6, "degauss": 6, "noncolin": 6, "nspin": 6, "electrons": 6, "missing": 6, "_beta": 6, "conv": 6, "_thr": 6, "1e": 6, "co": 6, "3sns": 6, "nosym": 6, "\u4e88\u3081": 6, "/pseudo": 6, "/scf": 6, "\u5909\u3048": 6, "\u306a\u304c\u3089": 6, "\u305f\u3044": 6, "\u4f8b\u3048": 6, "\u53ce\u675f": 6, "${": 6, "],": 6, "4x": 6, "8x": 6, "\u30b5\u30d6\u30c7\u30a3\u30ec\u30af\u30c8\u30ea": 6, "\u7b2c\u4e00\u539f\u7406\u8a08": 7}, "objects": {}, "objtypes": {}, "objnames": {}, "titleterms": {"\u6982\u8981": 0, "cif": [0, 3, 5, 7], "2x": [0, 3, 5, 7], "\u30e9\u30a4\u30bb\u30f3\u30b9": 0, "\u958b\u767a": 0, "\u8ca2\u732e": 0, "\u30b3\u30d4\u30fc\u30e9\u30a4\u30c8": 0, "\u52d5\u4f5c": 0, "\u74b0\u5883": 0, "\u62e1\u5f35": 1, "\u30ac\u30a4\u30c9": 1, "quantum": [1, 4], "espresso": [1, 4], "mode": 1, "\u8ffd\u52a0": 1, "\u3059\u308b": [1, 6], "\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb": 2, "\u57fa\u672c": 2, "\u4f7f\u3044\u65b9": 2, "\u30b3\u30de\u30f3\u30c9\u30ea\u30d5\u30a1\u30ec\u30f3\u30b9": 3, "\u30d5\u30a1\u30a4\u30eb\u30d5\u30a9\u30fc\u30de\u30c3\u30c8": 4, "\u5165\u529b": [4, 6], "\u30d1\u30e9\u30e1\u30fc\u30bf\u30d5\u30a1\u30a4\u30eb": [4, 6], "structure": 4, "optional": 4, "tasks": 4, "\u30d1\u30e9\u30e1\u30fc\u30bf\u30bb\u30c3\u30c8": [4, 6], "\u6307\u5b9a": [4, 6], "\u5411\u3051": 4, "\u30d1\u30e9\u30e1\u30fc\u30bf": 4, "\u30bb\u30af\u30b7\u30e7\u30f3": 4, "content": 4, "vasp": 4, "openmx": 4, "akaikkr": 4, "\u7b2c\u4e00\u539f\u7406\u8a08": [5, 6], "\u7b97\u5165": [5, 6], "\u30d5\u30a1\u30a4\u30eb": [5, 6], "\u751f\u6210": [5, 6], "\u30c4\u30fc\u30eb": 5, "\u30c1\u30e5\u30fc\u30c8\u30ea\u30a2\u30eb": 6, "\u4f5c\u6210": 6, "users": 7, "guide": 7, "contents": 7}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx": 60}, "alltitles": {"\u6982\u8981": [[0, "id1"]], "cif2x\u3068\u306f?": [[0, "cif2x"]], "\u30e9\u30a4\u30bb\u30f3\u30b9": [[0, "id2"]], "\u958b\u767a\u8ca2\u732e\u8005": [[0, "id3"]], "\u30b3\u30d4\u30fc\u30e9\u30a4\u30c8": [[0, "id4"]], "\u52d5\u4f5c\u74b0\u5883": [[0, "id5"]], "\u62e1\u5f35\u30ac\u30a4\u30c9": [[1, "sec-cif2x-appendix"]], "Quantum ESPRESSO \u306e mode \u3092\u8ffd\u52a0\u3059\u308b": [[1, "quantum-espresso-mode"]], "\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3068\u57fa\u672c\u7684\u306a\u4f7f\u3044\u65b9": [[2, "id1"]], "\u30b3\u30de\u30f3\u30c9\u30ea\u30d5\u30a1\u30ec\u30f3\u30b9": [[3, "id1"]], "cif2x": [[3, "cif2x"]], "\u30d5\u30a1\u30a4\u30eb\u30d5\u30a9\u30fc\u30de\u30c3\u30c8": [[4, "sec-cif2x-fileformat"]], "\u5165\u529b\u30d1\u30e9\u30e1\u30fc\u30bf\u30d5\u30a1\u30a4\u30eb": [[4, "id2"]], "structure": [[4, "structure"]], "optional": [[4, "optional"], [4, "id5"], [4, "id8"], [4, "id10"]], "tasks": [[4, "tasks"], [4, "id6"]], "\u30d1\u30e9\u30e1\u30fc\u30bf\u30bb\u30c3\u30c8\u6307\u5b9a": [[4, "id3"]], "Quantum ESPRESSO \u5411\u3051\u30d1\u30e9\u30e1\u30fc\u30bf": [[4, "quantum-espresso"]], "optional\u30bb\u30af\u30b7\u30e7\u30f3": [[4, "id4"]], "content": [[4, "content"], [4, "id7"], [4, "id9"], [4, "id11"]], "VASP \u5411\u3051\u30d1\u30e9\u30e1\u30fc\u30bf": [[4, "vasp"]], "OpenMX \u5411\u3051\u30d1\u30e9\u30e1\u30fc\u30bf": [[4, "openmx"]], "AkaiKKR \u5411\u3051\u30d1\u30e9\u30e1\u30fc\u30bf": [[4, "akaikkr"]], "\u7b2c\u4e00\u539f\u7406\u8a08\u7b97\u5165\u529b\u30d5\u30a1\u30a4\u30eb\u751f\u6210\u30c4\u30fc\u30eb (cif2x)": [[5, "cif2x"]], "\u30c1\u30e5\u30fc\u30c8\u30ea\u30a2\u30eb": [[6, "sec-cif2x-tutorial"]], "\u5165\u529b\u30d1\u30e9\u30e1\u30fc\u30bf\u30d5\u30a1\u30a4\u30eb\u3092\u4f5c\u6210\u3059\u308b": [[6, "id2"]], "\u7b2c\u4e00\u539f\u7406\u8a08\u7b97\u5165\u529b\u30d5\u30a1\u30a4\u30eb\u3092\u751f\u6210\u3059\u308b": [[6, "id3"]], "\u30d1\u30e9\u30e1\u30fc\u30bf\u30bb\u30c3\u30c8\u3092\u6307\u5b9a\u3059\u308b": [[6, "id4"]], "Cif2x Users Guide": [[7, "cif2x-users-guide"]], "Contents:": [[7, null]]}, "indexentries": {}}) \ No newline at end of file