1!--------------------------------------------------------------------------------------------------! 2! CP2K: A general program to perform molecular dynamics simulations ! 3! Copyright (C) 2000 - 2019 CP2K developers group ! 4!--------------------------------------------------------------------------------------------------! 5 6! ************************************************************************************************** 7!> \brief basis types for the calculation of the perturbation of density theory. 8!> \par History 9!> 4.2002 created [fawzi] 10!> \author Fawzi Mohamed 11! ************************************************************************************************** 12MODULE qs_kpp1_env_types 13 USE dbcsr_api, ONLY: dbcsr_deallocate_matrix,& 14 dbcsr_p_type 15 USE pw_types, ONLY: pw_p_type,& 16 pw_release 17 USE xc_derivative_set_types, ONLY: xc_derivative_set_type,& 18 xc_dset_release 19 USE xc_rho_set_types, ONLY: xc_rho_set_release,& 20 xc_rho_set_type 21#include "./base/base_uses.f90" 22 23 IMPLICIT NONE 24 PRIVATE 25 PUBLIC :: qs_kpp1_env_type 26 PUBLIC :: kpp1_release 27 28 LOGICAL, PRIVATE, PARAMETER :: debug_this_module = .TRUE. 29 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_kpp1_env_types' 30 31! ************************************************************************************************** 32!> \brief environment that keeps the informations and temporary 33!> val to build the kpp1 kernel matrix 34!> \param ref_count reference count (how may objects are sharing this one) 35!> \param v_rspace potential in r space. This is used to do an update only 36!> of what has changed. Useful if P1 converges to some density 37!> (you spare in the grid-ao conversion). 38!> With LSD contains the various orbitals. 39!> \param v_ao the potential in the ao basis (used togheter with v_rspace 40!> to update only what changed 41!> \param id_nr identification number, unique for each kpp1 env 42!> \param print_count counter to create unique filename 43!> \param iter number of iterations 44!> \param drho_r (idir,ispin): the derivative of rho wrt. x,y,z in the real space 45!> \param deriv_xc (ii,ipot): the second derivative of the xc potential at psi0 46!> (qs_env%c), if grad pot is true it should already be divised 47!> by the gradient 48!> \param spin_pot (1:2,ipot): information about wrt. to which spins the 49!> corresponding component of deriv_xc was derived (see 50!> xc_create_2nd_deriv_info) 51!> \param grad_pot (1:2,ipot): if the derivative spin_pot was wrt. to 52!> the gradient (see xc_create_2nd_deriv_info) 53!> \param ndiag_term (ipot): it the term is an off diagonal term (see 54!> xc_create_2nd_deriv_info) 55! ************************************************************************************************** 56 TYPE qs_kpp1_env_type 57 INTEGER :: ref_count, id_nr, print_count, iter 58 TYPE(pw_p_type), DIMENSION(:), POINTER :: v_rspace 59 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: v_ao 60 TYPE(pw_p_type), DIMENSION(:, :), POINTER :: drho_r 61 TYPE(xc_derivative_set_type), POINTER :: deriv_set 62 TYPE(xc_rho_set_type), POINTER :: rho_set 63 INTEGER, DIMENSION(:, :), POINTER :: spin_pot 64 LOGICAL, DIMENSION(:, :), POINTER :: grad_pot 65 LOGICAL, DIMENSION(:), POINTER :: ndiag_term 66 END TYPE qs_kpp1_env_type 67 68! ************************************************************************************************** 69!> \brief just to build array of pointers 70!> \param kpp1_env: the pointer to the kpp1_env 71!> \par History 72!> 12.2002 created [fawzi] 73!> \author Fawzi Mohamed 74! ************************************************************************************************** 75 TYPE qs_kpp1_env_p_type 76 TYPE(qs_kpp1_env_type), POINTER :: kpp1_env 77 END TYPE qs_kpp1_env_p_type 78 79CONTAINS 80 81! ************************************************************************************************** 82!> \brief releases a kpp1_env (see doc/ReferenceCounting.html) 83!> \param kpp1_env the environment to release 84!> \par History 85!> 07.2002 created [fawzi] 86!> \author Fawzi Mohamed 87! ************************************************************************************************** 88 SUBROUTINE kpp1_release(kpp1_env) 89 TYPE(qs_kpp1_env_type), POINTER :: kpp1_env 90 91 CHARACTER(len=*), PARAMETER :: routineN = 'kpp1_release', routineP = moduleN//':'//routineN 92 93 INTEGER :: ispin 94 95 IF (ASSOCIATED(kpp1_env)) THEN 96 CPASSERT(kpp1_env%ref_count > 0) 97 kpp1_env%ref_count = kpp1_env%ref_count - 1 98 IF (kpp1_env%ref_count < 1) THEN 99 IF (ASSOCIATED(kpp1_env%v_rspace)) THEN 100 DO ispin = 1, SIZE(kpp1_env%v_rspace) 101 CALL pw_release(kpp1_env%v_rspace(ispin)%pw) 102 END DO 103 DEALLOCATE (kpp1_env%v_rspace) 104 END IF 105 IF (ASSOCIATED(kpp1_env%v_ao)) THEN 106 DO ispin = 1, SIZE(kpp1_env%v_ao) 107 IF (ASSOCIATED(kpp1_env%v_ao(ispin)%matrix)) THEN 108 CALL dbcsr_deallocate_matrix(kpp1_env%v_ao(ispin)%matrix) 109 END IF 110 END DO 111 DEALLOCATE (kpp1_env%v_ao) 112 END IF 113 IF (ASSOCIATED(kpp1_env%drho_r)) THEN 114 DEALLOCATE (kpp1_env%drho_r) 115 END IF 116 IF (ASSOCIATED(kpp1_env%deriv_set)) THEN 117 CALL xc_dset_release(kpp1_env%deriv_set) 118 NULLIFY (kpp1_env%deriv_set) 119 END IF 120 IF (ASSOCIATED(kpp1_env%rho_set)) THEN 121 CALL xc_rho_set_release(kpp1_env%rho_set) 122 NULLIFY (kpp1_env%rho_set) 123 END IF 124 IF (ASSOCIATED(kpp1_env%spin_pot)) THEN 125 DEALLOCATE (kpp1_env%spin_pot) 126 END IF 127 IF (ASSOCIATED(kpp1_env%grad_pot)) THEN 128 DEALLOCATE (kpp1_env%grad_pot) 129 END IF 130 IF (ASSOCIATED(kpp1_env%ndiag_term)) THEN 131 DEALLOCATE (kpp1_env%ndiag_term) 132 END IF 133 DEALLOCATE (kpp1_env) 134 END IF 135 END IF 136 NULLIFY (kpp1_env) 137 END SUBROUTINE kpp1_release 138 139! ************************************************************************************************** 140!> \brief retains a kpp1_env (see doc/ReferenceCounting.html) 141!> \param kpp1_env the environment to retain 142!> \par History 143!> 11.2002 created [fawzi] 144!> \author Fawzi Mohamed 145! ************************************************************************************************** 146 SUBROUTINE kpp1_retain(kpp1_env) 147 TYPE(qs_kpp1_env_type), POINTER :: kpp1_env 148 149 CHARACTER(len=*), PARAMETER :: routineN = 'kpp1_retain', routineP = moduleN//':'//routineN 150 151 CPASSERT(ASSOCIATED(kpp1_env)) 152 CPASSERT(kpp1_env%ref_count > 0) 153 kpp1_env%ref_count = kpp1_env%ref_count + 1 154 END SUBROUTINE kpp1_retain 155 156END MODULE qs_kpp1_env_types 157