Repository files navigation

atomistics

PipelinecodecovBinder

The atomistics package consists of two primary components. On the one hand it provides interfaces to atomistic simulation codes - named calculators. The supported simulation codes in alphabetical order are:

  • Abinit - Plane wave density functional theory
  • EMT - Effective medium theory potential
  • GPAW - Density functional theory Python code based on the projector-augmented wave method
  • LAMMPS - Molecular Dynamics
  • Quantum Espresso - Integrated suite of Open-Source computer codes for electronic-structure calculations
  • Siesta - Electronic structure calculations and ab initio molecular dynamics
  • SPHInX - Plane wave DFT with interactive tools, charged defect correction and spin constraints

For majority of these simulation codes the atomistics package use the Atomic Simulation Environment to interface the underlying C/ C++ and Fortran Codes with the Python programming language. Still this approach limits the functionality of the simulation code to calculating the energy and forces, so by adding custom interfaces the atomistics package can support built-in features of the simulation code like structure optimization and molecular dynamics.

On the other hand the atomistics package also provides workflows to calculate material properties on the atomistic scales, these include:

  • Equation of State - to calculate equilibrium properties like the equilibrium energy, equilibrium volume, equilibrium bulk modulus and its pressure derivative.
  • Elastic Matrix - to calculate the elastic constants and elastic moduli.
  • Harmonic and Quasi-harmonic Approximation - to calculate the density of states, vibrational free energy and thermal expansion based on the finite displacements method implemented in phonopy.
  • Molecular Dynamics - to calculate finite temperature properties like thermal expansion including the anharmonic contributions.

All these workflows can be coupled with all the simulation codes implemented in the atomistics package. In contrast to the Atomic Simulation Environment which provides similar functionality the focus of the atomistics package is not to reimplement existing functionality but rather simplify the process of coupling existing simulation codes with existing workflows. Here the phonopy workflow is a great example to enable the calculation of thermodynamic properties with the harmonic and quasi-harmonic approximation.

Example

Use the equation of state to calculate the equilibrium properties like the equilibrium volume, equilibrium energy, equilibrium bulk modulus and its derivative using the GPAW simulation code

fromase.buildimportbulkfromatomistics.workflowsimportget_tasks_for_energy_volume_curvetask_dict=get_tasks_for_energy_volume_curve(
structure=bulk("Al", a=4.05, cubic=True),
num_points=11,
vol_range=0.05,
axes=["x", "y", "z"],
)
print(task_dict)
>>> {'calc_energy': OrderedDict([
>>> (0.95, Atoms(symbols='Al4', pbc=True, cell=[3.9813426685908118, 3.9813426685908118, 3.9813426685908118])),
>>> (0.96, Atoms(symbols='Al4', pbc=True, cell=[3.9952635604153612, 3.9952635604153612, 3.9952635604153612])),
>>> (0.97, Atoms(symbols='Al4', pbc=True, cell=[4.009088111958974, 4.009088111958974, 4.009088111958974])),
>>> (0.98, Atoms(symbols='Al4', pbc=True, cell=[4.022817972936038, 4.022817972936038, 4.022817972936038])),
>>> (0.99, Atoms(symbols='Al4', pbc=True, cell=[4.036454748321015, 4.036454748321015, 4.036454748321015])),
>>> (1.0, Atoms(symbols='Al4', pbc=True, cell=[4.05, 4.05, 4.05])),
>>> (1.01, Atoms(symbols='Al4', pbc=True, cell=[4.063455248345461, 4.063455248345461, 4.063455248345461])),
>>> (1.02, Atoms(symbols='Al4', pbc=True, cell=[4.076821973718458, 4.076821973718458, 4.076821973718458])),
>>> (1.03, Atoms(symbols='Al4', pbc=True, cell=[4.0901016179023415, 4.0901016179023415, 4.0901016179023415])),
>>> (1.04, Atoms(symbols='Al4', pbc=True, cell=[4.1032955854717175, 4.1032955854717175, 4.1032955854717175])),
>>> (1.05, Atoms(symbols='Al4', pbc=True, cell=[4.1164052451001565, 4.1164052451001565, 4.1164052451001565]))
>>> ])}

In the first step the EnergyVolumeCurveWorkflow object is initialized including all the parameters to generate the strained structures and afterwards fit the resulting energy volume curve. This allows the user to see all relevant parameters at one place. After the initialization the function generate_structures() is called without any additional parameters. This function returns the task dictionary task_dict which includes the tasks which should be executed by the calculator. In this case the task is to calculate the energy calc_energy of the eleven generated structures. Each structure is labeled by the ratio of compression or elongation. In the second step the task_dict is evaluate with the GPAW simulation code using the evaluate_with_ase() function:

fromatomistics.calculatorsimportevaluate_with_asefromgpawimportGPAW, PWresult_dict=evaluate_with_ase(
task_dict=task_dict, ase_calculator=GPAW(xc="PBE", mode=PW(300), kpts=(3, 3, 3))
)
print(result_dict)
>>> {'energy': {
>>> 0.95: -14.895378072824752,
>>> 0.96: -14.910819737657118,
>>> 0.97: -14.922307241122466,
>>> 0.98: -14.930392279321056,
>>> 0.99: -14.935048569964911,
>>> 1.0: -14.936666396364169,
>>> 1.01: -14.935212782128556,
>>> 1.02: -14.931045138839849,
>>> 1.03: -14.924165445706581,
>>> 1.04: -14.914703574005678,
>>> 1.05: -14.902774559134226
>>> }}

In analogy to the task_dict which defines the tasks to be executed by the simulation code the result_dict summarizes the results of the calculations. In this case the energies calculated for the specific strains. By ordering both the task_dict and the result_dict with the same labels, the EnergyVolumeCurveWorkflow object is able to match the calculation results to the corresponding structure. Finally, in the third step the analyse_structures() function takes the result_dict as an input and fits the Equation of State with the fitting parameters defined in the first step:

fromatomistics.workflowsimportanalyse_results_for_energy_volume_curvefit_dict=analyse_results_for_energy_volume_curve(
output_dict=result_dict,
task_dict=task_dict,
fit_type="polynomial",
fit_order=3,
)
print(fit_dict)
>>> {'poly_fit': array([-9.30297838e-05, 2.19434659e-02, -1.68388816e+00, 2.73605421e+01]),
>>> 'fit_type': 'polynomial',
>>> 'fit_order': 3,
>>> 'volume_eq': 66.44252286131888,
>>> 'energy_eq': -14.93670322204575,
>>> 'bulkmodul_eq': 72.38919826304497,
>>> 'b_prime_eq': 4.45383655040775,
>>> 'least_square_error': 4.432974529908853e-09,
>>> 'volume': [63.10861874999998, 63.77291999999998, ..., 69.75163125000002],
>>> 'energy': [-14.895378072824752, -14.910819737657118, ..., -14.902774559134226]
>>> }

As a result the equilibrium parameters are returned plus the parameters of the polynomial and the set of volumes and energies which were fitted to achieve these results. The important step here is that while the interface between the first and the second as well as between the second and the third step is clearly defined independent of the specific workflow, the initial parameters for the workflow to initialize the EnergyVolumeCurveWorkflow object as well as the final output of the fit_dict are workflow specific.

Disclaimer

While we try to develop a stable and reliable software library, the development remains a opensource project under the BSD 3-Clause License without any warranties:

BSD 3-Clause License
Copyright (c) 2023, Jan Janssen
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
* Neither the name of the copyright holder nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

Documentation

About

Interfaces for atomistic simulation codes and workflows

Topics

Resources

Code of conduct

Stars

10 stars

Watchers

6 watching

Forks

