From e68cd2b54fa8dd9349bf141aef862598d3ac3a84 Mon Sep 17 00:00:00 2001 From: HTP-tools Developers Date: Tue, 26 Dec 2023 02:29:17 +0000 Subject: [PATCH] Deploy docs to develop by GitHub Actions triggered by 70050adae1de71a0af5d1982e736c70c421f001b --- manual/develop/en/cif2x-usersguide.pdf | Bin 0 -> 80969 bytes manual/develop/en/html/.buildinfo | 4 + .../html/_sources/cif2x/about/index.rst.txt | 75 ++ .../_sources/cif2x/appendix/index.rst.txt | 47 + .../html/_sources/cif2x/basic-usage.rst.txt | 100 ++ .../html/_sources/cif2x/command/index.rst.txt | 54 + .../_sources/cif2x/filespec/index.rst.txt | 271 +++++ .../en/html/_sources/cif2x/index.rst.txt | 15 + .../_sources/cif2x/tutorial/index.rst.txt | 67 ++ manual/develop/en/html/_sources/index.rst.txt | 20 + manual/develop/en/html/_static/alabaster.css | 703 +++++++++++++ manual/develop/en/html/_static/basic.css | 925 ++++++++++++++++++ manual/develop/en/html/_static/custom.css | 1 + manual/develop/en/html/_static/doctools.js | 156 +++ .../en/html/_static/documentation_options.js | 13 + manual/develop/en/html/_static/file.png | Bin 0 -> 286 bytes .../develop/en/html/_static/language_data.js | 199 ++++ manual/develop/en/html/_static/minus.png | Bin 0 -> 90 bytes manual/develop/en/html/_static/plus.png | Bin 0 -> 90 bytes manual/develop/en/html/_static/pygments.css | 75 ++ manual/develop/en/html/_static/searchtools.js | 574 +++++++++++ .../en/html/_static/sphinx_highlight.js | 154 +++ manual/develop/en/html/cif2x/about/index.html | 172 ++++ .../develop/en/html/cif2x/appendix/index.html | 147 +++ manual/develop/en/html/cif2x/basic-usage.html | 214 ++++ .../develop/en/html/cif2x/command/index.html | 164 ++++ .../develop/en/html/cif2x/filespec/index.html | 367 +++++++ manual/develop/en/html/cif2x/index.html | 149 +++ .../develop/en/html/cif2x/tutorial/index.html | 215 ++++ manual/develop/en/html/genindex.html | 102 ++ manual/develop/en/html/index.html | 119 +++ manual/develop/en/html/objects.inv | 5 + manual/develop/en/html/search.html | 121 +++ manual/develop/en/html/searchindex.js | 1 + manual/develop/ja/cif2x-usersguide.pdf | Bin 0 -> 82302 bytes manual/develop/ja/html/.buildinfo | 4 + .../html/_sources/cif2x/about/index.rst.txt | 77 ++ .../_sources/cif2x/appendix/index.rst.txt | 50 + .../html/_sources/cif2x/basic-usage.rst.txt | 96 ++ .../html/_sources/cif2x/command/index.rst.txt | 55 ++ .../_sources/cif2x/filespec/index.rst.txt | 262 +++++ .../ja/html/_sources/cif2x/index.rst.txt | 15 + .../_sources/cif2x/tutorial/index.rst.txt | 65 ++ manual/develop/ja/html/_sources/index.rst.txt | 20 + manual/develop/ja/html/_static/alabaster.css | 703 +++++++++++++ manual/develop/ja/html/_static/basic.css | 925 ++++++++++++++++++ manual/develop/ja/html/_static/custom.css | 1 + manual/develop/ja/html/_static/doctools.js | 156 +++ .../ja/html/_static/documentation_options.js | 13 + manual/develop/ja/html/_static/file.png | Bin 0 -> 286 bytes .../develop/ja/html/_static/language_data.js | 26 + manual/develop/ja/html/_static/minus.png | Bin 0 -> 90 bytes manual/develop/ja/html/_static/plus.png | Bin 0 -> 90 bytes manual/develop/ja/html/_static/pygments.css | 75 ++ manual/develop/ja/html/_static/searchtools.js | 574 +++++++++++ .../ja/html/_static/sphinx_highlight.js | 154 +++ .../develop/ja/html/_static/translations.js | 60 ++ manual/develop/ja/html/cif2x/about/index.html | 174 ++++ .../develop/ja/html/cif2x/appendix/index.html | 151 +++ manual/develop/ja/html/cif2x/basic-usage.html | 212 ++++ .../develop/ja/html/cif2x/command/index.html | 165 ++++ .../develop/ja/html/cif2x/filespec/index.html | 366 +++++++ manual/develop/ja/html/cif2x/index.html | 150 +++ .../develop/ja/html/cif2x/tutorial/index.html | 215 ++++ manual/develop/ja/html/genindex.html | 103 ++ manual/develop/ja/html/index.html | 120 +++ manual/develop/ja/html/objects.inv | Bin 0 -> 567 bytes manual/develop/ja/html/search.html | 121 +++ manual/develop/ja/html/searchindex.js | 1 + 69 files changed, 10338 insertions(+) create mode 100644 manual/develop/en/cif2x-usersguide.pdf create mode 100644 manual/develop/en/html/.buildinfo create mode 100644 manual/develop/en/html/_sources/cif2x/about/index.rst.txt create mode 100644 manual/develop/en/html/_sources/cif2x/appendix/index.rst.txt create mode 100644 manual/develop/en/html/_sources/cif2x/basic-usage.rst.txt create mode 100644 manual/develop/en/html/_sources/cif2x/command/index.rst.txt create mode 100644 manual/develop/en/html/_sources/cif2x/filespec/index.rst.txt create mode 100644 manual/develop/en/html/_sources/cif2x/index.rst.txt create mode 100644 manual/develop/en/html/_sources/cif2x/tutorial/index.rst.txt create mode 100644 manual/develop/en/html/_sources/index.rst.txt create mode 100644 manual/develop/en/html/_static/alabaster.css create mode 100644 manual/develop/en/html/_static/basic.css create mode 100644 manual/develop/en/html/_static/custom.css create mode 100644 manual/develop/en/html/_static/doctools.js create mode 100644 manual/develop/en/html/_static/documentation_options.js create mode 100644 manual/develop/en/html/_static/file.png create mode 100644 manual/develop/en/html/_static/language_data.js create mode 100644 manual/develop/en/html/_static/minus.png create mode 100644 manual/develop/en/html/_static/plus.png create mode 100644 manual/develop/en/html/_static/pygments.css create mode 100644 manual/develop/en/html/_static/searchtools.js create mode 100644 manual/develop/en/html/_static/sphinx_highlight.js create mode 100644 manual/develop/en/html/cif2x/about/index.html create mode 100644 manual/develop/en/html/cif2x/appendix/index.html create mode 100644 manual/develop/en/html/cif2x/basic-usage.html create mode 100644 manual/develop/en/html/cif2x/command/index.html create mode 100644 manual/develop/en/html/cif2x/filespec/index.html create mode 100644 manual/develop/en/html/cif2x/index.html create mode 100644 manual/develop/en/html/cif2x/tutorial/index.html create mode 100644 manual/develop/en/html/genindex.html create mode 100644 manual/develop/en/html/index.html create mode 100644 manual/develop/en/html/objects.inv create mode 100644 manual/develop/en/html/search.html create mode 100644 manual/develop/en/html/searchindex.js create mode 100644 manual/develop/ja/cif2x-usersguide.pdf create mode 100644 manual/develop/ja/html/.buildinfo create mode 100644 manual/develop/ja/html/_sources/cif2x/about/index.rst.txt create mode 100644 manual/develop/ja/html/_sources/cif2x/appendix/index.rst.txt create mode 100644 manual/develop/ja/html/_sources/cif2x/basic-usage.rst.txt create mode 100644 manual/develop/ja/html/_sources/cif2x/command/index.rst.txt create mode 100644 manual/develop/ja/html/_sources/cif2x/filespec/index.rst.txt create mode 100644 manual/develop/ja/html/_sources/cif2x/index.rst.txt create mode 100644 manual/develop/ja/html/_sources/cif2x/tutorial/index.rst.txt create mode 100644 manual/develop/ja/html/_sources/index.rst.txt create mode 100644 manual/develop/ja/html/_static/alabaster.css create mode 100644 manual/develop/ja/html/_static/basic.css create mode 100644 manual/develop/ja/html/_static/custom.css create mode 100644 manual/develop/ja/html/_static/doctools.js create mode 100644 manual/develop/ja/html/_static/documentation_options.js create mode 100644 manual/develop/ja/html/_static/file.png create mode 100644 manual/develop/ja/html/_static/language_data.js create mode 100644 manual/develop/ja/html/_static/minus.png create mode 100644 manual/develop/ja/html/_static/plus.png create mode 100644 manual/develop/ja/html/_static/pygments.css create mode 100644 manual/develop/ja/html/_static/searchtools.js create mode 100644 manual/develop/ja/html/_static/sphinx_highlight.js create mode 100644 manual/develop/ja/html/_static/translations.js create mode 100644 manual/develop/ja/html/cif2x/about/index.html create mode 100644 manual/develop/ja/html/cif2x/appendix/index.html create mode 100644 manual/develop/ja/html/cif2x/basic-usage.html create mode 100644 manual/develop/ja/html/cif2x/command/index.html create mode 100644 manual/develop/ja/html/cif2x/filespec/index.html create mode 100644 manual/develop/ja/html/cif2x/index.html create mode 100644 manual/develop/ja/html/cif2x/tutorial/index.html create mode 100644 manual/develop/ja/html/genindex.html create mode 100644 manual/develop/ja/html/index.html create mode 100644 manual/develop/ja/html/objects.inv create mode 100644 manual/develop/ja/html/search.html create mode 100644 manual/develop/ja/html/searchindex.js diff --git a/manual/develop/en/cif2x-usersguide.pdf b/manual/develop/en/cif2x-usersguide.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ca8192b2296a9dcd9aa47cca205ce5649307dd69 GIT binary patch literal 80969 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 Spg9;AnOLAnNk!$wp#Kf-=HL7P literal 0 HcmV?d00001 diff --git a/manual/develop/en/html/.buildinfo b/manual/develop/en/html/.buildinfo new file mode 100644 index 0000000..1410c05 --- /dev/null +++ b/manual/develop/en/html/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 96ec05202045f68df79b021ada720333 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/manual/develop/en/html/_sources/cif2x/about/index.rst.txt b/manual/develop/en/html/_sources/cif2x/about/index.rst.txt new file mode 100644 index 0000000..de8b1c2 --- /dev/null +++ b/manual/develop/en/html/_sources/cif2x/about/index.rst.txt @@ -0,0 +1,75 @@ +**************************************************************** +Introduction +**************************************************************** + +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 `, and `OpenMX `, +with plans to support `AkaiKKR ` in the future. + +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-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) + + - Tetsuya Fukushima (The National Institute of Advanced Industrial Science and Technology (AIST)) + + - Kota Ido (The Instutite for Solid State Physics, The University of Tokyo) + + - 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/develop/en/html/_sources/cif2x/appendix/index.rst.txt b/manual/develop/en/html/_sources/cif2x/appendix/index.rst.txt new file mode 100644 index 0000000..9aabd23 --- /dev/null +++ b/manual/develop/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/develop/en/html/_sources/cif2x/basic-usage.rst.txt b/manual/develop/en/html/_sources/cif2x/basic-usage.rst.txt new file mode 100644 index 0000000..ce44218 --- /dev/null +++ b/manual/develop/en/html/_sources/cif2x/basic-usage.rst.txt @@ -0,0 +1,100 @@ +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) + +**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. + + +**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 + | |-- 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, and OpenMX. + + #. 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, and ``-t OpenMX`` for OpenMX. + + .. code-block:: bash + + $ cif2x -t QE input.yaml material.cif + diff --git a/manual/develop/en/html/_sources/cif2x/command/index.rst.txt b/manual/develop/en/html/_sources/cif2x/command/index.rst.txt new file mode 100644 index 0000000..0be10aa --- /dev/null +++ b/manual/develop/en/html/_sources/cif2x/command/index.rst.txt @@ -0,0 +1,54 @@ +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 + + - ``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/develop/en/html/_sources/cif2x/filespec/index.rst.txt b/manual/develop/en/html/_sources/cif2x/filespec/index.rst.txt new file mode 100644 index 0000000..bdf1ee0 --- /dev/null +++ b/manual/develop/en/html/_sources/cif2x/filespec/index.rst.txt @@ -0,0 +1,271 @@ +.. _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``. + diff --git a/manual/develop/en/html/_sources/cif2x/index.rst.txt b/manual/develop/en/html/_sources/cif2x/index.rst.txt new file mode 100644 index 0000000..24694f7 --- /dev/null +++ b/manual/develop/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/develop/en/html/_sources/cif2x/tutorial/index.rst.txt b/manual/develop/en/html/_sources/cif2x/tutorial/index.rst.txt new file mode 100644 index 0000000..758edac --- /dev/null +++ b/manual/develop/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, and OpenMX. +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/develop/en/html/_sources/index.rst.txt b/manual/develop/en/html/_sources/index.rst.txt new file mode 100644 index 0000000..0176a5c --- /dev/null +++ b/manual/develop/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/develop/en/html/_static/alabaster.css b/manual/develop/en/html/_static/alabaster.css new file mode 100644 index 0000000..78b7a4a --- /dev/null +++ b/manual/develop/en/html/_static/alabaster.css @@ -0,0 +1,703 @@ +@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 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 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; +} + +/* Make nested-list/multi-paragraph items look better in Releases changelog + * pages. Without this, docutils' magical list fuckery causes inconsistent + * formatting between different release sub-lists. + */ +div#changelog > div.section > ul > li > p:only-child { + margin-bottom: 0; +} + +/* Hide fugly 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/develop/en/html/_static/basic.css b/manual/develop/en/html/_static/basic.css new file mode 100644 index 0000000..30fee9d --- /dev/null +++ b/manual/develop/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: 360px; + 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/develop/en/html/_static/custom.css b/manual/develop/en/html/_static/custom.css new file mode 100644 index 0000000..2a924f1 --- /dev/null +++ b/manual/develop/en/html/_static/custom.css @@ -0,0 +1 @@ +/* This file intentionally left blank. */ diff --git a/manual/develop/en/html/_static/doctools.js b/manual/develop/en/html/_static/doctools.js new file mode 100644 index 0000000..d06a71d --- /dev/null +++ b/manual/develop/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/develop/en/html/_static/documentation_options.js b/manual/develop/en/html/_static/documentation_options.js new file mode 100644 index 0000000..3775ccc --- /dev/null +++ b/manual/develop/en/html/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '1.0-alpha', + 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/develop/en/html/_static/file.png b/manual/develop/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/develop/en/html/_static/language_data.js b/manual/develop/en/html/_static/language_data.js new file mode 100644 index 0000000..250f566 --- /dev/null +++ b/manual/develop/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/develop/en/html/_static/minus.png b/manual/develop/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/develop/en/html/_static/plus.png b/manual/develop/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/develop/en/html/_static/pygments.css b/manual/develop/en/html/_static/pygments.css new file mode 100644 index 0000000..0d49244 --- /dev/null +++ b/manual/develop/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/develop/en/html/_static/searchtools.js b/manual/develop/en/html/_static/searchtools.js new file mode 100644 index 0000000..7918c3f --- /dev/null +++ b/manual/develop/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/develop/en/html/_static/sphinx_highlight.js b/manual/develop/en/html/_static/sphinx_highlight.js new file mode 100644 index 0000000..8a96c69 --- /dev/null +++ b/manual/develop/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/develop/en/html/cif2x/about/index.html b/manual/develop/en/html/cif2x/about/index.html new file mode 100644 index 0000000..f618258 --- /dev/null +++ b/manual/develop/en/html/cif2x/about/index.html @@ -0,0 +1,172 @@ + + + + + + + + 1. Introduction — cif2x Users Guide 1.0-alpha 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 <https://www.vasp.at>, Quantum ESPRESSO <https://www.quantum-espresso.org>, and OpenMX <http://www.openmx-square.org>, +with plans to support AkaiKKR <http://kkr.issp.u-tokyo.ac.jp> in the future.

