40 #include "./base/base_uses.f90"
45 LOGICAL,
PRIVATE,
PARAMETER :: debug_this_module = .true.
46 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'qmmm_gaussian_init'
70 mm_el_pot_radius, mm_el_pot_radius_corr, &
71 qmmm_coupl_type, eps_mm_rspace, maxradius, maxchrg, compatibility, &
72 print_section, qmmm_section)
73 TYPE(qmmm_gaussian_p_type),
DIMENSION(:),
POINTER :: qmmm_gaussian_fns
74 TYPE(mp_para_env_type),
POINTER :: para_env
75 TYPE(pw_env_type),
POINTER :: pw_env
76 REAL(kind=
dp),
DIMENSION(:),
POINTER :: mm_el_pot_radius, mm_el_pot_radius_corr
77 INTEGER,
INTENT(IN) :: qmmm_coupl_type
78 REAL(kind=
dp),
INTENT(IN) :: eps_mm_rspace
79 REAL(kind=
dp),
DIMENSION(:),
POINTER :: maxradius
80 REAL(kind=
dp),
INTENT(IN) :: maxchrg
81 LOGICAL,
INTENT(IN) :: compatibility
82 TYPE(section_vals_type),
POINTER :: print_section, qmmm_section
84 INTEGER :: i, ilevel, j, ndim, num_geep_gauss, &
86 LOGICAL :: found, use_geep_lib
87 REAL(kind=
dp) :: alpha, mymaxradius, prefactor
88 REAL(kind=
dp),
DIMENSION(:),
POINTER :: c_radius, radius
89 TYPE(cp_logger_type),
POINTER :: logger
90 TYPE(gridlevel_info_type),
POINTER :: gridlevel_info
91 TYPE(pw_pool_p_type),
DIMENSION(:),
POINTER :: pools
92 TYPE(qmmm_gaussian_type),
POINTER :: mypgf
96 NULLIFY (mypgf, gridlevel_info, radius, c_radius, logger)
99 IF (num_geep_gauss == 0)
THEN
100 use_geep_lib = .false.
102 use_geep_lib = .true.
106 SELECT CASE (qmmm_coupl_type)
112 ALLOCATE (c_radius(1))
114 loop_on_all_values:
DO i = 1,
SIZE(mm_el_pot_radius)
116 loop_on_found_values:
DO j = 1,
SIZE(radius) - 1
117 IF (mm_el_pot_radius(i) .EQ. radius(j))
THEN
119 EXIT loop_on_found_values
121 END DO loop_on_found_values
122 IF (.NOT. found)
THEN
124 radius(ndim) = mm_el_pot_radius(i)
125 c_radius(ndim) = mm_el_pot_radius_corr(i)
127 CALL reallocate(radius, 1, ndim)
128 CALL reallocate(c_radius, 1, ndim)
130 END DO loop_on_all_values
132 IF (ndim - 1 > 0)
THEN
133 CALL reallocate(radius, 1, ndim - 1)
134 CALL reallocate(c_radius, 1, ndim - 1)
135 ELSE IF (ndim - 1 == 0)
THEN
137 DEALLOCATE (c_radius)
142 ALLOCATE (qmmm_gaussian_fns(ndim - 1))
144 NULLIFY (qmmm_gaussian_fns(i)%pgf)
145 ALLOCATE (qmmm_gaussian_fns(i)%pgf)
146 NULLIFY (qmmm_gaussian_fns(i)%pgf%Ak)
147 NULLIFY (qmmm_gaussian_fns(i)%pgf%Gk)
148 NULLIFY (qmmm_gaussian_fns(i)%pgf%grid_level)
152 qmmm_gaussian_fns(i)%pgf%Elp_Radius = radius(i)
153 qmmm_gaussian_fns(i)%pgf%Elp_Radius_corr = c_radius(i)
155 IF (
ASSOCIATED(radius))
THEN
158 IF (
ASSOCIATED(c_radius))
THEN
159 DEALLOCATE (c_radius)
162 IF (use_geep_lib)
THEN
165 compatibility, num_geep_gauss)
172 (compatibility .AND. (qmmm_coupl_type ==
do_qmmm_gauss)), qmmm_section)
175 CALL pw_env_get(pw_env, pw_pools=pools, gridlevel_info=gridlevel_info)
176 ALLOCATE (maxradius(
SIZE(pools)))
178 DO j = 1,
SIZE(qmmm_gaussian_fns)
179 mypgf => qmmm_gaussian_fns(j)%pgf
180 ALLOCATE (mypgf%grid_level(
SIZE(mypgf%Ak)))
183 DO i = 1, mypgf%number_of_gaussians
184 IF (mypgf%Gk(i) /= 0.0_dp)
THEN
185 alpha = 1.0_dp/mypgf%Gk(i)
188 prefactor = mypgf%Ak(i)*maxchrg
189 mymaxradius =
exp_radius(0, alpha, eps_mm_rspace, prefactor, rlow=mymaxradius)
190 maxradius(ilevel) = max(maxradius(ilevel), mymaxradius)
191 mypgf%grid_level(i) = ilevel
199 extension=
".qmmmLog")
200 IF (output_unit > 0)
WRITE (output_unit,
'(A)')
" QMMM Gaussian Data Not Initialized!"
All kind of helpful little routines.
real(kind=dp) function, public exp_radius(l, alpha, threshold, prefactor, epsabs, epsrel, rlow)
The radius of a primitive Gaussian function for a given threshold is calculated. g(r) = prefactor*r**...
various routines to log and control the output. The idea is that decisions about where to log should ...
type(cp_logger_type) function, pointer, public cp_get_default_logger()
returns the default logger
routines to handle the output, The idea is to remove the decision of wheter to output and what to out...
integer function, public cp_print_key_unit_nr(logger, basis_section, print_key_path, extension, middle_name, local, log_filename, ignore_should_output, file_form, file_position, file_action, file_status, do_backup, on_file, is_new_file, mpi_io, fout)
...
subroutine, public cp_print_key_finished_output(unit_nr, logger, basis_section, print_key_path, local, ignore_should_output, on_file, mpi_io)
should be called after you finish working with a unit obtained with cp_print_key_unit_nr,...
integer function, public gaussian_gridlevel(gridlevel_info, exponent)
...
Defines the basic variable types.
integer, parameter, public dp
Utility routines for the memory handling.
Interface to the message passing library MPI.
container for various plainwaves related things
subroutine, public pw_env_get(pw_env, pw_pools, cube_info, gridlevel_info, auxbas_pw_pool, auxbas_grid, auxbas_rs_desc, auxbas_rs_grid, rs_descs, rs_grids, xc_pw_pool, vdw_pw_pool, poisson_env, interp_section)
returns the various attributes of the pw env
Manages a pool of grids (to be used for example as tmp objects), but can also be used to instantiate ...
GEEP coefficients for fixed radii. THIS IS THE GEEP LIB. They can be used together with the "omotetia...
integer, parameter, public max_geep_lib_gauss
integer, parameter, public min_geep_lib_gauss
Initialize the use of the gaussians to treat the QMMM coupling potential.
subroutine, public qmmm_gaussian_initialize(qmmm_gaussian_fns, para_env, pw_env, mm_el_pot_radius, mm_el_pot_radius_corr, qmmm_coupl_type, eps_mm_rspace, maxradius, maxchrg, compatibility, print_section, qmmm_section)
Initialize the Gaussian QMMM Environment.
Sets the typo for the gaussian treatment of the qm/mm interaction.