Releases

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

atomistics

PipelinecodecovBinder

The atomistics package consists of two primary components. On the one hand it provides interfaces to atomistic simulation codes - named calculators. The supported simulation codes in alphabetical order are:

  • Abinit - Plane wave density functional theory
  • EMT - Effective medium theory potential
  • GPAW - Density functional theory Python code based on the projector-augmented wave method
  • LAMMPS - Molecular Dynamics
  • Quantum Espresso - Integrated suite of Open-Source computer codes for electronic-structure calculations
  • Siesta - Electronic structure calculations and ab initio molecular dynamics
  • SPHInX - Plane wave DFT with interactive tools, charged defect correction and spin constraints

For majority of these simulation codes the atomistics package use the Atomic Simulation Environment to interface the underlying C/ C++ and Fortran Codes with the Python programming language. Still this approach limits the functionality of the simulation code to calculating the energy and forces, so by adding custom interfaces the atomistics package can support built-in features of the simulation code like structure optimization and molecular dynamics.

On the other hand the atomistics package also provides workflows to calculate material properties on the atomistic scales, these include:

  • Equation of State - to calculate equilibrium properties like the equilibrium energy, equilibrium volume, equilibrium bulk modulus and its pressure derivative.
  • Elastic Matrix - to calculate the elastic constants and elastic moduli.
  • Harmonic and Quasi-harmonic Approximation - to calculate the density of states, vibrational free energy and thermal expansion based on the finite displacements method implemented in phonopy.
  • Molecular Dynamics - to calculate finite temperature properties like thermal expansion including the anharmonic contributions.

All these workflows can be coupled with all the simulation codes implemented in the atomistics package. In contrast to the Atomic Simulation Environment which provides similar functionality the focus of the atomistics package is not to reimplement existing functionality but rather simplify the process of coupling existing simulation codes with existing workflows. Here the phonopy workflow is a great example to enable the calculation of thermodynamic properties with the harmonic and quasi-harmonic approximation.

Example

Use the equation of state to calculate the equilibrium properties like the equilibrium volume, equilibrium energy, equilibrium bulk modulus and its derivative using the GPAW simulation code

fromase.buildimportbulkfromatomistics.workflowsimportget_tasks_for_energy_volume_curvetask_dict=get_tasks_for_energy_volume_curve(
structure=bulk("Al", a=4.05, cubic=True),
num_points=11,
vol_range=0.05,
axes=["x", "y", "z"],
)
print(task_dict)
>>> {'calc_energy': OrderedDict([
>>> (0.95, Atoms(symbols='Al4', pbc=True, cell=[3.9813426685908118, 3.9813426685908118, 3.9813426685908118])),
>>> (0.96, Atoms(symbols='Al4', pbc=True, cell=[3.9952635604153612, 3.9952635604153612, 3.9952635604153612])),
>>> (0.97, Atoms(symbols='Al4', pbc=True, cell=[4.009088111958974, 4.009088111958974, 4.009088111958974])),
>>> (0.98, Atoms(symbols='Al4', pbc=True, cell=[4.022817972936038, 4.022817972936038, 4.022817972936038])),
>>> (0.99, Atoms(symbols='Al4', pbc=True, cell=[4.036454748321015, 4.036454748321015, 4.036454748321015])),
>>> (1.0, Atoms(symbols='Al4', pbc=True, cell=[4.05, 4.05, 4.05])),
>>> (1.01, Atoms(symbols='Al4', pbc=True, cell=[4.063455248345461, 4.063455248345461, 4.063455248345461])),
>>> (1.02, Atoms(symbols='Al4', pbc=True, cell=[4.076821973718458, 4.076821973718458, 4.076821973718458])),
>>> (1.03, Atoms(symbols='Al4', pbc=True, cell=[4.0901016179023415, 4.0901016179023415, 4.0901016179023415])),
>>> (1.04, Atoms(symbols='Al4', pbc=True, cell=[4.1032955854717175, 4.1032955854717175, 4.1032955854717175])),
>>> (1.05, Atoms(symbols='Al4', pbc=True, cell=[4.1164052451001565, 4.1164052451001565, 4.1164052451001565]))
>>> ])}

In the first step the EnergyVolumeCurveWorkflow object is initialized including all the parameters to generate the strained structures and afterwards fit the resulting energy volume curve. This allows the user to see all relevant parameters at one place. After the initialization the function generate_structures() is called without any additional parameters. This function returns the task dictionary task_dict which includes the tasks which should be executed by the calculator. In this case the task is to calculate the energy calc_energy of the eleven generated structures. Each structure is labeled by the ratio of compression or elongation. In the second step the task_dict is evaluate with the GPAW simulation code using the evaluate_with_ase() function:

fromatomistics.calculatorsimportevaluate_with_asefromgpawimportGPAW, PWresult_dict=evaluate_with_ase(
task_dict=task_dict, ase_calculator=GPAW(xc="PBE", mode=PW(300), kpts=(3, 3, 3))
)
print(result_dict)
>>> {'energy': {
>>> 0.95: -14.895378072824752,
>>> 0.96: -14.910819737657118,
>>> 0.97: -14.922307241122466,
>>> 0.98: -14.930392279321056,
>>> 0.99: -14.935048569964911,
>>> 1.0: -14.936666396364169,
>>> 1.01: -14.935212782128556,
>>> 1.02: -14.931045138839849,
>>> 1.03: -14.924165445706581,
>>> 1.04: -14.914703574005678,
>>> 1.05: -14.902774559134226
>>> }}

In analogy to the task_dict which defines the tasks to be executed by the simulation code the result_dict summarizes the results of the calculations. In this case the energies calculated for the specific strains. By ordering both the task_dict and the result_dict with the same labels, the EnergyVolumeCurveWorkflow object is able to match the calculation results to the corresponding structure. Finally, in the third step the analyse_structures() function takes the result_dict as an input and fits the Equation of State with the fitting parameters defined in the first step:

fromatomistics.workflowsimportanalyse_results_for_energy_volume_curvefit_dict=analyse_results_for_energy_volume_curve(
output_dict=result_dict,
task_dict=task_dict,
fit_type="polynomial",
fit_order=3,
)
print(fit_dict)
>>> {'poly_fit': array([-9.30297838e-05, 2.19434659e-02, -1.68388816e+00, 2.73605421e+01]),
>>> 'fit_type': 'polynomial',
>>> 'fit_order': 3,
>>> 'volume_eq': 66.44252286131888,
>>> 'energy_eq': -14.93670322204575,
>>> 'bulkmodul_eq': 72.38919826304497,
>>> 'b_prime_eq': 4.45383655040775,
>>> 'least_square_error': 4.432974529908853e-09,
>>> 'volume': [63.10861874999998, 63.77291999999998, ..., 69.75163125000002],
>>> 'energy': [-14.895378072824752, -14.910819737657118, ..., -14.902774559134226]
>>> }

As a result the equilibrium parameters are returned plus the parameters of the polynomial and the set of volumes and energies which were fitted to achieve these results. The important step here is that while the interface between the first and the second as well as between the second and the third step is clearly defined independent of the specific workflow, the initial parameters for the workflow to initialize the EnergyVolumeCurveWorkflow object as well as the final output of the fit_dict are workflow specific.

Disclaimer

While we try to develop a stable and reliable software library, the development remains a opensource project under the BSD 3-Clause License without any warranties:

BSD 3-Clause License
Copyright (c) 2023, Jan Janssen
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
* Neither the name of the copyright holder nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

Documentation

About

Interfaces for atomistic simulation codes and workflows

Topics

Resources

Code of conduct

Stars

10 stars

Watchers

6 watching

Forks