+
+
+

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-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)

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

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

      • +
      • 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/develop/en/html/cif2x/appendix/index.html b/manual/develop/en/html/cif2x/appendix/index.html new file mode 100644 index 0000000..9f55d58 --- /dev/null +++ b/manual/develop/en/html/cif2x/appendix/index.html @@ -0,0 +1,147 @@ + + + + + + + + 6. Extension guide — cif2x Users Guide 1.0-alpha 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/develop/en/html/cif2x/basic-usage.html b/manual/develop/en/html/cif2x/basic-usage.html new file mode 100644 index 0000000..9e01e2f --- /dev/null +++ b/manual/develop/en/html/cif2x/basic-usage.html @@ -0,0 +1,214 @@ + + + + + + + + 2. Installation and basic usage — cif2x Users Guide 1.0-alpha 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)

  • +
+
+

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.

+
+

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
+|       |-- 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, and OpenMX.

+
    +
  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, and -t OpenMX for OpenMX.

    +
    $ cif2x -t QE input.yaml material.cif
    +
    +
    +
    +
  6. +
+
+
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/manual/develop/en/html/cif2x/command/index.html b/manual/develop/en/html/cif2x/command/index.html new file mode 100644 index 0000000..ac50e4d --- /dev/null +++ b/manual/develop/en/html/cif2x/command/index.html @@ -0,0 +1,164 @@ + + + + + + + + 4. Command reference — cif2x Users Guide 1.0-alpha 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

    • +
    +
  • +
  • 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/develop/en/html/cif2x/filespec/index.html b/manual/develop/en/html/cif2x/filespec/index.html new file mode 100644 index 0000000..9061d2c --- /dev/null +++ b/manual/develop/en/html/cif2x/filespec/index.html @@ -0,0 +1,367 @@ + + + + + + + + 5. File format — cif2x Users Guide 1.0-alpha 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.

