(git:424e1d4)
Loading...
Searching...
No Matches
efield_utils.F
Go to the documentation of this file.
1!--------------------------------------------------------------------------------------------------!
2! CP2K: A general program to perform molecular dynamics simulations !
3! Copyright 2000-2026 CP2K developers group <https://cp2k.org> !
4! !
5! SPDX-License-Identifier: GPL-2.0-or-later !
6!--------------------------------------------------------------------------------------------------!
7
8! **************************************************************************************************
9!> \brief all routins needed for a nonperiodic electric field
10! **************************************************************************************************
11
15 USE cell_types, ONLY: cell_type,&
16 pbc
19 USE cp_dbcsr_api, ONLY: dbcsr_add,&
25 USE input_constants, ONLY: constant_env,&
29 USE kinds, ONLY: dp
30 USE mathconstants, ONLY: pi,&
31 twopi
33 USE physcon, ONLY: c_light_au
38 USE qs_kind_types, ONLY: get_qs_kind,&
41#include "./base/base_uses.f90"
42
43 IMPLICIT NONE
44
45 PRIVATE
46
47 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'efield_utils'
48
49! *** Public subroutines ***
50
54
55CONTAINS
56
57! **************************************************************************************************
58!> \brief Replace the original implementation of the electric-electronic
59!> interaction in the length gauge. This calculation is no longer done in
60!> the grid but using matrices to match the velocity gauge implementation.
61!> Note: The energy is stored in energy%core and computed later on.
62!> \param qs_env ...
63!> \author Guillaume Le Breton (02.23)
64! **************************************************************************************************
65
67
68 TYPE(qs_environment_type), POINTER :: qs_env
69
70 CHARACTER(len=*), PARAMETER :: routinen = 'efield_potential_lengh_gauge'
71
72 INTEGER :: handle, i, image
73 REAL(kind=dp) :: field(3)
74 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_s, moments
75 TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: matrix_h
76 TYPE(dft_control_type), POINTER :: dft_control
77
78 NULLIFY (dft_control)
79 CALL timeset(routinen, handle)
80
81 CALL get_qs_env(qs_env, &
82 dft_control=dft_control, &
83 matrix_h_kp=matrix_h, &
84 matrix_s=matrix_s)
85
86 NULLIFY (moments)
87 CALL dbcsr_allocate_matrix_set(moments, 3)
88 DO i = 1, 3
89 ALLOCATE (moments(i)%matrix)
90 CALL dbcsr_copy(moments(i)%matrix, matrix_s(1)%matrix, "Moments")
91 CALL dbcsr_set(moments(i)%matrix, 0.0_dp)
92 END DO
93
94 CALL build_local_moment_matrix(qs_env, moments, 1)
95
96 CALL make_field(dft_control, field, qs_env%sim_step, qs_env%sim_time)
97
98 DO i = 1, 3
99 DO image = 1, dft_control%nimages
100 CALL dbcsr_add(matrix_h(1, image)%matrix, moments(i)%matrix, 1.0_dp, field(i))
101 END DO
102 END DO
103
104 CALL dbcsr_deallocate_matrix_set(moments)
105
106 CALL timestop(handle)
107
108 END SUBROUTINE efield_potential_lengh_gauge
109
110! **************************************************************************************************
111!> \brief computes the amplitude of the efield within a given envelop
112!> \param dft_control ...
113!> \param field ...
114!> \param sim_step ...
115!> \param sim_time ...
116!> \author Florian Schiffmann (02.09)
117! **************************************************************************************************
118
119 SUBROUTINE make_field(dft_control, field, sim_step, sim_time)
120 TYPE(dft_control_type), INTENT(IN) :: dft_control
121 REAL(dp), INTENT(OUT) :: field(3)
122 INTEGER, INTENT(IN) :: sim_step
123 REAL(kind=dp), INTENT(IN) :: sim_time
124
125 INTEGER :: i, lower, nfield, upper
126 REAL(dp) :: e_0, env, nu, pol(3), strength
127 REAL(kind=dp) :: dt
128 TYPE(efield_type), POINTER :: efield
129
130 field = 0._dp
131 nfield = SIZE(dft_control%efield_fields)
132 DO i = 1, nfield
133 efield => dft_control%efield_fields(i)%efield
134 nu = 0.0_dp
135 IF (.NOT. efield%envelop_id == custom_env .AND. efield%wavelength > epsilon(0.0_dp)) THEN
136 nu = c_light_au/(efield%wavelength) !in case of a custom efield we do not need nu
137 END IF
138 e_0 = efield%amplitude
139
140 IF (dot_product(efield%polarisation, efield%polarisation) == 0) THEN
141 pol(:) = 1.0_dp/3.0_dp
142 ELSE
143 pol(:) = efield%polarisation(:)/(sqrt(dot_product(efield%polarisation, efield%polarisation)))
144 END IF
145
146 SELECT CASE (efield%envelop_id)
147 CASE (constant_env)
148 IF (sim_step >= efield%envelop_i_vars(1) .AND. &
149 (sim_step <= efield%envelop_i_vars(2) .OR. efield%envelop_i_vars(2) < 0)) THEN
150 field = field + e_0*cos(sim_time*nu*twopi + &
151 efield%phase_offset*pi)*pol(:)
152 END IF
153 CASE (ramp_env)
154 IF (sim_step >= efield%envelop_i_vars(1) .AND. sim_step <= efield%envelop_i_vars(2)) &
155 strength = e_0*(sim_step - efield%envelop_i_vars(1))/(efield%envelop_i_vars(2) - efield%envelop_i_vars(1))
156 IF (sim_step >= efield%envelop_i_vars(3) .AND. sim_step <= efield%envelop_i_vars(4)) &
157 strength = e_0*(efield%envelop_i_vars(4) - sim_step)/(efield%envelop_i_vars(4) - efield%envelop_i_vars(3))
158 IF (sim_step > efield%envelop_i_vars(4) .AND. efield%envelop_i_vars(4) > 0) strength = 0.0_dp
159 IF (sim_step <= efield%envelop_i_vars(1)) strength = 0.0_dp
160 field = field + strength*cos(sim_time*nu*twopi + &
161 efield%phase_offset*pi)*pol(:)
162 CASE (gaussian_env)
163 env = exp(-0.5_dp*((sim_time - efield%envelop_r_vars(1))/efield%envelop_r_vars(2))**2.0_dp)
164 field = field + e_0*env*cos(sim_time*nu*twopi + &
165 efield%phase_offset*pi)*pol(:)
166 CASE (custom_env)
167 dt = efield%envelop_r_vars(1)
168 IF (sim_time < (SIZE(efield%envelop_r_vars) - 2)*dt) THEN
169 !make a linear interpolation between the two next points
170 lower = floor(sim_time/dt)
171 upper = lower + 1
172 strength = (efield%envelop_r_vars(lower + 2)*(upper*dt - sim_time) &
173 + efield%envelop_r_vars(upper + 2)*(sim_time - lower*dt))/dt
174 ELSE
175 strength = 0.0_dp
176 END IF
177 field = field + strength*pol(:)
178 CASE default
179 END SELECT
180 END DO
181
182 END SUBROUTINE make_field
183
184! **************************************************************************************************
185!> \brief Computes the force and the energy due to a efield on the cores
186!> Note: In the velocity gauge, the energy term is not added because
187!> it would lead to an unbalanced energy (center of negative charge not
188!> involved in the electric energy in this gauge).
189!> \param qs_env ...
190!> \param calculate_forces ...
191!> \author Florian Schiffmann (02.09)
192! **************************************************************************************************
193
194 SUBROUTINE calculate_ecore_efield(qs_env, calculate_forces)
195 TYPE(qs_environment_type), POINTER :: qs_env
196 LOGICAL, OPTIONAL :: calculate_forces
197
198 CHARACTER(len=*), PARAMETER :: routinen = 'calculate_ecore_efield'
199
200 INTEGER :: atom_a, handle, iatom, ikind, natom, &
201 nkind
202 INTEGER, DIMENSION(:), POINTER :: list
203 LOGICAL :: my_force
204 REAL(kind=dp) :: efield_ener, zeff
205 REAL(kind=dp), DIMENSION(3) :: field, r
206 TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
207 TYPE(cell_type), POINTER :: cell
208 TYPE(dft_control_type), POINTER :: dft_control
209 TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
210 TYPE(qs_energy_type), POINTER :: energy
211 TYPE(qs_force_type), DIMENSION(:), POINTER :: force
212 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
213
214 NULLIFY (dft_control)
215 CALL timeset(routinen, handle)
216 CALL get_qs_env(qs_env, dft_control=dft_control)
217 IF (dft_control%apply_efield_field .OR. dft_control%apply_vector_potential) THEN
218 my_force = .false.
219 IF (PRESENT(calculate_forces)) my_force = calculate_forces
220
221 CALL get_qs_env(qs_env=qs_env, &
222 atomic_kind_set=atomic_kind_set, &
223 qs_kind_set=qs_kind_set, &
224 energy=energy, &
225 particle_set=particle_set, &
226 cell=cell)
227 efield_ener = 0.0_dp
228 nkind = SIZE(atomic_kind_set)
229 CALL make_field(dft_control, field, qs_env%sim_step, qs_env%sim_time)
230
231 DO ikind = 1, SIZE(atomic_kind_set)
232 CALL get_atomic_kind(atomic_kind_set(ikind), atom_list=list, natom=natom)
233 CALL get_qs_kind(qs_kind_set(ikind), zeff=zeff)
234
235 natom = SIZE(list)
236 DO iatom = 1, natom
237 IF (dft_control%apply_efield_field) THEN
238 atom_a = list(iatom)
239 r(:) = pbc(particle_set(atom_a)%r(:), cell)
240 efield_ener = efield_ener - zeff*dot_product(r, field)
241 END IF
242 IF (my_force) THEN
243 CALL get_qs_env(qs_env=qs_env, force=force)
244 force(ikind)%efield(:, iatom) = force(ikind)%efield(:, iatom) - field*zeff
245 END IF
246 END DO
247
248 END DO
249 IF (dft_control%apply_efield_field) energy%efield_core = efield_ener
250 END IF
251 CALL timestop(handle)
252 END SUBROUTINE calculate_ecore_efield
253END MODULE efield_utils
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...
subroutine, public dbcsr_copy(matrix_b, matrix_a, name, keep_sparsity, keep_imaginary)
...
subroutine, public dbcsr_set(matrix, alpha)
...
subroutine, public dbcsr_add(matrix_a, matrix_b, alpha_scalar, beta_scalar)
...
DBCSR operations in CP2K.
all routins needed for a nonperiodic electric field
subroutine, public make_field(dft_control, field, sim_step, sim_time)
computes the amplitude of the efield within a given envelop
subroutine, public calculate_ecore_efield(qs_env, calculate_forces)
Computes the force and the energy due to a efield on the cores Note: In the velocity gauge,...
subroutine, public efield_potential_lengh_gauge(qs_env)
Replace the original implementation of the electric-electronic interaction in the length gauge....
collects all constants needed in input so that they can be used without circular dependencies
integer, parameter, public ramp_env
integer, parameter, public constant_env
integer, parameter, public gaussian_env
integer, parameter, public custom_env
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public dp
Definition kinds.F:34
An array-based list which grows on demand. When the internal array is full, a new array of twice the ...
Definition list.F:24
Definition of mathematical constants and functions.
real(kind=dp), parameter, public pi
real(kind=dp), parameter, public twopi
Define the data structure for the particle information.
Definition of physical constants:
Definition physcon.F:68
real(kind=dp), parameter, public c_light_au
Definition physcon.F:90
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, mimic, 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, xcint_weights, 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, monovalent, floating, name, element_symbol, pao_basis_size, pao_model_file, pao_potentials, pao_descriptors, nelec)
Get attributes of an atomic kind.
Calculates the moment integrals <a|r^m|b> and <a|r x d/dr|b>
Definition qs_moments.F:14
subroutine, public build_local_moment_matrix(qs_env, moments, nmoments, ref_point, ref_points, basis_type)
...
Definition qs_moments.F:593
Provides all information about an atomic kind.
Type defining parameters related to the simulation cell.
Definition cell_types.F:60
Provides all information about a quickstep kind.