Releases

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

atomistics

PipelinecodecovBinder

The atomistics package consists of two primary components. On the one hand it provides interfaces to atomistic simulation codes - named calculators. The supported simulation codes in alphabetical order are:

  • Abinit - Plane wave density functional theory
  • EMT - Effective medium theory potential
  • GPAW - Density functional theory Python code based on the projector-augmented wave method
  • LAMMPS - Molecular Dynamics
  • Quantum Espresso - Integrated suite of Open-Source computer codes for electronic-structure calculations
  • Siesta - Electronic structure calculations and ab initio molecular dynamics
  • SPHInX - Plane wave DFT with interactive tools, charged defect correction and spin constraints

For majority of these simulation codes the atomistics package use the Atomic Simulation Environment to interface the underlying C/ C++ and Fortran Codes with the Python programming language. Still this approach limits the functionality of the simulation code to calculating the energy and forces, so by adding custom interfaces the atomistics package can support built-in features of the simulation code like structure optimization and molecular dynamics.

On the other hand the atomistics package also provides workflows to calculate material properties on the atomistic scales, these include:

  • Equation of State - to calculate equilibrium properties like the equilibrium energy, equilibrium volume, equilibrium bulk modulus and its pressure derivative.
  • Elastic Matrix - to calculate the elastic constants and elastic moduli.
  • Harmonic and Quasi-harmonic Approximation - to calculate the density of states, vibrational free energy and thermal expansion based on the finite displacements method implemented in phonopy.
  • Molecular Dynamics - to calculate finite temperature properties like thermal expansion including the anharmonic contributions.

All these workflows can be coupled with all the simulation codes implemented in the atomistics package. In contrast to the Atomic Simulation Environment which provides similar functionality the focus of the atomistics package is not to reimplement existing functionality but rather simplify the process of coupling existing simulation codes with existing workflows. Here the phonopy workflow is a great example to enable the calculation of thermodynamic properties with the harmonic and quasi-harmonic approximation.

Example

Use the equation of state to calculate the equilibrium properties like the equilibrium volume, equilibrium energy, equilibrium bulk modulus and its derivative using the GPAW simulation code

fromase.buildimportbulkfromatomistics.workflowsimportget_tasks_for_energy_volume_curvetask_dict=get_tasks_for_energy_volume_curve(
structure=bulk("Al", a=4.05, cubic=True),
num_points=11,
vol_range=0.05,
axes=["x", "y", "z"],
)
print(task_dict)
>>> {'calc_energy': OrderedDict([
>>> (0.95, Atoms(symbols='Al4', pbc=True, cell=[3.9813426685908118, 3.9813426685908118, 3.9813426685908118])),
>>> (0.96, Atoms(symbols='Al4', pbc=True, cell=[3.9952635604153612, 3.9952635604153612, 3.9952635604153612])),
>>> (0.97, Atoms(symbols='Al4', pbc=True, cell=[4.009088111958974, 4.009088111958974, 4.009088111958974])),
>>> (0.98, Atoms(symbols='Al4', pbc=True, cell=[4.022817972936038, 4.022817972936038, 4.022817972936038])),
>>> (0.99, Atoms(symbols='Al4', pbc=True, cell=[4.036454748321015, 4.036454748321015, 4.036454748321015])),
>>> (1.0, Atoms(symbols='Al4', pbc=True, cell=[4.05, 4.05, 4.05])),
>>> (1.01, Atoms(symbols='Al4', pbc=True, cell=[4.063455248345461, 4.063455248345461, 4.063455248345461])),
>>> (1.02, Atoms(symbols='Al4', pbc=True, cell=[4.076821973718458, 4.076821973718458, 4.076821973718458])),
>>> (1.03, Atoms(symbols='Al4', pbc=True, cell=[4.0901016179023415, 4.0901016179023415, 4.0901016179023415])),
>>> (1.04, Atoms(symbols='Al4', pbc=True, cell=[4.1032955854717175, 4.1032955854717175, 4.1032955854717175])),
>>> (1.05, Atoms(symbols='Al4', pbc=True, cell=[4.1164052451001565, 4.1164052451001565, 4.1164052451001565]))
>>> ])}

In the first step the EnergyVolumeCurveWorkflow object is initialized including all the parameters to generate the strained structures and afterwards fit the resulting energy volume curve. This allows the user to see all relevant parameters at one place. After the initialization the function generate_structures() is called without any additional parameters. This function returns the task dictionary task_dict which includes the tasks which should be executed by the calculator. In this case the task is to calculate the energy calc_energy of the eleven generated structures. Each structure is labeled by the ratio of compression or elongation. In the second step the task_dict is evaluate with the GPAW simulation code using the evaluate_with_ase() function:

fromatomistics.calculatorsimportevaluate_with_asefromgpawimportGPAW, PWresult_dict=evaluate_with_ase(
task_dict=task_dict, ase_calculator=GPAW(xc="PBE", mode=PW(300), kpts=(3, 3, 3))
)
print(result_dict)
>>> {'energy': {
>>> 0.95: -14.895378072824752,
>>> 0.96: -14.910819737657118,
>>> 0.97: -14.922307241122466,
>>> 0.98: -14.930392279321056,
>>> 0.99: -14.935048569964911,
>>> 1.0: -14.936666396364169,
>>> 1.01: -14.935212782128556,
>>> 1.02: -14.931045138839849,
>>> 1.03: -14.924165445706581,
>>> 1.04: -14.914703574005678,
>>> 1.05: -14.902774559134226
>>> }}

In analogy to the task_dict which defines the tasks to be executed by the simulation code the result_dict summarizes the results of the calculations. In this case the energies calculated for the specific strains. By ordering both the task_dict and the result_dict with the same labels, the EnergyVolumeCurveWorkflow object is able to match the calculation results to the corresponding structure. Finally, in the third step the analyse_structures() function takes the result_dict as an input and fits the Equation of State with the fitting parameters defined in the first step:

fromatomistics.workflowsimportanalyse_results_for_energy_volume_curvefit_dict=analyse_results_for_energy_volume_curve(
output_dict=result_dict,
task_dict=task_dict,
fit_type="polynomial",
fit_order=3,
)
print(fit_dict)
>>> {'poly_fit': array([-9.30297838e-05, 2.19434659e-02, -1.68388816e+00, 2.73605421e+01]),
>>> 'fit_type': 'polynomial',
>>> 'fit_order': 3,
>>> 'volume_eq': 66.44252286131888,
>>> 'energy_eq': -14.93670322204575,
>>> 'bulkmodul_eq': 72.38919826304497,
>>> 'b_prime_eq': 4.45383655040775,
>>> 'least_square_error': 4.432974529908853e-09,
>>> 'volume': [63.10861874999998, 63.77291999999998, ..., 69.75163125000002],
>>> 'energy': [-14.895378072824752, -14.910819737657118, ..., -14.902774559134226]
>>> }

As a result the equilibrium parameters are returned plus the parameters of the polynomial and the set of volumes and energies which were fitted to achieve these results. The important step here is that while the interface between the first and the second as well as between the second and the third step is clearly defined independent of the specific workflow, the initial parameters for the workflow to initialize the EnergyVolumeCurveWorkflow object as well as the final output of the fit_dict are workflow specific.

Disclaimer

While we try to develop a stable and reliable software library, the development remains a opensource project under the BSD 3-Clause License without any warranties:

BSD 3-Clause License
Copyright (c) 2023, Jan Janssen
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
* Neither the name of the copyright holder nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

Documentation

About

Interfaces for atomistic simulation codes and workflows

Topics

Resources

Code of conduct

Stars

10 stars

Watchers

6 watching

Forks

Releases

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

