Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add Feature: XspectraCrystalWorkChain #888

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
64 commits
Select commit Hold shift + click to select a range
11e9c65
Upload of new CalcJob files
PNOGillespie May 9, 2022
0c6373a
Upload of Parser classes for new CalcJobs
PNOGillespie May 9, 2022
5d14f11
Added XSpectra entry points
PNOGillespie May 9, 2022
4c36b55
Cleaned up docstrings and added newline after return statement
PNOGillespie May 19, 2022
0e62357
Cleaned up xspectra.py and added newline after return statement
PNOGillespie May 19, 2022
8b73bd9
Remove upf2plotcore CalcJob class
PNOGillespie May 30, 2022
bd4274a
Remove upf2plotcore Parser class
PNOGillespie May 30, 2022
ee2e9ef
Remove entry points for upf2plotcore
PNOGillespie May 30, 2022
6c39561
Update src/aiida_quantumespresso/calculations/xspectra.py
PNOGillespie Jun 6, 2022
0c20f58
Correct Capitalization
PNOGillespie Jun 6, 2022
fdbddaa
Correct Capitalization
PNOGillespie Jun 6, 2022
5f7844e
Correct Capitalization
PNOGillespie Jun 6, 2022
811066b
Correct Capitalization
PNOGillespie Jun 6, 2022
a41de8c
Merge branch 'aiidateam:develop' into develop
PNOGillespie Jun 8, 2022
a7390e3
`XspectraCalculation`: revised method for adding kpoints and core wav…
PNOGillespie Jun 9, 2022
3c83c4d
`XspectraParser`: Added parsing for spin-polarised calculations, remo…
PNOGillespie Jun 9, 2022
f12cf09
`XspectraCalculation`: Fixed wording of error codes
PNOGillespie Jun 14, 2022
d5530c6
`XspectraCalculation`: Updated `_Plotcore_FILENAME`
PNOGillespie Jun 20, 2022
75ba5d8
`XspectraParser`: Fixed various errors in `parse`
PNOGillespie Jun 20, 2022
5f4bd99
Added various tests for `XspectraParser`
PNOGillespie Jun 20, 2022
c6f4485
Merge branch 'aiidateam:develop' into develop
PNOGillespie Jul 13, 2022
875fa58
`XspectraCalculation`+`XspectraParser`: Added Various Extra Features
PNOGillespie Sep 2, 2022
793b391
Tests: Update `XspectraParser` Tests for Latest Commit
PNOGillespie Sep 2, 2022
ec841e4
Merge branch 'aiidateam:main' into develop
PNOGillespie Sep 2, 2022
8427a55
Merge branch 'develop' of https://github.com/PNOGillespie/aiida-quant…
PNOGillespie Sep 2, 2022
f0b00a5
`XspectraCalculation`: Fix unnecessary bracketing
PNOGillespie Sep 12, 2022
63b32f6
`XspectraCalculation`: Minor change to `gamma_file` input check
PNOGillespie Sep 12, 2022
746770e
`XspectraCalculation`: Change of walltime error code
PNOGillespie Sep 12, 2022
6eb8ace
`XspectraParser`: Change of walltime error code
PNOGillespie Sep 12, 2022
6742ff3
Tests: Update of error code text
PNOGillespie Sep 12, 2022
8b84c55
`XspectraCalculation`: Cleanup code for `restart_flag`
PNOGillespie Sep 12, 2022
ab9ba9f
Tests: Trim contents of `aiida.out` for `failed_walltime`
PNOGillespie Sep 12, 2022
a6ac39a
Merge branch 'develop' of https://github.com/PNOGillespie/aiida-quant…
PNOGillespie Sep 12, 2022
e0529ec
Merge branch 'aiidateam:main' into develop
PNOGillespie Sep 12, 2022
5a0e90f
Merge branch 'main' into develop
PNOGillespie Sep 26, 2022
767e2d6
Update tests/parsers/test_xspectra.py
PNOGillespie Sep 27, 2022
ae91712
Merge branch 'aiidateam:main' into develop
PNOGillespie Sep 27, 2022
a2c1321
Merge branch 'aiidateam:main' into develop
PNOGillespie Oct 14, 2022
dd73851
Merge branch 'aiidateam:main' into develop
PNOGillespie Oct 21, 2022
2a73bd5
Merge branch 'aiidateam:main' into develop
PNOGillespie Oct 27, 2022
b2c4b83
`XspectraParser`: Fix bugs in parsing vector/coord system
PNOGillespie Sep 21, 2022
d6577fa
Hotfix: Update Previous Commit to `XspectraParser`
PNOGillespie Sep 21, 2022
af1822d
`XspectraParser`: Improve reliability of parsing method
PNOGillespie Sep 30, 2022
42d66bb
`XspectraParser`: Updates to parser dict keys and tests
PNOGillespie Oct 17, 2022
df1def4
`XspectraParser`: Change `output_parameter` keys and add defaults
PNOGillespie Oct 28, 2022
9bb7cbf
Merge branch 'aiidateam:main' into develop
PNOGillespie Oct 28, 2022
4a058f5
Merge branch 'develop' of https://github.com/PNOGillespie/aiida-quant…
PNOGillespie Oct 28, 2022
ee58a8f
Merge branch 'aiidateam:main' into develop
PNOGillespie Nov 11, 2022
ab5559a
Merge branch 'aiidateam:main' into develop
PNOGillespie Nov 22, 2022
5c68963
Merge branch 'aiidateam:main' into develop
PNOGillespie Dec 14, 2022
ede83a3
Merge branch 'aiidateam:main' into develop
PNOGillespie Dec 16, 2022
d1c7d74
Merge branch 'aiidateam:main' into develop
PNOGillespie Jan 31, 2023
6bf3998
Merge branch 'aiidateam:main' into develop
PNOGillespie Feb 3, 2023
d4a2845
Add Feature: `XspectraCrystalWorkChain`
PNOGillespie Feb 14, 2023
bceb7f6
`XspectraCrystalWorkChain`: Add `core_wfc_data` input namespace
PNOGillespie Feb 15, 2023
58a290e
`XspectraCrystalWorkChain`: Add `protocol` tests
PNOGillespie Feb 15, 2023
b9e6879
Merge branch 'aiidateam:main' into feature/xspectra-crystal-workchain
PNOGillespie Feb 15, 2023
6d9506d
`XspectraCrystalWorkChain`: Clean up and simplify code
PNOGillespie Mar 20, 2023
28c65ac
`XspectraCrystalWorkChain`: Fix typo in `validiate_inputs`
PNOGillespie Mar 20, 2023
142a0b1
Merge branch 'main' into feature/xspectra-crystal-workchain
PNOGillespie Mar 20, 2023
5964896
`XspectraCrystalWorkChain`: Requested Changes for PR (1)
PNOGillespie Mar 21, 2023
14d2afa
`Tests`: Update `test_crystal.yaml`
PNOGillespie Mar 21, 2023
41a5e40
update doc
superstar54 Mar 22, 2023
dde5b4d
fix doc warning
superstar54 Mar 22, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,7 @@ aiida-quantumespresso = 'aiida_quantumespresso.cli:cmd_root'
'quantumespresso.pdos' = 'aiida_quantumespresso.workflows.pdos:PdosWorkChain'
'quantumespresso.xspectra.base' = 'aiida_quantumespresso.workflows.xspectra.base:XspectraBaseWorkChain'
'quantumespresso.xspectra.core' = 'aiida_quantumespresso.workflows.xspectra.core:XspectraCoreWorkChain'
'quantumespresso.xspectra.crystal' = 'aiida_quantumespresso.workflows.xspectra.crystal:XspectraCrystalWorkChain'

