From 9a17af08efbb62817ff5a7546a1df955217112dd Mon Sep 17 00:00:00 2001 From: Chengcheng Xiao Date: Sun, 16 Nov 2025 19:57:00 +0000 Subject: [PATCH 01/12] Update favicon and onetep logo. --- _static/favicon.ico | Bin 0 -> 15406 bytes _static/onetep_logo.svg | 61 ++++++++++++++++++++++++++++++++++++++++ conf.py | 11 ++++++++ 3 files changed, 72 insertions(+) create mode 100644 _static/favicon.ico create mode 100644 _static/onetep_logo.svg diff --git a/_static/favicon.ico b/_static/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..1053f25571d2e5eabfa3b317b80319fbd536a11e GIT binary patch literal 15406 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
    lIn?TGdG4y6AId + + + diff --git a/conf.py b/conf.py index c76d348..f19ec71 100644 --- a/conf.py +++ b/conf.py @@ -33,6 +33,7 @@ # ones. extensions = ['sphinx.ext.mathjax'] extensions += ["sphinx_rtd_dark_mode"] +extensions += ["sphinx_favicon"] default_dark_mode = False # Add any paths that contain templates here, relative to this directory. @@ -88,6 +89,16 @@ # a list of builtin themes. # html_theme = 'alabaster' +html_logo = '_static/onetep_logo.svg' +html_theme_options = { + 'logo_only': True, + 'display_version': True, +} + +# --- Favicon --- +favicons = [ + "favicon.ico", +] # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the From 5604e66ea03418b7800e01c712b82ea151df0feb Mon Sep 17 00:00:00 2001 From: Chengcheng Xiao Date: Sun, 16 Nov 2025 20:10:44 +0000 Subject: [PATCH 02/12] Update symmetry and kpoints_and_spin to include latest keywords. --- kpoints_and_spin.rst | 35 ++++++++++++++++++++----- symmetry.rst | 62 +++++++++++++++++++++++--------------------- 2 files changed, 61 insertions(+), 36 deletions(-) diff --git a/kpoints_and_spin.rst b/kpoints_and_spin.rst index 037c991..70e0a79 100644 --- a/kpoints_and_spin.rst +++ b/kpoints_and_spin.rst @@ -308,9 +308,9 @@ where :math:`q` is the number of k-points in each direction and :math:`r` is the k-point index. An optional shift of half a grid cell can be added so that :math:`\Gamma` point is included in the sampling. -There are two ways to define the k-point sampling in ONETEP: +There are two ways to define the k-point grid in ONETEP: -1. Automatic generation using the Monkhorst-Pack scheme.: +1. Automatic generation using the Monkhorst-Pack scheme: :: @@ -321,6 +321,21 @@ There are two ways to define the k-point sampling in ONETEP: along b direction (shifted by half a grid distance) and 6 along c direction (also shifted by half a grid distance). + Alternatively, one can set the grid spacing in units of 1/Bohr and a grid + that fits within the specified spacing will be generated: + + :: + + kpoint_grid_spacing : 0.1 1/Bohr + + Optionally, one can force the generated grid to include the Gamma point by: + + :: + + kpoint_gamma_centred : T + + which will override any shifts specified in `kpoint_grid_shift`. + 2. Manual generation using the k-point coordinates: @@ -442,10 +457,10 @@ pseudopotentials. Here's a brief list of supported functionalities: Keywords ======== -- ``extended_ngwf`` [Basic, bool bool bool, default ``F F F``\ ]. Turn on +- ``extended_ngwf`` [Basic, bool bool bool, default ``F F F``\ ] Turn on extended NGWFs along the three directions. -- ``kpoint_method`` [Basic, default ``None``\ ]. The method used to generate +- ``kpoint_method`` [Basic, string, default ``None``\ ] The method used to generate the k-point grid. The options are: - ``PW``: Plane-wave mode. Requires NGWFs to be extended along the periodic @@ -453,11 +468,17 @@ Keywords - ``TB``: Tight-Binding mode. Requires NGWFs to be fully localised. - ``None``: No k-point sampling. -- ``kpoint_grid_shift`` [Basic int int int, default ``0 0 0``\ ]. The shift of +- ``kpoint_grid_shift`` [Basic int int int, default ``0 0 0``\ ] The shift of the k-point grid. -- ``kpoint_grid_size`` [Basic int int int, default ``1 1 1``\ ]. The size of +- ``kpoint_grid_size`` [Basic int int int, default ``1 1 1``\ ] The size of the k-point grid. -- ``num_kpars`` [Basic int, default ``1``\ ]. The number of k-parallelisation +- ``kpoint_grid_spacing`` [Basic float 1/Bohr, default ``0.0 1/Bohr``\ ] The + spacing of the k-point grid in units of 1/Bohr. + +- ``kpoint_gamma_centred`` [Basic, bool, default ``F``\ ] Whether to force the + generated k-point grid to be Gamma-centred. + +- ``num_kpars`` [Basic int, default ``1``\ ] The number of k-parallelisation groups. diff --git a/symmetry.rst b/symmetry.rst index bf63ba2..ed44445 100644 --- a/symmetry.rst +++ b/symmetry.rst @@ -11,7 +11,7 @@ Symmetry operations in ONETEP Crystal symmetry operations can be defined using rotation and translation pairs. In ONETEP, symmetry operations (in fractional coordinates) are obtained by passing the crystal information (lattice, ionic positions, and types) to -`spglib `. +`spglib `__. These operations can then be used to find symmetry-related k-points: @@ -68,31 +68,32 @@ commensurate with the total number of non-primitive translations, it will have zero amplitude so we can **avoid** applying symmetry operations to these G-vectors altogether. -Magnetic symmetry operations -============================ +Symmetry operations reductions +============================== -Magnetic moments can affect the symmetry operations in a crystal. Specifically, -the presence of certain magnetic moments can lead to the existence of additional -symmetry operations - Time-reversal operations that swap the spin components of -the wavefunctions. +In ONETEP, the default crystal symmetry is detected by pseudopotential types +instead of species labels. This ensures that if the symmetry is not broken even +if user has specified different species labels for atoms with the same +pseudopotential and initial configurations. -In ONETEP, instead of using full time-reversal operations to symmetrise the spin -polarised charge density, the entire crystal symmetry is lowered by treating the -atoms that belong to the same species but have different **initial** magnetic -moments as if they belong to different species. +It is important to know that initial atomic configurations can affect the +symmetry operations in a crystal. For example, the presence of certain magnetic +moments can lead to the existence of additional symmetry operations - +Time-reversal operations that swap the spin components of the wavefunctions. -Doing this allows the possibility for the lower symmetry magnetic structure -(such as antiferromagnetic) to relax into a higher symmetry structure (such as +In ONETEP, the entire crystal symmetry is lowered by treating the atoms that +belong to the same species but have different **initial** configurations (e.g., +magnetic moments) as if they belong to different species. Doing this allows the +possibility for the lower symmetry magnetic structure (such as +antiferromagnetic) to relax into a higher symmetry structure (such as ferrimagnetic). - This is done automatically by ONETEP when the ``use_symmetry`` keyword is set to -``True`` and the ``use_time_reversal`` keyword is set to ``True`` and ``LOCK -SPECIES_ATOMIC_SET`` is used to specify different initial magnetic moments for -different atoms of the same species (for more, see -:ref:`initial-guess-density-setting-initial-charges-and-spins`). If the initial -magnetic moments do change the symmetry, ONETEP will report the symmetry -operations written: +``True`` and ``SPECIES_ATOMIC_SET`` is used to specify different initial +configurations for different atoms of the same species (how this is done is +documented in :ref:`initial-guess-density-setting-initial-charges-and-spins`). +If the initial configurations such as magnetic moments do change the symmetry, +ONETEP will report the symmetry operations written: .. code:: @@ -109,6 +110,9 @@ ONETEP now ships with spglib and can be enabled by ``BUILD_SPGLIB=yes``, i.e., make onetep ARCH=YOUR_ARCH BUILD_SPGLIB=yes +This is by default turned on, and you can turn it off by setting +``BUILD_SPGLIB=no``. + You can also change the C-compiler by setting the ``CC`` environment variable in your ARCH file, e.g., @@ -124,22 +128,22 @@ keyword to ``True``. To leverage the time-reversal symmetry to reduce the number of k-points, the ``use_time_reversal`` keyword can also be set to `True`. One thing to note is that only MP grids set up by ``kpoint_grid_size`` will get -symmetrised. User-supplied k-point list (via ``block kpoints_list``) will not be -modified. +symmetrised (i.e., reduced by applying symmetry). User-supplied k-point list +(via ``block kpoints_list``) will not be modified. Once these tags are set, ONETEP will report the symmetry operations and the -reduced k-points in the output file (if ``output_detail`` is set to +reduced k-points in the output file (only if ``output_detail`` is set to ``verbose``), and the symmetry-related k-points will be used in the calculation. Keywords ======== -- ``use_symmetry``: [bool] turn symmetry on or off (only works if compiled with - spglib) | default: off +- ``use_symmetry``: [Basic, bool, default ``F``\ ] Whether to use symmetry or + not (only works if compiled with spglib) -- ``use_time_reversal`` : [bool] use TRS to reduce the number of k-points or not | - default: on +- ``use_time_reversal``: [Basic, bool, define ``T``\ ] use TRS to reduce the + number of k-points or not. -- ``symmetry_tol``: [float] Precision in determining the symmetry. | default: - 0.001889726 Bohr (0.001 Å) +- ``symmetry_tol``: [Basic, float, default 0.001889726 Bohr (0.001 Å)] Precision + in determining the symmetry. From 4a53331a4eaaeff68b7770991f60c00473ca7fc1 Mon Sep 17 00:00:00 2001 From: Chengcheng Xiao Date: Sun, 16 Nov 2025 21:11:13 +0000 Subject: [PATCH 03/12] Add dipole correction documentation. --- dipole_correction.rst | 99 ++++++++++++++++++++++++++++++++++++++++++ index_ground_state.rst | 1 + 2 files changed, 100 insertions(+) create mode 100644 dipole_correction.rst diff --git a/dipole_correction.rst b/dipole_correction.rst new file mode 100644 index 0000000..28310c4 --- /dev/null +++ b/dipole_correction.rst @@ -0,0 +1,99 @@ +=========================== +Dipole correction in ONETEP +=========================== + +:Author: Chengcheng Xiao +:Date: Nov 2025 + +Dipole correction in ONETEP +=========================== + +When the system has a net dipole, the electric field generated by it will incur +spurious interaction across periodic images, especially when there's not enough +vacuum space. The goal of applying dipole correction to ONETEP is to eliminate +this effect. An alternative way is to employ coulomb cut-off. + +The netdipole moment :math:`\mu` can be easily calculated as, + +.. math:: + + \boldsymbol{\mu} = \int_\mathrm{cell} \rho(\mathbf{r}) \mathbf{r} d\mathbf{r} + +where the total charge density $\rho(\mathbf{r})$ can be decomposed as the +contribution from the electrons and ions + +.. math:: + + \rho(\mathbf{r}) = -\rho_\mathrm{el}(\mathbf{r}) + \rho_\mathrm{ion}(\mathbf{r}) + +Correspondingly, the electric field created by this dipole moment can be +expressed as + +.. math:: + + E = 4\pi(\boldsymbol{\mu}/\Omega)_z + +To eliminate this effect, we can insert a dipole layer (by directly manipulating +the external potential) along certain direction. This is done in the spirit of +`Jörg Neugebauer and Matthias Scheffler +`__. It is indeed possible to do this +adaptively to counter all dipole correction for molecules and that will be +implemented in the future. For now, the added electric field takes the following +shape + + +.. math:: + + E = 4\pi(\boldsymbol{\mu}/\Omega)_z (z-z_\mathrm{origin}) + +Furthermore, following the same logic one can add an external electric field by +manipulating + +.. math:: + + \mu = \mu + \mu_\mathrm{ext} + +and in this case, dipole correction could and should be added to make sure the +results are correct. + +In ONETEP, dipole correction can be added by + +.. code:: + + dipole_correction : T + +and the correction direction is set by + +.. code:: + + dipole_correction_dir : 3 + +The location of the dipole layer is set by + +.. code:: + + efield_origin : 0.0 0.0 0.0 + +And a constant external electric field can be added as + +.. code:: + + constant_efield : 0.0 0.0 1.0 + + +Keywords +======== + +- ``dipole_correction``: [Basic, bool, default ``F``\ ] Whether to use dipole + correction or not. + +- ``dipole_correction_dir``: [Basic, integer, define ``3``\ ] Direction along + which the dipole correction is applied. ``1``\ , ``2``\ , ``3``\ correspond + to x, y, z directions respectively. + +- ``efield_origin``: [Basic, float float float, default 0.0 0.0 0.0] Location of + the dipole layer. + +- ``constant_efield``: [Basic, float float float, default 0.0 0.0 0.0] Constant + external electric field to be added. + diff --git a/index_ground_state.rst b/index_ground_state.rst index 4ca03b5..58bf426 100644 --- a/index_ground_state.rst +++ b/index_ground_state.rst @@ -23,6 +23,7 @@ Ground State Calculation Setup implicit_solvation_v3.rst hfx.rst cutoff_coulomb.rst + dipole_correction.rst scissor_operator.rst EMFT_in_ONETEP.rst From 6f4b6235ce4c1a13eaac4cb367ece3e162076e73 Mon Sep 17 00:00:00 2001 From: Chengcheng Xiao Date: Mon, 17 Nov 2025 08:37:52 +0000 Subject: [PATCH 04/12] Update logo --- _static/onetep_logo.png | Bin 0 -> 18243 bytes _static/onetep_logo.svg | 150 +++++++++++++++++++++++++--------------- conf.py | 2 +- 3 files changed, 96 insertions(+), 56 deletions(-) create mode 100644 _static/onetep_logo.png diff --git a/_static/onetep_logo.png b/_static/onetep_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..c2c967412c647fba95b421e4f4d20f181fe69e45 GIT binary patch literal 18243 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 e0002=^4|f;2FZJ>UP$Ty0000 - - + xmlns:svg="http://www.w3.org/2000/svg"> + + + + + + + + + + + + + + + + + + + + + + + diff --git a/conf.py b/conf.py index f19ec71..ea736a4 100644 --- a/conf.py +++ b/conf.py @@ -89,7 +89,7 @@ # a list of builtin themes. # html_theme = 'alabaster' -html_logo = '_static/onetep_logo.svg' +html_logo = '_static/onetep_logo.png' html_theme_options = { 'logo_only': True, 'display_version': True, From 638e2144ea0cf6315665a2bd0d32608a8131d931 Mon Sep 17 00:00:00 2001 From: Chengcheng Xiao Date: Mon, 17 Nov 2025 15:00:20 +0000 Subject: [PATCH 05/12] Update github action. --- .github/workflows/doc.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/doc.yml b/.github/workflows/doc.yml index 7c99f17..3c96edb 100644 --- a/.github/workflows/doc.yml +++ b/.github/workflows/doc.yml @@ -26,6 +26,7 @@ jobs: - name: sphinx run: | pip install sphinx-rtd-dark-mode + pip install sphinx_favicon make latexpdf cp _build/latex/ONETEP_Documentation.pdf _static/ make html From 76511821bfefd20ce7bd590ee18deb06664b00f9 Mon Sep 17 00:00:00 2001 From: Chengcheng Xiao Date: Mon, 17 Nov 2025 15:09:22 +0000 Subject: [PATCH 06/12] Update dipole_correction --- dipole_correction.rst | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/dipole_correction.rst b/dipole_correction.rst index 28310c4..ce6c4ec 100644 --- a/dipole_correction.rst +++ b/dipole_correction.rst @@ -13,7 +13,7 @@ spurious interaction across periodic images, especially when there's not enough vacuum space. The goal of applying dipole correction to ONETEP is to eliminate this effect. An alternative way is to employ coulomb cut-off. -The netdipole moment :math:`\mu` can be easily calculated as, +The net dipole moment :math:`\mu` can be easily calculated as, .. math:: @@ -36,18 +36,20 @@ expressed as To eliminate this effect, we can insert a dipole layer (by directly manipulating the external potential) along certain direction. This is done in the spirit of `Jörg Neugebauer and Matthias Scheffler -`__. It is indeed possible to do this -adaptively to counter all dipole correction for molecules and that will be -implemented in the future. For now, the added electric field takes the following -shape +`__. +For now, the dipole correction only supports slab calculation (or equivlant) and +can only be applied to the vacuum direction prependicular to the other two +directions. Note that you cell can be tilted but as long as the Cartesian +direction specified for the dipole correction is prependicular to the periodic +cell direction, the result is correct. The added electric field takes the +following shape .. math:: E = 4\pi(\boldsymbol{\mu}/\Omega)_z (z-z_\mathrm{origin}) -Furthermore, following the same logic one can add an external electric field by -manipulating +Furthermore, one can add an external electric field by manipulating .. math:: From 6f03de05184b87d46fa5372bcfb97e7ed906c918 Mon Sep 17 00:00:00 2001 From: Chengcheng Xiao Date: Tue, 18 Nov 2025 21:49:05 +0000 Subject: [PATCH 07/12] Fix conflict --- dipole_correction.rst | 41 ++++++++++++++++++++--------------------- 1 file changed, 20 insertions(+), 21 deletions(-) diff --git a/dipole_correction.rst b/dipole_correction.rst index ce6c4ec..a7cbe07 100644 --- a/dipole_correction.rst +++ b/dipole_correction.rst @@ -1,12 +1,12 @@ -=========================== -Dipole correction in ONETEP -=========================== +================= +Dipole correction +================= :Author: Chengcheng Xiao -:Date: Nov 2025 +:Date: November 2025 -Dipole correction in ONETEP -=========================== +Dipole correction +================= When the system has a net dipole, the electric field generated by it will incur spurious interaction across periodic images, especially when there's not enough @@ -20,40 +20,39 @@ The net dipole moment :math:`\mu` can be easily calculated as, \boldsymbol{\mu} = \int_\mathrm{cell} \rho(\mathbf{r}) \mathbf{r} d\mathbf{r} where the total charge density $\rho(\mathbf{r})$ can be decomposed as the -contribution from the electrons and ions +contribution from the electrons and ions (in units of e*Bohr): .. math:: \rho(\mathbf{r}) = -\rho_\mathrm{el}(\mathbf{r}) + \rho_\mathrm{ion}(\mathbf{r}) Correspondingly, the electric field created by this dipole moment can be -expressed as +expressed as (in units of Hartree/Bohr) .. math:: - E = 4\pi(\boldsymbol{\mu}/\Omega)_z + \mathbf{E} = 4\pi(\boldsymbol{\mu}/\Omega) To eliminate this effect, we can insert a dipole layer (by directly manipulating the external potential) along certain direction. This is done in the spirit of -`Jörg Neugebauer and Matthias Scheffler -`__. - -For now, the dipole correction only supports slab calculation (or equivlant) and -can only be applied to the vacuum direction prependicular to the other two -directions. Note that you cell can be tilted but as long as the Cartesian -direction specified for the dipole correction is prependicular to the periodic -cell direction, the result is correct. The added electric field takes the -following shape +`Jörg Neugebauer and Matthias +Scheffler`__. For now, the dipole +correction only supports slab calculation (or equivlant) and can only be applied +to the vacuum direction prependicular to the other two directions. Note that you +cell can be tilted but as long as the Cartesian direction specified for the +dipole correction is prependicular to the periodic cell direction, the result is +correct. The added electric field generates a potential that takes the following +form (assuming z direction): .. math:: - E = 4\pi(\boldsymbol{\mu}/\Omega)_z (z-z_\mathrm{origin}) + V_\mathrm{dipole}(z) = -4\pi(\boldsymbol{\mu}/\Omega)_z \cdot z -Furthermore, one can add an external electric field by manipulating +Following the same logic, one can add an external electric field by: .. math:: - \mu = \mu + \mu_\mathrm{ext} + \mathbf{E} = 4\pi(\boldsymbol{\mu}/\Omega) + \mathbf{E}_\mathrm{ext} and in this case, dipole correction could and should be added to make sure the results are correct. From a69b4da14c73a814532a539c56a8a8d620e2c2dc Mon Sep 17 00:00:00 2001 From: Chengcheng Xiao Date: Tue, 18 Nov 2025 21:51:03 +0000 Subject: [PATCH 08/12] Fix hyperlink format. --- dipole_correction.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dipole_correction.rst b/dipole_correction.rst index a7cbe07..7d38c3e 100644 --- a/dipole_correction.rst +++ b/dipole_correction.rst @@ -35,8 +35,8 @@ expressed as (in units of Hartree/Bohr) To eliminate this effect, we can insert a dipole layer (by directly manipulating the external potential) along certain direction. This is done in the spirit of -`Jörg Neugebauer and Matthias -Scheffler`__. For now, the dipole +`Jörg Neugebauer and Matthias Scheffler `__. +For now, the dipole correction only supports slab calculation (or equivlant) and can only be applied to the vacuum direction prependicular to the other two directions. Note that you cell can be tilted but as long as the Cartesian direction specified for the From ef05155e8ef0b3e5a32e64b6711a0e2ca48a0fe7 Mon Sep 17 00:00:00 2001 From: Chengcheng Xiao Date: Tue, 18 Nov 2025 21:53:52 +0000 Subject: [PATCH 09/12] Update symmetry. --- symmetry.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/symmetry.rst b/symmetry.rst index ed44445..355bd94 100644 --- a/symmetry.rst +++ b/symmetry.rst @@ -131,9 +131,9 @@ One thing to note is that only MP grids set up by ``kpoint_grid_size`` will get symmetrised (i.e., reduced by applying symmetry). User-supplied k-point list (via ``block kpoints_list``) will not be modified. -Once these tags are set, ONETEP will report the symmetry operations and the -reduced k-points in the output file (only if ``output_detail`` is set to -``verbose``), and the symmetry-related k-points will be used in the calculation. +Once these tags are set (along with ``output_detail`` set to ``verbose``), +ONETEP will report the symmetry operations and the reduced k-points in the +output file, and the symmetry-related k-points will be used in the calculation. Keywords ======== From 89ea116b0e7be84a593afd80ee763c94b30830cc Mon Sep 17 00:00:00 2001 From: Chengcheng Xiao Date: Tue, 18 Nov 2025 22:24:37 +0000 Subject: [PATCH 10/12] Update author list. --- conf.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/conf.py b/conf.py index ea736a4..a681b2c 100644 --- a/conf.py +++ b/conf.py @@ -50,8 +50,8 @@ # General information about the project. project = 'ONETEP Documentation' -copyright = '2022-2023, Joseph Prentice' -author = 'ONETEP Developers\' Group: Jacek Dziedzic, Peter Haynes, Nicholas Hine, Arash Mostofi, Mike Payne, and Chris-Kriton Skylaris. Documentation by Joseph Prentice' +copyright = '2022-2025, ONETEP Developers\' Group' +author = 'ONETEP Developers\' Group: Jacek Dziedzic, Peter Haynes, Nicholas Hine, Arash Mostofi, Mike Payne, and Chris-Kriton Skylaris.' # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the @@ -158,7 +158,7 @@ # author, documentclass [howto, manual, or own class]). latex_documents = [ (master_doc, 'ONETEP_Documentation.tex', 'ONETEP Documentation', - 'Joseph Prentice', 'manual'), + 'ONETEP Developers\'s Group', 'manual'), ] From 4fe9a36f51b16c7b4e565fdf7393ec1c201f6a08 Mon Sep 17 00:00:00 2001 From: Chengcheng Xiao Date: Tue, 18 Nov 2025 22:26:48 +0000 Subject: [PATCH 11/12] Update version --- conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf.py b/conf.py index a681b2c..1f3338f 100644 --- a/conf.py +++ b/conf.py @@ -58,7 +58,7 @@ # built documents. # # The short X.Y version. -version = '7.1' +version = '7.3' # The full version, including alpha/beta/rc tags. release = '7.1.8' From e2273571a24fc521ea459f3e10faeffdcb5d7b44 Mon Sep 17 00:00:00 2001 From: Chengcheng Xiao Date: Tue, 18 Nov 2025 22:30:22 +0000 Subject: [PATCH 12/12] Update dipole correction --- dipole_correction.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/dipole_correction.rst b/dipole_correction.rst index 7d38c3e..8424210 100644 --- a/dipole_correction.rst +++ b/dipole_correction.rst @@ -57,6 +57,11 @@ Following the same logic, one can add an external electric field by: and in this case, dipole correction could and should be added to make sure the results are correct. +Finally, after running ground state calculation with dipole correction, the +total energy reported in the output file will contain the contribution from the +dipole layer. Furthermore, the output potential will also include the dipole +layer contribution. + In ONETEP, dipole correction can be added by .. code::