atomistics

PipelinecodecovBinder

The atomistics package consists of two primary components. On the one hand it provides interfaces to atomistic simulation codes - named calculators. The supported simulation codes in alphabetical order are:

  • Abinit - Plane wave density functional theory
  • EMT - Effective medium theory potential
  • GPAW - Density functional theory Python code based on the projector-augmented wave method
  • LAMMPS - Molecular Dynamics
  • Quantum Espresso - Integrated suite of Open-Source computer codes for electronic-structure calculations
  • Siesta - Electronic structure calculations and ab initio molecular dynamics
  • SPHInX - Plane wave DFT with interactive tools, charged defect correction and spin constraints

For majority of these simulation codes the atomistics package use the Atomic Simulation Environment to interface the underlying C/ C++ and Fortran Codes with the Python programming language. Still this approach limits the functionality of the simulation code to calculating the energy and forces, so by adding custom interfaces the atomistics package can support built-in features of the simulation code like structure optimization and molecular dynamics.

On the other hand the atomistics package also provides workflows to calculate material properties on the atomistic scales, these include:

  • Equation of State - to calculate equilibrium properties like the equilibrium energy, equilibrium volume, equilibrium bulk modulus and its pressure derivative.
  • Elastic Matrix - to calculate the elastic constants and elastic moduli.
  • Harmonic and Quasi-harmonic Approximation - to calculate the density of states, vibrational free energy and thermal expansion based on the finite displacements method implemented in phonopy.
  • Molecular Dynamics - to calculate finite temperature properties like thermal expansion including the anharmonic contributions.

All these workflows can be coupled with all the simulation codes implemented in the atomistics package. In contrast to the Atomic Simulation Environment which provides similar functionality the focus of the atomistics package is not to reimplement existing functionality but rather simplify the process of coupling existing simulation codes with existing workflows. Here the phonopy workflow is a great example to enable the calculation of thermodynamic properties with the harmonic and quasi-harmonic approximation.

Example

Use the equation of state to calculate the equilibrium properties like the equilibrium volume, equilibrium energy, equilibrium bulk modulus and its derivative using the GPAW simulation code

fromase.buildimportbulkfromatomistics.workflowsimportget_tasks_for_energy_volume_curvetask_dict=get_tasks_for_energy_volume_curve(
structure=bulk("Al", a=4.05, cubic=True),
num_points=11,
vol_range=0.05,
axes=["x", "y", "z"],
)
print(task_dict)
>>> {'calc_energy': OrderedDict([
>>> (0.95, Atoms(symbols='Al4', pbc=True, cell=[3.9813426685908118, 3.9813426685908118, 3.9813426685908118])),
>>> (0.96, Atoms(symbols='Al4', pbc=True, cell=[3.9952635604153612, 3.9952635604153612, 3.9952635604153612])),
>>> (0.97, Atoms(symbols='Al4', pbc=True, cell=[4.009088111958974, 4.009088111958974, 4.009088111958974])),
>>> (0.98, Atoms(symbols='Al4', pbc=True, cell=[4.022817972936038, 4.022817972936038, 4.022817972936038])),
>>> (0.99, Atoms(symbols='Al4', pbc=True, cell=[4.036454748321015, 4.036454748321015, 4.036454748321015])),
>>> (1.0, Atoms(symbols='Al4', pbc=True, cell=[4.05, 4.05, 4.05])),
>>> (1.01, Atoms(symbols='Al4', pbc=True, cell=[4.063455248345461, 4.063455248345461, 4.063455248345461])),
>>> (1.02, Atoms(symbols='Al4', pbc=True, cell=[4.076821973718458, 4.076821973718458, 4.076821973718458])),
>>> (1.03, Atoms(symbols='Al4', pbc=True, cell=[4.0901016179023415, 4.0901016179023415, 4.0901016179023415])),
>>> (1.04, Atoms(symbols='Al4', pbc=True, cell=[4.1032955854717175, 4.1032955854717175, 4.1032955854717175])),
>>> (1.05, Atoms(symbols='Al4', pbc=True, cell=[4.1164052451001565, 4.1164052451001565, 4.1164052451001565]))
>>> ])}

In the first step the EnergyVolumeCurveWorkflow object is initialized including all the parameters to generate the strained structures and afterwards fit the resulting energy volume curve. This allows the user to see all relevant parameters at one place. After the initialization the function generate_structures() is called without any additional parameters. This function returns the task dictionary task_dict which includes the tasks which should be executed by the calculator. In this case the task is to calculate the energy calc_energy of the eleven generated structures. Each structure is labeled by the ratio of compression or elongation. In the second step the task_dict is evaluate with the GPAW simulation code using the evaluate_with_ase() function:

fromatomistics.calculatorsimportevaluate_with_asefromgpawimportGPAW, PWresult_dict=evaluate_with_ase(
task_dict=task_dict, ase_calculator=GPAW(xc="PBE", mode=PW(300), kpts=(3, 3, 3))
)
print(result_dict)
>>> {'energy': {
>>> 0.95: -14.895378072824752,
>>> 0.96: -14.910819737657118,
>>> 0.97: -14.922307241122466,
>>> 0.98: -14.930392279321056,
>>> 0.99: -14.935048569964911,
>>> 1.0: -14.936666396364169,
>>> 1.01: -14.935212782128556,
>>> 1.02: -14.931045138839849,
>>> 1.03: -14.924165445706581,
>>> 1.04: -14.914703574005678,
>>> 1.05: -14.902774559134226
>>> }}

In analogy to the task_dict which defines the tasks to be executed by the simulation code the result_dict summarizes the results of the calculations. In this case the energies calculated for the specific strains. By ordering both the task_dict and the result_dict with the same labels, the EnergyVolumeCurveWorkflow object is able to match the calculation results to the corresponding structure. Finally, in the third step the analyse_structures() function takes the result_dict as an input and fits the Equation of State with the fitting parameters defined in the first step:

fromatomistics.workflowsimportanalyse_results_for_energy_volume_curvefit_dict=analyse_results_for_energy_volume_curve(
output_dict=result_dict,
task_dict=task_dict,
fit_type="polynomial",
fit_order=3,
)
print(fit_dict)
>>> {'poly_fit': array([-9.30297838e-05, 2.19434659e-02, -1.68388816e+00, 2.73605421e+01]),
>>> 'fit_type': 'polynomial',
>>> 'fit_order': 3,
>>> 'volume_eq': 66.44252286131888,
>>> 'energy_eq': -14.93670322204575,
>>> 'bulkmodul_eq': 72.38919826304497,
>>> 'b_prime_eq': 4.45383655040775,
>>> 'least_square_error': 4.432974529908853e-09,
>>> 'volume': [63.10861874999998, 63.77291999999998, ..., 69.75163125000002],
>>> 'energy': [-14.895378072824752, -14.910819737657118, ..., -14.902774559134226]
>>> }

As a result the equilibrium parameters are returned plus the parameters of the polynomial and the set of volumes and energies which were fitted to achieve these results. The important step here is that while the interface between the first and the second as well as between the second and the third step is clearly defined independent of the specific workflow, the initial parameters for the workflow to initialize the EnergyVolumeCurveWorkflow object as well as the final output of the fit_dict are workflow specific.

Disclaimer

While we try to develop a stable and reliable software library, the development remains a opensource project under the BSD 3-Clause License without any warranties:

BSD 3-Clause License
Copyright (c) 2023, Jan Janssen
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
* Neither the name of the copyright holder nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

Documentation

About

Interfaces for atomistic simulation codes and workflows

Topics

Resources

Code of conduct

Stars

10 stars

Watchers

6 watching

Forks

Releases

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