[tool.flit.module]
name = 'aiida_quantumespresso'
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
# -*- coding: utf-8 -*-
"""Calcfunction to compile a complete spectrum for each element from multiple powder sample spectra."""
from aiida import orm
from aiida.engine import calcfunction
import numpy as np


@calcfunction
def get_spectra_by_element(elements_list, equivalent_sites_data, **kwargs):
"""Generate a final spectrum for each element from a dictionary of powder spectra inputs.

Powder spectra to be processed must be passed in using ``kwargs``, in which the keys must
correspond to the keys of ``equivalent_sites_data``.

:param elements_list: a List object defining the elements to compile spectra for.
:param equivalent_sites_data: a Dict object, defining the symmetry properties of the sites associated with each
powder spectrum in ``kwargs``. Must be in the format used in the ``equivalent_sites_data`` dictionary of
``get_xspectra_structures.outputs.output_parameters``
"""

incoming_spectra_nodes = {key: value for key, value in kwargs.items() if key != 'metadata'}
elements = elements_list.get_list()
equivalency_data = equivalent_sites_data.get_dict()
core_work_chains = {key: value.creator.caller for key, value in incoming_spectra_nodes.items()}

data_dict = {element: {} for element in elements}
for key in incoming_spectra_nodes:
core_work_chain = core_work_chains[key]
xspectra_out_params = core_work_chain.outputs.parameters_xspectra__xas_0.get_dict()
energy_zero = xspectra_out_params['energy_zero']
multiplicity = equivalency_data[key]['multiplicity']
element = equivalency_data[key]['symbol']

