42 USE dbcsr_api,
ONLY: dbcsr_p_type
68 #include "./base/base_uses.f90"
76 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'qs_linres_polar_utils'
88 TYPE(qs_environment_type),
POINTER :: qs_env
90 CHARACTER(LEN=*),
PARAMETER :: routinen =
'polar_env_init'
92 INTEGER :: handle, idir, iounit, ispin, m, nao, &
94 TYPE(cp_fm_struct_type),
POINTER :: tmp_fm_struct
95 TYPE(cp_fm_type),
POINTER :: mo_coeff
96 TYPE(cp_logger_type),
POINTER :: logger
97 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_s
98 TYPE(dft_control_type),
POINTER :: dft_control
99 TYPE(linres_control_type),
POINTER :: linres_control
100 TYPE(mo_set_type),
DIMENSION(:),
POINTER :: mos
101 TYPE(polar_env_type),
POINTER :: polar_env
102 TYPE(section_vals_type),
POINTER :: lr_section, polar_section
104 CALL timeset(routinen, handle)
106 NULLIFY (dft_control)
107 NULLIFY (linres_control)
112 NULLIFY (lr_section, polar_section)
118 extension=
".linresLog")
121 WRITE (iounit,
"(/,(T2,A))")
"POLAR| Starting polarizability calculation", &
122 "POLAR| Initialization of the polar environment"
126 "PROPERTIES%LINRES%POLAR")
129 polar_env=polar_env, &
130 dft_control=dft_control, &
132 linres_control=linres_control, &
136 IF (.NOT.
ASSOCIATED(polar_env))
THEN
138 CALL set_qs_env(qs_env=qs_env, polar_env=polar_env)
141 nspins = dft_control%nspins
144 CALL section_vals_val_get(polar_section,
"PERIODIC_DIPOLE_OPERATOR", l_val=polar_env%do_periodic)
147 IF (.NOT.
ASSOCIATED(polar_env%polar))
THEN
148 ALLOCATE (polar_env%polar(3, 3))
149 polar_env%polar(:, :) = 0.0_dp
151 IF (.NOT.
ASSOCIATED(polar_env%dBerry_psi0))
THEN
152 ALLOCATE (polar_env%dBerry_psi0(3, nspins))
157 CALL cp_fm_release(polar_env%dBerry_psi0(idir, ispin))
161 IF (.NOT.
ASSOCIATED(polar_env%psi1_dBerry))
THEN
162 ALLOCATE (polar_env%psi1_dBerry(3, nspins))
167 CALL cp_fm_release(polar_env%psi1_dBerry(idir, ispin))
172 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, nao=nao, nmo=nmo)
174 NULLIFY (tmp_fm_struct)
177 context=mo_coeff%matrix_struct%context)
179 CALL cp_fm_create(polar_env%dBerry_psi0(idir, ispin), tmp_fm_struct)
180 CALL cp_fm_create(polar_env%psi1_dBerry(idir, ispin), tmp_fm_struct)
186 "PRINT%PROGRAM_RUN_INFO")
188 CALL timestop(handle)
200 TYPE(qs_environment_type),
POINTER :: qs_env
202 CHARACTER(LEN=*),
PARAMETER :: routinen =
'polar_polar'
204 INTEGER :: handle, i, iounit, ispin, nspins, z
205 LOGICAL :: do_periodic, do_raman, run_stopped
207 REAL(
dp),
DIMENSION(:, :),
POINTER :: polar, polar_tmp
208 TYPE(cell_type),
POINTER :: cell
209 TYPE(cp_fm_type),
DIMENSION(:, :),
POINTER :: dberry_psi0, psi1_dberry
210 TYPE(cp_logger_type),
POINTER :: logger
211 TYPE(dft_control_type),
POINTER :: dft_control
212 TYPE(mo_set_type),
DIMENSION(:),
POINTER :: mos
213 TYPE(polar_env_type),
POINTER :: polar_env
215 CALL timeset(routinen, handle)
217 NULLIFY (cell, dft_control, polar, psi1_dberry, logger)
218 NULLIFY (mos, dberry_psi0)
224 dft_control=dft_control, &
228 nspins = dft_control%nspins
232 run_stopped=run_stopped)
234 IF (.NOT. run_stopped .AND. do_raman)
THEN
239 do_periodic=do_periodic, &
240 dberry_psi0=dberry_psi0, &
242 psi1_dberry=psi1_dberry)
245 ALLOCATE (polar_tmp(3, 3))
246 polar_tmp(:, :) = 0.0_dp
250 DO ispin = 1, dft_control%nspins
253 CALL cp_fm_trace(psi1_dberry(i, ispin), dberry_psi0(z, ispin), ptmp)
254 polar_tmp(i, z) = polar_tmp(i, z) - 2.0_dp*ptmp
259 IF (do_periodic)
THEN
260 polar(:, :) = matmul(matmul(cell%hmat, polar_tmp), transpose(cell%hmat))/(
twopi*
twopi)
262 polar(:, :) = polar_tmp(:, :)
265 IF (dft_control%nspins == 1)
THEN
266 polar(:, :) = 2.0_dp*polar(:, :)
269 IF (
ASSOCIATED(polar_tmp))
THEN
270 DEALLOCATE (polar_tmp)
275 CALL timestop(handle)
287 TYPE(qs_environment_type),
POINTER :: qs_env
289 CHARACTER(LEN=default_string_length) :: description
290 INTEGER :: iounit, unit_p
291 LOGICAL :: do_raman, run_stopped
292 REAL(
dp),
DIMENSION(:, :),
POINTER :: polar
293 TYPE(cp_logger_type),
POINTER :: logger
294 TYPE(cp_result_type),
POINTER :: results
295 TYPE(dft_control_type),
POINTER :: dft_control
296 TYPE(mp_para_env_type),
POINTER :: para_env
297 TYPE(polar_env_type),
POINTER :: polar_env
298 TYPE(section_vals_type),
POINTER :: polar_section
300 NULLIFY (logger, dft_control, para_env, results)
303 dft_control=dft_control, &
304 polar_env=polar_env, &
316 run_stopped=run_stopped)
318 IF (.NOT. run_stopped .AND. do_raman)
THEN
320 description =
"[POLAR]"
322 CALL put_results(results, description=description, values=polar(:, :))
328 extension=
".data", middle_name=
"raman", log_filename=.false.)
330 IF (unit_p /= iounit)
THEN
332 WRITE (unit_p,
'(T10,A)')
'POLARIZABILITY TENSOR (atomic units):'
333 WRITE (unit_p,
'(T10,A,3F15.5)')
"xx,yy,zz", polar(1, 1), polar(2, 2), polar(3, 3)
334 WRITE (unit_p,
'(T10,A,3F15.5)')
"xy,xz,yz", polar(1, 2), polar(1, 3), polar(2, 3)
335 WRITE (unit_p,
'(T10,A,3F15.5)')
"yx,zx,zy", polar(2, 1), polar(3, 1), polar(3, 2)
336 WRITE (unit_p,
'(T10,A)')
'POLARIZABILITY TENSOR (Angstrom^3):'
337 WRITE (unit_p,
'(T10,A,3F15.5)')
"xx,yy,zz", polar(1, 1)*
angstrom**3, &
339 WRITE (unit_p,
'(T10,A,3F15.5)')
"xy,xz,yz", polar(1, 2)*
angstrom**3, &
341 WRITE (unit_p,
'(T10,A,3F15.5)')
"yx,zx,zy", polar(2, 1)*
angstrom**3, &
344 "PRINT%POLAR_MATRIX")
349 WRITE (iounit,
'(/,T2,A)') &
350 'POLAR| Polarizability tensor [a.u.]'
351 WRITE (iounit,
'(T2,A,T24,3(1X,F18.12))') &
352 'POLAR| xx,yy,zz', polar(1, 1), polar(2, 2), polar(3, 3)
353 WRITE (iounit,
'(T2,A,T24,3(1X,F18.12))') &
354 'POLAR| xy,xz,yz', polar(1, 2), polar(1, 3), polar(2, 3)
355 WRITE (iounit,
'(T2,A,T24,3(1X,F18.12))') &
356 'POLAR| yx,zx,zy', polar(2, 1), polar(3, 1), polar(3, 2)
357 WRITE (iounit,
'(/,T2,A)') &
358 'POLAR| Polarizability tensor [ang^3]'
359 WRITE (iounit,
'(T2,A,T24,3(1X,F18.12))') &
361 WRITE (iounit,
'(T2,A,T24,3(1X,F18.12))') &
363 WRITE (iounit,
'(T2,A,T24,3(1X,F18.12))') &
379 TYPE(qs_p_env_type) :: p_env
380 TYPE(qs_environment_type),
POINTER :: qs_env
382 CHARACTER(LEN=*),
PARAMETER :: routinen =
'polar_response'
384 INTEGER :: handle, idir, iounit, ispin, nao, nmo, &
386 LOGICAL :: do_periodic, do_raman, should_stop
387 TYPE(cp_fm_struct_type),
POINTER :: tmp_fm_struct
388 TYPE(cp_fm_type),
ALLOCATABLE,
DIMENSION(:) :: h1_psi0, psi0_order, psi1
389 TYPE(cp_fm_type),
DIMENSION(:, :),
POINTER :: dberry_psi0, psi1_dberry
390 TYPE(cp_fm_type),
POINTER :: mo_coeff
391 TYPE(cp_logger_type),
POINTER :: logger
392 TYPE(dft_control_type),
POINTER :: dft_control
393 TYPE(linres_control_type),
POINTER :: linres_control
394 TYPE(mo_set_type),
DIMENSION(:),
POINTER :: mos
395 TYPE(mp_para_env_type),
POINTER :: para_env
396 TYPE(polar_env_type),
POINTER :: polar_env
397 TYPE(qs_matrix_pools_type),
POINTER :: mpools
398 TYPE(section_vals_type),
POINTER :: lr_section, polar_section
400 CALL timeset(routinen, handle)
402 NULLIFY (dft_control, linres_control, lr_section, polar_section)
403 NULLIFY (logger, mpools, mo_coeff, para_env)
404 NULLIFY (tmp_fm_struct, psi1_dberry, dberry_psi0)
409 "PROPERTIES%LINRES%POLAR")
412 extension=
".linresLog")
414 WRITE (unit=iounit, fmt=
"(T2,A,/)") &
415 "POLAR| Self consistent optimization of the response wavefunctions"
419 dft_control=dft_control, &
421 linres_control=linres_control, &
423 polar_env=polar_env, &
426 nspins = dft_control%nspins
428 CALL get_polar_env(polar_env=polar_env, do_raman=do_raman, do_periodic=do_periodic)
431 ALLOCATE (psi0_order(nspins))
432 ALLOCATE (psi1(nspins), h1_psi0(nspins))
434 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff)
435 psi0_order(ispin) = mo_coeff
437 NULLIFY (tmp_fm_struct)
440 context=mo_coeff%matrix_struct%context)
448 psi1_dberry=psi1_dberry, &
449 dberry_psi0=dberry_psi0)
451 IF (linres_control%linres_restart)
THEN
462 loop_idir:
DO idir = 1, 3
464 IF (do_periodic)
THEN
465 WRITE (iounit,
"(/,T2,A)") &
466 "POLAR| Response to the perturbation operator Berry phase_"//achar(idir + 119)
468 WRITE (iounit,
"(/,T2,A)") &
469 "POLAR| Response to the perturbation operator R_"//achar(idir + 119)
474 CALL cp_fm_to_fm(psi1_dberry(idir, ispin), psi1(ispin))
475 CALL cp_fm_to_fm(dberry_psi0(idir, ispin), h1_psi0(ispin))
478 linres_control%lr_triplet = .false.
479 linres_control%do_kernel = .true.
480 linres_control%converged = .false.
481 CALL linres_solver(p_env, qs_env, psi1, h1_psi0, psi0_order, iounit, should_stop)
485 CALL cp_fm_to_fm(psi1(ispin), psi1_dberry(idir, ispin))
489 IF (linres_control%linres_restart)
THEN
498 CALL cp_fm_release(psi1)
499 CALL cp_fm_release(h1_psi0)
501 DEALLOCATE (psi0_order)
504 "PRINT%PROGRAM_RUN_INFO")
506 CALL timestop(handle)
524 TYPE(force_env_type),
POINTER :: force_env
525 TYPE(section_vals_type),
POINTER :: motion_section
526 INTEGER,
INTENT(IN) :: itimes
527 REAL(kind=
dp),
INTENT(IN) :: time
528 CHARACTER(LEN=default_string_length),
INTENT(IN), &
531 CHARACTER(LEN=default_string_length) :: my_act, my_pos
533 LOGICAL :: do_raman, new_file, run_stopped
534 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: polar
535 TYPE(cp_logger_type),
POINTER :: logger
536 TYPE(polar_env_type),
POINTER :: polar_env
537 TYPE(qs_environment_type),
POINTER :: qs_env
542 IF (
ASSOCIATED(qs_env))
THEN
544 CALL get_qs_env(qs_env=qs_env, polar_env=polar_env)
545 IF (
ASSOCIATED(polar_env))
THEN
549 run_stopped=run_stopped)
550 IF (.NOT. run_stopped .AND. do_raman)
THEN
555 IF (
PRESENT(pos)) my_pos = pos
556 IF (
PRESENT(act)) my_act = act
558 extension=
".polar", file_position=my_pos, &
559 file_action=my_act, file_form=
"FORMATTED", &
560 is_new_file=new_file)
566 WRITE (unit=iounit, fmt=
'(A,9(11X,A2," [a.u.]"),6X,A)') &
567 "# Step Time [fs]",
"xx",
"xy",
"xz",
"yx",
"yy",
"yz",
"zx",
"zy",
"zz"
569 WRITE (unit=iounit, fmt=
'(I8,F12.3,9(1X,F19.8))') itimes, time, &
570 polar(1, 1), polar(1, 2), polar(1, 3), &
571 polar(2, 1), polar(2, 2), polar(2, 3), &
572 polar(3, 1), polar(3, 2), polar(3, 3)
collects all references to literature in CP2K as new algorithms / method are included from literature...
integer, save, public luber2014
Handles all functions related to the CELL.
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
basic linear algebra operations for full matrices
represent the structure of a full matrix
subroutine, public cp_fm_struct_create(fmstruct, para_env, context, nrow_global, ncol_global, nrow_block, ncol_block, descriptor, first_p_pos, local_leading_dimension, template_fmstruct, square_blocks, force_block)
allocates and initializes a full matrix structure
subroutine, public cp_fm_struct_release(fmstruct)
releases a full matrix structure
represent a full matrix distributed on many processors
subroutine, public cp_fm_get_info(matrix, name, nrow_global, ncol_global, nrow_block, ncol_block, nrow_local, ncol_local, row_indices, col_indices, local_data, context, nrow_locals, ncol_locals, matrix_struct, para_env)
returns all kind of information about the full matrix
subroutine, public cp_fm_set_all(matrix, alpha, beta)
set all elements of a matrix to the same value, and optionally the diagonal to a different one
subroutine, public cp_fm_create(matrix, matrix_struct, name, use_sp)
creates a new full matrix with the given structure
various routines to log and control the output. The idea is that decisions about where to log should ...
integer function, public cp_logger_get_default_io_unit(logger)
returns the unit nr for the ionode (-1 on all other processors) skips as well checks if the procs cal...
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, parameter, public cp_p_file
integer function, public cp_print_key_should_output(iteration_info, basis_section, print_key_path, used_print_key, first_time)
returns what should be done with the given property if btest(res,cp_p_store) then the property should...
set of type/routines to handle the storage of results in force_envs
subroutine, public cp_results_erase(results, description, nval)
erase a part of result_list
set of type/routines to handle the storage of results in force_envs
Interface for the force calculations.
recursive subroutine, public force_env_get(force_env, in_use, fist_env, qs_env, meta_env, fp_env, subsys, para_env, potential_energy, additional_potential, kinetic_energy, harmonic_shell, kinetic_shell, cell, sub_force_env, qmmm_env, qmmmx_env, eip_env, pwdft_env, globenv, input, force_env_section, method_name_id, root_section, mixed_env, nnp_env, embed_env)
returns various attributes about the force environment
Defines the basic variable types.
integer, parameter, public dp
integer, parameter, public default_string_length
Machine interface based on Fortran 2003 and POSIX.
subroutine, public m_flush(lunit)
flushes units if the &GLOBAL flag is set accordingly
Definition of mathematical constants and functions.
real(kind=dp), parameter, public twopi
Interface to the message passing library MPI.
Definition of physical constants:
real(kind=dp), parameter, public angstrom
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_nonbond, sab_almo, sab_kp, sab_kp_nosym, 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, ecoul_1c, rho0_s_rs, rho0_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, 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, rhs)
Get the QUICKSTEP environment.
subroutine, public set_qs_env(qs_env, super_cell, mos, qmmm, qmmm_periodic, ewald_env, ewald_pw, mpools, rho_external, external_vxc, mask, scf_control, rel_control, qs_charges, ks_env, ks_qmmm_env, wf_history, scf_env, active_space, input, oce, rho_atom_set, rho0_atom_set, rho0_mpole, run_rtp, rtp, rhoz_set, rhoz_tot, ecoul_1c, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, efield, linres_control, xas_env, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, ls_scf_env, do_transport, transport_env, lri_env, lri_density, exstate_env, ec_env, dispersion_env, gcp_env, mp2_env, bs_env, kg_env, force, kpoints, WannierCentres, almo_scf_env, gradient_history, variable_history, embed_pot, spin_embed_pot, polar_env, mos_last_converged, rhs)
Set the QUICKSTEP environment.
localize wavefunctions linear response scf
subroutine, public linres_write_restart(qs_env, linres_section, vec, ivec, tag, ind)
...
subroutine, public linres_read_restart(qs_env, linres_section, vec, ivec, tag, ind)
...
subroutine, public linres_solver(p_env, qs_env, psi1, h1_psi0, psi0_order, iounit, should_stop)
scf loop to optimize the first order wavefunctions (psi1) given a perturbation as an operator applied...
Polarizability calculation by dfpt Initialization of the polar_env, Perturbation Hamiltonian by appli...
subroutine, public write_polarisability_tensor(force_env, motion_section, itimes, time, pos, act)
Prints the polarisability tensor to a file during MD runs.
subroutine, public polar_polar(qs_env)
...
subroutine, public polar_print(qs_env)
Print information related to the polarisability tensor.
subroutine, public polar_env_init(qs_env)
Initialize the polar environment.
subroutine, public polar_response(p_env, qs_env)
Calculate the polarisability tensor using response theory.
Type definitiona for linear response calculations.
subroutine, public get_polar_env(polar_env, do_raman, do_periodic, dBerry_psi0, polar, psi1_dBerry, run_stopped)
...
subroutine, public set_polar_env(polar_env, do_raman, do_periodic, dBerry_psi0, polar, psi1_dBerry, run_stopped)
...
wrapper for the pools of matrixes
Definition and initialisation of the mo data type.
subroutine, public get_mo_set(mo_set, maxocc, homo, lfomo, nao, nelectron, n_el_f, nmo, eigenvalues, occupation_numbers, mo_coeff, mo_coeff_b, uniform_occupation, kTS, mu, flexible_electron_count)
Get the components of a MO set data structure.
basis types for the calculation of the perturbation of density theory.