atomistics

PipelinecodecovBinder

The atomistics package consists of two primary components. On the one hand it provides interfaces to atomistic simulation codes - named calculators. The supported simulation codes in alphabetical order are:

  • Abinit - Plane wave density functional theory
  • EMT - Effective medium theory potential
  • GPAW - Density functional theory Python code based on the projector-augmented wave method
  • LAMMPS - Molecular Dynamics
  • Quantum Espresso - Integrated suite of Open-Source computer codes for electronic-structure calculations
  • Siesta - Electronic structure calculations and ab initio molecular dynamics
  • SPHInX - Plane wave DFT with interactive tools, charged defect correction and spin constraints

For majority of these simulation codes the atomistics package use the Atomic Simulation Environment to interface the underlying C/ C++ and Fortran Codes with the Python programming language. Still this approach limits the functionality of the simulation code to calculating the energy and forces, so by adding custom interfaces the atomistics package can support built-in features of the simulation code like structure optimization and molecular dynamics.

On the other hand the atomistics package also provides workflows to calculate material properties on the atomistic scales, these include:

  • Equation of State - to calculate equilibrium properties like the equilibrium energy, equilibrium volume, equilibrium bulk modulus and its pressure derivative.
  • Elastic Matrix - to calculate the elastic constants and elastic moduli.
  • Harmonic and Quasi-harmonic Approximation - to calculate the density of states, vibrational free energy and thermal expansion based on the finite displacements method implemented in phonopy.
  • Molecular Dynamics - to calculate finite temperature properties like thermal expansion including the anharmonic contributions.

All these workflows can be coupled with all the simulation codes implemented in the atomistics package. In contrast to the Atomic Simulation Environment which provides similar functionality the focus of the atomistics package is not to reimplement existing functionality but rather simplify the process of coupling existing simulation codes with existing workflows. Here the phonopy workflow is a great example to enable the calculation of thermodynamic properties with the harmonic and quasi-harmonic approximation.

Example

Use the equation of state to calculate the equilibrium properties like the equilibrium volume, equilibrium energy, equilibrium bulk modulus and its derivative using the GPAW simulation code

fromase.buildimportbulkfromatomistics.workflowsimportget_tasks_for_energy_volume_curvetask_dict=get_tasks_for_energy_volume_curve(
structure=bulk("Al", a=4.05, cubic=True),
num_points=11,
vol_range=0.05,
axes=["x", "y", "z"],
)
print(task_dict)
>>> {'calc_energy': OrderedDict([
>>> (0.95, Atoms(symbols='Al4', pbc=True, cell=[3.9813426685908118, 3.9813426685908118, 3.9813426685908118])),
>>> (0.96, Atoms(symbols='Al4', pbc=True, cell=[3.9952635604153612, 3.9952635604153612, 3.9952635604153612])),
>>> (0.97, Atoms(symbols='Al4', pbc=True, cell=[4.009088111958974, 4.009088111958974, 4.009088111958974])),
>>> (0.98, Atoms(symbols='Al4', pbc=True, cell=[4.022817972936038, 4.022817972936038, 4.022817972936038])),
>>> (0.99, Atoms(symbols='Al4', pbc=True, cell=[4.036454748321015, 4.036454748321015, 4.036454748321015])),
>>> (1.0, Atoms(symbols='Al4', pbc=True, cell=[4.05, 4.05, 4.05])),
>>> (1.01, Atoms(symbols='Al4', pbc=True, cell=[4.063455248345461, 4.063455248345461, 4.063455248345461])),
>>> (1.02, Atoms(symbols='Al4', pbc=True, cell=[4.076821973718458, 4.076821973718458, 4.076821973718458])),
>>> (1.03, Atoms(symbols='Al4', pbc=True, cell=[4.0901016179023415, 4.0901016179023415, 4.0901016179023415])),
>>> (1.04, Atoms(symbols='Al4', pbc=True, cell=[4.1032955854717175, 4.1032955854717175, 4.1032955854717175])),
>>> (1.05, Atoms(symbols='Al4', pbc=True, cell=[4.1164052451001565, 4.1164052451001565, 4.1164052451001565]))
>>> ])}

In the first step the EnergyVolumeCurveWorkflow object is initialized including all the parameters to generate the strained structures and afterwards fit the resulting energy volume curve. This allows the user to see all relevant parameters at one place. After the initialization the function generate_structures() is called without any additional parameters. This function returns the task dictionary task_dict which includes the tasks which should be executed by the calculator. In this case the task is to calculate the energy calc_energy of the eleven generated structures. Each structure is labeled by the ratio of compression or elongation. In the second step the task_dict is evaluate with the GPAW simulation code using the evaluate_with_ase() function:

fromatomistics.calculatorsimportevaluate_with_asefromgpawimportGPAW, PWresult_dict=evaluate_with_ase(
task_dict=task_dict, ase_calculator=GPAW(xc="PBE", mode=PW(300), kpts=(3, 3, 3))
)
print(result_dict)
>>> {'energy': {
>>> 0.95: -14.895378072824752,
>>> 0.96: -14.910819737657118,
>>> 0.97: -14.922307241122466,
>>> 0.98: -14.930392279321056,
>>> 0.99: -14.935048569964911,
>>> 1.0: -14.936666396364169,
>>> 1.01: -14.935212782128556,
>>> 1.02: -14.931045138839849,
>>> 1.03: -14.924165445706581,
>>> 1.04: -14.914703574005678,
>>> 1.05: -14.902774559134226
>>> }}

In analogy to the task_dict which defines the tasks to be executed by the simulation code the result_dict summarizes the results of the calculations. In this case the energies calculated for the specific strains. By ordering both the task_dict and the result_dict with the same labels, the EnergyVolumeCurveWorkflow object is able to match the calculation results to the corresponding structure. Finally, in the third step the analyse_structures() function takes the result_dict as an input and fits the Equation of State with the fitting parameters defined in the first step:

fromatomistics.workflowsimportanalyse_results_for_energy_volume_curvefit_dict=analyse_results_for_energy_volume_curve(
output_dict=result_dict,
task_dict=task_dict,
fit_type="polynomial",
fit_order=3,
)
print(fit_dict)
>>> {'poly_fit': array([-9.30297838e-05, 2.19434659e-02, -1.68388816e+00, 2.73605421e+01]),
>>> 'fit_type': 'polynomial',
>>> 'fit_order': 3,
>>> 'volume_eq': 66.44252286131888,
>>> 'energy_eq': -14.93670322204575,
>>> 'bulkmodul_eq': 72.38919826304497,
>>> 'b_prime_eq': 4.45383655040775,
>>> 'least_square_error': 4.432974529908853e-09,
>>> 'volume': [63.10861874999998, 63.77291999999998, ..., 69.75163125000002],
>>> 'energy': [-14.895378072824752, -14.910819737657118, ..., -14.902774559134226]
>>> }

As a result the equilibrium parameters are returned plus the parameters of the polynomial and the set of volumes and energies which were fitted to achieve these results. The important step here is that while the interface between the first and the second as well as between the second and the third step is clearly defined independent of the specific workflow, the initial parameters for the workflow to initialize the EnergyVolumeCurveWorkflow object as well as the final output of the fit_dict are workflow specific.

Disclaimer

While we try to develop a stable and reliable software library, the development remains a opensource project under the BSD 3-Clause License without any warranties:

BSD 3-Clause License
Copyright (c) 2023, Jan Janssen
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
* Neither the name of the copyright holder nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

Documentation

About

Interfaces for atomistic simulation codes and workflows

Topics

Resources

Code of conduct

Stars

10 stars

Watchers

6 watching

Forks

Releases

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

atomistics