if 'total_multiplicity' not in data_dict[element]:
data_dict[element]['total_multiplicity'] = multiplicity
else:
data_dict[element]['total_multiplicity'] += multiplicity

data_dict[element][key] = {
'spectrum_node': incoming_spectra_nodes[key],
'element': element,
'multiplicity': multiplicity,
'energy_zero': energy_zero
}

spectra_by_element = {}
for element in elements:
spectra_list = []
total_multiplicity = data_dict[element].pop('total_multiplicity')
for key in data_dict[element]:
spectrum_node = data_dict[element][key]['spectrum_node']
site_multiplicity = data_dict[element][key]['multiplicity']
spectrum_x = spectrum_node.get_x()[1]
spectrum_y = spectrum_node.get_y()[0][1]
weighted_spectrum = np.column_stack((spectrum_x, (spectrum_y * site_multiplicity) / total_multiplicity))
spectra_list.append((weighted_spectrum, float(data_dict[element][key]['energy_zero'])))

# Sort according to Fermi level, then correct to align all spectra to the
# highest value. Note that this is needed because XSpectra automatically aligns the
# final spectrum such that the system's Fermi level is at 0 eV.
spectra_list.sort(key=lambda entry: entry[1])
highest_level = spectra_list[0][-1]
energy_zero_corrections = [(entry[0], entry[1] - highest_level) for entry in spectra_list]
corrected_spectra = [
np.column_stack((entry[0][:, 0] - entry[1], entry[0][:, 1])) for entry in energy_zero_corrections
]

spectra_by_element[element] = np.column_stack((
sum([array[:, 0] for array in corrected_spectra]) / len(corrected_spectra),
sum([array[:, 1] for array in corrected_spectra])
))

all_final_spectra = {}
for element in elements:
final_spectra = orm.XyData()
corrected_spectrum = spectra_by_element[element]
final_spectra_y_labels = [f'{element}_dipole']
final_spectra_y_units = ['sigma']
final_spectra_y_arrays = [corrected_spectrum[:, 1]]

final_spectra_x_label = 'energy'
final_spectra_x_units = 'eV'
final_spectra_x_array = corrected_spectrum[:, 0]
final_spectra.set_x(final_spectra_x_array, final_spectra_x_label, final_spectra_x_units)
final_spectra.set_y(final_spectra_y_arrays, final_spectra_y_labels, final_spectra_y_units)
all_final_spectra[f'{element}_xas'] = final_spectra

return all_final_spectra
Original file line number Diff line number Diff line change
Expand Up @@ -256,9 +256,9 @@ def get_xspectra_structures(structure, **kwargs): # pylint: disable=too-many-st
output_params['spacegroup_number'] = symmetry_dataset['number']
output_params['international_symbol'] = symmetry_dataset['international']

result['standardized_structure'] = standardized_structure_node
output_params['structure_is_standardized'] = structure_is_standardized
if structure_is_standardized:
result['standardized_structure'] = standardized_structure_node
output_params['standardized_structure_num_sites'] = len(standardized_structure_node.sites)
output_params['standardized_structure_cell_matrix'] = standardized_structure_node.cell
output_params['standardized_structure_params'] = standardized_structure_node.cell_lengths
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
default_inputs:
abs_atom_marker: X
clean_workdir: True
return_all_powder_spectra: False
core:
get_powder_spectrum: True
default_protocol: moderate
protocols:
superstar54 marked this conversation as resolved.
Show resolved Hide resolved
moderate:
description: 'Protocol to perform XANES dipole calculations at normal precision and moderate computational cost.'
precise:
description: 'Protocol to perform XANES dipole calculations at high precision and higher computational cost.'
fast:
description: 'Protocol to perform XANES dipole calculations at low precision and minimal computational cost for testing purposes.'
Loading