LCOV - code coverage report
Current view: top level - src - floquet_types.F (source / functions) Coverage Total Hit
Test: CP2K Regtests (git:21ef868) Lines: 93.2 % 44 41
Test Date: 2026-08-14 07:04:57 Functions: 50.0 % 4 2

            Line data    Source code
       1              : !--------------------------------------------------------------------------------------------------!
       2              : !   CP2K: A general program to perform molecular dynamics simulations                              !
       3              : !   Copyright 2000-2026 CP2K developers group <https://cp2k.org>                                   !
       4              : !                                                                                                  !
       5              : !   SPDX-License-Identifier: GPL-2.0-or-later                                                      !
       6              : !--------------------------------------------------------------------------------------------------!
       7              : 
       8              : ! **************************************************************************************************
       9              : !> \brief Environment type holding the work and accumulation arrays of the Floquet-Bloch
      10              : !>        band-structure calculation (floquet_main), plus the derived sizes.
      11              : !> \par History
      12              : !> \author Shridhar Shanbhag (27.01.2026)
      13              : ! **************************************************************************************************
      14              : MODULE floquet_types
      15              :    USE kinds,                           ONLY: dp
      16              :    USE post_scf_bandstructure_types,    ONLY: post_scf_bandstructure_type
      17              : #include "./base/base_uses.f90"
      18              : 
      19              :    IMPLICIT NONE
      20              : 
      21              :    PRIVATE
      22              : 
      23              :    CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'floquet_types'
      24              : 
      25              :    PUBLIC :: floquet_env_type, &
      26              :              floquet_env_create, &
      27              :              floquet_env_release
      28              : 
      29              : ! **************************************************************************************************
      30              : !> \brief Work and accumulation arrays for one Floquet-Bloch band-structure run, plus the derived
      31              : !>        sizes. The per-(k-point,spin) buffers are overwritten each iteration; the all_* arrays
      32              : !>        accumulate the results over all DOS k-points and spins.
      33              : !> \param max_f_index Floquet truncation index M
      34              : !> \param n_f_size size of the truncated Floquet Hamiltonian, nao*(1 + 2*M)
      35              : !> \param n_E number of points on the DOS energy grid
      36              : !> \param nkp_only_bs number of band-structure k-points (the k-points the Floquet loop runs over)
      37              : !> \param nao number of atomic orbitals
      38              : !> \param n_spin number of spin channels
      39              : !> \param eigenvalues Floquet eigenvalues for the current (k-point,spin) (n_f_size)
      40              : !> \param w0 central-sector weights (n_f_size)
      41              : !> \param wE outermost-sector weights (n_f_size)
      42              : !> \param a_k spectral function A(k,E) on the energy grid (n_E)
      43              : !> \param quasi_energies quasi-energies (nao)
      44              : !> \param m0_energies m=0 band energies (nao)
      45              : !> \param m0_weights central-sector weight of each m=0 band (nao)
      46              : !> \param e_k_kp_spin band energies for the current (k-point,spin) (nao)
      47              : !> \param de_dk_kp_spin band-energy k-derivatives for the current (k-point,spin) (3, nao)
      48              : !> \param dipole_kp_spin dipole matrix elements for the current (k-point,spin) (3, nao, nao)
      49              : !> \param all_quasi_energies quasi-energies for every (band, spin, bs k-point) (nao, n_spin, nkp_only_bs)
      50              : !> \param all_a_k spectral function for every (energy, spin, bs k-point) (n_E, n_spin, nkp_only_bs)
      51              : !> \param all_m0_energies m=0 band energies for every (band, spin, bs k-point) (nao, n_spin, nkp_only_bs)
      52              : !> \param all_m0_weights central-sector weights for every (band, spin, bs k-point) (nao, n_spin, nkp_only_bs)
      53              : ! **************************************************************************************************
      54              :    TYPE floquet_env_type
      55              :       INTEGER                                          :: max_f_index = -1, &
      56              :                                                           n_f_size = -1, &
      57              :                                                           n_E = -1, &
      58              :                                                           nkp_only_bs = -1, &
      59              :                                                           nao = -1, &
      60              :                                                           n_spin = -1
      61              :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:)         :: eigenvalues, w0, wE, a_k, &
      62              :                                                           quasi_energies, m0_energies, &
      63              :                                                           m0_weights, e_k_kp_spin
      64              :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :)      :: de_dk_kp_spin
      65              :       COMPLEX(KIND=dp), ALLOCATABLE, DIMENSION(:, :, :) :: dipole_kp_spin
      66              :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :, :)   :: all_quasi_energies, all_a_k, &
      67              :                                                           all_m0_energies, all_m0_weights
      68              :    END TYPE floquet_env_type
      69              : 
      70              : CONTAINS
      71              : 
      72              : ! **************************************************************************************************
      73              : !> \brief Set the derived sizes from bs_env and allocate all work and accumulation arrays.
      74              : !> \param floquet_env ...
      75              : !> \param bs_env ...
      76              : ! **************************************************************************************************
      77            2 :    SUBROUTINE floquet_env_create(floquet_env, bs_env)
      78              :       TYPE(floquet_env_type), INTENT(OUT)                :: floquet_env
      79              :       TYPE(post_scf_bandstructure_type), POINTER         :: bs_env
      80              : 
      81              :       CHARACTER(LEN=*), PARAMETER :: routineN = 'floquet_env_create'
      82              : 
      83              :       INTEGER                                            :: handle, nao, nE, nf, nk, ns
      84              : 
      85            2 :       CALL timeset(routineN, handle)
      86              : 
      87            2 :       floquet_env%nao = bs_env%n_ao
      88            2 :       floquet_env%n_spin = bs_env%n_spin
      89            2 :       floquet_env%max_f_index = bs_env%max_floquet_index
      90            2 :       floquet_env%n_f_size = floquet_env%nao*(1 + 2*floquet_env%max_f_index)
      91            2 :       floquet_env%n_E = NINT(2*bs_env%energy_window_floquet/bs_env%energy_step_floquet)
      92            2 :       floquet_env%nkp_only_bs = bs_env%nkp_only_bs
      93              : 
      94            2 :       nao = floquet_env%nao
      95            2 :       nf = floquet_env%n_f_size
      96            2 :       nE = floquet_env%n_E
      97            2 :       ns = floquet_env%n_spin
      98            2 :       nk = floquet_env%nkp_only_bs
      99              : 
     100              :       ! per-(k-point,spin) work buffers
     101           10 :       ALLOCATE (floquet_env%eigenvalues(nf), floquet_env%w0(nf), floquet_env%wE(nf))
     102            6 :       ALLOCATE (floquet_env%a_k(nE))
     103            0 :       ALLOCATE (floquet_env%quasi_energies(nao), floquet_env%m0_energies(nao), &
     104           10 :                 floquet_env%m0_weights(nao))
     105            0 :       ALLOCATE (floquet_env%e_k_kp_spin(nao), floquet_env%de_dk_kp_spin(3, nao), &
     106           14 :                 floquet_env%dipole_kp_spin(3, nao, nao))
     107              : 
     108              :       ! per-(spin,k-point) accumulation arrays, filled once by the owning subgroup source and
     109              :       ! summed across the global communicator after the k-point loop
     110           30 :       ALLOCATE (floquet_env%all_quasi_energies(nao, ns, nk), source=0.0_dp)
     111           18 :       ALLOCATE (floquet_env%all_a_k(nE, ns, nk), source=0.0_dp)
     112           28 :       ALLOCATE (floquet_env%all_m0_energies(nao, ns, nk), source=0.0_dp)
     113           28 :       ALLOCATE (floquet_env%all_m0_weights(nao, ns, nk), source=0.0_dp)
     114              : 
     115            2 :       CALL timestop(handle)
     116              : 
     117            2 :    END SUBROUTINE floquet_env_create
     118              : 
     119              : ! **************************************************************************************************
     120              : !> \brief Deallocate all arrays held by floquet_env.
     121              : !> \param floquet_env ...
     122              : ! **************************************************************************************************
     123            2 :    SUBROUTINE floquet_env_release(floquet_env)
     124              :       TYPE(floquet_env_type), INTENT(INOUT)              :: floquet_env
     125              : 
     126              :       CHARACTER(LEN=*), PARAMETER :: routineN = 'floquet_env_release'
     127              : 
     128              :       INTEGER                                            :: handle
     129              : 
     130            2 :       CALL timeset(routineN, handle)
     131              : 
     132            2 :       IF (ALLOCATED(floquet_env%eigenvalues)) DEALLOCATE (floquet_env%eigenvalues)
     133            2 :       IF (ALLOCATED(floquet_env%w0)) DEALLOCATE (floquet_env%w0)
     134            2 :       IF (ALLOCATED(floquet_env%wE)) DEALLOCATE (floquet_env%wE)
     135            2 :       IF (ALLOCATED(floquet_env%a_k)) DEALLOCATE (floquet_env%a_k)
     136            2 :       IF (ALLOCATED(floquet_env%quasi_energies)) DEALLOCATE (floquet_env%quasi_energies)
     137            2 :       IF (ALLOCATED(floquet_env%m0_energies)) DEALLOCATE (floquet_env%m0_energies)
     138            2 :       IF (ALLOCATED(floquet_env%m0_weights)) DEALLOCATE (floquet_env%m0_weights)
     139            2 :       IF (ALLOCATED(floquet_env%e_k_kp_spin)) DEALLOCATE (floquet_env%e_k_kp_spin)
     140            2 :       IF (ALLOCATED(floquet_env%de_dk_kp_spin)) DEALLOCATE (floquet_env%de_dk_kp_spin)
     141            2 :       IF (ALLOCATED(floquet_env%dipole_kp_spin)) DEALLOCATE (floquet_env%dipole_kp_spin)
     142            2 :       IF (ALLOCATED(floquet_env%all_quasi_energies)) DEALLOCATE (floquet_env%all_quasi_energies)
     143            2 :       IF (ALLOCATED(floquet_env%all_a_k)) DEALLOCATE (floquet_env%all_a_k)
     144            2 :       IF (ALLOCATED(floquet_env%all_m0_energies)) DEALLOCATE (floquet_env%all_m0_energies)
     145            2 :       IF (ALLOCATED(floquet_env%all_m0_weights)) DEALLOCATE (floquet_env%all_m0_weights)
     146              : 
     147            2 :       CALL timestop(handle)
     148              : 
     149            2 :    END SUBROUTINE floquet_env_release
     150              : 
     151            0 : END MODULE floquet_types
        

Generated by: LCOV version 2.0-1