PipelinecodecovBinder

The atomistics package consists of two primary components. On the one hand it provides interfaces to atomistic simulation codes - named calculators. The supported simulation codes in alphabetical order are:

  • Abinit - Plane wave density functional theory
  • EMT - Effective medium theory potential
  • GPAW - Density functional theory Python code based on the projector-augmented wave method
  • LAMMPS - Molecular Dynamics
  • Quantum Espresso - Integrated suite of Open-Source computer codes for electronic-structure calculations
  • Siesta - Electronic structure calculations and ab initio molecular dynamics
  • SPHInX - Plane wave DFT with interactive tools, charged defect correction and spin constraints

For majority of these simulation codes the atomistics package use the Atomic Simulation Environment to interface the underlying C/ C++ and Fortran Codes with the Python programming language. Still this approach limits the functionality of the simulation code to calculating the energy and forces, so by adding custom interfaces the atomistics package can support built-in features of the simulation code like structure optimization and molecular dynamics.

On the other hand the atomistics package also provides workflows to calculate material properties on the atomistic scales, these include:

  • Equation of State - to calculate equilibrium properties like the equilibrium energy, equilibrium volume, equilibrium bulk modulus and its pressure derivative.
  • Elastic Matrix - to calculate the elastic constants and elastic moduli.
  • Harmonic and Quasi-harmonic Approximation - to calculate the density of states, vibrational free energy and thermal expansion based on the finite displacements method implemented in phonopy.
  • Molecular Dynamics - to calculate finite temperature properties like thermal expansion including the anharmonic contributions.

All these workflows can be coupled with all the simulation codes implemented in the atomistics package. In contrast to the Atomic Simulation Environment which provides similar functionality the focus of the atomistics package is not to reimplement existing functionality but rather simplify the process of coupling existing simulation codes with existing workflows. Here the phonopy workflow is a great example to enable the calculation of thermodynamic properties with the harmonic and quasi-harmonic approximation.

Example

Use the equation of state to calculate the equilibrium properties like the equilibrium volume, equilibrium energy, equilibrium bulk modulus and its derivative using the GPAW simulation code

fromase.buildimportbulkfromatomistics.workflowsimportget_tasks_for_energy_volume_curvetask_dict=get_tasks_for_energy_volume_curve(
structure=bulk("Al", a=4.05, cubic=True),
num_points=11,
vol_range=0.05,
axes=["x", "y", "z"],
)
print(task_dict)
>>> {'calc_energy': OrderedDict([
>>> (0.95, Atoms(symbols='Al4', pbc=True, cell=[3.9813426685908118, 3.9813426685908118, 3.9813426685908118])),
>>> (0.96, Atoms(symbols='Al4', pbc=True, cell=[3.9952635604153612, 3.9952635604153612, 3.9952635604153612])),
>>> (0.97, Atoms(symbols='Al4', pbc=True, cell=[4.009088111958974, 4.009088111958974, 4.009088111958974])),
>>> (0.98, Atoms(symbols='Al4', pbc=True, cell=[4.022817972936038, 4.022817972936038, 4.022817972936038])),
>>> (0.99, Atoms(symbols='Al4', pbc=True, cell=[4.036454748321015, 4.036454748321015, 4.036454748321015])),
>>> (1.0, Atoms(symbols='Al4', pbc=True, cell=[4.05, 4.05, 4.05])),
>>> (1.01, Atoms(symbols='Al4', pbc=True, cell=[4.063455248345461, 4.063455248345461, 4.063455248345461])),
>>> (1.02, Atoms(symbols='Al4', pbc=True, cell=[4.076821973718458, 4.076821973718458, 4.076821973718458])),
>>> (1.03, Atoms(symbols='Al4', pbc=True, cell=[4.0901016179023415, 4.0901016179023415, 4.0901016179023415])),
>>> (1.04, Atoms(symbols='Al4', pbc=True, cell=[4.1032955854717175, 4.1032955854717175, 4.1032955854717175])),
>>> (1.05, Atoms(symbols='Al4', pbc=True, cell=[4.1164052451001565, 4.1164052451001565, 4.1164052451001565]))
>>> ])}

In the first step the EnergyVolumeCurveWorkflow object is initialized including all the parameters to generate the strained structures and afterwards fit the resulting energy volume curve. This allows the user to see all relevant parameters at one place. After the initialization the function generate_structures() is called without any additional parameters. This function returns the task dictionary task_dict which includes the tasks which should be executed by the calculator. In this case the task is to calculate the energy calc_energy of the eleven generated structures. Each structure is labeled by the ratio of compression or elongation. In the second step the task_dict is evaluate with the GPAW simulation code using the evaluate_with_ase() function:

fromatomistics.calculatorsimportevaluate_with_asefromgpawimportGPAW, PWresult_dict=evaluate_with_ase(
task_dict=task_dict, ase_calculator=GPAW(xc="PBE", mode=PW(300), kpts=(3, 3, 3))
)
print(result_dict)
>>> {'energy': {
>>> 0.95: -14.895378072824752,
>>> 0.96: -14.910819737657118,
>>> 0.97: -14.922307241122466,
>>> 0.98: -14.930392279321056,
>>> 0.99: -14.935048569964911,
>>> 1.0: -14.936666396364169,
>>> 1.01: -14.935212782128556,
>>> 1.02: -14.931045138839849,
>>> 1.03: -14.924165445706581,
>>> 1.04: -14.914703574005678,
>>> 1.05: -14.902774559134226
>>> }}

In analogy to the task_dict which defines the tasks to be executed by the simulation code the result_dict summarizes the results of the calculations. In this case the energies calculated for the specific strains. By ordering both the task_dict and the result_dict with the same labels, the EnergyVolumeCurveWorkflow object is able to match the calculation results to the corresponding structure. Finally, in the third step the analyse_structures() function takes the result_dict as an input and fits the Equation of State with the fitting parameters defined in the first step:

fromatomistics.workflowsimportanalyse_results_for_energy_volume_curvefit_dict=analyse_results_for_energy_volume_curve(
output_dict=result_dict,
task_dict=task_dict,
fit_type="polynomial",
fit_order=3,
)
print(fit_dict)
>>> {'poly_fit': array([-9.30297838e-05, 2.19434659e-02, -1.68388816e+00, 2.73605421e+01]),
>>> 'fit_type': 'polynomial',
>>> 'fit_order': 3,
>>> 'volume_eq': 66.44252286131888,
>>> 'energy_eq': -14.93670322204575,
>>> 'bulkmodul_eq': 72.38919826304497,
>>> 'b_prime_eq': 4.45383655040775,
>>> 'least_square_error': 4.432974529908853e-09,
>>> 'volume': [63.10861874999998, 63.77291999999998, ..., 69.75163125000002],
>>> 'energy': [-14.895378072824752, -14.910819737657118, ..., -14.902774559134226]
>>> }

As a result the equilibrium parameters are returned plus the parameters of the polynomial and the set of volumes and energies which were fitted to achieve these results. The important step here is that while the interface between the first and the second as well as between the second and the third step is clearly defined independent of the specific workflow, the initial parameters for the workflow to initialize the EnergyVolumeCurveWorkflow object as well as the final output of the fit_dict are workflow specific.

Disclaimer

While we try to develop a stable and reliable software library, the development remains a opensource project under the BSD 3-Clause License without any warranties:

BSD 3-Clause License
Copyright (c) 2023, Jan Janssen
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
* Neither the name of the copyright holder nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

Documentation

About

Interfaces for atomistic simulation codes and workflows

Topics

Resources

Code of conduct

Stars

10 stars

Watchers

6 watching

Forks

Releases

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

atomistics

