(git:f2099e5)
Loading...
Searching...
No Matches
qs_linres_polar_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 Polarizability calculation by dfpt
10!> Initialization of the polar_env,
11!> Perturbation Hamiltonian by application of the Berry phase operator to psi0
12!> Write output
13!> Deallocate everything
14!> periodic Raman SL February 2013
15!> \note
16! **************************************************************************************************
18 USE bibliography, ONLY: luber2014,&
19 cite_reference
20 USE cell_types, ONLY: cell_type
22 USE cp_dbcsr_api, ONLY: dbcsr_p_type
27 USE cp_fm_types, ONLY: cp_fm_create,&
36 USE cp_output_handling, ONLY: cp_p_file,&
48 USE kinds, ONLY: default_string_length,&
49 dp
50 USE machine, ONLY: m_flush
51 USE mathconstants, ONLY: twopi
53 USE physcon, ONLY: angstrom
65 USE qs_mo_types, ONLY: get_mo_set,&
68#include "./base/base_uses.f90"
69
70 IMPLICIT NONE
71
72 PRIVATE
73
75
76 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_linres_polar_utils'
77
78CONTAINS
79
80! **************************************************************************************************
81!> \brief Initialize the polar environment
82!> \param qs_env ...
83!> \par History
84!> 06.2018 polar_env integrated into qs_env (MK)
85! **************************************************************************************************
86 SUBROUTINE polar_env_init(qs_env)
87
88 TYPE(qs_environment_type), POINTER :: qs_env
89
90 CHARACTER(LEN=*), PARAMETER :: routinen = 'polar_env_init'
91
92 INTEGER :: handle, idir, iounit, ispin, m, nao, &
93 nmo, nspins
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
103
104 CALL timeset(routinen, handle)
105
106 NULLIFY (dft_control)
107 NULLIFY (linres_control)
108 NULLIFY (logger)
109 NULLIFY (matrix_s)
110 NULLIFY (mos)
111 NULLIFY (polar_env)
112 NULLIFY (lr_section, polar_section)
113
114 logger => cp_get_default_logger()
115 lr_section => section_vals_get_subs_vals(qs_env%input, "PROPERTIES%LINRES")
116
117 iounit = cp_print_key_unit_nr(logger, lr_section, "PRINT%PROGRAM_RUN_INFO", &
118 extension=".linresLog")
119
120 IF (iounit > 0) THEN
121 WRITE (iounit, "(/,(T2,A))") "POLAR| Starting polarizability calculation", &
122 "POLAR| Initialization of the polar environment"
123 END IF
124
125 polar_section => section_vals_get_subs_vals(qs_env%input, &
126 "PROPERTIES%LINRES%POLAR")
127
128 CALL get_qs_env(qs_env=qs_env, &
129 polar_env=polar_env, &
130 dft_control=dft_control, &
131 matrix_s=matrix_s, &
132 linres_control=linres_control, &
133 mos=mos)
134
135 ! Create polar environment if needed
136 IF (.NOT. ASSOCIATED(polar_env)) THEN
137 ALLOCATE (polar_env)
138 CALL set_qs_env(qs_env=qs_env, polar_env=polar_env)
139 END IF
140
141 nspins = dft_control%nspins
142
143 CALL section_vals_val_get(polar_section, "DO_RAMAN", l_val=polar_env%do_raman)
144 CALL section_vals_val_get(polar_section, "PERIODIC_DIPOLE_OPERATOR", l_val=polar_env%do_periodic)
145
146 ! Allocate components of the polar environment if needed
147 IF (.NOT. ASSOCIATED(polar_env%polar)) THEN
148 ALLOCATE (polar_env%polar(3, 3))
149 polar_env%polar(:, :) = 0.0_dp
150 END IF
151 IF (.NOT. ASSOCIATED(polar_env%dBerry_psi0)) THEN
152 ALLOCATE (polar_env%dBerry_psi0(3, nspins))
153 ELSE
154 ! Remove previous matrices
155 DO ispin = 1, nspins
156 DO idir = 1, 3
157 CALL cp_fm_release(polar_env%dBerry_psi0(idir, ispin))
158 END DO
159 END DO
160 END IF
161 IF (.NOT. ASSOCIATED(polar_env%psi1_dBerry)) THEN
162 ALLOCATE (polar_env%psi1_dBerry(3, nspins))
163 ELSE
164 ! Remove previous matrices
165 DO ispin = 1, nspins
166 DO idir = 1, 3
167 CALL cp_fm_release(polar_env%psi1_dBerry(idir, ispin))
168 END DO
169 END DO
170 END IF
171 DO ispin = 1, nspins
172 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, nao=nao, nmo=nmo)
173 CALL cp_fm_get_info(mo_coeff, ncol_global=m, nrow_global=nao)
174 NULLIFY (tmp_fm_struct)
175 CALL cp_fm_struct_create(tmp_fm_struct, nrow_global=nao, &
176 ncol_global=m, &
177 context=mo_coeff%matrix_struct%context)
178 DO idir = 1, 3
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)
181 END DO
182 CALL cp_fm_struct_release(tmp_fm_struct)
183 END DO
184
185 CALL cp_print_key_finished_output(iounit, logger, lr_section, &
186 "PRINT%PROGRAM_RUN_INFO")
187
188 CALL timestop(handle)
189
190 END SUBROUTINE polar_env_init
191
192! **************************************************************************************************
193!> \brief ...
194!> \param qs_env ...
195!> \par History
196!> 06.2018 polar_env integrated into qs_env (MK)
197! **************************************************************************************************
198 SUBROUTINE polar_polar(qs_env)
199
200 TYPE(qs_environment_type), POINTER :: qs_env
201
202 CHARACTER(LEN=*), PARAMETER :: routinen = 'polar_polar'
203
204 INTEGER :: handle, i, iounit, ispin, nspins, z
205 LOGICAL :: do_periodic, do_raman, run_stopped
206 REAL(dp) :: ptmp
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
214
215 CALL timeset(routinen, handle)
216
217 NULLIFY (cell, dft_control, polar, psi1_dberry, logger)
218 NULLIFY (mos, dberry_psi0)
219 logger => cp_get_default_logger()
220 iounit = cp_logger_get_default_io_unit(logger)
221
222 CALL get_qs_env(qs_env=qs_env, &
223 cell=cell, &
224 dft_control=dft_control, &
225 mos=mos, &
226 polar_env=polar_env)
227
228 nspins = dft_control%nspins
229
230 CALL get_polar_env(polar_env=polar_env, &
231 do_raman=do_raman, &
232 run_stopped=run_stopped)
233
234 IF (.NOT. run_stopped .AND. do_raman) THEN
235
236 CALL cite_reference(luber2014)
237
238 CALL get_polar_env(polar_env=polar_env, &
239 do_periodic=do_periodic, &
240 dberry_psi0=dberry_psi0, &
241 polar=polar, &
242 psi1_dberry=psi1_dberry)
243
244 ! Initialize
245 ALLOCATE (polar_tmp(3, 3))
246 polar_tmp(:, :) = 0.0_dp
247
248 DO i = 1, 3 ! directions of electric field
249 DO z = 1, 3 !dipole directions
250 DO ispin = 1, dft_control%nspins
251 !SL compute trace
252 ptmp = 0.0_dp
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
255 END DO
256 END DO
257 END DO !spin
258
259 IF (do_periodic) THEN
260 polar(:, :) = matmul(matmul(cell%hmat, polar_tmp), transpose(cell%hmat))/(twopi*twopi)
261 ELSE
262 polar(:, :) = polar_tmp(:, :)
263 END IF
264 !SL evtl maxocc instead?
265 IF (dft_control%nspins == 1) THEN
266 polar(:, :) = 2.0_dp*polar(:, :)
267 END IF
268
269 IF (ASSOCIATED(polar_tmp)) THEN
270 DEALLOCATE (polar_tmp)
271 END IF
272
273 END IF ! do_raman
274
275 CALL timestop(handle)
276
277 END SUBROUTINE polar_polar
278
279! **************************************************************************************************
280!> \brief Print information related to the polarisability tensor
281!> \param qs_env ...
282!> \par History
283!> 06.2018 polar_env integrated into qs_env (MK)
284! **************************************************************************************************
285 SUBROUTINE polar_print(qs_env)
286
287 TYPE(qs_environment_type), POINTER :: qs_env
288
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
299
300 NULLIFY (logger, dft_control, para_env, results)
301
302 CALL get_qs_env(qs_env=qs_env, &
303 dft_control=dft_control, &
304 polar_env=polar_env, &
305 results=results, &
306 para_env=para_env)
307
308 logger => cp_get_default_logger()
309 iounit = cp_logger_get_default_io_unit(logger)
310
311 polar_section => section_vals_get_subs_vals(qs_env%input, "PROPERTIES%LINRES%POLAR")
312
313 CALL get_polar_env(polar_env=polar_env, &
314 polar=polar, &
315 do_raman=do_raman, &
316 run_stopped=run_stopped)
317
318 IF (.NOT. run_stopped .AND. do_raman) THEN
319
320 description = "[POLAR]"
321 CALL cp_results_erase(results, description=description)
322 CALL put_results(results, description=description, values=polar(:, :))
323
324 IF (btest(cp_print_key_should_output(logger%iter_info, polar_section, &
325 "PRINT%POLAR_MATRIX"), cp_p_file)) THEN
326
327 unit_p = cp_print_key_unit_nr(logger, polar_section, "PRINT%POLAR_MATRIX", &
328 extension=".data", middle_name="raman", log_filename=.false.)
329 IF (unit_p > 0) THEN
330 IF (unit_p /= iounit) THEN
331 WRITE (unit_p, *)
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, &
338 polar(2, 2)*angstrom**3, polar(3, 3)*angstrom**3
339 WRITE (unit_p, '(T10,A,3F15.5)') "xy,xz,yz", polar(1, 2)*angstrom**3, &
340 polar(1, 3)*angstrom**3, polar(2, 3)*angstrom**3
341 WRITE (unit_p, '(T10,A,3F15.5)') "yx,zx,zy", polar(2, 1)*angstrom**3, &
342 polar(3, 1)*angstrom**3, polar(3, 2)*angstrom**3
343 CALL cp_print_key_finished_output(unit_p, logger, polar_section, &
344 "PRINT%POLAR_MATRIX")
345 END IF
346 END IF
347 END IF
348 IF (iounit > 0) THEN
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))') &
360 'POLAR| xx,yy,zz', polar(1, 1)*angstrom**3, polar(2, 2)*angstrom**3, polar(3, 3)*angstrom**3
361 WRITE (iounit, '(T2,A,T24,3(1X,F18.12))') &
362 'POLAR| xy,xz,yz', polar(1, 2)*angstrom**3, polar(1, 3)*angstrom**3, polar(2, 3)*angstrom**3
363 WRITE (iounit, '(T2,A,T24,3(1X,F18.12))') &
364 'POLAR| yx,zx,zy', polar(2, 1)*angstrom**3, polar(3, 1)*angstrom**3, polar(3, 2)*angstrom**3
365 END IF
366 IF (iounit > 0) THEN
367 WRITE (unit=iounit, fmt="(T2,A,T61,E20.12)") ' POLAR : CheckSum =', sum(polar)
368 END IF
369 END IF
370
371 END SUBROUTINE polar_print
372
373! **************************************************************************************************
374!> \brief Calculate the polarisability tensor using response theory
375!> \param p_env ...
376!> \param qs_env ...
377!> \par History
378!> 06.2018 polar_env integrated into qs_env (MK)
379! **************************************************************************************************
380 SUBROUTINE polar_response(p_env, qs_env)
381
382 TYPE(qs_p_env_type) :: p_env
383 TYPE(qs_environment_type), POINTER :: qs_env
384
385 CHARACTER(LEN=*), PARAMETER :: routinen = 'polar_response'
386
387 INTEGER :: handle, idir, iounit, ispin, nao, nmo, &
388 nspins
389 LOGICAL :: do_periodic, do_raman, should_stop
390 TYPE(cp_fm_struct_type), POINTER :: tmp_fm_struct
391 TYPE(cp_fm_type), ALLOCATABLE, DIMENSION(:) :: h1_psi0, psi0_order, psi1
392 TYPE(cp_fm_type), DIMENSION(:, :), POINTER :: dberry_psi0, psi1_dberry
393 TYPE(cp_fm_type), POINTER :: mo_coeff
394 TYPE(cp_logger_type), POINTER :: logger
395 TYPE(dft_control_type), POINTER :: dft_control
396 TYPE(linres_control_type), POINTER :: linres_control
397 TYPE(mo_set_type), DIMENSION(:), POINTER :: mos
398 TYPE(mp_para_env_type), POINTER :: para_env
399 TYPE(polar_env_type), POINTER :: polar_env
400 TYPE(qs_matrix_pools_type), POINTER :: mpools
401 TYPE(section_vals_type), POINTER :: lr_section, polar_section
402
403 CALL timeset(routinen, handle)
404
405 NULLIFY (dft_control, linres_control, lr_section, polar_section)
406 NULLIFY (logger, mpools, mo_coeff, para_env)
407 NULLIFY (tmp_fm_struct, psi1_dberry, dberry_psi0)
408
409 logger => cp_get_default_logger()
410 lr_section => section_vals_get_subs_vals(qs_env%input, "PROPERTIES%LINRES")
411 polar_section => section_vals_get_subs_vals(qs_env%input, &
412 "PROPERTIES%LINRES%POLAR")
413
414 iounit = cp_print_key_unit_nr(logger, lr_section, "PRINT%PROGRAM_RUN_INFO", &
415 extension=".linresLog")
416 IF (iounit > 0) THEN
417 WRITE (unit=iounit, fmt="(T2,A,/)") &
418 "POLAR| Self consistent optimization of the response wavefunctions"
419 END IF
420
421 CALL get_qs_env(qs_env=qs_env, &
422 dft_control=dft_control, &
423 mpools=mpools, &
424 linres_control=linres_control, &
425 mos=mos, &
426 polar_env=polar_env, &
427 para_env=para_env)
428
429 nspins = dft_control%nspins
430
431 CALL get_polar_env(polar_env=polar_env, do_raman=do_raman, do_periodic=do_periodic)
432
433 ! Allocate the vectors
434 ALLOCATE (psi0_order(nspins))
435 ALLOCATE (psi1(nspins), h1_psi0(nspins))
436 DO ispin = 1, nspins
437 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff)
438 psi0_order(ispin) = mo_coeff
439 CALL cp_fm_get_info(mo_coeff, ncol_global=nmo, nrow_global=nao)
440 NULLIFY (tmp_fm_struct)
441 CALL cp_fm_struct_create(tmp_fm_struct, nrow_global=nao, &
442 ncol_global=nmo, &
443 context=mo_coeff%matrix_struct%context)
444 CALL cp_fm_create(psi1(ispin), tmp_fm_struct)
445 CALL cp_fm_create(h1_psi0(ispin), tmp_fm_struct)
446 CALL cp_fm_struct_release(tmp_fm_struct)
447 END DO
448
449 IF (do_raman) THEN
450 CALL get_polar_env(polar_env=polar_env, &
451 psi1_dberry=psi1_dberry, &
452 dberry_psi0=dberry_psi0)
453 DO idir = 1, 3
454 DO ispin = 1, nspins
455 CALL cp_fm_set_all(psi1_dberry(idir, ispin), 0.0_dp)
456 END DO
457 END DO
458 ! Restart
459 IF (linres_control%linres_restart) THEN
460 DO idir = 1, 3
461 CALL linres_read_restart(qs_env, lr_section, psi1_dberry(idir, :), idir, "psi1_dBerry")
462 END DO
463 END IF
464 loop_idir: DO idir = 1, 3
465 IF (iounit > 0) THEN
466 IF (do_periodic) THEN
467 WRITE (iounit, "(/,T2,A)") &
468 "POLAR| Response to the perturbation operator Berry phase_"//achar(idir + 119)
469 ELSE
470 WRITE (iounit, "(/,T2,A)") &
471 "POLAR| Response to the perturbation operator R_"//achar(idir + 119)
472 END IF
473 END IF
474 ! Do scf cycle to optimize psi1
475 DO ispin = 1, nspins
476 CALL cp_fm_to_fm(psi1_dberry(idir, ispin), psi1(ispin))
477 CALL cp_fm_to_fm(dberry_psi0(idir, ispin), h1_psi0(ispin))
478 END DO
479 !
480 linres_control%lr_triplet = .false. ! we do singlet response
481 linres_control%do_kernel = .true. ! we do coupled response
482 linres_control%converged = .false.
483 CALL linres_solver(p_env, qs_env, psi1, h1_psi0, psi0_order, iounit, should_stop)
484
485 ! Copy the response
486 DO ispin = 1, nspins
487 CALL cp_fm_to_fm(psi1(ispin), psi1_dberry(idir, ispin))
488 END DO
489 !
490 ! Write the new result to the restart file
491 IF (linres_control%linres_restart) THEN
492 CALL linres_write_restart(qs_env, lr_section, psi1_dberry(idir, :), idir, "psi1_dBerry")
493 END IF
494 END DO loop_idir
495 END IF ! do_raman
496
497 CALL set_polar_env(polar_env, run_stopped=should_stop)
498
499 ! Clean up
500 CALL cp_fm_release(psi1)
501 CALL cp_fm_release(h1_psi0)
502
503 DEALLOCATE (psi0_order)
504
505 CALL cp_print_key_finished_output(iounit, logger, lr_section, &
506 "PRINT%PROGRAM_RUN_INFO")
507
508 CALL timestop(handle)
509
510 END SUBROUTINE polar_response
511
512! **************************************************************************************************
513!> \brief Prints the polarisability tensor to a file during MD runs
514!> \param force_env ...
515!> \param motion_section ...
516!> \param itimes ...
517!> \param time ...
518!> \param pos ...
519!> \param act ...
520!> \par History
521!> 06.2018 Creation (MK)
522!> \author Matthias Krack (MK)
523! **************************************************************************************************
524 SUBROUTINE write_polarisability_tensor(force_env, motion_section, itimes, time, pos, act)
525
526 TYPE(force_env_type), POINTER :: force_env
527 TYPE(section_vals_type), POINTER :: motion_section
528 INTEGER, INTENT(IN) :: itimes
529 REAL(kind=dp), INTENT(IN) :: time
530 CHARACTER(LEN=default_string_length), INTENT(IN), &
531 OPTIONAL :: pos, act
532
533 CHARACTER(LEN=default_string_length) :: my_act, my_pos
534 INTEGER :: iounit
535 LOGICAL :: do_raman, new_file, run_stopped
536 REAL(kind=dp), DIMENSION(:, :), POINTER :: polar
537 TYPE(cp_logger_type), POINTER :: logger
538 TYPE(polar_env_type), POINTER :: polar_env
539 TYPE(qs_environment_type), POINTER :: qs_env
540
541 NULLIFY (qs_env)
542
543 CALL force_env_get(force_env, qs_env=qs_env)
544 IF (ASSOCIATED(qs_env)) THEN
545 NULLIFY (polar_env)
546 CALL get_qs_env(qs_env=qs_env, polar_env=polar_env)
547 IF (ASSOCIATED(polar_env)) THEN
548 CALL get_polar_env(polar_env=polar_env, &
549 polar=polar, &
550 do_raman=do_raman, &
551 run_stopped=run_stopped)
552 IF (.NOT. run_stopped .AND. do_raman) THEN
553 NULLIFY (logger)
554 logger => cp_get_default_logger()
555 my_pos = "APPEND"
556 my_act = "WRITE"
557 IF (PRESENT(pos)) my_pos = pos
558 IF (PRESENT(act)) my_act = act
559 iounit = cp_print_key_unit_nr(logger, motion_section, "PRINT%POLAR_MATRIX", &
560 extension=".polar", file_position=my_pos, &
561 file_action=my_act, file_form="FORMATTED", &
562 is_new_file=new_file)
563 ELSE
564 iounit = 0
565 END IF
566 IF (iounit > 0) THEN
567 IF (new_file) THEN
568 WRITE (unit=iounit, fmt='(A,9(11X,A2," [a.u.]"),6X,A)') &
569 "# Step Time [fs]", "xx", "xy", "xz", "yx", "yy", "yz", "zx", "zy", "zz"
570 END IF
571 WRITE (unit=iounit, fmt='(I8,F12.3,9(1X,F19.8))') itimes, time, &
572 polar(1, 1), polar(1, 2), polar(1, 3), &
573 polar(2, 1), polar(2, 2), polar(2, 3), &
574 polar(3, 1), polar(3, 2), polar(3, 3)
575 CALL m_flush(iounit)
576 CALL cp_print_key_finished_output(iounit, logger, motion_section, "PRINT%POLAR_MATRIX")
577 END IF
578 END IF ! polar_env
579 END IF ! qs_env
580
581 END SUBROUTINE write_polarisability_tensor
582
583END MODULE qs_linres_polar_utils
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.
Definition cell_types.F:15
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
Definition cp_fm_types.F:15
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, nrow, ncol, set_zero)
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, ipi_env)
returns various attributes about the force environment
objects that represent the structure of input sections and the data contained in an input section
recursive type(section_vals_type) function, pointer, public section_vals_get_subs_vals(section_vals, subsection_name, i_rep_section, can_return_null)
returns the values of the requested subsection
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
integer, parameter, public default_string_length
Definition kinds.F:57
Machine interface based on Fortran 2003 and POSIX.
Definition machine.F:17
subroutine, public m_flush(lunit)
flushes units if the &GLOBAL flag is set accordingly
Definition machine.F:124
Definition of mathematical constants and functions.
real(kind=dp), parameter, public twopi
Interface to the message passing library MPI.
Definition of physical constants:
Definition physcon.F:68
real(kind=dp), parameter, public angstrom
Definition physcon.F:144
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, matrix_vhxc, 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.
subroutine, public set_qs_env(qs_env, super_cell, mos, qmmm, qmmm_periodic, mimic, 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, rhoz_cneo_set, 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, harris_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, eeq, rhs, do_rixs, tb_tblite)
Set the QUICKSTEP environment.
localize wavefunctions linear response scf
subroutine, public linres_solver(p_env, qs_env, psi1, h1_psi0, psi0_order, iounit, should_stop, silent)
scf loop to optimize the first order wavefunctions (psi1) given a perturbation as an operator applied...
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)
...
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 set_polar_env(polar_env, do_raman, do_periodic, dberry_psi0, polar, psi1_dberry, run_stopped)
...
subroutine, public get_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.
Definition qs_mo_types.F:22
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, cmo_coeff)
Get the components of a MO set data structure.
basis types for the calculation of the perturbation of density theory.
Type defining parameters related to the simulation cell.
Definition cell_types.F:60
keeps the information about the structure of a full matrix
represent a full matrix
type of a logger, at the moment it contains just a print level starting at which level it should be l...
contains arbitrary information which need to be stored
wrapper to abstract the force evaluation of the various methods
stores all the informations relevant to an mpi environment
General settings for linear response calculations.
container for the pools of matrixes used by qs
Represent a qs system that is perturbed. Can calculate the linear operator and the rhs of the system ...