Line data Source code
1 : # SPDX-FileCopyrightText: 2025 PairInteraction Developers 2 : # SPDX-License-Identifier: LGPL-3.0-or-later 3 : 4 1 : import logging 5 1 : from typing import TYPE_CHECKING 6 : 7 1 : from attr import dataclass 8 : 9 1 : import pairinteraction as pi_complex 10 1 : import pairinteraction.real as pi_real 11 1 : from pairinteraction_gui.calculate.calculate_base import Parameters, Results 12 : 13 : if TYPE_CHECKING: 14 : from pairinteraction_gui.page import OneAtomPage # noqa: F401 # related to ruff extend-generics 15 : 16 1 : logger = logging.getLogger(__name__) 17 : 18 : 19 1 : @dataclass 20 1 : class ParametersOneAtom(Parameters["OneAtomPage"]): 21 : """Parameters for the single-atom calculation.""" 22 : 23 : 24 1 : @dataclass 25 1 : class ResultsOneAtom(Results): 26 : """Results for the single-atom calculation.""" 27 : 28 : 29 1 : def calculate_one_atom(parameters: ParametersOneAtom) -> ResultsOneAtom: 30 : """Calculate the energy plot for one atom. 31 : 32 : This means, given a Parameters object, do the PairInteraction calculations and return an ResultsOneAtom object. 33 : """ 34 1 : return _calculate_one_atom(parameters) 35 : 36 : 37 1 : def _calculate_one_atom(parameters: ParametersOneAtom) -> ResultsOneAtom: 38 : """Make the unwrapped function available for testing.""" 39 1 : pi = pi_real if parameters.is_real else pi_complex 40 : 41 1 : ket = pi.KetAtom(parameters.get_species(), **parameters.get_quantum_numbers()) 42 1 : ket_energy = ket.get_energy("GHz") 43 1 : basis = pi.BasisAtom(parameters.get_species(), **parameters.get_quantum_number_restrictions()) 44 : 45 1 : system_list = [ 46 : pi.SystemAtom(basis) 47 : .set_electric_field(parameters.get_efield(step), unit="V/cm") 48 : .set_magnetic_field(parameters.get_bfield(step), unit="G") 49 : .set_diamagnetism_enabled(parameters.diamagnetism_enabled) 50 : for step in range(parameters.steps) 51 : ] 52 : 53 1 : logger.debug("Diagonalizing SystemAtoms...") 54 1 : pi.diagonalize( 55 : system_list, 56 : **parameters.diagonalize_kwargs, 57 : **parameters.get_diagonalize_energy_range_kwargs(ket_energy), 58 : ) 59 1 : logger.debug("Done diagonalizing SystemAtoms.") 60 1 : return ResultsOneAtom.from_calculate(parameters, system_list, ket, ket_energy)