+
+
+
+
+
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/manual/develop/en/html/cif2x/index.html b/manual/develop/en/html/cif2x/index.html new file mode 100644 index 0000000..3534888 --- /dev/null +++ b/manual/develop/en/html/cif2x/index.html @@ -0,0 +1,149 @@ + + + + + + + + Input file generator for first-principles calculations (cif2x) — cif2x Users Guide 1.0-alpha documentation + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/manual/develop/en/html/cif2x/tutorial/index.html b/manual/develop/en/html/cif2x/tutorial/index.html new file mode 100644 index 0000000..bcd3990 --- /dev/null +++ b/manual/develop/en/html/cif2x/tutorial/index.html @@ -0,0 +1,215 @@ + + + + + + + + 3. Tutorial — cif2x Users Guide 1.0-alpha 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, and OpenMX. +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/develop/en/html/genindex.html b/manual/develop/en/html/genindex.html new file mode 100644 index 0000000..8344c64 --- /dev/null +++ b/manual/develop/en/html/genindex.html @@ -0,0 +1,102 @@ + + + + + + + Index — cif2x Users Guide 1.0-alpha documentation + + + + + + + + + + + + + + + + +
+
+
+ + +
+ + +

Index

+ +
+ +
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/manual/develop/en/html/index.html b/manual/develop/en/html/index.html new file mode 100644 index 0000000..5a573e4 --- /dev/null +++ b/manual/develop/en/html/index.html @@ -0,0 +1,119 @@ + + + + + + + + Cif2x Users Guide — cif2x Users Guide 1.0-alpha documentation + + + + + + + + + + + + + + + + + +
+ + +
+
+ + + + + + + \ No newline at end of file diff --git a/manual/develop/en/html/objects.inv b/manual/develop/en/html/objects.inv new file mode 100644 index 0000000..daa6a03 --- /dev/null +++ b/manual/develop/en/html/objects.inv @@ -0,0 +1,5 @@ +# Sphinx inventory version 2 +# Project: cif2x Users Guide +# Version: 1.0-alpha +# 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/develop/en/html/search.html b/manual/develop/en/html/search.html new file mode 100644 index 0000000..a3dc58e --- /dev/null +++ b/manual/develop/en/html/search.html @@ -0,0 +1,121 @@ + + + + + + + Search — cif2x Users Guide 1.0-alpha documentation + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +

Search

+ + + + +

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

+ + +
+ + + +
+ + + +
+ +
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/manual/develop/en/html/searchindex.js b/manual/develop/en/html/searchindex.js new file mode 100644 index 0000000..672742b --- /dev/null +++ b/manual/develop/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], "http": [0, 2], "www": 0, "quantum": [0, 2, 3, 5, 6], "espresso": [0, 2, 3, 5, 6], "org": 0, "openmx": [0, 2, 3, 5, 6], "squar": 0, "plan": 0, "akaikkr": 0, "kkr": 0, "issp": [0, 2], "u": 0, "tokyo": 0, "ac": 0, "jp": 0, "futur": 0, "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], "alpha": 0, "releas": 0, "2023": 0, "12": [0, 6], "28": 0, "kazuyoshi": 0, "yoshimi": 0, "instutit": 0, "solid": 0, "state": 0, "physic": 0, "univers": 0, "tatsumi": 0, "aoyama": 0, "yuichi": 0, "motoyama": 0, "masahiro": 0, "fukuda": 0, "tetsuya": 0, "fukushima": 0, "nation": 0, "institut": 0, "industri": 0, "scienc": 0, "technologi": 0, "aist": 0, "kota": 0, "ido": 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, 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, "offici": 2, "page": 2, "github": 2, "repositori": 2, "download": 2, "can": [2, 6], "command": [2, 5, 7], "git": 2, "clone": 2, "com": 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, "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, "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], "avail": 4, "correspond": 4, "below": [4, 6], "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], "step": [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, "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, "along": 6, "text": 6, "section": 6, "string": 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, "except": 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, "have": 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, "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"]], "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"]], "Parameters for VASP": [[4, "parameters-for-vasp"]], "Parameters for OpenMX": [[4, "parameters-for-openmx"]], "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/develop/ja/cif2x-usersguide.pdf b/manual/develop/ja/cif2x-usersguide.pdf new file mode 100644 index 0000000000000000000000000000000000000000..8aa9f48b6569135c605f91248a0799fba099c506 GIT binary patch literal 82302 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 、`Quantum ESPRESSO `_ 、`OpenMX `_ に対応し、 +将来的には `AkaiKKR `_ にも対応する予定です。 + + +ライセンス +---------------------------------------------------------------- + +本ソフトウェアのプログラムパッケージおよびソースコード一式はGNU General Public License version 3 (GPL v3) に準じて配布されています。 + +開発貢献者 +---------------------------------------------------------------- + +本ソフトウェアは以下の開発貢献者により開発されています。 + +- 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/develop/ja/html/_sources/cif2x/appendix/index.rst.txt b/manual/develop/ja/html/_sources/cif2x/appendix/index.rst.txt new file mode 100644 index 0000000..1355827 --- /dev/null +++ b/manual/develop/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/develop/ja/html/_sources/cif2x/basic-usage.rst.txt b/manual/develop/ja/html/_sources/cif2x/basic-usage.rst.txt new file mode 100644 index 0000000..faba11f --- /dev/null +++ b/manual/develop/ja/html/_sources/cif2x/basic-usage.rst.txt @@ -0,0 +1,96 @@ +インストールと基本的な使い方 +================================================================ + +**必要なライブラリ・環境** + + HTP-tools に含まれる第一原理計算入力ファイル生成ツール cif2x を利用するには、以下のプログラムとライブラリが必要です。 + + - python 3.x + - pymatgen モジュール + - ruamel.yaml モジュール + - f90nml モジュール + - qe-tools モジュール + - numpy モジュール + - pandas モジュール + - monty モジュール + +**ソースコード配布サイト** + + - `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`` がインストールされます。 + +**ディレクトリ構成** + + :: + + . + |-- 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 + | |-- utils.py + |-- sample/ + + +**基本的な使用方法** + + cif2xは第一原理計算プログラムのための入力ファイルを生成するツールです。入力パラメータを雛形として、物質の種類や計算条件によって変わる箇所を結晶構造データなどから構成します。現在は Quantum ESPRESSO, VASP, および OpenMX の入力ファイル形式に対応しています。 + + #. 入力パラメータファイルの作成 + + cif2xを使用するには、まず、生成する入力ファイルの内容を記述したパラメータファイルをYAML形式で作成します。詳細についてはファイルフォーマットの章を参照してください。 + + #. 結晶構造ファイルと擬ポテンシャルファイルの配置 + + 対象となる物質の結晶構造を記述したファイルを用意します。ファイル形式は CIF または pymatgen が扱える POSCAR や xfs 形式に対応しています。 + + Quantum ESPRESSO の場合、利用する擬ポテンシャルファイルと、CSV形式のインデックスファイルを配置します。擬ポテンシャルファイルの配置先などは入力パラメータファイル内に指定します。 + + VASP の場合、擬ポテンシャルファイルの格納場所を ``~/.config/.pmgrc.yaml`` ファイルに記述するか環境変数にセットします。入力パラメータファイル内で指定することもできます。 + + #. コマンドの実行 + + 作成した入力パラメータファイルおよび結晶構造データファイルを入力としてcif2xプログラムを実行します。Quantum ESPRESSO用の入力ファイルを生成する場合はターゲットオプションに ``-t QE`` を指定します。VASPの場合は ``-t VASP``, OpenMX の場合は ``-t OpenMX`` を指定します。 + + .. code-block:: bash + + $ cif2x -t QE input.yaml material.cif + diff --git a/manual/develop/ja/html/_sources/cif2x/command/index.rst.txt b/manual/develop/ja/html/_sources/cif2x/command/index.rst.txt new file mode 100644 index 0000000..e5b9cdf --- /dev/null +++ b/manual/develop/ja/html/_sources/cif2x/command/index.rst.txt @@ -0,0 +1,55 @@ +コマンドリファレンス +================================================================ + +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向け入力ファイルを生成します。 + + - ``input_yaml`` + + 入力パラメータファイルを指定します。形式は YAML format です。 + + - ``material.cif`` + + 結晶構造データファイルを指定します。形式は CIF の他、pymatgen で扱える形式のファイルを指定できます。 + + - ``-h`` + + ヘルプを表示します。 + + - ``--version`` + + バージョン情報を表示します。 + diff --git a/manual/develop/ja/html/_sources/cif2x/filespec/index.rst.txt b/manual/develop/ja/html/_sources/cif2x/filespec/index.rst.txt new file mode 100644 index 0000000..b7b452e --- /dev/null +++ b/manual/develop/ja/html/_sources/cif2x/filespec/index.rst.txt @@ -0,0 +1,262 @@ +.. _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`` です。 + diff --git a/manual/develop/ja/html/_sources/cif2x/index.rst.txt b/manual/develop/ja/html/_sources/cif2x/index.rst.txt new file mode 100644 index 0000000..82d4180 --- /dev/null +++ b/manual/develop/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/develop/ja/html/_sources/cif2x/tutorial/index.rst.txt b/manual/develop/ja/html/_sources/cif2x/tutorial/index.rst.txt new file mode 100644 index 0000000..dda7d69 --- /dev/null +++ b/manual/develop/ja/html/_sources/cif2x/tutorial/index.rst.txt @@ -0,0 +1,65 @@ +.. _sec-cif2x-tutorial: + +チュートリアル +================================================================ + +第一原理計算入力ファイル生成ツール cif2x を使うには、入力パラメータファイルと結晶構造データおよび擬ポテンシャルファイルを用意した後、プログラム cif2x を実行します。現在は Quantum ESPRESSO, VASP, OpenMX の入力ファイル生成に対応しています。以下では、 ``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/develop/ja/html/_sources/index.rst.txt b/manual/develop/ja/html/_sources/index.rst.txt new file mode 100644 index 0000000..0176a5c --- /dev/null +++ b/manual/develop/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/develop/ja/html/_static/alabaster.css b/manual/develop/ja/html/_static/alabaster.css new file mode 100644 index 0000000..78b7a4a --- /dev/null +++ b/manual/develop/ja/html/_static/alabaster.css @@ -0,0 +1,703 @@ +@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 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 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; +} + +/* Make nested-list/multi-paragraph items look better in Releases changelog + * pages. Without this, docutils' magical list fuckery causes inconsistent + * formatting between different release sub-lists. + */ +div#changelog > div.section > ul > li > p:only-child { + margin-bottom: 0; +} + +/* Hide fugly 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/develop/ja/html/_static/basic.css b/manual/develop/ja/html/_static/basic.css new file mode 100644 index 0000000..30fee9d --- /dev/null +++ b/manual/develop/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: 360px; + 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/develop/ja/html/_static/custom.css b/manual/develop/ja/html/_static/custom.css new file mode 100644 index 0000000..2a924f1 --- /dev/null +++ b/manual/develop/ja/html/_static/custom.css @@ -0,0 +1 @@ +/* This file intentionally left blank. */ diff --git a/manual/develop/ja/html/_static/doctools.js b/manual/develop/ja/html/_static/doctools.js new file mode 100644 index 0000000..d06a71d --- /dev/null +++ b/manual/develop/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/develop/ja/html/_static/documentation_options.js b/manual/develop/ja/html/_static/documentation_options.js new file mode 100644 index 0000000..ae40009 --- /dev/null +++ b/manual/develop/ja/html/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '1.0-alpha', + 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/develop/ja/html/_static/file.png b/manual/develop/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/develop/ja/html/_static/language_data.js b/manual/develop/ja/html/_static/language_data.js new file mode 100644 index 0000000..b368127 --- /dev/null +++ b/manual/develop/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/develop/ja/html/_static/minus.png b/manual/develop/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/develop/ja/html/_static/plus.png b/manual/develop/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/develop/ja/html/_static/pygments.css b/manual/develop/ja/html/_static/pygments.css new file mode 100644 index 0000000..0d49244 --- /dev/null +++ b/manual/develop/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/develop/ja/html/_static/searchtools.js b/manual/develop/ja/html/_static/searchtools.js new file mode 100644 index 0000000..7918c3f --- /dev/null +++ b/manual/develop/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/develop/ja/html/_static/sphinx_highlight.js b/manual/develop/ja/html/_static/sphinx_highlight.js new file mode 100644 index 0000000..8a96c69 --- /dev/null +++ b/manual/develop/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/develop/ja/html/_static/translations.js b/manual/develop/ja/html/_static/translations.js new file mode 100644 index 0000000..817b128 --- /dev/null +++ b/manual/develop/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/develop/ja/html/cif2x/about/index.html b/manual/develop/ja/html/cif2x/about/index.html new file mode 100644 index 0000000..c226d6b --- /dev/null +++ b/manual/develop/ja/html/cif2x/about/index.html @@ -0,0 +1,174 @@ + + + + + + + + 1. 概要 — cif2x Users Guide 1.0-alpha ドキュメント + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

1. 概要

+
+

1.1. cif2xとは?

+

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

+

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

+
+
+

1.2. ライセンス

+

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

+
+
+

1.3. 開発貢献者

+

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

+
    +
  • 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/develop/ja/html/cif2x/appendix/index.html b/manual/develop/ja/html/cif2x/appendix/index.html new file mode 100644 index 0000000..8faff8d --- /dev/null +++ b/manual/develop/ja/html/cif2x/appendix/index.html @@ -0,0 +1,151 @@ + + + + + + + + 6. 拡張ガイド — cif2x Users Guide 1.0-alpha ドキュメント + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

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/develop/ja/html/cif2x/basic-usage.html b/manual/develop/ja/html/cif2x/basic-usage.html new file mode 100644 index 0000000..803e3a3 --- /dev/null +++ b/manual/develop/ja/html/cif2x/basic-usage.html @@ -0,0 +1,212 @@ + + + + + + + + 2. インストールと基本的な使い方 — cif2x Users Guide 1.0-alpha ドキュメント + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

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

+

必要なライブラリ・環境

+
+

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

+
    +
  • python 3.x

  • +
  • pymatgen モジュール

  • +
  • ruamel.yaml モジュール

  • +
  • f90nml モジュール

  • +
  • qe-tools モジュール

  • +
  • numpy モジュール

  • +
  • pandas モジュール

  • +
  • monty モジュール

  • +
+
+

ソースコード配布サイト

+
+
+

ダウンロード方法

+
+

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

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

インストール方法

+
+

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

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

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

+
+

ディレクトリ構成

+
+
.
+|-- 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
+|       |-- utils.py
+|-- sample/
+
+
+
+

基本的な使用方法

+
+

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

+
    +
  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 を指定します。

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

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向け入力ファイルを生成します。

    • +
    +
  • +
  • input_yaml

    +

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

    +
  • +
  • material.cif

    +

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

    +
  • +
  • -h

    +

    ヘルプを表示します。

    +
  • +
  • --version

    +

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

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

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 です。

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

3. チュートリアル

+

第一原理計算入力ファイル生成ツール cif2x を使うには、入力パラメータファイルと結晶構造データおよび擬ポテンシャルファイルを用意した後、プログラム cif2x を実行します。現在は Quantum ESPRESSO, VASP, OpenMX の入力ファイル生成に対応しています。以下では、 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/develop/ja/html/genindex.html b/manual/develop/ja/html/genindex.html new file mode 100644 index 0000000..37f1c93 --- /dev/null +++ b/manual/develop/ja/html/genindex.html @@ -0,0 +1,103 @@ + + + + + + + 索引 — cif2x Users Guide 1.0-alpha ドキュメント + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ + +

索引

+ +
+ +
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/manual/develop/ja/html/index.html b/manual/develop/ja/html/index.html new file mode 100644 index 0000000..5a85223 --- /dev/null +++ b/manual/develop/ja/html/index.html @@ -0,0 +1,120 @@ + + + + + + + + Cif2x Users Guide — cif2x Users Guide 1.0-alpha ドキュメント + + + + + + + + + + + + + + + + + + +
+ + +
+
+ + + + + + + \ No newline at end of file diff --git a/manual/develop/ja/html/objects.inv b/manual/develop/ja/html/objects.inv new file mode 100644 index 0000000000000000000000000000000000000000..72cddaafa931a35891cb6536c0398c275d8cae3a GIT binary patch literal 567 zcmV-70?7R%AX9K?X>NERX>N99Zgg*Qc_4OWa&u{KZXhxWBOp+6Z)#;@bUGkoX=XBb zAXRf^a&sU@b!lW}3L_v^WpZMd?av*PJ zAarPHb0B7EY-J#6b0A}HZE$jBb8}^6Aa!$TZf78RY-wUH3V7Oulg&=TKoo`deTpW! z&_yM>bnC*c8y}#w12pLmp=|;?+d)$_F)TzABoYV^gvJe;fWi1Mmr@?X{!BwFZP+z) z?)}ca(=(hdS2&tErMds&NlBALdOb2XBZDGpxr}69sAhI2 zbOLzjIm<6FZ7>Ib8-$c+Re@u4l`W!OOiT=?cRugbNyd(N3pd1qq zP1lr)z=~OBNj)0g06YwEmVYZ|-{Vq6BySlan@6HgiB8G9pM7W9qISGuB^SOeeXXL3 zN?+;%k0?puQ^4gK6A95&eK6 + + + + + + 検索 — cif2x Users Guide 1.0-alpha ドキュメント + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +

検索

+ + + + +

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

+ + +
+ + + +
+ + + +
+ +
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/manual/develop/ja/html/searchindex.js b/manual/develop/ja/html/searchindex.js new file mode 100644 index 0000000..7563781 --- /dev/null +++ b/manual/develop/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], "\u306b\u5bfe\u5fdc": [0, 1, 3, 4, 6], "\u5c06\u6765": 0, "akaikkr": 0, "\u306b\u3082": 0, "\u5bfe\u5fdc": [0, 1, 2, 4, 6], "\u4e88\u5b9a": 0, "\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, "alpha": 0, "\u30ea\u30ea\u30fc\u30b9": 0, "\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, "\u798f\u5cf6": 0, "\u9244\u4e5f": 0, "\u7523\u696d": 0, "\u6280\u8853": 0, "\u7dcf\u5408": 0, "\u4e95\u6238": 0, "\u5eb7\u592a": 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], "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, "\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, 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, "\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, "\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, "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, "\u30aa\u30d7\u30b7\u30e7\u30f3": [3, 4, 6], "\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], "\u3002\u307e\u305f": 4, "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, "\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, "\u3044\u308b": 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, "\u304a\u304d": 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, "\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"]], "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"]], "VASP \u5411\u3051\u30d1\u30e9\u30e1\u30fc\u30bf": [[4, "vasp"]], "OpenMX \u5411\u3051\u30d1\u30e9\u30e1\u30fc\u30bf": [[4, "openmx"]], "\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