(git:8e2f697)
Loading...
Searching...
No Matches
molecular_dipoles.F
Go to the documentation of this file.
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 Set of routines handling the localization for molecular properties
10! **************************************************************************************************
14 USE cell_types, ONLY: cell_type,&
15 pbc
25 USE kinds, ONLY: dp
26 USE mathconstants, ONLY: twopi,&
27 z_one
34 USE physcon, ONLY: debye
37 USE qs_kind_types, ONLY: get_qs_kind,&
40#include "./base/base_uses.f90"
41
42 IMPLICIT NONE
43
44 PRIVATE
45
46 ! *** Public ***
48
49 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'molecular_dipoles'
50
51CONTAINS
52
53! **************************************************************************************************
54!> \brief maps wfc's to molecules and also prints molecular dipoles
55!> \param qs_env the qs_env in which the qs_env lives
56!> \param qs_loc_env ...
57!> \param loc_print_key ...
58!> \param molecule_set ...
59! **************************************************************************************************
60 SUBROUTINE calculate_molecular_dipole(qs_env, qs_loc_env, loc_print_key, molecule_set)
61 TYPE(qs_environment_type), POINTER :: qs_env
62 TYPE(qs_loc_env_type), INTENT(IN) :: qs_loc_env
63 TYPE(section_vals_type), POINTER :: loc_print_key
64 TYPE(molecule_type), POINTER :: molecule_set(:)
65
66 COMPLEX(KIND=dp) :: zeta
67 COMPLEX(KIND=dp), DIMENSION(3) :: ggamma, zphase
68 INTEGER :: akind, first_atom, i, iatom, ikind, &
69 imol, imol_now, iounit, ispin, istate, &
70 j, natom, nkind, nmol, nspins, nstate, &
71 reference
72 LOGICAL :: do_berry, floating, ghost
73 REAL(kind=dp) :: charge_tot, dipole(3), ria(3), theta, &
74 zeff, zwfc
75 REAL(kind=dp), ALLOCATABLE, DIMENSION(:) :: charge_set
76 REAL(kind=dp), ALLOCATABLE, DIMENSION(:, :) :: dipole_set
77 REAL(kind=dp), DIMENSION(3) :: ci, gvec, rcc
78 REAL(kind=dp), DIMENSION(:), POINTER :: ref_point
79 REAL(kind=dp), DIMENSION(:, :), POINTER :: center(:, :)
80 TYPE(atomic_kind_type), POINTER :: atomic_kind
81 TYPE(cell_type), POINTER :: cell
82 TYPE(cp_logger_type), POINTER :: logger
83 TYPE(dft_control_type), POINTER :: dft_control
84 TYPE(distribution_1d_type), POINTER :: local_molecules
85 TYPE(molecule_kind_type), POINTER :: molecule_kind
86 TYPE(mp_para_env_type), POINTER :: para_env
87 TYPE(particle_type), POINTER :: particle_set(:)
88 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
89
90 logger => cp_get_default_logger()
91
92 CALL get_qs_env(qs_env, dft_control=dft_control)
93 nspins = dft_control%nspins
94
95 ! Setup reference point
96 reference = section_get_ival(loc_print_key, keyword_name="MOLECULAR_DIPOLES%REFERENCE")
97 CALL section_vals_val_get(loc_print_key, "MOLECULAR_DIPOLES%REF_POINT", r_vals=ref_point)
98 CALL section_vals_val_get(loc_print_key, "MOLECULAR_DIPOLES%PERIODIC", l_val=do_berry)
99
100 CALL get_qs_env(qs_env, qs_kind_set=qs_kind_set, cell=cell)
101 particle_set => qs_loc_env%particle_set
102 para_env => qs_loc_env%para_env
103 local_molecules => qs_loc_env%local_molecules
104 nkind = SIZE(local_molecules%n_el)
105 zwfc = 3.0_dp - real(nspins, kind=dp)
106
107 ALLOCATE (dipole_set(3, SIZE(molecule_set)))
108 ALLOCATE (charge_set(SIZE(molecule_set)))
109 dipole_set = 0.0_dp
110 charge_set = 0.0_dp
111
112 DO ispin = 1, nspins
113 center => qs_loc_env%localized_wfn_control%centers_set(ispin)%array
114 nstate = SIZE(center, 2)
115 DO ikind = 1, nkind ! loop over different molecules
116 nmol = SIZE(local_molecules%list(ikind)%array)
117 DO imol = 1, nmol ! all the molecules of the kind
118 imol_now = local_molecules%list(ikind)%array(imol) ! index in the global array
119 IF (.NOT. ASSOCIATED(molecule_set(imol_now)%lmi(ispin)%states)) cycle
120 molecule_kind => molecule_set(imol_now)%molecule_kind
121 first_atom = molecule_set(imol_now)%first_atom
122 CALL get_molecule_kind(molecule_kind=molecule_kind, natom=natom)
123
124 ! Get reference point for this molecule
125 CALL get_reference_point(rcc, qs_env=qs_env, reference=reference, &
126 ref_point=ref_point, ifirst=first_atom, &
127 ilast=first_atom + natom - 1)
128
129 dipole = 0.0_dp
130 IF (do_berry) THEN
131 rcc = pbc(rcc, cell)
132 ! Find out the total charge of the molecule
133 DO iatom = 1, natom
134 i = first_atom + iatom - 1
135 atomic_kind => particle_set(i)%atomic_kind
136 CALL get_atomic_kind(atomic_kind, kind_number=akind)
137 CALL get_qs_kind(qs_kind_set(akind), ghost=ghost, floating=floating)
138 IF (.NOT. ghost .AND. .NOT. floating) THEN
139 CALL get_qs_kind(qs_kind_set(akind), core_charge=zeff)
140 charge_set(imol_now) = charge_set(imol_now) + zeff
141 END IF
142 END DO
143 ! Charges of the wfc involved
144 DO istate = 1, SIZE(molecule_set(imol_now)%lmi(ispin)%states)
145 charge_set(imol_now) = charge_set(imol_now) - zwfc
146 END DO
147
148 charge_tot = charge_set(imol_now)
149 ria = twopi*matmul(cell%h_inv, rcc)
150 zphase = cmplx(cos(ria), sin(ria), kind=dp)**charge_tot
151 ggamma = z_one
152
153 ! Nuclear charges
154 IF (ispin == 1) THEN
155 DO iatom = 1, natom
156 i = first_atom + iatom - 1
157 atomic_kind => particle_set(i)%atomic_kind
158 CALL get_atomic_kind(atomic_kind, kind_number=akind)
159 CALL get_qs_kind(qs_kind_set(akind), ghost=ghost, floating=floating)
160 IF (.NOT. ghost .AND. .NOT. floating) THEN
161 CALL get_qs_kind(qs_kind_set(akind), core_charge=zeff)
162 ria = pbc(particle_set(i)%r, cell)
163 DO j = 1, 3
164 gvec = twopi*cell%h_inv(j, :)
165 theta = sum(ria(:)*gvec(:))
166 zeta = cmplx(cos(theta), sin(theta), kind=dp)**(zeff)
167 ggamma(j) = ggamma(j)*zeta
168 END DO
169 END IF
170 END DO
171 END IF
172
173 ! Charges of the wfc involved
174 DO istate = 1, SIZE(molecule_set(imol_now)%lmi(ispin)%states)
175 i = molecule_set(imol_now)%lmi(ispin)%states(istate)
176 ria = pbc(center(1:3, i), cell)
177 DO j = 1, 3
178 gvec = twopi*cell%h_inv(j, :)
179 theta = sum(ria(:)*gvec(:))
180 zeta = cmplx(cos(theta), sin(theta), kind=dp)**(-zwfc)
181 ggamma(j) = ggamma(j)*zeta
182 END DO
183 END DO
184
185 ggamma = ggamma*zphase
186 ci = aimag(log(ggamma))/twopi
187 dipole = matmul(cell%hmat, ci)
188 ELSE
189 IF (ispin == 1) THEN
190 ! Nuclear charges
191 DO iatom = 1, natom
192 i = first_atom + iatom - 1
193 atomic_kind => particle_set(i)%atomic_kind
194 CALL get_atomic_kind(atomic_kind, kind_number=akind)
195 CALL get_qs_kind(qs_kind_set(akind), ghost=ghost, floating=floating)
196 IF (.NOT. ghost .AND. .NOT. floating) THEN
197 CALL get_qs_kind(qs_kind_set(akind), core_charge=zeff)
198 ria = pbc(particle_set(i)%r, cell) - rcc
199 dipole = dipole + zeff*(ria - rcc)
200 charge_set(imol_now) = charge_set(imol_now) + zeff
201 END IF
202 END DO
203 END IF
204 ! Charges of the wfc involved
205 DO istate = 1, SIZE(molecule_set(imol_now)%lmi(ispin)%states)
206 i = molecule_set(imol_now)%lmi(ispin)%states(istate)
207 ria = pbc(center(1:3, i), cell)
208 dipole = dipole - zwfc*(ria - rcc)
209 charge_set(imol_now) = charge_set(imol_now) - zwfc
210 END DO
211 END IF
212 dipole_set(:, imol_now) = dipole_set(:, imol_now) + dipole ! a.u.
213 END DO
214 END DO
215 END DO
216 CALL para_env%sum(dipole_set)
217 CALL para_env%sum(charge_set)
218
219 iounit = cp_print_key_unit_nr(logger, loc_print_key, "MOLECULAR_DIPOLES", &
220 extension=".MolDip", middle_name="MOLECULAR_DIPOLES")
221 IF (iounit > 0) THEN
222 WRITE (unit=iounit, fmt='(A80)') &
223 "# molecule nr, charge, dipole vector, dipole[Debye]"
224 dipole_set(:, :) = dipole_set(:, :)*debye ! Debye
225 DO i = 1, SIZE(dipole_set, 2)
226 WRITE (unit=iounit, fmt='(T8,I6,T21,5F12.6)') i, charge_set(i), dipole_set(1:3, i), &
227 sqrt(dot_product(dipole_set(1:3, i), dipole_set(1:3, i)))
228 END DO
229 WRITE (unit=iounit, fmt="(T2,A,T61,E20.12)") ' DIPOLE : CheckSum =', sum(dipole_set)
230 END IF
231 CALL cp_print_key_finished_output(iounit, logger, loc_print_key, &
232 "MOLECULAR_DIPOLES")
233
234 DEALLOCATE (dipole_set, charge_set)
235
236 END SUBROUTINE calculate_molecular_dipole
237 !------------------------------------------------------------------------------
238
239END MODULE molecular_dipoles
240
Define the atomic kind types and their sub types.
subroutine, public get_atomic_kind(atomic_kind, fist_potential, element_symbol, name, mass, kind_number, natom, atom_list, rcov, rvdw, z, qeff, apol, cpol, mm_radius, shell, shell_active, damping)
Get attributes of an atomic kind.
Handles all functions related to the CELL.
Definition cell_types.F:15
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
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,...
stores a lists of integer that are local to a processor. The idea is that these integers represent ob...
objects that represent the structure of input sections and the data contained in an input section
integer function, public section_get_ival(section_vals, keyword_name)
...
subroutine, public section_vals_val_get(section_vals, keyword_name, i_rep_section, i_rep_val, n_rep_val, val, l_val, i_val, r_val, c_val, l_vals, i_vals, r_vals, c_vals, explicit)
returns the requested value
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public dp
Definition kinds.F:34
Definition of mathematical constants and functions.
complex(kind=dp), parameter, public z_one
real(kind=dp), parameter, public twopi
Interface to the message passing library MPI.
Set of routines handling the localization for molecular properties.
subroutine, public calculate_molecular_dipole(qs_env, qs_loc_env, loc_print_key, molecule_set)
maps wfc's to molecules and also prints molecular dipoles
Define the molecule kind structure types and the corresponding functionality.
subroutine, public get_molecule_kind(molecule_kind, atom_list, bond_list, bend_list, ub_list, impr_list, opbend_list, colv_list, fixd_list, g3x3_list, g4x6_list, vsite_list, torsion_list, shell_list, name, mass, charge, kind_number, natom, nbend, nbond, nub, nimpr, nopbend, nconstraint, nconstraint_fixd, nfixd, ncolv, ng3x3, ng4x6, nvsite, nfixd_restraint, ng3x3_restraint, ng4x6_restraint, nvsite_restraint, nrestraints, nmolecule, nsgf, nshell, ntorsion, molecule_list, nelectron, nelectron_alpha, nelectron_beta, bond_kind_set, bend_kind_set, ub_kind_set, impr_kind_set, opbend_kind_set, torsion_kind_set, molname_generated)
Get informations about a molecule kind.
Define the data structure for the molecule information.
Calculates the moment integrals <a|r^m|b>
subroutine, public get_reference_point(rpoint, drpoint, qs_env, fist_env, reference, ref_point, ifirst, ilast)
...
Define the data structure for the particle information.
Definition of physical constants:
Definition physcon.F:68
real(kind=dp), parameter, public debye
Definition physcon.F:201
subroutine, public get_qs_env(qs_env, atomic_kind_set, qs_kind_set, cell, super_cell, cell_ref, use_ref_cell, kpoints, dft_control, mos, sab_orb, sab_all, qmmm, qmmm_periodic, sac_ae, sac_ppl, sac_lri, sap_ppnl, sab_vdw, sab_scp, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_pp, sab_xtb_nonbond, sab_almo, sab_kp, sab_kp_nosym, sab_cneo, particle_set, energy, force, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, run_rtp, rtp, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_ks_im_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_ri_aux_kp, matrix_s, matrix_s_ri_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, rho, rho_xc, pw_env, ewald_env, ewald_pw, active_space, mpools, input, para_env, blacs_env, scf_control, rel_control, kinetic, qs_charges, vppl, rho_core, rho_nlcc, rho_nlcc_g, ks_env, ks_qmmm_env, wf_history, scf_env, local_particles, local_molecules, distribution_2d, dbcsr_dist, molecule_kind_set, molecule_set, subsys, cp_subsys, oce, local_rho_set, rho_atom_set, task_list, task_list_soft, rho0_atom_set, rho0_mpole, rhoz_set, rhoz_cneo_set, ecoul_1c, rho0_s_rs, rho0_s_gs, rhoz_cneo_s_rs, rhoz_cneo_s_gs, do_kpoints, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, nkind, natom, nelectron_total, nelectron_spin, efield, neighbor_list_id, linres_control, xas_env, virial, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, results, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, lri_env, lri_density, exstate_env, ec_env, harris_env, dispersion_env, gcp_env, vee, rho_external, external_vxc, mask, mp2_env, bs_env, kg_env, wanniercentres, atprop, ls_scf_env, do_transport, transport_env, v_hartree_rspace, s_mstruct_changed, rho_changed, potential_changed, forces_up_to_date, mscfg_env, almo_scf_env, gradient_history, variable_history, embed_pot, spin_embed_pot, polar_env, mos_last_converged, eeq, rhs, do_rixs, tb_tblite)
Get the QUICKSTEP environment.
Define the quickstep kind type and their sub types.
subroutine, public get_qs_kind(qs_kind, basis_set, basis_type, ncgf, nsgf, all_potential, tnadd_potential, gth_potential, sgp_potential, upf_potential, cneo_potential, se_parameter, dftb_parameter, xtb_parameter, dftb3_param, zatom, zeff, elec_conf, mao, lmax_dftb, alpha_core_charge, ccore_charge, core_charge, core_charge_radius, paw_proj_set, paw_atom, hard_radius, hard0_radius, max_rad_local, covalent_radius, vdw_radius, gpw_type_forced, harmonics, max_iso_not0, max_s_harm, grid_atom, ngrid_ang, ngrid_rad, lmax_rho0, dft_plus_u_atom, l_of_dft_plus_u, n_of_dft_plus_u, u_minus_j, u_of_dft_plus_u, j_of_dft_plus_u, alpha_of_dft_plus_u, beta_of_dft_plus_u, j0_of_dft_plus_u, occupation_of_dft_plus_u, dispersion, bs_occupation, magnetization, no_optimize, addel, laddel, naddel, orbitals, max_scf, eps_scf, smear, u_ramping, u_minus_j_target, eps_u_ramping, init_u_ramping_each_scf, reltmat, ghost, floating, name, element_symbol, pao_basis_size, pao_model_file, pao_potentials, pao_descriptors, nelec)
Get attributes of an atomic kind.
New version of the module for the localization of the molecular orbitals This should be able to use d...
Provides all information about an atomic kind.
Type defining parameters related to the simulation cell.
Definition cell_types.F:55
type of a logger, at the moment it contains just a print level starting at which level it should be l...
structure to store local (to a processor) ordered lists of integers.
stores all the informations relevant to an mpi environment
Provides all information about a quickstep kind.
contains all the info needed by quickstep to calculate the spread of a selected set of orbitals and i...