PipelinecodecovBinder

The atomistics package consists of two primary components. On the one hand it provides interfaces to atomistic simulation codes - named calculators. The supported simulation codes in alphabetical order are:

  • Abinit - Plane wave density functional theory
  • EMT - Effective medium theory potential
  • GPAW - Density functional theory Python code based on the projector-augmented wave method
  • LAMMPS - Molecular Dynamics
  • Quantum Espresso - Integrated suite of Open-Source computer codes for electronic-structure calculations
  • Siesta - Electronic structure calculations and ab initio molecular dynamics
  • SPHInX - Plane wave DFT with interactive tools, charged defect correction and spin constraints

For majority of these simulation codes the atomistics package use the Atomic Simulation Environment to interface the underlying C/ C++ and Fortran Codes with the Python programming language. Still this approach limits the functionality of the simulation code to calculating the energy and forces, so by adding custom interfaces the atomistics package can support built-in features of the simulation code like structure optimization and molecular dynamics.

On the other hand the atomistics package also provides workflows to calculate material properties on the atomistic scales, these include:

  • Equation of State - to calculate equilibrium properties like the equilibrium energy, equilibrium volume, equilibrium bulk modulus and its pressure derivative.
  • Elastic Matrix - to calculate the elastic constants and elastic moduli.
  • Harmonic and Quasi-harmonic Approximation - to calculate the density of states, vibrational free energy and thermal expansion based on the finite displacements method implemented in phonopy.
  • Molecular Dynamics - to calculate finite temperature properties like thermal expansion including the anharmonic contributions.

All these workflows can be coupled with all the simulation codes implemented in the atomistics package. In contrast to the Atomic Simulation Environment which provides similar functionality the focus of the atomistics package is not to reimplement existing functionality but rather simplify the process of coupling existing simulation codes with existing workflows. Here the phonopy workflow is a great example to enable the calculation of thermodynamic properties with the harmonic and quasi-harmonic approximation.

Example

Use the equation of state to calculate the equilibrium properties like the equilibrium volume, equilibrium energy, equilibrium bulk modulus and its derivative using the GPAW simulation code

fromase.buildimportbulkfromatomistics.workflowsimportget_tasks_for_energy_volume_curvetask_dict=get_tasks_for_energy_volume_curve(
structure=bulk("Al", a=4.05, cubic=True),
num_points=11,
vol_range=0.05,
axes=["x", "y", "z"],
)
print(task_dict)
>>> {'calc_energy': OrderedDict([
>>> (0.95, Atoms(symbols='Al4', pbc=True, cell=[3.9813426685908118, 3.9813426685908118, 3.9813426685908118])),
>>> (0.96, Atoms(symbols='Al4', pbc=True, cell=[3.9952635604153612, 3.9952635604153612, 3.9952635604153612])),
>>> (0.97, Atoms(symbols='Al4', pbc=True, cell=[4.009088111958974, 4.009088111958974, 4.009088111958974])),
>>> (0.98, Atoms(symbols='Al4', pbc=True, cell=[4.022817972936038, 4.022817972936038, 4.022817972936038])),
>>> (0.99, Atoms(symbols='Al4', pbc=True, cell=[4.036454748321015, 4.036454748321015, 4.036454748321015])),
>>> (1.0, Atoms(symbols='Al4', pbc=True, cell=[4.05, 4.05, 4.05])),
>>> (1.01, Atoms(symbols='Al4', pbc=True, cell=[4.063455248345461, 4.063455248345461, 4.063455248345461])),
>>> (1.02, Atoms(symbols='Al4', pbc=True, cell=[4.076821973718458, 4.076821973718458, 4.076821973718458])),
>>> (1.03, Atoms(symbols='Al4', pbc=True, cell=[4.0901016179023415, 4.0901016179023415, 4.0901016179023415])),
>>> (1.04, Atoms(symbols='Al4', pbc=True, cell=[4.1032955854717175, 4.1032955854717175, 4.1032955854717175])),
>>> (1.05, Atoms(symbols='Al4', pbc=True, cell=[4.1164052451001565, 4.1164052451001565, 4.1164052451001565]))
>>> ])}

In the first step the EnergyVolumeCurveWorkflow object is initialized including all the parameters to generate the strained structures and afterwards fit the resulting energy volume curve. This allows the user to see all relevant parameters at one place. After the initialization the function generate_structures() is called without any additional parameters. This function returns the task dictionary task_dict which includes the tasks which should be executed by the calculator. In this case the task is to calculate the energy calc_energy of the eleven generated structures. Each structure is labeled by the ratio of compression or elongation. In the second step the task_dict is evaluate with the GPAW simulation code using the evaluate_with_ase() function:

fromatomistics.calculatorsimportevaluate_with_asefromgpawimportGPAW, PWresult_dict=evaluate_with_ase(
task_dict=task_dict, ase_calculator=GPAW(xc="PBE", mode=PW(300), kpts=(3, 3, 3))
)
print(result_dict)
>>> {'energy': {
>>> 0.95: -14.895378072824752,
>>> 0.96: -14.910819737657118,
>>> 0.97: -14.922307241122466,
>>> 0.98: -14.930392279321056,
>>> 0.99: -14.935048569964911,
>>> 1.0: -14.936666396364169,
>>> 1.01: -14.935212782128556,
>>> 1.02: -14.931045138839849,
>>> 1.03: -14.924165445706581,
>>> 1.04: -14.914703574005678,
>>> 1.05: -14.902774559134226
>>> }}

In analogy to the task_dict which defines the tasks to be executed by the simulation code the result_dict summarizes the results of the calculations. In this case the energies calculated for the specific strains. By ordering both the task_dict and the result_dict with the same labels, the EnergyVolumeCurveWorkflow object is able to match the calculation results to the corresponding structure. Finally, in the third step the analyse_structures() function takes the result_dict as an input and fits the Equation of State with the fitting parameters defined in the first step:

fromatomistics.workflowsimportanalyse_results_for_energy_volume_curvefit_dict=analyse_results_for_energy_volume_curve(
output_dict=result_dict,
task_dict=task_dict,
fit_type="polynomial",
fit_order=3,
)
print(fit_dict)
>>> {'poly_fit': array([-9.30297838e-05, 2.19434659e-02, -1.68388816e+00, 2.73605421e+01]),
>>> 'fit_type': 'polynomial',
>>> 'fit_order': 3,
>>> 'volume_eq': 66.44252286131888,
>>> 'energy_eq': -14.93670322204575,
>>> 'bulkmodul_eq': 72.38919826304497,
>>> 'b_prime_eq': 4.45383655040775,
>>> 'least_square_error': 4.432974529908853e-09,
>>> 'volume': [63.10861874999998, 63.77291999999998, ..., 69.75163125000002],
>>> 'energy': [-14.895378072824752, -14.910819737657118, ..., -14.902774559134226]
>>> }

As a result the equilibrium parameters are returned plus the parameters of the polynomial and the set of volumes and energies which were fitted to achieve these results. The important step here is that while the interface between the first and the second as well as between the second and the third step is clearly defined independent of the specific workflow, the initial parameters for the workflow to initialize the EnergyVolumeCurveWorkflow object as well as the final output of the fit_dict are workflow specific.

Disclaimer

While we try to develop a stable and reliable software library, the development remains a opensource project under the BSD 3-Clause License without any warranties:

BSD 3-Clause License
Copyright (c) 2023, Jan Janssen
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
* Neither the name of the copyright holder nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

Documentation

About

Interfaces for atomistic simulation codes and workflows

Topics

Resources

Code of conduct

Stars

10 stars

Watchers

6 watching

Forks

Releases

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

atomistics

