LCOV - code coverage report
Current view: top level - src - admm_types.F (source / functions) Coverage Total Hit
Test: CP2K Regtests (git:42dac4a) Lines: 98.2 % 273 268
Test Date: 2025-07-25 12:55:17 Functions: 55.6 % 9 5

            Line data    Source code
       1              : !--------------------------------------------------------------------------------------------------!
       2              : !   CP2K: A general program to perform molecular dynamics simulations                              !
       3              : !   Copyright 2000-2025 CP2K developers group <https://cp2k.org>                                   !
       4              : !                                                                                                  !
       5              : !   SPDX-License-Identifier: GPL-2.0-or-later                                                      !
       6              : !--------------------------------------------------------------------------------------------------!
       7              : 
       8              : ! **************************************************************************************************
       9              : !> \brief Types and set/get functions for auxiliary density matrix methods
      10              : !> \par History
      11              : !>      05.2008 created [Manuel Guidon]
      12              : !>      12.2019 Made GAPW compatiblae [Augustin Bussy]
      13              : !> \author Manuel Guidon
      14              : ! **************************************************************************************************
      15              : MODULE admm_types
      16              :    USE admm_dm_types,                   ONLY: admm_dm_release,&
      17              :                                               admm_dm_type
      18              :    USE bibliography,                    ONLY: Guidon2010,&
      19              :                                               cite_reference
      20              :    USE cp_blacs_env,                    ONLY: cp_blacs_env_type
      21              :    USE cp_control_types,                ONLY: admm_control_type
      22              :    USE cp_dbcsr_api,                    ONLY: dbcsr_p_type
      23              :    USE cp_dbcsr_operations,             ONLY: dbcsr_deallocate_matrix_set
      24              :    USE cp_fm_struct,                    ONLY: cp_fm_struct_create,&
      25              :                                               cp_fm_struct_release,&
      26              :                                               cp_fm_struct_type
      27              :    USE cp_fm_types,                     ONLY: cp_fm_create,&
      28              :                                               cp_fm_release,&
      29              :                                               cp_fm_type
      30              :    USE input_constants,                 ONLY: do_admm_aux_exch_func_none,&
      31              :                                               do_admm_blocked_projection,&
      32              :                                               do_admm_blocking_purify_full,&
      33              :                                               do_admm_charge_constrained_projection,&
      34              :                                               do_admm_exch_scaling_merlot,&
      35              :                                               do_admm_exch_scaling_none,&
      36              :                                               do_admm_purify_none
      37              :    USE input_section_types,             ONLY: section_vals_release,&
      38              :                                               section_vals_type
      39              :    USE kinds,                           ONLY: dp
      40              :    USE kpoint_transitional,             ONLY: get_1d_pointer,&
      41              :                                               get_2d_pointer,&
      42              :                                               kpoint_transitional_release,&
      43              :                                               kpoint_transitional_type,&
      44              :                                               set_1d_pointer,&
      45              :                                               set_2d_pointer
      46              :    USE message_passing,                 ONLY: mp_para_env_type
      47              :    USE qs_kind_types,                   ONLY: deallocate_qs_kind_set,&
      48              :                                               qs_kind_type
      49              :    USE qs_local_rho_types,              ONLY: local_rho_set_release,&
      50              :                                               local_rho_type
      51              :    USE qs_mo_types,                     ONLY: deallocate_mo_set,&
      52              :                                               get_mo_set,&
      53              :                                               mo_set_type
      54              :    USE qs_neighbor_list_types,          ONLY: neighbor_list_set_p_type,&
      55              :                                               release_neighbor_list_sets
      56              :    USE qs_oce_types,                    ONLY: deallocate_oce_set,&
      57              :                                               oce_matrix_type
      58              :    USE qs_rho_types,                    ONLY: qs_rho_release,&
      59              :                                               qs_rho_type
      60              :    USE task_list_types,                 ONLY: deallocate_task_list,&
      61              :                                               task_list_type
      62              : #include "./base/base_uses.f90"
      63              : 
      64              :    IMPLICIT NONE
      65              :    PRIVATE
      66              :    PUBLIC :: admm_env_create, admm_env_release, admm_type, admm_gapw_r3d_rs_type, set_admm_env, get_admm_env
      67              : 
      68              :    CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'admm_types'
      69              : 
      70              :    TYPE eigvals_type
      71              :       REAL(dp), DIMENSION(:), POINTER          :: DATA => NULL()
      72              :    END TYPE
      73              : 
      74              :    TYPE eigvals_p_type
      75              :       TYPE(eigvals_type), POINTER              :: eigvals => NULL()
      76              :    END TYPE
      77              : 
      78              : ! **************************************************************************************************
      79              : !> \brief A subtype of the admm_env that contains the extra data needed for an ADMM GAPW calculation
      80              : !> \param admm_kind_set gets its own qs_kind set to store all relevant basis/grid/etc info
      81              : !> \param local_rho_set caontains soft and hard AUX_FIT atomoc densities
      82              : !> \param task_list the task list used for all soft density pw operations
      83              : !> \param oce stores the precomputed oce integrals
      84              : ! **************************************************************************************************
      85              :    TYPE admm_gapw_r3d_rs_type
      86              :       TYPE(qs_kind_type), DIMENSION(:), POINTER          :: admm_kind_set => Null()
      87              :       TYPE(local_rho_type), POINTER                      :: local_rho_set => Null()
      88              :       TYPE(task_list_type), POINTER                      :: task_list => Null()
      89              :       TYPE(oce_matrix_type), POINTER                     :: oce => Null()
      90              :    END TYPE admm_gapw_r3d_rs_type
      91              : 
      92              : ! **************************************************************************************************
      93              : !> \brief stores some data used in wavefunction fitting
      94              : !> \param S overlap matrix for auxiliary fit basis set
      95              : !> \param P overlap matrix for mixed aux_fit/orb basis set
      96              : !> \param A contains inv(S)*P
      97              : !> \param B contains transpose(P)*inv(S)*P = transpose(P)*A
      98              : !> \param lambda contains transpose(mo_coeff_aux_fit)*B*mo_coeff_aux_fit
      99              : !> \param lambda_inv_sqrt contains inv(SQRT(lambda))
     100              : !> \param R contains eigenvectors of lambda
     101              : !> \param work_aux_aux temporary matrix
     102              : !> \param work_orb_nmo temporary matrix
     103              : !> \param work_nmo_nmo1 temporary matrix
     104              : !> \param work_nmo_nmo2 temporary matrix
     105              : !> \param work_aux_nmo temporary matrix
     106              : !> \param H contains KS_matrix * mo_coeff for auxiliary basis set
     107              : !> \param K contains KS matrix for auxiliary basis set
     108              : !> \param M contains matrix holding the 2nd order residues
     109              : !> \param nao_orb number of atomic orbitals in orb basis set
     110              : !> \param nao_aux_fit number of atomic orbitals in aux basis set
     111              : !> \param nmo number of molecular orbitals per spin
     112              : !> \param eigvals_lamda eigenvalues of lambda matrix
     113              : !> \param gsi contains ratio N_dens_m/N_aux_dens_m
     114              : !> \param admm_gapw_env the type containing ADMM GAPW specific data
     115              : !> \param do_gapw an internal logical switch for GAPW
     116              : !> \par History
     117              : !>      05.2008 created [Manuel Guidon]
     118              : !> \author Manuel Guidon
     119              : ! **************************************************************************************************
     120              :    TYPE admm_type
     121              :       TYPE(cp_fm_type), POINTER                :: S_inv => Null(), &
     122              :                                                   S => Null(), &
     123              :                                                   Q => Null(), &
     124              :                                                   A => Null(), &
     125              :                                                   B => Null(), &
     126              :                                                   work_orb_orb => Null(), &
     127              :                                                   work_orb_orb2 => Null(), &
     128              :                                                   work_orb_orb3 => Null(), &
     129              :                                                   work_aux_orb => Null(), &
     130              :                                                   work_aux_orb2 => Null(), &
     131              :                                                   work_aux_orb3 => Null(), &
     132              :                                                   work_aux_aux => Null(), &
     133              :                                                   work_aux_aux2 => Null(), &
     134              :                                                   work_aux_aux3 => Null(), &
     135              :                                                   work_aux_aux4 => Null(), &
     136              :                                                   work_aux_aux5 => Null()
     137              : 
     138              :       TYPE(cp_fm_type), DIMENSION(:), &
     139              :          POINTER                                :: lambda => Null(), &
     140              :                                                    lambda_inv => Null(), &
     141              :                                                    lambda_inv_sqrt => Null(), &
     142              :                                                    R => Null(), &
     143              :                                                    R_purify => Null(), &
     144              :                                                    work_orb_nmo => Null(), &
     145              :                                                    work_nmo_nmo1 => Null(), &
     146              :                                                    R_schur_R_t => Null(), &
     147              :                                                    work_nmo_nmo2 => Null(), &
     148              :                                                    work_aux_nmo => Null(), &
     149              :                                                    work_aux_nmo2 => Null(), &
     150              :                                                    H => Null(), &
     151              :                                                    H_corr => Null(), &
     152              :                                                    mo_derivs_tmp => Null(), &
     153              :                                                    K => Null(), &
     154              :                                                    M => Null(), &
     155              :                                                    M_purify => Null(), &
     156              :                                                    P_to_be_purified => Null(), &
     157              :                                                    lambda_inv2 => Null(), &
     158              :                                                    C_hat => Null(), &
     159              :                                                    P_tilde => Null(), &
     160              :                                                    ks_to_be_merged => Null(), &
     161              :                                                    scf_work_aux_fit => Null()
     162              :       TYPE(eigvals_p_type), DIMENSION(:), &
     163              :          POINTER                                :: eigvals_lambda => Null(), &
     164              :                                                    eigvals_P_to_be_purified => Null()
     165              :       TYPE(section_vals_type), POINTER         :: xc_section_primary => Null(), &
     166              :                                                   xc_section_aux => Null()
     167              :       REAL(KIND=dp)                            :: gsi(3) = 0.0_dp, &
     168              :                                                   lambda_merlot(2) = 0.0_dp, &
     169              :                                                   n_large_basis(3) = 0.0_dp
     170              :       INTEGER                                  :: nao_orb = 0, nao_aux_fit = 0, nmo(2) = 0
     171              :       INTEGER                                  :: purification_method = do_admm_purify_none
     172              :       LOGICAL                                  :: charge_constrain = .FALSE., do_admmp = .FALSE., &
     173              :                                                   do_admmq = .FALSE., do_admms = .FALSE.
     174              :       INTEGER                                  :: scaling_model = do_admm_exch_scaling_none, &
     175              :                                                   aux_exch_func = do_admm_aux_exch_func_none
     176              :       LOGICAL                                  :: aux_exch_func_param = .FALSE.
     177              :       REAL(KIND=dp), DIMENSION(3)              :: aux_x_param = 0.0_dp
     178              :       LOGICAL                                  :: block_dm = .FALSE.
     179              :       LOGICAL                                  :: block_fit = .FALSE.
     180              :       INTEGER, DIMENSION(:, :), POINTER        :: block_map => Null()
     181              :       TYPE(admm_gapw_r3d_rs_type), POINTER            :: admm_gapw_env => NULL()
     182              :       LOGICAL                                  :: do_gapw = .FALSE.
     183              :       TYPE(admm_dm_type), POINTER              :: admm_dm => Null()
     184              : 
     185              :       TYPE(mo_set_type), DIMENSION(:), &
     186              :          POINTER                               :: mos_aux_fit => NULL()
     187              :       TYPE(neighbor_list_set_p_type), &
     188              :          DIMENSION(:), POINTER                 :: sab_aux_fit => NULL(), sab_aux_fit_asymm => NULL(), sab_aux_fit_vs_orb => NULL()
     189              :       TYPE(dbcsr_p_type), DIMENSION(:), &
     190              :          POINTER                               :: matrix_ks_aux_fit_im => Null()
     191              :       TYPE(kpoint_transitional_type)           :: matrix_ks_aux_fit, &
     192              :                                                   matrix_ks_aux_fit_dft, &
     193              :                                                   matrix_ks_aux_fit_hfx, &
     194              :                                                   matrix_s_aux_fit, &
     195              :                                                   matrix_s_aux_fit_vs_orb
     196              :       TYPE(qs_rho_type), POINTER               :: rho_aux_fit => NULL(), rho_aux_fit_buffer => NULL()
     197              :       TYPE(task_list_type), POINTER            :: task_list_aux_fit => NULL()
     198              :       TYPE(cp_fm_type), DIMENSION(:), &
     199              :          POINTER                               :: mo_derivs_aux_fit => NULL()
     200              : 
     201              :    END TYPE
     202              : 
     203              : CONTAINS
     204              : 
     205              : ! **************************************************************************************************
     206              : !> \brief creates ADMM environment, initializes the basic types
     207              : !>
     208              : !> \param admm_env The ADMM env
     209              : !> \param admm_control ...
     210              : !> \param mos the MO's of the orbital basis set
     211              : !> \param para_env The parallel env
     212              : !> \param natoms ...
     213              : !> \param nao_aux_fit ...
     214              : !> \param blacs_env_ext ...
     215              : !> \par History
     216              : !>      05.2008 created [Manuel Guidon]
     217              : !> \author Manuel Guidon
     218              : ! **************************************************************************************************
     219          474 :    SUBROUTINE admm_env_create(admm_env, admm_control, mos, para_env, natoms, nao_aux_fit, blacs_env_ext)
     220              : 
     221              :       TYPE(admm_type), POINTER                           :: admm_env
     222              :       TYPE(admm_control_type), POINTER                   :: admm_control
     223              :       TYPE(mo_set_type), DIMENSION(:), INTENT(IN)        :: mos
     224              :       TYPE(mp_para_env_type), POINTER                    :: para_env
     225              :       INTEGER, INTENT(IN)                                :: natoms, nao_aux_fit
     226              :       TYPE(cp_blacs_env_type), OPTIONAL, POINTER         :: blacs_env_ext
     227              : 
     228              :       INTEGER                                            :: i, iatom, iblock, ispin, j, jatom, &
     229              :                                                             nao_orb, nmo, nspins
     230              :       TYPE(cp_blacs_env_type), POINTER                   :: blacs_env
     231              :       TYPE(cp_fm_struct_type), POINTER :: fm_struct_aux_aux, fm_struct_aux_nmo, fm_struct_aux_orb, &
     232              :          fm_struct_nmo_nmo, fm_struct_orb_nmo, fm_struct_orb_orb
     233              :       TYPE(cp_fm_type), POINTER                          :: mo_coeff
     234              : 
     235          474 :       CALL cite_reference(Guidon2010)
     236              : 
     237         9006 :       ALLOCATE (admm_env)
     238              : 
     239          474 :       nspins = SIZE(mos)
     240          474 :       CALL get_mo_set(mos(1), mo_coeff=mo_coeff, nmo=nmo, nao=nao_orb)
     241          474 :       blacs_env => mo_coeff%matrix_struct%context
     242          474 :       IF (PRESENT(blacs_env_ext)) blacs_env => blacs_env_ext
     243              : 
     244         1422 :       admm_env%nmo = 0
     245          474 :       admm_env%nao_aux_fit = nao_aux_fit
     246          474 :       admm_env%nao_orb = nao_orb
     247              :       CALL cp_fm_struct_create(fm_struct_aux_aux, &
     248              :                                context=blacs_env, &
     249              :                                nrow_global=nao_aux_fit, &
     250              :                                ncol_global=nao_aux_fit, &
     251          474 :                                para_env=para_env)
     252              :       CALL cp_fm_struct_create(fm_struct_aux_orb, &
     253              :                                context=blacs_env, &
     254              :                                nrow_global=nao_aux_fit, &
     255              :                                ncol_global=nao_orb, &
     256          474 :                                para_env=para_env)
     257              :       CALL cp_fm_struct_create(fm_struct_orb_orb, &
     258              :                                context=blacs_env, &
     259              :                                nrow_global=nao_orb, &
     260              :                                ncol_global=nao_orb, &
     261          474 :                                para_env=para_env)
     262              : 
     263          474 :       NULLIFY (admm_env%S, admm_env%S_inv, admm_env%Q, admm_env%A, admm_env%B, &
     264          474 :                admm_env%work_orb_orb, admm_env%work_orb_orb2, admm_env%work_orb_orb3, &
     265          474 :                admm_env%work_aux_orb, admm_env%work_aux_orb2, admm_env%work_aux_orb3, &
     266          474 :                admm_env%work_aux_aux, admm_env%work_aux_aux2, admm_env%work_aux_aux3, &
     267          474 :                admm_env%work_aux_aux4, admm_env%work_aux_aux5)
     268              :       ALLOCATE (admm_env%S, admm_env%S_inv, admm_env%Q, admm_env%A, admm_env%B, &
     269              :                 admm_env%work_orb_orb, admm_env%work_orb_orb2, admm_env%work_orb_orb3, &
     270              :                 admm_env%work_aux_orb, admm_env%work_aux_orb2, admm_env%work_aux_orb3, &
     271              :                 admm_env%work_aux_aux, admm_env%work_aux_aux2, admm_env%work_aux_aux3, &
     272          474 :                 admm_env%work_aux_aux4, admm_env%work_aux_aux5)
     273          474 :       CALL cp_fm_create(admm_env%S, fm_struct_aux_aux, name="aux_fit_overlap")
     274          474 :       CALL cp_fm_create(admm_env%S_inv, fm_struct_aux_aux, name="aux_fit_overlap_inv")
     275          474 :       CALL cp_fm_create(admm_env%Q, fm_struct_aux_orb, name="mixed_overlap")
     276          474 :       CALL cp_fm_create(admm_env%A, fm_struct_aux_orb, name="work_A")
     277          474 :       CALL cp_fm_create(admm_env%B, fm_struct_orb_orb, name="work_B")
     278          474 :       CALL cp_fm_create(admm_env%work_orb_orb, fm_struct_orb_orb, name="work_orb_orb")
     279          474 :       CALL cp_fm_create(admm_env%work_orb_orb2, fm_struct_orb_orb, name="work_orb_orb")
     280          474 :       CALL cp_fm_create(admm_env%work_orb_orb3, fm_struct_orb_orb, name="work_orb_orb3")
     281          474 :       CALL cp_fm_create(admm_env%work_aux_orb, fm_struct_aux_orb, name="work_aux_orb")
     282          474 :       CALL cp_fm_create(admm_env%work_aux_orb2, fm_struct_aux_orb, name="work_aux_orb2")
     283          474 :       CALL cp_fm_create(admm_env%work_aux_orb3, fm_struct_aux_orb, name="work_aux_orb3")
     284          474 :       CALL cp_fm_create(admm_env%work_aux_aux, fm_struct_aux_aux, name="work_aux_aux")
     285          474 :       CALL cp_fm_create(admm_env%work_aux_aux2, fm_struct_aux_aux, name="work_aux_aux2")
     286          474 :       CALL cp_fm_create(admm_env%work_aux_aux3, fm_struct_aux_aux, name="work_aux_aux3")
     287          474 :       CALL cp_fm_create(admm_env%work_aux_aux4, fm_struct_aux_aux, name="work_aux_aux4")
     288          474 :       CALL cp_fm_create(admm_env%work_aux_aux5, fm_struct_aux_aux, name="work_aux_aux5")
     289              : 
     290         2016 :       ALLOCATE (admm_env%lambda_inv(nspins))
     291         2016 :       ALLOCATE (admm_env%lambda(nspins))
     292         2016 :       ALLOCATE (admm_env%lambda_inv_sqrt(nspins))
     293         2016 :       ALLOCATE (admm_env%R(nspins))
     294         2016 :       ALLOCATE (admm_env%R_purify(nspins))
     295         2016 :       ALLOCATE (admm_env%work_orb_nmo(nspins))
     296         2016 :       ALLOCATE (admm_env%work_nmo_nmo1(nspins))
     297         2016 :       ALLOCATE (admm_env%R_schur_R_t(nspins))
     298         2016 :       ALLOCATE (admm_env%work_nmo_nmo2(nspins))
     299         2016 :       ALLOCATE (admm_env%eigvals_lambda(nspins))
     300         2016 :       ALLOCATE (admm_env%eigvals_P_to_be_purified(nspins))
     301         2016 :       ALLOCATE (admm_env%H(nspins))
     302         2016 :       ALLOCATE (admm_env%K(nspins))
     303         2016 :       ALLOCATE (admm_env%M(nspins))
     304         2016 :       ALLOCATE (admm_env%M_purify(nspins))
     305         2016 :       ALLOCATE (admm_env%P_to_be_purified(nspins))
     306         2016 :       ALLOCATE (admm_env%work_aux_nmo(nspins))
     307         2016 :       ALLOCATE (admm_env%work_aux_nmo2(nspins))
     308         2016 :       ALLOCATE (admm_env%mo_derivs_tmp(nspins))
     309         2016 :       ALLOCATE (admm_env%H_corr(nspins))
     310         2016 :       ALLOCATE (admm_env%ks_to_be_merged(nspins))
     311         2016 :       ALLOCATE (admm_env%lambda_inv2(nspins))
     312         2016 :       ALLOCATE (admm_env%C_hat(nspins))
     313         2016 :       ALLOCATE (admm_env%P_tilde(nspins))
     314              : 
     315         1068 :       DO ispin = 1, nspins
     316          594 :          CALL get_mo_set(mos(ispin), mo_coeff=mo_coeff, nmo=nmo)
     317          594 :          admm_env%nmo(ispin) = nmo
     318              :          CALL cp_fm_struct_create(fm_struct_aux_nmo, &
     319              :                                   context=blacs_env, &
     320              :                                   nrow_global=nao_aux_fit, &
     321              :                                   ncol_global=nmo, &
     322          594 :                                   para_env=para_env)
     323              :          CALL cp_fm_struct_create(fm_struct_orb_nmo, &
     324              :                                   context=blacs_env, &
     325              :                                   nrow_global=nao_orb, &
     326              :                                   ncol_global=nmo, &
     327          594 :                                   para_env=para_env)
     328              :          CALL cp_fm_struct_create(fm_struct_nmo_nmo, &
     329              :                                   context=blacs_env, &
     330              :                                   nrow_global=nmo, &
     331              :                                   ncol_global=nmo, &
     332          594 :                                   para_env=para_env)
     333              : 
     334          594 :          CALL cp_fm_create(admm_env%work_orb_nmo(ispin), fm_struct_orb_nmo, name="work_orb_nmo")
     335          594 :          CALL cp_fm_create(admm_env%work_nmo_nmo1(ispin), fm_struct_nmo_nmo, name="work_nmo_nmo1")
     336          594 :          CALL cp_fm_create(admm_env%R_schur_R_t(ispin), fm_struct_nmo_nmo, name="R_schur_R_t")
     337          594 :          CALL cp_fm_create(admm_env%work_nmo_nmo2(ispin), fm_struct_nmo_nmo, name="work_nmo_nmo2")
     338          594 :          CALL cp_fm_create(admm_env%lambda(ispin), fm_struct_nmo_nmo, name="lambda")
     339          594 :          CALL cp_fm_create(admm_env%lambda_inv(ispin), fm_struct_nmo_nmo, name="lambda_inv")
     340          594 :          CALL cp_fm_create(admm_env%lambda_inv_sqrt(ispin), fm_struct_nmo_nmo, name="lambda_inv_sqrt")
     341          594 :          CALL cp_fm_create(admm_env%R(ispin), fm_struct_nmo_nmo, name="R")
     342          594 :          CALL cp_fm_create(admm_env%R_purify(ispin), fm_struct_aux_aux, name="R_purify")
     343          594 :          CALL cp_fm_create(admm_env%K(ispin), fm_struct_aux_aux, name="K")
     344          594 :          CALL cp_fm_create(admm_env%H(ispin), fm_struct_aux_nmo, name="H")
     345          594 :          CALL cp_fm_create(admm_env%H_corr(ispin), fm_struct_orb_orb, name="H_corr")
     346          594 :          CALL cp_fm_create(admm_env%M(ispin), fm_struct_nmo_nmo, name="M")
     347          594 :          CALL cp_fm_create(admm_env%M_purify(ispin), fm_struct_aux_aux, name="M aux")
     348          594 :          CALL cp_fm_create(admm_env%P_to_be_purified(ispin), fm_struct_aux_aux, name="P_to_be_purified")
     349          594 :          CALL cp_fm_create(admm_env%work_aux_nmo(ispin), fm_struct_aux_nmo, name="work_aux_nmo")
     350          594 :          CALL cp_fm_create(admm_env%work_aux_nmo2(ispin), fm_struct_aux_nmo, name="work_aux_nmo2")
     351          594 :          CALL cp_fm_create(admm_env%mo_derivs_tmp(ispin), fm_struct_orb_nmo, name="mo_derivs_tmp")
     352          594 :          CALL cp_fm_create(admm_env%lambda_inv2(ispin), fm_struct_nmo_nmo, name="lambda_inv2")
     353          594 :          CALL cp_fm_create(admm_env%C_hat(ispin), fm_struct_aux_nmo, name="C_hat")
     354          594 :          CALL cp_fm_create(admm_env%P_tilde(ispin), fm_struct_aux_aux, name="P_tilde")
     355          594 :          CALL cp_fm_create(admm_env%ks_to_be_merged(ispin), fm_struct_orb_orb, name="KS_to_be_merged")
     356              : 
     357          594 :          ALLOCATE (admm_env%eigvals_lambda(ispin)%eigvals)
     358          594 :          ALLOCATE (admm_env%eigvals_P_to_be_purified(ispin)%eigvals)
     359         1772 :          ALLOCATE (admm_env%eigvals_lambda(ispin)%eigvals%data(nmo))
     360         1782 :          ALLOCATE (admm_env%eigvals_P_to_be_purified(ispin)%eigvals%data(nao_aux_fit))
     361         3236 :          admm_env%eigvals_lambda(ispin)%eigvals%data = 0.0_dp
     362         9120 :          admm_env%eigvals_P_to_be_purified(ispin)%eigvals%data = 0.0_dp
     363          594 :          CALL cp_fm_struct_release(fm_struct_aux_nmo)
     364          594 :          CALL cp_fm_struct_release(fm_struct_orb_nmo)
     365         1662 :          CALL cp_fm_struct_release(fm_struct_nmo_nmo)
     366              :       END DO
     367              : 
     368          474 :       CALL cp_fm_struct_release(fm_struct_aux_aux)
     369          474 :       CALL cp_fm_struct_release(fm_struct_aux_orb)
     370          474 :       CALL cp_fm_struct_release(fm_struct_orb_orb)
     371              : 
     372              :       ! Copy settings from admm_control
     373          474 :       CPASSERT(ASSOCIATED(admm_control))
     374          474 :       admm_env%purification_method = admm_control%purification_method
     375          474 :       admm_env%scaling_model = admm_control%scaling_model
     376          474 :       admm_env%aux_exch_func = admm_control%aux_exch_func
     377          474 :       admm_env%charge_constrain = (admm_control%method == do_admm_charge_constrained_projection)
     378              :       admm_env%block_dm = ((admm_control%method == do_admm_blocking_purify_full) .OR. &
     379          474 :                            (admm_control%method == do_admm_blocked_projection))
     380          474 :       admm_env%block_fit = admm_control%method == do_admm_blocked_projection
     381          474 :       admm_env%aux_exch_func_param = admm_control%aux_exch_func_param
     382         3792 :       admm_env%aux_x_param(:) = admm_control%aux_x_param(:)
     383              : 
     384              :       !ADMMP, ADMMQ, ADMMS
     385          474 :       IF ((.NOT. admm_env%charge_constrain) .AND. (admm_env%scaling_model == do_admm_exch_scaling_merlot)) &
     386           18 :          admm_env%do_admmp = .TRUE.
     387          474 :       IF (admm_env%charge_constrain .AND. (admm_env%scaling_model == do_admm_exch_scaling_none)) &
     388           14 :          admm_env%do_admmq = .TRUE.
     389          474 :       IF (admm_env%charge_constrain .AND. (admm_env%scaling_model == do_admm_exch_scaling_merlot)) &
     390           18 :          admm_env%do_admms = .TRUE.
     391              : 
     392          474 :       IF ((admm_control%method == do_admm_blocking_purify_full) .OR. &
     393              :           (admm_control%method == do_admm_blocked_projection)) THEN
     394              :          ! Create block map
     395           72 :          ALLOCATE (admm_env%block_map(natoms, natoms))
     396          414 :          admm_env%block_map(:, :) = 0
     397           54 :          DO iblock = 1, SIZE(admm_control%blocks)
     398          122 :             DO i = 1, SIZE(admm_control%blocks(iblock)%list)
     399           68 :                iatom = admm_control%blocks(iblock)%list(i)
     400          268 :                DO j = 1, SIZE(admm_control%blocks(iblock)%list)
     401          164 :                   jatom = admm_control%blocks(iblock)%list(j)
     402          232 :                   admm_env%block_map(iatom, jatom) = 1
     403              :                END DO
     404              :             END DO
     405              :          END DO
     406              :       END IF
     407              : 
     408          474 :       NULLIFY (admm_env%admm_gapw_env)
     409          474 :       admm_env%do_gapw = .FALSE.
     410              : 
     411          474 :       NULLIFY (admm_env%mos_aux_fit, admm_env%sab_aux_fit, admm_env%sab_aux_fit_asymm, admm_env%sab_aux_fit_vs_orb)
     412          474 :       NULLIFY (admm_env%matrix_ks_aux_fit_im)
     413          474 :       NULLIFY (admm_env%rho_aux_fit, admm_env%rho_aux_fit_buffer, admm_env%task_list_aux_fit, admm_env%mo_derivs_aux_fit)
     414              : 
     415          474 :    END SUBROUTINE admm_env_create
     416              : 
     417              : ! **************************************************************************************************
     418              : !> \brief releases the ADMM environment, cleans up all types
     419              : !>
     420              : !> \param admm_env The ADMM env
     421              : !> \par History
     422              : !>      05.2008 created [Manuel Guidon]
     423              : !> \author Manuel Guidon
     424              : ! **************************************************************************************************
     425          474 :    SUBROUTINE admm_env_release(admm_env)
     426              : 
     427              :       TYPE(admm_type), POINTER                           :: admm_env
     428              : 
     429              :       INTEGER                                            :: ispin
     430              : 
     431          474 :       CPASSERT(ASSOCIATED(admm_env))
     432              : 
     433          474 :       CALL cp_fm_release(admm_env%S)
     434          474 :       CALL cp_fm_release(admm_env%S_inv)
     435          474 :       CALL cp_fm_release(admm_env%Q)
     436          474 :       CALL cp_fm_release(admm_env%A)
     437          474 :       CALL cp_fm_release(admm_env%B)
     438          474 :       CALL cp_fm_release(admm_env%work_orb_orb)
     439          474 :       CALL cp_fm_release(admm_env%work_orb_orb2)
     440          474 :       CALL cp_fm_release(admm_env%work_orb_orb3)
     441          474 :       CALL cp_fm_release(admm_env%work_aux_aux)
     442          474 :       CALL cp_fm_release(admm_env%work_aux_aux2)
     443          474 :       CALL cp_fm_release(admm_env%work_aux_aux3)
     444          474 :       CALL cp_fm_release(admm_env%work_aux_aux4)
     445          474 :       CALL cp_fm_release(admm_env%work_aux_aux5)
     446          474 :       CALL cp_fm_release(admm_env%work_aux_orb)
     447          474 :       CALL cp_fm_release(admm_env%work_aux_orb2)
     448          474 :       CALL cp_fm_release(admm_env%work_aux_orb3)
     449            0 :       DEALLOCATE (admm_env%S, admm_env%S_inv, admm_env%Q, admm_env%A, admm_env%B, &
     450            0 :                   admm_env%work_orb_orb, admm_env%work_orb_orb2, admm_env%work_orb_orb3, &
     451            0 :                   admm_env%work_aux_orb, admm_env%work_aux_orb2, admm_env%work_aux_orb3, &
     452            0 :                   admm_env%work_aux_aux, admm_env%work_aux_aux2, admm_env%work_aux_aux3, &
     453          474 :                   admm_env%work_aux_aux4, admm_env%work_aux_aux5)
     454          474 :       CALL cp_fm_release(admm_env%lambda)
     455          474 :       CALL cp_fm_release(admm_env%lambda_inv)
     456          474 :       CALL cp_fm_release(admm_env%lambda_inv_sqrt)
     457          474 :       CALL cp_fm_release(admm_env%lambda_inv2)
     458          474 :       CALL cp_fm_release(admm_env%C_hat)
     459          474 :       CALL cp_fm_release(admm_env%P_tilde)
     460          474 :       CALL cp_fm_release(admm_env%R)
     461          474 :       CALL cp_fm_release(admm_env%R_purify)
     462          474 :       CALL cp_fm_release(admm_env%H)
     463          474 :       CALL cp_fm_release(admm_env%H_corr)
     464          474 :       CALL cp_fm_release(admm_env%K)
     465          474 :       CALL cp_fm_release(admm_env%M)
     466          474 :       CALL cp_fm_release(admm_env%M_purify)
     467          474 :       CALL cp_fm_release(admm_env%P_to_be_purified)
     468          474 :       CALL cp_fm_release(admm_env%work_orb_nmo)
     469          474 :       CALL cp_fm_release(admm_env%work_nmo_nmo1)
     470          474 :       CALL cp_fm_release(admm_env%R_schur_R_t)
     471          474 :       CALL cp_fm_release(admm_env%work_nmo_nmo2)
     472          474 :       CALL cp_fm_release(admm_env%work_aux_nmo)
     473          474 :       CALL cp_fm_release(admm_env%work_aux_nmo2)
     474          474 :       CALL cp_fm_release(admm_env%mo_derivs_tmp)
     475          474 :       CALL cp_fm_release(admm_env%ks_to_be_merged)
     476          474 :       CALL cp_fm_release(admm_env%lambda_inv2)
     477         1068 :       DO ispin = 1, SIZE(admm_env%eigvals_lambda)
     478          594 :          DEALLOCATE (admm_env%eigvals_lambda(ispin)%eigvals%data)
     479          594 :          DEALLOCATE (admm_env%eigvals_P_to_be_purified(ispin)%eigvals%data)
     480          594 :          DEALLOCATE (admm_env%eigvals_lambda(ispin)%eigvals)
     481         1068 :          DEALLOCATE (admm_env%eigvals_P_to_be_purified(ispin)%eigvals)
     482              :       END DO
     483          474 :       DEALLOCATE (admm_env%eigvals_lambda)
     484          474 :       DEALLOCATE (admm_env%eigvals_P_to_be_purified)
     485              : 
     486          474 :       IF (ASSOCIATED(admm_env%block_map)) &
     487           18 :          DEALLOCATE (admm_env%block_map)
     488              : 
     489          474 :       IF (ASSOCIATED(admm_env%xc_section_primary)) &
     490          470 :          CALL section_vals_release(admm_env%xc_section_primary)
     491          474 :       IF (ASSOCIATED(admm_env%xc_section_aux)) &
     492          470 :          CALL section_vals_release(admm_env%xc_section_aux)
     493              : 
     494          474 :       IF (ASSOCIATED(admm_env%admm_gapw_env)) CALL admm_gapw_env_release(admm_env%admm_gapw_env)
     495          474 :       IF (ASSOCIATED(admm_env%admm_dm)) CALL admm_dm_release(admm_env%admm_dm)
     496              : 
     497          474 :       IF (ASSOCIATED(admm_env%mos_aux_fit)) THEN
     498         1024 :          DO ispin = 1, SIZE(admm_env%mos_aux_fit)
     499         1024 :             CALL deallocate_mo_set(admm_env%mos_aux_fit(ispin))
     500              :          END DO
     501          454 :          DEALLOCATE (admm_env%mos_aux_fit)
     502              :       END IF
     503          474 :       CALL cp_fm_release(admm_env%mo_derivs_aux_fit)
     504              : 
     505          474 :       IF (ASSOCIATED(admm_env%scf_work_aux_fit)) THEN
     506           30 :          CALL cp_fm_release(admm_env%scf_work_aux_fit)
     507              :       END IF
     508              : 
     509          474 :       IF (ASSOCIATED(admm_env%sab_aux_fit)) CALL release_neighbor_list_sets(admm_env%sab_aux_fit)
     510          474 :       IF (ASSOCIATED(admm_env%sab_aux_fit_vs_orb)) CALL release_neighbor_list_sets(admm_env%sab_aux_fit_vs_orb)
     511          474 :       IF (ASSOCIATED(admm_env%sab_aux_fit_asymm)) CALL release_neighbor_list_sets(admm_env%sab_aux_fit_asymm)
     512              : 
     513          474 :       CALL kpoint_transitional_release(admm_env%matrix_ks_aux_fit)
     514          474 :       CALL kpoint_transitional_release(admm_env%matrix_ks_aux_fit_dft)
     515          474 :       CALL kpoint_transitional_release(admm_env%matrix_ks_aux_fit_hfx)
     516          474 :       CALL kpoint_transitional_release(admm_env%matrix_s_aux_fit)
     517          474 :       CALL kpoint_transitional_release(admm_env%matrix_s_aux_fit_vs_orb)
     518              : 
     519          474 :       IF (ASSOCIATED(admm_env%matrix_ks_aux_fit_im)) CALL dbcsr_deallocate_matrix_set(admm_env%matrix_ks_aux_fit_im)
     520              : 
     521          474 :       IF (ASSOCIATED(admm_env%rho_aux_fit)) THEN
     522          450 :          CALL qs_rho_release(admm_env%rho_aux_fit)
     523          450 :          DEALLOCATE (admm_env%rho_aux_fit)
     524              :       END IF
     525          474 :       IF (ASSOCIATED(admm_env%rho_aux_fit_buffer)) THEN
     526          450 :          CALL qs_rho_release(admm_env%rho_aux_fit_buffer)
     527          450 :          DEALLOCATE (admm_env%rho_aux_fit_buffer)
     528              :       END IF
     529              : 
     530          474 :       IF (ASSOCIATED(admm_env%task_list_aux_fit)) CALL deallocate_task_list(admm_env%task_list_aux_fit)
     531              : 
     532          474 :       DEALLOCATE (admm_env)
     533              : 
     534          474 :    END SUBROUTINE admm_env_release
     535              : 
     536              : ! **************************************************************************************************
     537              : !> \brief Release the ADMM GAPW stuff
     538              : !> \param admm_gapw_env ...
     539              : ! **************************************************************************************************
     540           92 :    SUBROUTINE admm_gapw_env_release(admm_gapw_env)
     541              : 
     542              :       TYPE(admm_gapw_r3d_rs_type), POINTER               :: admm_gapw_env
     543              : 
     544           92 :       IF (ASSOCIATED(admm_gapw_env%admm_kind_set)) THEN
     545           92 :          CALL deallocate_qs_kind_set(admm_gapw_env%admm_kind_set)
     546              :       END IF
     547              : 
     548           92 :       IF (ASSOCIATED(admm_gapw_env%local_rho_set)) THEN
     549           92 :          CALL local_rho_set_release(admm_gapw_env%local_rho_set)
     550              :       END IF
     551              : 
     552           92 :       IF (ASSOCIATED(admm_gapw_env%task_list)) THEN
     553           92 :          CALL deallocate_task_list(admm_gapw_env%task_list)
     554              :       END IF
     555              : 
     556           92 :       IF (ASSOCIATED(admm_gapw_env%oce)) THEN
     557           92 :          CALL deallocate_oce_set(admm_gapw_env%oce)
     558              :       END IF
     559              : 
     560           92 :       DEALLOCATE (admm_gapw_env)
     561              : 
     562           92 :    END SUBROUTINE admm_gapw_env_release
     563              : 
     564              : ! **************************************************************************************************
     565              : !> \brief Get routine for the ADMM env
     566              : !> \param admm_env ...
     567              : !> \param mo_derivs_aux_fit ...
     568              : !> \param mos_aux_fit ...
     569              : !> \param sab_aux_fit ...
     570              : !> \param sab_aux_fit_asymm ...
     571              : !> \param sab_aux_fit_vs_orb ...
     572              : !> \param matrix_s_aux_fit ...
     573              : !> \param matrix_s_aux_fit_kp ...
     574              : !> \param matrix_s_aux_fit_vs_orb ...
     575              : !> \param matrix_s_aux_fit_vs_orb_kp ...
     576              : !> \param task_list_aux_fit ...
     577              : !> \param matrix_ks_aux_fit ...
     578              : !> \param matrix_ks_aux_fit_kp ...
     579              : !> \param matrix_ks_aux_fit_im ...
     580              : !> \param matrix_ks_aux_fit_dft ...
     581              : !> \param matrix_ks_aux_fit_hfx ...
     582              : !> \param matrix_ks_aux_fit_dft_kp ...
     583              : !> \param matrix_ks_aux_fit_hfx_kp ...
     584              : !> \param rho_aux_fit ...
     585              : !> \param rho_aux_fit_buffer ...
     586              : !> \param admm_dm ...
     587              : ! **************************************************************************************************
     588       110142 :    SUBROUTINE get_admm_env(admm_env, mo_derivs_aux_fit, mos_aux_fit, sab_aux_fit, sab_aux_fit_asymm, &
     589              :                    sab_aux_fit_vs_orb, matrix_s_aux_fit, matrix_s_aux_fit_kp, matrix_s_aux_fit_vs_orb, matrix_s_aux_fit_vs_orb_kp, &
     590              :                            task_list_aux_fit, matrix_ks_aux_fit, matrix_ks_aux_fit_kp, matrix_ks_aux_fit_im, &
     591              :                     matrix_ks_aux_fit_dft, matrix_ks_aux_fit_hfx, matrix_ks_aux_fit_dft_kp, matrix_ks_aux_fit_hfx_kp, rho_aux_fit, &
     592              :                            rho_aux_fit_buffer, admm_dm)
     593              : 
     594              :       TYPE(admm_type), INTENT(IN), POINTER               :: admm_env
     595              :       TYPE(cp_fm_type), DIMENSION(:), OPTIONAL, POINTER  :: mo_derivs_aux_fit
     596              :       TYPE(mo_set_type), DIMENSION(:), OPTIONAL, POINTER :: mos_aux_fit
     597              :       TYPE(neighbor_list_set_p_type), DIMENSION(:), &
     598              :          OPTIONAL, POINTER                               :: sab_aux_fit, sab_aux_fit_asymm, &
     599              :                                                             sab_aux_fit_vs_orb
     600              :       TYPE(dbcsr_p_type), DIMENSION(:), OPTIONAL, &
     601              :          POINTER                                         :: matrix_s_aux_fit
     602              :       TYPE(dbcsr_p_type), DIMENSION(:, :), OPTIONAL, &
     603              :          POINTER                                         :: matrix_s_aux_fit_kp
     604              :       TYPE(dbcsr_p_type), DIMENSION(:), OPTIONAL, &
     605              :          POINTER                                         :: matrix_s_aux_fit_vs_orb
     606              :       TYPE(dbcsr_p_type), DIMENSION(:, :), OPTIONAL, &
     607              :          POINTER                                         :: matrix_s_aux_fit_vs_orb_kp
     608              :       TYPE(task_list_type), OPTIONAL, POINTER            :: task_list_aux_fit
     609              :       TYPE(dbcsr_p_type), DIMENSION(:), OPTIONAL, &
     610              :          POINTER                                         :: matrix_ks_aux_fit
     611              :       TYPE(dbcsr_p_type), DIMENSION(:, :), OPTIONAL, &
     612              :          POINTER                                         :: matrix_ks_aux_fit_kp
     613              :       TYPE(dbcsr_p_type), DIMENSION(:), OPTIONAL, &
     614              :          POINTER                                         :: matrix_ks_aux_fit_im, &
     615              :                                                             matrix_ks_aux_fit_dft, &
     616              :                                                             matrix_ks_aux_fit_hfx
     617              :       TYPE(dbcsr_p_type), DIMENSION(:, :), OPTIONAL, &
     618              :          POINTER                                         :: matrix_ks_aux_fit_dft_kp, &
     619              :                                                             matrix_ks_aux_fit_hfx_kp
     620              :       TYPE(qs_rho_type), OPTIONAL, POINTER               :: rho_aux_fit, rho_aux_fit_buffer
     621              :       TYPE(admm_dm_type), OPTIONAL, POINTER              :: admm_dm
     622              : 
     623       110142 :       CPASSERT(ASSOCIATED(admm_env))
     624              : 
     625       110142 :       IF (PRESENT(mo_derivs_aux_fit)) mo_derivs_aux_fit => admm_env%mo_derivs_aux_fit
     626       110142 :       IF (PRESENT(mos_aux_fit)) mos_aux_fit => admm_env%mos_aux_fit
     627       110142 :       IF (PRESENT(sab_aux_fit)) sab_aux_fit => admm_env%sab_aux_fit
     628       110142 :       IF (PRESENT(sab_aux_fit_asymm)) sab_aux_fit_asymm => admm_env%sab_aux_fit_asymm
     629       110142 :       IF (PRESENT(sab_aux_fit_vs_orb)) sab_aux_fit_vs_orb => admm_env%sab_aux_fit_vs_orb
     630       110142 :       IF (PRESENT(task_list_aux_fit)) task_list_aux_fit => admm_env%task_list_aux_fit
     631       110142 :       IF (PRESENT(matrix_ks_aux_fit_im)) matrix_ks_aux_fit_im => admm_env%matrix_ks_aux_fit_im
     632       110142 :       IF (PRESENT(rho_aux_fit)) rho_aux_fit => admm_env%rho_aux_fit
     633       110142 :       IF (PRESENT(rho_aux_fit_buffer)) rho_aux_fit_buffer => admm_env%rho_aux_fit_buffer
     634       110142 :       IF (PRESENT(admm_dm)) admm_dm => admm_env%admm_dm
     635              : 
     636       110142 :       IF (PRESENT(matrix_ks_aux_fit)) matrix_ks_aux_fit => get_1d_pointer(admm_env%matrix_ks_aux_fit)
     637       110142 :       IF (PRESENT(matrix_ks_aux_fit_kp)) matrix_ks_aux_fit_kp => get_2d_pointer(admm_env%matrix_ks_aux_fit)
     638       110142 :       IF (PRESENT(matrix_ks_aux_fit_dft)) matrix_ks_aux_fit_dft => get_1d_pointer(admm_env%matrix_ks_aux_fit_dft)
     639       110142 :       IF (PRESENT(matrix_ks_aux_fit_dft_kp)) matrix_ks_aux_fit_dft_kp => get_2d_pointer(admm_env%matrix_ks_aux_fit_dft)
     640       110142 :       IF (PRESENT(matrix_ks_aux_fit_hfx)) matrix_ks_aux_fit_hfx => get_1d_pointer(admm_env%matrix_ks_aux_fit_hfx)
     641       110142 :       IF (PRESENT(matrix_ks_aux_fit_hfx_kp)) matrix_ks_aux_fit_hfx_kp => get_2d_pointer(admm_env%matrix_ks_aux_fit_hfx)
     642       110142 :       IF (PRESENT(matrix_s_aux_fit)) matrix_s_aux_fit => get_1d_pointer(admm_env%matrix_s_aux_fit)
     643       110142 :       IF (PRESENT(matrix_s_aux_fit_kp)) matrix_s_aux_fit_kp => get_2d_pointer(admm_env%matrix_s_aux_fit)
     644       110142 :       IF (PRESENT(matrix_s_aux_fit_vs_orb)) matrix_s_aux_fit_vs_orb => get_1d_pointer(admm_env%matrix_s_aux_fit_vs_orb)
     645       110142 :       IF (PRESENT(matrix_s_aux_fit_vs_orb_kp)) matrix_s_aux_fit_vs_orb_kp => get_2d_pointer(admm_env%matrix_s_aux_fit_vs_orb)
     646       110142 :    END SUBROUTINE get_admm_env
     647              : 
     648              : ! **************************************************************************************************
     649              : !> \brief Set routine for the ADMM env
     650              : !> \param admm_env ...
     651              : !> \param mo_derivs_aux_fit ...
     652              : !> \param mos_aux_fit ...
     653              : !> \param sab_aux_fit ...
     654              : !> \param sab_aux_fit_asymm ...
     655              : !> \param sab_aux_fit_vs_orb ...
     656              : !> \param matrix_s_aux_fit ...
     657              : !> \param matrix_s_aux_fit_kp ...
     658              : !> \param matrix_s_aux_fit_vs_orb ...
     659              : !> \param matrix_s_aux_fit_vs_orb_kp ...
     660              : !> \param task_list_aux_fit ...
     661              : !> \param matrix_ks_aux_fit ...
     662              : !> \param matrix_ks_aux_fit_kp ...
     663              : !> \param matrix_ks_aux_fit_im ...
     664              : !> \param matrix_ks_aux_fit_dft ...
     665              : !> \param matrix_ks_aux_fit_hfx ...
     666              : !> \param matrix_ks_aux_fit_dft_kp ...
     667              : !> \param matrix_ks_aux_fit_hfx_kp ...
     668              : !> \param rho_aux_fit ...
     669              : !> \param rho_aux_fit_buffer ...
     670              : !> \param admm_dm ...
     671              : ! **************************************************************************************************
     672          822 :    SUBROUTINE set_admm_env(admm_env, mo_derivs_aux_fit, mos_aux_fit, sab_aux_fit, sab_aux_fit_asymm, &
     673              :                    sab_aux_fit_vs_orb, matrix_s_aux_fit, matrix_s_aux_fit_kp, matrix_s_aux_fit_vs_orb, matrix_s_aux_fit_vs_orb_kp, &
     674              :                            task_list_aux_fit, matrix_ks_aux_fit, matrix_ks_aux_fit_kp, matrix_ks_aux_fit_im, &
     675              :                     matrix_ks_aux_fit_dft, matrix_ks_aux_fit_hfx, matrix_ks_aux_fit_dft_kp, matrix_ks_aux_fit_hfx_kp, rho_aux_fit, &
     676              :                            rho_aux_fit_buffer, admm_dm)
     677              : 
     678              :       TYPE(admm_type), INTENT(INOUT), POINTER            :: admm_env
     679              :       TYPE(cp_fm_type), DIMENSION(:), OPTIONAL, POINTER  :: mo_derivs_aux_fit
     680              :       TYPE(mo_set_type), DIMENSION(:), OPTIONAL, POINTER :: mos_aux_fit
     681              :       TYPE(neighbor_list_set_p_type), DIMENSION(:), &
     682              :          OPTIONAL, POINTER                               :: sab_aux_fit, sab_aux_fit_asymm, &
     683              :                                                             sab_aux_fit_vs_orb
     684              :       TYPE(dbcsr_p_type), DIMENSION(:), OPTIONAL, &
     685              :          POINTER                                         :: matrix_s_aux_fit
     686              :       TYPE(dbcsr_p_type), DIMENSION(:, :), OPTIONAL, &
     687              :          POINTER                                         :: matrix_s_aux_fit_kp
     688              :       TYPE(dbcsr_p_type), DIMENSION(:), OPTIONAL, &
     689              :          POINTER                                         :: matrix_s_aux_fit_vs_orb
     690              :       TYPE(dbcsr_p_type), DIMENSION(:, :), OPTIONAL, &
     691              :          POINTER                                         :: matrix_s_aux_fit_vs_orb_kp
     692              :       TYPE(task_list_type), OPTIONAL, POINTER            :: task_list_aux_fit
     693              :       TYPE(dbcsr_p_type), DIMENSION(:), OPTIONAL, &
     694              :          POINTER                                         :: matrix_ks_aux_fit
     695              :       TYPE(dbcsr_p_type), DIMENSION(:, :), OPTIONAL, &
     696              :          POINTER                                         :: matrix_ks_aux_fit_kp
     697              :       TYPE(dbcsr_p_type), DIMENSION(:), OPTIONAL, &
     698              :          POINTER                                         :: matrix_ks_aux_fit_im, &
     699              :                                                             matrix_ks_aux_fit_dft, &
     700              :                                                             matrix_ks_aux_fit_hfx
     701              :       TYPE(dbcsr_p_type), DIMENSION(:, :), OPTIONAL, &
     702              :          POINTER                                         :: matrix_ks_aux_fit_dft_kp, &
     703              :                                                             matrix_ks_aux_fit_hfx_kp
     704              :       TYPE(qs_rho_type), OPTIONAL, POINTER               :: rho_aux_fit, rho_aux_fit_buffer
     705              :       TYPE(admm_dm_type), OPTIONAL, POINTER              :: admm_dm
     706              : 
     707          822 :       CPASSERT(ASSOCIATED(admm_env))
     708              : 
     709          822 :       IF (PRESENT(mo_derivs_aux_fit)) admm_env%mo_derivs_aux_fit => mo_derivs_aux_fit
     710          822 :       IF (PRESENT(mos_aux_fit)) admm_env%mos_aux_fit => mos_aux_fit
     711          822 :       IF (PRESENT(sab_aux_fit)) admm_env%sab_aux_fit => sab_aux_fit
     712          822 :       IF (PRESENT(sab_aux_fit_asymm)) admm_env%sab_aux_fit_asymm => sab_aux_fit_asymm
     713          822 :       IF (PRESENT(sab_aux_fit_vs_orb)) admm_env%sab_aux_fit_vs_orb => sab_aux_fit_vs_orb
     714          822 :       IF (PRESENT(task_list_aux_fit)) admm_env%task_list_aux_fit => task_list_aux_fit
     715          822 :       IF (PRESENT(matrix_ks_aux_fit_im)) admm_env%matrix_ks_aux_fit_im => matrix_ks_aux_fit_im
     716          822 :       IF (PRESENT(rho_aux_fit)) admm_env%rho_aux_fit => rho_aux_fit
     717          822 :       IF (PRESENT(rho_aux_fit_buffer)) admm_env%rho_aux_fit_buffer => rho_aux_fit_buffer
     718          822 :       IF (PRESENT(admm_dm)) admm_env%admm_dm => admm_dm
     719              : 
     720          822 :       IF (PRESENT(matrix_ks_aux_fit)) CALL set_1d_pointer(admm_env%matrix_ks_aux_fit, matrix_ks_aux_fit)
     721          822 :       IF (PRESENT(matrix_ks_aux_fit_kp)) CALL set_2d_pointer(admm_env%matrix_ks_aux_fit, matrix_ks_aux_fit_kp)
     722          822 :       IF (PRESENT(matrix_ks_aux_fit_dft)) CALL set_1d_pointer(admm_env%matrix_ks_aux_fit_dft, matrix_ks_aux_fit_dft)
     723          822 :       IF (PRESENT(matrix_ks_aux_fit_dft_kp)) CALL set_2d_pointer(admm_env%matrix_ks_aux_fit_dft, matrix_ks_aux_fit_dft_kp)
     724          822 :       IF (PRESENT(matrix_ks_aux_fit_hfx)) CALL set_1d_pointer(admm_env%matrix_ks_aux_fit_hfx, matrix_ks_aux_fit)
     725          822 :       IF (PRESENT(matrix_ks_aux_fit_hfx_kp)) CALL set_2d_pointer(admm_env%matrix_ks_aux_fit_hfx, matrix_ks_aux_fit_hfx_kp)
     726          822 :       IF (PRESENT(matrix_s_aux_fit)) CALL set_1d_pointer(admm_env%matrix_s_aux_fit, matrix_s_aux_fit)
     727          822 :       IF (PRESENT(matrix_s_aux_fit_kp)) CALL set_2d_pointer(admm_env%matrix_s_aux_fit, matrix_s_aux_fit_kp)
     728          822 :       IF (PRESENT(matrix_s_aux_fit_vs_orb)) CALL set_1d_pointer(admm_env%matrix_s_aux_fit_vs_orb, matrix_s_aux_fit_vs_orb)
     729          822 :       IF (PRESENT(matrix_s_aux_fit_vs_orb_kp)) CALL set_2d_pointer(admm_env%matrix_s_aux_fit_vs_orb, matrix_s_aux_fit_vs_orb_kp)
     730              : 
     731          822 :    END SUBROUTINE set_admm_env
     732              : 
     733            0 : END MODULE admm_types
     734              : 
        

Generated by: LCOV version 2.0-1