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