PipelinecodecovBinder

The atomistics package consists of two primary components. On the one hand it provides interfaces to atomistic simulation codes - named calculators. The supported simulation codes in alphabetical order are:

  • Abinit - Plane wave density functional theory
  • EMT - Effective medium theory potential
  • GPAW - Density functional theory Python code based on the projector-augmented wave method
  • LAMMPS - Molecular Dynamics
  • Quantum Espresso - Integrated suite of Open-Source computer codes for electronic-structure calculations
  • Siesta - Electronic structure calculations and ab initio molecular dynamics
  • SPHInX - Plane wave DFT with interactive tools, charged defect correction and spin constraints

For majority of these simulation codes the atomistics package use the Atomic Simulation Environment to interface the underlying C/ C++ and Fortran Codes with the Python programming language. Still this approach limits the functionality of the simulation code to calculating the energy and forces, so by adding custom interfaces the atomistics package can support built-in features of the simulation code like structure optimization and molecular dynamics.

On the other hand the atomistics package also provides workflows to calculate material properties on the atomistic scales, these include:

  • Equation of State - to calculate equilibrium properties like the equilibrium energy, equilibrium volume, equilibrium bulk modulus and its pressure derivative.
  • Elastic Matrix - to calculate the elastic constants and elastic moduli.
  • Harmonic and Quasi-harmonic Approximation - to calculate the density of states, vibrational free energy and thermal expansion based on the finite displacements method implemented in phonopy.
  • Molecular Dynamics - to calculate finite temperature properties like thermal expansion including the anharmonic contributions.

All these workflows can be coupled with all the simulation codes implemented in the atomistics package. In contrast to the Atomic Simulation Environment which provides similar functionality the focus of the atomistics package is not to reimplement existing functionality but rather simplify the process of coupling existing simulation codes with existing workflows. Here the phonopy workflow is a great example to enable the calculation of thermodynamic properties with the harmonic and quasi-harmonic approximation.

Example

Use the equation of state to calculate the equilibrium properties like the equilibrium volume, equilibrium energy, equilibrium bulk modulus and its derivative using the GPAW simulation code

fromase.buildimportbulkfromatomistics.workflowsimportget_tasks_for_energy_volume_curvetask_dict=get_tasks_for_energy_volume_curve(
structure=bulk("Al", a=4.05, cubic=True),
num_points=11,
vol_range=0.05,
axes=["x", "y", "z"],
)
print(task_dict)
>>> {'calc_energy': OrderedDict([
>>> (0.95, Atoms(symbols='Al4', pbc=True, cell=[3.9813426685908118, 3.9813426685908118, 3.9813426685908118])),
>>> (0.96, Atoms(symbols='Al4', pbc=True, cell=[3.9952635604153612, 3.9952635604153612, 3.9952635604153612])),
>>> (0.97, Atoms(symbols='Al4', pbc=True, cell=[4.009088111958974, 4.009088111958974, 4.009088111958974])),
>>> (0.98, Atoms(symbols='Al4', pbc=True, cell=[4.022817972936038, 4.022817972936038, 4.022817972936038])),
>>> (0.99, Atoms(symbols='Al4', pbc=True, cell=[4.036454748321015, 4.036454748321015, 4.036454748321015])),
>>> (1.0, Atoms(symbols='Al4', pbc=True, cell=[4.05, 4.05, 4.05])),
>>> (1.01, Atoms(symbols='Al4', pbc=True, cell=[4.063455248345461, 4.063455248345461, 4.063455248345461])),
>>> (1.02, Atoms(symbols='Al4', pbc=True, cell=[4.076821973718458, 4.076821973718458, 4.076821973718458])),
>>> (1.03, Atoms(symbols='Al4', pbc=True, cell=[4.0901016179023415, 4.0901016179023415, 4.0901016179023415])),
>>> (1.04, Atoms(symbols='Al4', pbc=True, cell=[4.1032955854717175, 4.1032955854717175, 4.1032955854717175])),
>>> (1.05, Atoms(symbols='Al4', pbc=True, cell=[4.1164052451001565, 4.1164052451001565, 4.1164052451001565]))
>>> ])}

In the first step the EnergyVolumeCurveWorkflow object is initialized including all the parameters to generate the strained structures and afterwards fit the resulting energy volume curve. This allows the user to see all relevant parameters at one place. After the initialization the function generate_structures() is called without any additional parameters. This function returns the task dictionary task_dict which includes the tasks which should be executed by the calculator. In this case the task is to calculate the energy calc_energy of the eleven generated structures. Each structure is labeled by the ratio of compression or elongation. In the second step the task_dict is evaluate with the GPAW simulation code using the evaluate_with_ase() function:

fromatomistics.calculatorsimportevaluate_with_asefromgpawimportGPAW, PWresult_dict=evaluate_with_ase(
task_dict=task_dict, ase_calculator=GPAW(xc="PBE", mode=PW(300), kpts=(3, 3, 3))
)
print(result_dict)
>>> {'energy': {
>>> 0.95: -14.895378072824752,
>>> 0.96: -14.910819737657118,
>>> 0.97: -14.922307241122466,
>>> 0.98: -14.930392279321056,
>>> 0.99: -14.935048569964911,
>>> 1.0: -14.936666396364169,
>>> 1.01: -14.935212782128556,
>>> 1.02: -14.931045138839849,
>>> 1.03: -14.924165445706581,
>>> 1.04: -14.914703574005678,
>>> 1.05: -14.902774559134226
>>> }}

In analogy to the task_dict which defines the tasks to be executed by the simulation code the result_dict summarizes the results of the calculations. In this case the energies calculated for the specific strains. By ordering both the task_dict and the result_dict with the same labels, the EnergyVolumeCurveWorkflow object is able to match the calculation results to the corresponding structure. Finally, in the third step the analyse_structures() function takes the result_dict as an input and fits the Equation of State with the fitting parameters defined in the first step:

fromatomistics.workflowsimportanalyse_results_for_energy_volume_curvefit_dict=analyse_results_for_energy_volume_curve(
output_dict=result_dict,
task_dict=task_dict,
fit_type="polynomial",
fit_order=3,
)
print(fit_dict)
>>> {'poly_fit': array([-9.30297838e-05, 2.19434659e-02, -1.68388816e+00, 2.73605421e+01]),
>>> 'fit_type': 'polynomial',
>>> 'fit_order': 3,
>>> 'volume_eq': 66.44252286131888,
>>> 'energy_eq': -14.93670322204575,
>>> 'bulkmodul_eq': 72.38919826304497,
>>> 'b_prime_eq': 4.45383655040775,
>>> 'least_square_error': 4.432974529908853e-09,
>>> 'volume': [63.10861874999998, 63.77291999999998, ..., 69.75163125000002],
>>> 'energy': [-14.895378072824752, -14.910819737657118, ..., -14.902774559134226]
>>> }

As a result the equilibrium parameters are returned plus the parameters of the polynomial and the set of volumes and energies which were fitted to achieve these results. The important step here is that while the interface between the first and the second as well as between the second and the third step is clearly defined independent of the specific workflow, the initial parameters for the workflow to initialize the EnergyVolumeCurveWorkflow object as well as the final output of the fit_dict are workflow specific.

Disclaimer

While we try to develop a stable and reliable software library, the development remains a opensource project under the BSD 3-Clause License without any warranties:

BSD 3-Clause License
Copyright (c) 2023, Jan Janssen
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
* Neither the name of the copyright holder nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

Documentation

About

Interfaces for atomistic simulation codes and workflows

Topics

Resources

Code of conduct

Stars

10 stars

Watchers

6 watching

Forks

Releases

Used by

Contributors

Languages