1!--------------------------------------------------------------------------------------------------! 2! CP2K: A general program to perform molecular dynamics simulations ! 3! Copyright (C) 2000 - 2019 CP2K developers group ! 4!--------------------------------------------------------------------------------------------------! 5 6! ************************************************************************************************** 7!> \brief Types containing essential information for running implicit (iterative) 8!> Poisson solver 9!> \par History 10!> 08.2014 created [Hossein Bani-Hashemian] 11!> \author Hossein Bani-Hashemian 12! ************************************************************************************************** 13MODULE ps_implicit_types 14 15 USE dct, ONLY: dct_type,& 16 dct_type_release 17 USE dielectric_types, ONLY: dielectric_release,& 18 dielectric_type 19 USE dirichlet_bc_types, ONLY: dbc_release,& 20 dirichlet_bc_p_type 21 USE kinds, ONLY: dp 22 USE pw_pool_types, ONLY: pw_pool_give_back_pw,& 23 pw_pool_type 24 USE pw_types, ONLY: pw_release,& 25 pw_type 26#include "../base/base_uses.f90" 27 28 IMPLICIT NONE 29 PRIVATE 30 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'ps_implicit_types' 31 32 TYPE :: ps_implicit_parameters 33 INTEGER :: boundary_condition 34 LOGICAL :: zero_initial_guess 35 INTEGER :: max_iter 36 REAL(KIND=dp) :: tol 37 REAL(KIND=dp) :: omega 38 INTEGER :: neumann_directions 39 END TYPE ps_implicit_parameters 40 41 TYPE :: ps_implicit_type 42 LOGICAL :: do_dbc_cube 43 TYPE(dielectric_type), POINTER :: dielectric 44 TYPE(dct_type) :: dct_env 45 TYPE(pw_type), POINTER :: initial_guess 46 TYPE(pw_type), POINTER :: v_eps 47 TYPE(pw_type), POINTER :: cstr_charge 48 REAL(dp), DIMENSION(:), POINTER :: initial_lambda => NULL() 49 REAL(dp) :: ehartree 50 REAL(dp) :: electric_enthalpy 51 INTEGER :: times_called 52 TYPE(dirichlet_bc_p_type), & 53 DIMENSION(:), POINTER :: contacts => NULL() 54 REAL(dp), DIMENSION(:, :), POINTER :: QS => NULL() 55 REAL(dp), DIMENSION(:, :), POINTER :: Rinv => NULL() 56 REAL(dp), DIMENSION(:, :), POINTER :: B => NULL() 57 REAL(dp), DIMENSION(:, :), POINTER :: Bt => NULL() 58 REAL(dp), DIMENSION(:), POINTER :: v_D => NULL() 59 REAL(dp), DIMENSION(:), POINTER :: osc_frac => NULL() 60 REAL(dp), DIMENSION(:), POINTER :: frequency => NULL() 61 REAL(dp), DIMENSION(:), POINTER :: phase => NULL() 62 INTEGER, DIMENSION(:), POINTER :: idx_1dto3d => NULL() 63 END TYPE ps_implicit_type 64 65 PUBLIC ps_implicit_type, ps_implicit_parameters 66 PUBLIC ps_implicit_release 67 68 INTEGER, PARAMETER, PUBLIC :: PERIODIC_BC = 0, & 69 MIXED_BC = 1, & 70 MIXED_PERIODIC_BC = 2, & 71 NEUMANN_BC = 3 72CONTAINS 73 74! ************************************************************************************************** 75!> \brief Deallocates ps_implicit 76!> \param ps_implicit_env the implicit_env to be deallocated 77!> \param ps_implicit_params implicit env parameters 78!> \param pw_pool pool of plane-wave grid 79!> \par History 80!> 08.2014 created [Hossein Bani-Hashemian] 81!> \author Mohammad Hossein Bani-Hashemian 82! ************************************************************************************************** 83 SUBROUTINE ps_implicit_release(ps_implicit_env, ps_implicit_params, pw_pool) 84 TYPE(ps_implicit_type), POINTER :: ps_implicit_env 85 TYPE(ps_implicit_parameters), INTENT(INOUT) :: ps_implicit_params 86 TYPE(pw_pool_type), INTENT(IN), OPTIONAL, POINTER :: pw_pool 87 88 CHARACTER(len=*), PARAMETER :: routineN = 'ps_implicit_release', & 89 routineP = moduleN//':'//routineN 90 91 INTEGER :: boundary_condition, handle 92 LOGICAL :: can_give_back, do_dbc_cube 93 94 CALL timeset(routineN, handle) 95 96 IF (ASSOCIATED(ps_implicit_env)) THEN 97 can_give_back = PRESENT(pw_pool) 98 IF (can_give_back) can_give_back = ASSOCIATED(pw_pool) 99 do_dbc_cube = ps_implicit_env%do_dbc_cube 100 101 IF (can_give_back) THEN 102 CALL pw_pool_give_back_pw(pw_pool, ps_implicit_env%initial_guess, & 103 accept_non_compatible=.TRUE.) 104 CALL pw_pool_give_back_pw(pw_pool, ps_implicit_env%v_eps, & 105 accept_non_compatible=.TRUE.) 106 CALL pw_pool_give_back_pw(pw_pool, ps_implicit_env%cstr_charge, & 107 accept_non_compatible=.TRUE.) 108 CALL dbc_release(ps_implicit_env%contacts, do_dbc_cube, pw_pool=pw_pool) 109 ELSE 110 CALL pw_release(ps_implicit_env%initial_guess) 111 CALL pw_release(ps_implicit_env%v_eps) 112 CALL pw_release(ps_implicit_env%cstr_charge) 113 CALL dbc_release(ps_implicit_env%contacts, do_dbc_cube) 114 END IF 115 116 DEALLOCATE (ps_implicit_env%initial_lambda) 117 DEALLOCATE (ps_implicit_env%B) 118 DEALLOCATE (ps_implicit_env%Bt) 119 DEALLOCATE (ps_implicit_env%QS) 120 DEALLOCATE (ps_implicit_env%Rinv) 121 DEALLOCATE (ps_implicit_env%v_D) 122 DEALLOCATE (ps_implicit_env%osc_frac) 123 DEALLOCATE (ps_implicit_env%frequency) 124 DEALLOCATE (ps_implicit_env%phase) 125 DEALLOCATE (ps_implicit_env%idx_1dto3d) 126 127 CALL dielectric_release(ps_implicit_env%dielectric, pw_pool) 128 boundary_condition = ps_implicit_params%boundary_condition 129 IF (boundary_condition .EQ. MIXED_BC .OR. boundary_condition .EQ. NEUMANN_BC) THEN 130 CALL dct_type_release(ps_implicit_env%dct_env) 131 END IF 132 133 DEALLOCATE (ps_implicit_env) 134 END IF 135 136 CALL timestop(handle) 137 138 END SUBROUTINE ps_implicit_release 139 140END MODULE ps_implicit_types 141