(git:6344619)
Loading...
Searching...
No Matches
qs_vcd_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
9 USE cell_types, ONLY: cell_type
12 USE cp_dbcsr_api, ONLY: dbcsr_copy,&
16 dbcsr_set,&
17 dbcsr_type_antisymmetric,&
18 dbcsr_type_no_symmetry
22 USE cp_files, ONLY: close_file,&
24 USE cp_fm_types, ONLY: cp_fm_create,&
34 USE cp_output_handling, ONLY: cp_p_file,&
45 USE kinds, ONLY: default_path_length,&
47 dp
60 USE qs_mo_types, ONLY: get_mo_set,&
65 USE qs_vcd_ao, ONLY: build_com_rpnl_r,&
67 USE string_utilities, ONLY: xstring
68#include "./base/base_uses.f90"
69
70 IMPLICIT NONE
71
72 PRIVATE
75 PUBLIC :: vcd_print
76
77 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_vcd_utils'
78
79 REAL(dp), DIMENSION(3, 3, 3), PARAMETER :: Levi_Civita = reshape([ &
80 0.0_dp, 0.0_dp, 0.0_dp, 0.0_dp, 0.0_dp, -1.0_dp, 0.0_dp, 1.0_dp, 0.0_dp, &
81 0.0_dp, 0.0_dp, 1.0_dp, 0.0_dp, 0.0_dp, 0.0_dp, -1.0_dp, 0.0_dp, 0.0_dp, &
82 0.0_dp, -1.0_dp, 0.0_dp, 1.0_dp, 0.0_dp, 0.0_dp, 0.0_dp, 0.0_dp, 0.0_dp], [3, 3, 3])
83
84CONTAINS
85
86! *****************************************************************************
87!> \brief Initialize the vcd environment
88!> \param vcd_env ...
89!> \param qs_env ...
90!> \author Edward Ditler
91! **************************************************************************************************
92 SUBROUTINE vcd_env_init(vcd_env, qs_env)
93 TYPE(vcd_env_type), TARGET :: vcd_env
94 TYPE(qs_environment_type), POINTER :: qs_env
95
96 CHARACTER(LEN=*), PARAMETER :: routinen = 'vcd_env_init'
97
98 INTEGER :: handle, i, idir, ispin, j, natom, &
99 nspins, output_unit, reference, &
100 unit_number
101 LOGICAL :: explicit
102 REAL(kind=dp), DIMENSION(:), POINTER :: ref_point
103 TYPE(cell_type), POINTER :: cell
104 TYPE(cp_logger_type), POINTER :: logger
105 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_ks
106 TYPE(dft_control_type), POINTER :: dft_control
107 TYPE(neighbor_list_set_p_type), DIMENSION(:), &
108 POINTER :: sab_all, sab_orb, sap_ppnl
109 TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
110 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
111 TYPE(qs_ks_env_type), POINTER :: ks_env
112 TYPE(section_vals_type), POINTER :: lr_section, vcd_section
113
114 CALL timeset(routinen, handle)
115 vcd_env%do_mfp = .false.
116
117 ! Set up the logger
118 NULLIFY (logger, vcd_section, lr_section)
119 logger => cp_get_default_logger()
120 vcd_section => section_vals_get_subs_vals(qs_env%input, "PROPERTIES%LINRES%VCD")
121 vcd_env%output_unit = cp_print_key_unit_nr(logger, vcd_section, "PRINT%VCD", &
122 extension=".data", middle_name="vcd", log_filename=.false., &
123 file_position="REWIND", file_status="REPLACE")
124
125 lr_section => section_vals_get_subs_vals(qs_env%input, "PROPERTIES%LINRES")
126 output_unit = cp_print_key_unit_nr(logger, lr_section, "PRINT%PROGRAM_RUN_INFO", &
127 extension=".linresLog")
128 unit_number = cp_print_key_unit_nr(logger, lr_section, "PRINT%PROGRAM_RUN_INFO", extension=".linresLog")
129
130 ! We can't run a NVPT/MFPT calculation without the coefficients dC/dR.
131 CALL dcdr_env_init(vcd_env%dcdr_env, qs_env)
132 ! vcd_env%dcdr_env%output_unit = vcd_env%output_unit
133
134 IF (output_unit > 0) THEN
135 WRITE (output_unit, "(/,T20,A,/)") "*** Start NVPT/MFPT calculation ***"
136 END IF
137
138 ! Just to make sure. The memory requirements are tiny.
139 CALL init_orbital_pointers(12)
140
141 CALL section_vals_val_get(vcd_section, "DISTRIBUTED_ORIGIN", l_val=vcd_env%distributed_origin)
142 CALL section_vals_val_get(vcd_section, "ORIGIN_DEPENDENT_MFP", l_val=vcd_env%origin_dependent_op_mfp)
143
144 ! Reference point
145 vcd_env%magnetic_origin = 0._dp
146 vcd_env%spatial_origin = 0._dp
147 ! Get the magnetic origin from the input
148 CALL section_vals_val_get(vcd_section, "MAGNETIC_ORIGIN", i_val=reference)
149 CALL section_vals_val_get(vcd_section, "MAGNETIC_ORIGIN_REFERENCE", explicit=explicit)
150 IF (explicit) THEN
151 CALL section_vals_val_get(vcd_section, "MAGNETIC_ORIGIN_REFERENCE", r_vals=ref_point)
152 ELSE
153 IF (reference == use_mom_ref_user) THEN
154 cpabort("User-defined reference point should be given explicitly")
155 END IF
156 END IF
157
158 CALL get_reference_point(rpoint=vcd_env%magnetic_origin, qs_env=qs_env, &
159 reference=reference, &
160 ref_point=ref_point)
161
162 ! Get the spatial origin from the input
163 CALL section_vals_val_get(vcd_section, "SPATIAL_ORIGIN", i_val=reference)
164 CALL section_vals_val_get(vcd_section, "SPATIAL_ORIGIN_REFERENCE", explicit=explicit)
165 IF (explicit) THEN
166 CALL section_vals_val_get(vcd_section, "SPATIAL_ORIGIN_REFERENCE", r_vals=ref_point)
167 ELSE
168 IF (reference == use_mom_ref_user) THEN
169 cpabort("User-defined reference point should be given explicitly")
170 END IF
171 END IF
172
173 CALL get_reference_point(rpoint=vcd_env%spatial_origin, qs_env=qs_env, &
174 reference=reference, &
175 ref_point=ref_point)
176
177 IF (vcd_env%distributed_origin .AND. any(vcd_env%magnetic_origin /= vcd_env%spatial_origin)) THEN
178 cpwarn("The magnetic and spatial origins don't match")
179 ! This is fine for NVP but will give unphysical results for MFP.
180 END IF
181
182 IF (vcd_env%output_unit > 0) WRITE (vcd_env%output_unit, "(A,3F10.6)") &
183 'The reference point is', vcd_env%dcdr_env%ref_point
184 IF (vcd_env%output_unit > 0) WRITE (vcd_env%output_unit, "(A,3F10.6)") &
185 'The magnetic origin is', vcd_env%magnetic_origin
186 IF (vcd_env%output_unit > 0) WRITE (vcd_env%output_unit, "(A,3F10.6)") &
187 'The velocity origin is', vcd_env%spatial_origin
188
189 vcd_env%magnetic_origin_atom = vcd_env%magnetic_origin
190 vcd_env%spatial_origin_atom = vcd_env%spatial_origin
191
192 CALL get_qs_env(qs_env=qs_env, &
193 ks_env=ks_env, &
194 dft_control=dft_control, &
195 sab_orb=sab_orb, &
196 sab_all=sab_all, &
197 sap_ppnl=sap_ppnl, &
198 particle_set=particle_set, &
199 matrix_ks=matrix_ks, &
200 cell=cell, &
201 qs_kind_set=qs_kind_set)
202
203 natom = SIZE(particle_set)
204 nspins = dft_control%nspins
205
206 ALLOCATE (vcd_env%apt_el_nvpt(3, 3, natom))
207 ALLOCATE (vcd_env%apt_nuc_nvpt(3, 3, natom))
208 ALLOCATE (vcd_env%apt_total_nvpt(3, 3, natom))
209 ALLOCATE (vcd_env%aat_atom_nvpt(3, 3, natom))
210 ALLOCATE (vcd_env%aat_atom_mfp(3, 3, natom))
211 vcd_env%apt_el_nvpt = 0._dp
212 vcd_env%apt_nuc_nvpt = 0._dp
213 vcd_env%apt_total_nvpt = 0._dp
214 vcd_env%aat_atom_nvpt = 0._dp
215 vcd_env%aat_atom_mfp = 0._dp
216
217 ALLOCATE (vcd_env%dCV(nspins))
218 ALLOCATE (vcd_env%dCV_prime(nspins))
219 ALLOCATE (vcd_env%op_dV(nspins))
220 ALLOCATE (vcd_env%op_dB(nspins))
221 DO ispin = 1, nspins
222 CALL cp_fm_create(vcd_env%dCV(ispin), vcd_env%dcdr_env%likemos_fm_struct(1)%struct, set_zero=.true.)
223 CALL cp_fm_create(vcd_env%dCV_prime(ispin), vcd_env%dcdr_env%likemos_fm_struct(1)%struct, set_zero=.true.)
224 CALL cp_fm_create(vcd_env%op_dV(ispin), vcd_env%dcdr_env%likemos_fm_struct(1)%struct, set_zero=.true.)
225 CALL cp_fm_create(vcd_env%op_dB(ispin), vcd_env%dcdr_env%likemos_fm_struct(1)%struct, set_zero=.true.)
226 END DO
227
228 ALLOCATE (vcd_env%dCB(3))
229 ALLOCATE (vcd_env%dCB_prime(3))
230 DO i = 1, 3
231 CALL cp_fm_create(vcd_env%dCB(i), vcd_env%dcdr_env%likemos_fm_struct(1)%struct, set_zero=.true.)
232 CALL cp_fm_create(vcd_env%dCB_prime(i), vcd_env%dcdr_env%likemos_fm_struct(1)%struct, set_zero=.true.)
233 END DO
234
235 ! DBCSR matrices
236 CALL dbcsr_allocate_matrix_set(vcd_env%moments_der, 9, 3)
237 CALL dbcsr_allocate_matrix_set(vcd_env%moments_der_right, 9, 3)
238 CALL dbcsr_allocate_matrix_set(vcd_env%moments_der_left, 9, 3)
239 CALL dbcsr_allocate_matrix_set(vcd_env%matrix_difdip2, 3, 3)
240 CALL dbcsr_allocate_matrix_set(vcd_env%matrix_dSdV, 3)
241 CALL dbcsr_allocate_matrix_set(vcd_env%matrix_dSdB, 3)
242 CALL dbcsr_allocate_matrix_set(vcd_env%matrix_hxc_dsdv, nspins)
243
244 CALL dbcsr_allocate_matrix_set(vcd_env%hcom, 3)
245 CALL dbcsr_allocate_matrix_set(vcd_env%matrix_rcomr, 3, 3)
246 CALL dbcsr_allocate_matrix_set(vcd_env%matrix_rrcom, 3, 3)
247 CALL dbcsr_allocate_matrix_set(vcd_env%matrix_dcom, 3, 3)
248 CALL dbcsr_allocate_matrix_set(vcd_env%matrix_hr, nspins, 3)
249 CALL dbcsr_allocate_matrix_set(vcd_env%matrix_rh, nspins, 3)
250 CALL dbcsr_allocate_matrix_set(vcd_env%matrix_drpnl, 3)
251 CALL dbcsr_allocate_matrix_set(vcd_env%dipvel_ao, 3)
252 CALL dbcsr_allocate_matrix_set(vcd_env%dipvel_ao_delta, 3)
253 CALL dbcsr_allocate_matrix_set(vcd_env%matrix_rxrv, 3)
254 CALL dbcsr_allocate_matrix_set(vcd_env%matrix_r_rxvr, 3, 3)
255 CALL dbcsr_allocate_matrix_set(vcd_env%matrix_rxvr_r, 3, 3)
256 CALL dbcsr_allocate_matrix_set(vcd_env%matrix_r_doublecom, 3, 3)
257
258 CALL dbcsr_allocate_matrix_set(vcd_env%matrix_nosym_temp_33, 3, 3)
259 CALL dbcsr_allocate_matrix_set(vcd_env%matrix_nosym_temp2_33, 3, 3)
260 DO i = 1, 9 ! x, y, z, xx, xy, xz, yy, yz, zz
261 DO idir = 1, 3 ! d/dx, d/dy, d/dz
262 CALL dbcsr_init_p(vcd_env%moments_der(i, idir)%matrix)
263 CALL dbcsr_init_p(vcd_env%moments_der_right(i, idir)%matrix)
264 CALL dbcsr_init_p(vcd_env%moments_der_left(i, idir)%matrix)
265
266 CALL dbcsr_create(vcd_env%moments_der(i, idir)%matrix, template=matrix_ks(1)%matrix, &
267 matrix_type=dbcsr_type_antisymmetric)
268 CALL cp_dbcsr_alloc_block_from_nbl(vcd_env%moments_der(i, idir)%matrix, sab_orb)
269 CALL dbcsr_set(vcd_env%moments_der(i, idir)%matrix, 0.0_dp)
270
271 ! And the ones which will be multiplied by delta_(mu/nu)
272 CALL dbcsr_copy(vcd_env%moments_der_right(i, idir)%matrix, &
273 vcd_env%dcdr_env%matrix_nosym_temp(1)%matrix)
274 CALL dbcsr_copy(vcd_env%moments_der_left(i, idir)%matrix, &
275 vcd_env%dcdr_env%matrix_nosym_temp(1)%matrix)
276 END DO
277 END DO
278
279 DO i = 1, 3
280 DO j = 1, 3
281 CALL dbcsr_init_p(vcd_env%matrix_difdip2(i, j)%matrix)
282 CALL dbcsr_copy(vcd_env%matrix_difdip2(i, j)%matrix, vcd_env%dcdr_env%matrix_nosym_temp(1)%matrix)
283 CALL dbcsr_set(vcd_env%matrix_difdip2(i, j)%matrix, 0.0_dp)
284
285 CALL dbcsr_init_p(vcd_env%matrix_nosym_temp_33(i, j)%matrix)
286 CALL dbcsr_create(vcd_env%matrix_nosym_temp_33(i, j)%matrix, template=matrix_ks(1)%matrix, &
287 matrix_type=dbcsr_type_no_symmetry)
288 CALL cp_dbcsr_alloc_block_from_nbl(vcd_env%matrix_nosym_temp_33(i, j)%matrix, sab_all)
289 CALL dbcsr_set(vcd_env%matrix_nosym_temp_33(i, j)%matrix, 0._dp)
290
291 CALL dbcsr_init_p(vcd_env%matrix_nosym_temp2_33(i, j)%matrix)
292 CALL dbcsr_create(vcd_env%matrix_nosym_temp2_33(i, j)%matrix, template=matrix_ks(1)%matrix, &
293 matrix_type=dbcsr_type_no_symmetry)
294 CALL cp_dbcsr_alloc_block_from_nbl(vcd_env%matrix_nosym_temp2_33(i, j)%matrix, sab_all)
295 CALL dbcsr_set(vcd_env%matrix_nosym_temp2_33(i, j)%matrix, 0._dp)
296
297 END DO
298 CALL dbcsr_init_p(vcd_env%matrix_dSdV(i)%matrix)
299 CALL dbcsr_copy(vcd_env%matrix_dSdV(i)%matrix, vcd_env%dcdr_env%matrix_nosym_temp(1)%matrix)
300 CALL dbcsr_init_p(vcd_env%matrix_dSdB(i)%matrix)
301 CALL dbcsr_copy(vcd_env%matrix_dSdB(i)%matrix, vcd_env%dcdr_env%matrix_nosym_temp(1)%matrix)
302 END DO
303
304 DO ispin = 1, nspins
305 CALL dbcsr_init_p(vcd_env%matrix_hxc_dsdv(ispin)%matrix)
306 CALL dbcsr_copy(vcd_env%matrix_hxc_dsdv(ispin)%matrix, vcd_env%dcdr_env%matrix_nosym_temp(1)%matrix)
307 END DO
308
309 ! Things for op_dV
310 ! lin_mom
311 DO i = 1, 3
312 CALL dbcsr_init_p(vcd_env%dipvel_ao(i)%matrix)
313 CALL dbcsr_copy(vcd_env%dipvel_ao(i)%matrix, vcd_env%dcdr_env%matrix_nosym_temp(1)%matrix)
314
315 CALL dbcsr_init_p(vcd_env%dipvel_ao_delta(i)%matrix)
316 CALL dbcsr_copy(vcd_env%dipvel_ao_delta(i)%matrix, vcd_env%dcdr_env%matrix_nosym_temp(1)%matrix)
317 END DO
318
319 ! [V, r]
320 DO i = 1, 3
321 CALL dbcsr_init_p(vcd_env%hcom(i)%matrix)
322 CALL dbcsr_create(vcd_env%hcom(i)%matrix, template=matrix_ks(1)%matrix, &
323 matrix_type=dbcsr_type_antisymmetric)
324 CALL cp_dbcsr_alloc_block_from_nbl(vcd_env%hcom(i)%matrix, sab_orb)
325
326 CALL dbcsr_init_p(vcd_env%matrix_rxrv(i)%matrix)
327 CALL dbcsr_create(vcd_env%matrix_rxrv(i)%matrix, template=matrix_ks(1)%matrix, &
328 matrix_type=dbcsr_type_antisymmetric)
329 CALL cp_dbcsr_alloc_block_from_nbl(vcd_env%matrix_rxrv(i)%matrix, sab_orb)
330
331 DO j = 1, 3
332 CALL dbcsr_init_p(vcd_env%matrix_rcomr(i, j)%matrix)
333 CALL dbcsr_copy(vcd_env%matrix_rcomr(i, j)%matrix, vcd_env%dcdr_env%matrix_nosym_temp(1)%matrix)
334 CALL dbcsr_init_p(vcd_env%matrix_rrcom(i, j)%matrix)
335 CALL dbcsr_copy(vcd_env%matrix_rrcom(i, j)%matrix, vcd_env%dcdr_env%matrix_nosym_temp(1)%matrix)
336 CALL dbcsr_init_p(vcd_env%matrix_dcom(i, j)%matrix)
337 CALL dbcsr_copy(vcd_env%matrix_dcom(i, j)%matrix, matrix_ks(1)%matrix)
338 CALL dbcsr_set(vcd_env%matrix_dcom(i, j)%matrix, 0._dp)
339
340 CALL dbcsr_init_p(vcd_env%matrix_r_rxvr(i, j)%matrix)
341 CALL dbcsr_copy(vcd_env%matrix_r_rxvr(i, j)%matrix, vcd_env%dcdr_env%matrix_nosym_temp(1)%matrix)
342 CALL dbcsr_set(vcd_env%matrix_r_rxvr(i, j)%matrix, 0._dp)
343
344 CALL dbcsr_init_p(vcd_env%matrix_rxvr_r(i, j)%matrix)
345 CALL dbcsr_copy(vcd_env%matrix_rxvr_r(i, j)%matrix, vcd_env%dcdr_env%matrix_nosym_temp(1)%matrix)
346 CALL dbcsr_set(vcd_env%matrix_rxvr_r(i, j)%matrix, 0._dp)
347
348 CALL dbcsr_init_p(vcd_env%matrix_r_doublecom(i, j)%matrix)
349 CALL dbcsr_copy(vcd_env%matrix_r_doublecom(i, j)%matrix, vcd_env%dcdr_env%matrix_nosym_temp(1)%matrix)
350 CALL dbcsr_set(vcd_env%matrix_r_doublecom(i, j)%matrix, 0._dp)
351 END DO
352 END DO
353
354 ! matrix_hr: nonsymmetric dbcsr matrix
355 DO ispin = 1, nspins
356 DO i = 1, 3
357 CALL dbcsr_init_p(vcd_env%matrix_hr(ispin, i)%matrix)
358 CALL dbcsr_copy(vcd_env%matrix_hr(ispin, i)%matrix, vcd_env%dcdr_env%matrix_nosym_temp(1)%matrix)
359
360 CALL dbcsr_init_p(vcd_env%matrix_rh(ispin, i)%matrix)
361 CALL dbcsr_copy(vcd_env%matrix_rh(ispin, i)%matrix, vcd_env%dcdr_env%matrix_nosym_temp(1)%matrix)
362 END DO
363 END DO
364
365 ! drpnl for the operator
366 DO i = 1, 3
367 CALL dbcsr_init_p(vcd_env%matrix_drpnl(i)%matrix)
368 CALL dbcsr_copy(vcd_env%matrix_drpnl(i)%matrix, vcd_env%dcdr_env%matrix_nosym_temp(1)%matrix)
369 END DO
370
371 ! NVP matrices
372 ! hr matrices
373 CALL build_matrix_hr_rh(vcd_env, qs_env, [0._dp, 0._dp, 0._dp])
374
375 ! commutator terms
376 ! - [V, r]
377 CALL build_com_mom_nl(qs_kind_set, sab_orb, sap_ppnl, dft_control%qs_control%eps_ppnl, &
378 particle_set, cell=cell, matrix_rv=vcd_env%hcom)
379 ! <[V, r] * r> and <r * [V, r]>
380 CALL build_com_rpnl_r(vcd_env%matrix_rcomr, vcd_env%matrix_rrcom, qs_kind_set, sab_all, sap_ppnl, &
381 dft_control%qs_control%eps_ppnl, particle_set, cell)
382
383 ! lin_mom
384 CALL build_lin_mom_matrix(qs_env, vcd_env%dipvel_ao)
385
386 ! AAT
387 ! The moments are set to zero and then recomputed in the routine.
388 CALL build_local_moments_der_matrix(qs_env, moments_der=vcd_env%moments_der, &
389 nmoments_der=2, nmoments=0, ref_point=[0._dp, 0._dp, 0._dp])
390
391 ! PP terms
392 CALL build_com_mom_nl(qs_kind_set, sab_orb, sap_ppnl, dft_control%qs_control%eps_ppnl, &
393 particle_set, matrix_rxrv=vcd_env%matrix_rxrv, ref_point=[0._dp, 0._dp, 0._dp], &
394 cell=cell)
395
396 CALL build_com_mom_nl(qs_kind_set, sab_all, sap_ppnl, dft_control%qs_control%eps_ppnl, &
397 particle_set, ref_point=[0._dp, 0._dp, 0._dp], cell=cell, &
398 matrix_r_rxvr=vcd_env%matrix_r_rxvr, matrix_rxvr_r=vcd_env%matrix_rxvr_r)
399
400 ! Done with NVP matrices
401
402 CALL cp_print_key_finished_output(output_unit, logger, lr_section, &
403 "PRINT%PROGRAM_RUN_INFO")
404
405 CALL timestop(handle)
406
407 END SUBROUTINE vcd_env_init
408
409! *****************************************************************************
410!> \brief Deallocate the vcd environment
411!> \param qs_env ...
412!> \param vcd_env ...
413!> \author Edward Ditler
414! **************************************************************************************************
415 SUBROUTINE vcd_env_cleanup(qs_env, vcd_env)
416
417 TYPE(qs_environment_type), POINTER :: qs_env
418 TYPE(vcd_env_type) :: vcd_env
419
420 CHARACTER(LEN=*), PARAMETER :: routinen = 'vcd_env_cleanup'
421
422 INTEGER :: handle
423
424 CALL timeset(routinen, handle)
425
426 ! We can't run a NVPT/MFPT calculation without the coefficients dC/dR.
427 CALL dcdr_env_cleanup(qs_env, vcd_env%dcdr_env)
428
429 DEALLOCATE (vcd_env%apt_el_nvpt)
430 DEALLOCATE (vcd_env%apt_nuc_nvpt)
431 DEALLOCATE (vcd_env%apt_total_nvpt)
432 DEALLOCATE (vcd_env%aat_atom_nvpt)
433 DEALLOCATE (vcd_env%aat_atom_mfp)
434
435 CALL cp_fm_release(vcd_env%dCV)
436 CALL cp_fm_release(vcd_env%dCV_prime)
437 CALL cp_fm_release(vcd_env%op_dV)
438 CALL cp_fm_release(vcd_env%op_dB)
439
440 CALL cp_fm_release(vcd_env%dCB)
441 CALL cp_fm_release(vcd_env%dCB_prime)
442
443 ! DBCSR matrices
444 ! Probably, the memory requirements could be reduced by quite a bit
445 ! by not storing each term in its own set of matrices.
446 ! On the other hand, the memory bottleneck is usually the numerical
447 ! integration grid.
448 CALL dbcsr_deallocate_matrix_set(vcd_env%moments_der)
449 CALL dbcsr_deallocate_matrix_set(vcd_env%moments_der_right)
450 CALL dbcsr_deallocate_matrix_set(vcd_env%moments_der_left)
451 CALL dbcsr_deallocate_matrix_set(vcd_env%matrix_difdip2)
452 CALL dbcsr_deallocate_matrix_set(vcd_env%matrix_dSdV)
453 CALL dbcsr_deallocate_matrix_set(vcd_env%matrix_dSdB)
454 CALL dbcsr_deallocate_matrix_set(vcd_env%matrix_hxc_dsdv)
455 CALL dbcsr_deallocate_matrix_set(vcd_env%hcom)
456 CALL dbcsr_deallocate_matrix_set(vcd_env%matrix_rcomr)
457 CALL dbcsr_deallocate_matrix_set(vcd_env%matrix_rrcom)
458 CALL dbcsr_deallocate_matrix_set(vcd_env%matrix_dcom)
459 CALL dbcsr_deallocate_matrix_set(vcd_env%matrix_hr)
460 CALL dbcsr_deallocate_matrix_set(vcd_env%matrix_rh)
461 CALL dbcsr_deallocate_matrix_set(vcd_env%matrix_drpnl)
462 CALL dbcsr_deallocate_matrix_set(vcd_env%dipvel_ao)
463 CALL dbcsr_deallocate_matrix_set(vcd_env%dipvel_ao_delta)
464 CALL dbcsr_deallocate_matrix_set(vcd_env%matrix_rxrv)
465 CALL dbcsr_deallocate_matrix_set(vcd_env%matrix_r_rxvr)
466 CALL dbcsr_deallocate_matrix_set(vcd_env%matrix_rxvr_r)
467 CALL dbcsr_deallocate_matrix_set(vcd_env%matrix_r_doublecom)
468 CALL dbcsr_deallocate_matrix_set(vcd_env%matrix_nosym_temp_33)
469 CALL dbcsr_deallocate_matrix_set(vcd_env%matrix_nosym_temp2_33)
470 CALL timestop(handle)
471
472 END SUBROUTINE vcd_env_cleanup
473
474! **************************************************************************************************
475!> \brief Copied from linres_read_restart
476!> \param qs_env ...
477!> \param linres_section ...
478!> \param vec ...
479!> \param lambda ...
480!> \param beta ...
481!> \param tag ...
482!> \author Edward Ditler
483! **************************************************************************************************
484 SUBROUTINE vcd_read_restart(qs_env, linres_section, vec, lambda, beta, tag)
485 TYPE(qs_environment_type), POINTER :: qs_env
486 TYPE(section_vals_type), POINTER :: linres_section
487 TYPE(cp_fm_type), DIMENSION(:), INTENT(IN) :: vec
488 INTEGER, INTENT(IN) :: lambda, beta
489 CHARACTER(LEN=*) :: tag
490
491 CHARACTER(LEN=*), PARAMETER :: routinen = 'vcd_read_restart'
492
493 CHARACTER(LEN=default_path_length) :: filename
494 CHARACTER(LEN=default_string_length) :: my_middle
495 INTEGER :: beta_tmp, handle, i, i_block, ia, ie, iostat, iounit, ispin, j, lambda_tmp, &
496 max_block, n_rep_val, nao, nao_tmp, nmo, nmo_tmp, nspins, nspins_tmp, rst_unit
497 LOGICAL :: file_exists
498 REAL(kind=dp), DIMENSION(:, :), POINTER :: vecbuffer
499 TYPE(cp_fm_type), POINTER :: mo_coeff
500 TYPE(cp_logger_type), POINTER :: logger
501 TYPE(mo_set_type), DIMENSION(:), POINTER :: mos
502 TYPE(mp_para_env_type), POINTER :: para_env
503 TYPE(section_vals_type), POINTER :: print_key
504
505 file_exists = .false.
506
507 CALL timeset(routinen, handle)
508
509 NULLIFY (mos, para_env, logger, print_key, vecbuffer)
510 logger => cp_get_default_logger()
511
512 iounit = cp_print_key_unit_nr(logger, linres_section, &
513 "PRINT%PROGRAM_RUN_INFO", extension=".Log")
514
515 CALL get_qs_env(qs_env=qs_env, &
516 para_env=para_env, &
517 mos=mos)
518
519 nspins = SIZE(mos)
520
521 rst_unit = -1
522 IF (para_env%is_source()) THEN
523 CALL section_vals_val_get(linres_section, "WFN_RESTART_FILE_NAME", &
524 n_rep_val=n_rep_val)
525
526 CALL xstring(tag, ia, ie)
527 my_middle = "RESTART-"//tag(ia:ie)//trim("-")//trim(adjustl(cp_to_string(beta))) &
528 //trim("-")//trim(adjustl(cp_to_string(lambda)))
529
530 IF (n_rep_val > 0) THEN
531 CALL section_vals_val_get(linres_section, "WFN_RESTART_FILE_NAME", c_val=filename)
532 CALL xstring(filename, ia, ie)
533 filename = filename(ia:ie)//trim(my_middle)//".lr"
534 ELSE
535 ! try to read from the filename that is generated automatically from the printkey
536 print_key => section_vals_get_subs_vals(linres_section, "PRINT%RESTART")
537 filename = cp_print_key_generate_filename(logger, print_key, &
538 extension=".lr", middle_name=trim(my_middle), my_local=.false.)
539 END IF
540 INQUIRE (file=filename, exist=file_exists)
541 !
542 ! open file
543 IF (file_exists) THEN
544 CALL open_file(file_name=trim(filename), &
545 file_action="READ", &
546 file_form="UNFORMATTED", &
547 file_position="REWIND", &
548 file_status="OLD", &
549 unit_number=rst_unit)
550
551 IF (iounit > 0) WRITE (iounit, "(T2,A)") &
552 "LINRES| Reading response wavefunctions from the restart file <"//trim(adjustl(filename))//">"
553 ELSE
554 IF (iounit > 0) WRITE (iounit, "(T2,A)") &
555 "LINRES| Restart file <"//trim(adjustl(filename))//"> not found"
556 END IF
557 END IF
558
559 CALL para_env%bcast(file_exists)
560
561 IF (file_exists) THEN
562
563 CALL get_mo_set(mos(1), mo_coeff=mo_coeff)
564 CALL cp_fm_get_info(mo_coeff, nrow_global=nao, ncol_block=max_block)
565
566 ALLOCATE (vecbuffer(nao, max_block))
567 !
568 ! read headers
569 IF (rst_unit > 0) READ (rst_unit, iostat=iostat) lambda_tmp, beta_tmp, nspins_tmp, nao_tmp
570 CALL para_env%bcast(iostat)
571
572 CALL para_env%bcast(beta_tmp)
573 CALL para_env%bcast(lambda_tmp)
574 CALL para_env%bcast(nspins_tmp)
575 CALL para_env%bcast(nao_tmp)
576
577 ! check that the number nao, nmo and nspins are
578 ! the same as in the current mos
579 IF (nspins_tmp /= nspins) THEN
580 cpabort("nspins not consistent")
581 END IF
582 IF (nao_tmp /= nao) cpabort("nao not consistent")
583 ! check that it's the right file
584 ! the same as in the current mos
585 IF (lambda_tmp /= lambda) cpabort("lambda not consistent")
586 IF (beta_tmp /= beta) cpabort("beta not consistent")
587 !
588 DO ispin = 1, nspins
589 CALL get_mo_set(mos(ispin), mo_coeff=mo_coeff)
590 CALL cp_fm_get_info(mo_coeff, ncol_global=nmo)
591 !
592 IF (rst_unit > 0) READ (rst_unit) nmo_tmp
593 CALL para_env%bcast(nmo_tmp)
594 IF (nmo_tmp /= nmo) cpabort("nmo not consistent")
595 !
596 ! read the response
597 DO i = 1, nmo, max(max_block, 1)
598 i_block = min(max_block, nmo - i + 1)
599 DO j = 1, i_block
600 IF (rst_unit > 0) READ (rst_unit) vecbuffer(1:nao, j)
601 END DO
602 CALL para_env%bcast(vecbuffer)
603 CALL cp_fm_set_submatrix(vec(ispin), vecbuffer, 1, i, nao, i_block)
604 END DO
605 END DO
606
607 IF (iostat /= 0) THEN
608 IF (iounit > 0) WRITE (iounit, "(T2,A)") &
609 "LINRES| Restart file <"//trim(adjustl(filename))//"> not found"
610 END IF
611
612 DEALLOCATE (vecbuffer)
613
614 END IF
615
616 IF (para_env%is_source()) THEN
617 IF (file_exists) CALL close_file(unit_number=rst_unit)
618 END IF
619
620 CALL timestop(handle)
621
622 END SUBROUTINE vcd_read_restart
623
624! **************************************************************************************************
625!> \brief Copied from linres_write_restart
626!> \param qs_env ...
627!> \param linres_section ...
628!> \param vec ...
629!> \param lambda ...
630!> \param beta ...
631!> \param tag ...
632!> \author Edward Ditler
633! **************************************************************************************************
634 SUBROUTINE vcd_write_restart(qs_env, linres_section, vec, lambda, beta, tag)
635 TYPE(qs_environment_type), POINTER :: qs_env
636 TYPE(section_vals_type), POINTER :: linres_section
637 TYPE(cp_fm_type), DIMENSION(:), INTENT(IN) :: vec
638 INTEGER, INTENT(IN) :: lambda, beta
639 CHARACTER(LEN=*) :: tag
640
641 CHARACTER(LEN=*), PARAMETER :: routinen = 'vcd_write_restart'
642
643 CHARACTER(LEN=default_path_length) :: filename
644 CHARACTER(LEN=default_string_length) :: my_middle, my_pos, my_status
645 INTEGER :: handle, i, i_block, ia, ie, iounit, &
646 ispin, j, max_block, nao, nmo, nspins, &
647 rst_unit
648 REAL(kind=dp), DIMENSION(:, :), POINTER :: vecbuffer
649 TYPE(cp_fm_type), POINTER :: mo_coeff
650 TYPE(cp_logger_type), POINTER :: logger
651 TYPE(mo_set_type), DIMENSION(:), POINTER :: mos
652 TYPE(mp_para_env_type), POINTER :: para_env
653 TYPE(section_vals_type), POINTER :: print_key
654
655 NULLIFY (logger, mo_coeff, mos, para_env, print_key, vecbuffer)
656
657 CALL timeset(routinen, handle)
658
659 logger => cp_get_default_logger()
660
661 IF (btest(cp_print_key_should_output(logger%iter_info, linres_section, "PRINT%RESTART", &
662 used_print_key=print_key), &
663 cp_p_file)) THEN
664
665 iounit = cp_print_key_unit_nr(logger, linres_section, &
666 "PRINT%PROGRAM_RUN_INFO", extension=".Log")
667
668 CALL get_qs_env(qs_env=qs_env, &
669 mos=mos, &
670 para_env=para_env)
671
672 nspins = SIZE(mos)
673
674 my_status = "REPLACE"
675 my_pos = "REWIND"
676 CALL xstring(tag, ia, ie)
677 my_middle = "RESTART-"//tag(ia:ie)//trim("-")//trim(adjustl(cp_to_string(beta))) &
678 //trim("-")//trim(adjustl(cp_to_string(lambda)))
679 rst_unit = cp_print_key_unit_nr(logger, linres_section, "PRINT%RESTART", &
680 extension=".lr", middle_name=trim(my_middle), file_status=trim(my_status), &
681 file_position=trim(my_pos), file_action="WRITE", file_form="UNFORMATTED")
682
683 filename = cp_print_key_generate_filename(logger, print_key, &
684 extension=".lr", middle_name=trim(my_middle), my_local=.false.)
685
686 IF (iounit > 0) THEN
687 WRITE (unit=iounit, fmt="(T2,A)") &
688 "LINRES| Writing response functions to the restart file <"//trim(adjustl(filename))//">"
689 END IF
690
691 !
692 ! write data to file
693 ! use the scalapack block size as a default for buffering columns
694 CALL get_mo_set(mos(1), mo_coeff=mo_coeff)
695 CALL cp_fm_get_info(mo_coeff, nrow_global=nao, ncol_block=max_block)
696 ALLOCATE (vecbuffer(nao, max_block))
697
698 IF (rst_unit > 0) WRITE (rst_unit) lambda, beta, nspins, nao
699
700 DO ispin = 1, nspins
701 CALL cp_fm_get_info(vec(ispin), ncol_global=nmo)
702
703 IF (rst_unit > 0) WRITE (rst_unit) nmo
704
705 DO i = 1, nmo, max(max_block, 1)
706 i_block = min(max_block, nmo - i + 1)
707 CALL cp_fm_get_submatrix(vec(ispin), vecbuffer, 1, i, nao, i_block)
708 ! doing this in one write would increase efficiency, but breaks RESTART compatibility.
709 ! to old ones, and in cases where max_block is different between runs, as might happen during
710 ! restarts with a different number of CPUs
711 DO j = 1, i_block
712 IF (rst_unit > 0) WRITE (rst_unit) vecbuffer(1:nao, j)
713 END DO
714 END DO
715 END DO
716
717 DEALLOCATE (vecbuffer)
718
719 CALL cp_print_key_finished_output(rst_unit, logger, linres_section, &
720 "PRINT%RESTART")
721 END IF
722
723 CALL timestop(handle)
724
725 END SUBROUTINE vcd_write_restart
726
727! **************************************************************************************************
728!> \brief Print the APTs, AATs, and sum rules
729!> \param vcd_env ...
730!> \param qs_env ...
731!> \author Edward Ditler
732! **************************************************************************************************
733 SUBROUTINE vcd_print(vcd_env, qs_env)
734 TYPE(vcd_env_type) :: vcd_env
735 TYPE(qs_environment_type), POINTER :: qs_env
736
737 CHARACTER(len=*), PARAMETER :: routinen = 'vcd_print'
738
739 CHARACTER(LEN=default_string_length) :: description
740 INTEGER :: alpha, beta, delta, gamma, handle, i, l, &
741 lambda, natom, nsubset, output_unit
742 REAL(dp) :: mean, standard_deviation, &
743 standard_deviation_sum
744 REAL(dp), DIMENSION(:, :, :), POINTER :: apt_el_dcdr, apt_el_nvpt, apt_nuc_dcdr, &
745 apt_nuc_nvpt, apt_total_dcdr, &
746 apt_total_nvpt
747 REAL(dp), DIMENSION(:, :, :, :), POINTER :: apt_center_dcdr, apt_subset_dcdr
748 REAL(kind=dp), DIMENSION(3, 3) :: sum_rule_0, sum_rule_0_second, &
749 sum_rule_1, sum_rule_2, &
750 sum_rule_2_second, sum_rule_3_mfp, &
751 sum_rule_3_second
752 TYPE(cp_logger_type), POINTER :: logger
753 TYPE(cp_result_type), POINTER :: results
754 TYPE(molecule_type), DIMENSION(:), POINTER :: molecule_set
755 TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
756 TYPE(section_vals_type), POINTER :: vcd_section
757
758 CALL timeset(routinen, handle)
759
760 NULLIFY (logger)
761
762 logger => cp_get_default_logger()
763 output_unit = cp_logger_get_default_io_unit(logger)
764
765 vcd_section => section_vals_get_subs_vals(qs_env%input, "PROPERTIES%LINRES%VCD")
766
767 NULLIFY (particle_set)
768 CALL get_qs_env(qs_env=qs_env, particle_set=particle_set, molecule_set=molecule_set)
769 natom = SIZE(particle_set)
770 nsubset = SIZE(molecule_set)
771
772 apt_el_dcdr => vcd_env%dcdr_env%apt_el_dcdr
773 apt_nuc_dcdr => vcd_env%dcdr_env%apt_nuc_dcdr
774 apt_total_dcdr => vcd_env%dcdr_env%apt_total_dcdr
775 apt_subset_dcdr => vcd_env%dcdr_env%apt_el_dcdr_per_subset
776 apt_center_dcdr => vcd_env%dcdr_env%apt_el_dcdr_per_center
777
778 apt_el_nvpt => vcd_env%apt_el_nvpt
779 apt_nuc_nvpt => vcd_env%apt_nuc_nvpt
780 apt_total_nvpt => vcd_env%apt_total_nvpt
781
782 IF (vcd_env%output_unit > 0) WRITE (vcd_env%output_unit, "(A)") &
783 'APT | Write the final APT matrix per atom (Position perturbation)'
784 DO l = 1, natom
785 IF (vcd_env%output_unit > 0) WRITE (vcd_env%output_unit, "(A,I3,A,F15.6)") &
786 'APT | Atom', l, ' - GAPT ', &
787 (apt_total_dcdr(1, 1, l) &
788 + apt_total_dcdr(2, 2, l) &
789 + apt_total_dcdr(3, 3, l))/3._dp
790 DO i = 1, 3
791 IF (vcd_env%output_unit > 0) WRITE (vcd_env%output_unit, "(A,F15.6,F15.6,F15.6)") "APT | ", apt_total_dcdr(i, :, l)
792 END DO
793 END DO
794
795 IF (vcd_env%output_unit > 0) WRITE (vcd_env%output_unit, "(A)") &
796 'NVP | Write the final APT matrix per atom (Velocity perturbation)'
797 DO l = 1, natom
798 IF (vcd_env%output_unit > 0) WRITE (vcd_env%output_unit, "(A,I3,A,F15.6)") &
799 'NVP | Atom', l, ' - GAPT ', &
800 (apt_total_nvpt(1, 1, l) &
801 + apt_total_nvpt(2, 2, l) &
802 + apt_total_nvpt(3, 3, l))/3._dp
803 DO i = 1, 3
804 IF (vcd_env%output_unit > 0) THEN
805 WRITE (vcd_env%output_unit, "(A,F15.6,F15.6,F15.6)") &
806 "NVP | ", apt_total_nvpt(i, :, l)
807 END IF
808 END DO
809 END DO
810
811 IF (vcd_env%output_unit > 0) WRITE (vcd_env%output_unit, "(A)") &
812 'NVP | Write the final AAT matrix per atom (Velocity perturbation)'
813 DO l = 1, natom
814 IF (vcd_env%output_unit > 0) WRITE (vcd_env%output_unit, "(A,I3)") &
815 'NVP | Atom', l
816 DO i = 1, 3
817 IF (vcd_env%output_unit > 0) THEN
818 WRITE (vcd_env%output_unit, "(A,F15.6,F15.6,F15.6)") &
819 "NVP | ", vcd_env%aat_atom_nvpt(i, :, l)
820 END IF
821 END DO
822 END DO
823
824 IF (vcd_env%do_mfp) THEN
825 IF (vcd_env%output_unit > 0) WRITE (vcd_env%output_unit, "(A)") &
826 'MFP | Write the final AAT matrix per atom (Magnetic Field perturbation)'
827 DO l = 1, natom
828 IF (vcd_env%output_unit > 0) WRITE (vcd_env%output_unit, "(A,I3)") &
829 'MFP | Atom', l
830 DO i = 1, 3
831 IF (vcd_env%output_unit > 0) THEN
832 WRITE (vcd_env%output_unit, "(A,F15.6,F15.6,F15.6)") &
833 "MFP | ", vcd_env%aat_atom_mfp(i, :, l)
834 END IF
835 END DO
836 END DO
837 END IF
838
839 ! Get the dipole
840 CALL get_qs_env(qs_env, results=results)
841 description = "[DIPOLE]"
842 CALL get_results(results=results, description=description, values=vcd_env%dcdr_env%dipole_pos(1:3))
843
844 ! Sum rules [for all alpha, beta]
845 sum_rule_0 = 0._dp
846 sum_rule_1 = 0._dp
847 sum_rule_2 = 0._dp
848 sum_rule_0_second = 0._dp
849 sum_rule_2_second = 0._dp
850 sum_rule_3_second = 0._dp
851 sum_rule_3_mfp = 0._dp
852 standard_deviation = 0._dp
853 standard_deviation_sum = 0._dp
854
855 DO alpha = 1, 3
856 DO beta = 1, 3
857 ! 0: sum_lambda apt(alpha, beta, lambda)
858 DO lambda = 1, natom
859 sum_rule_0(alpha, beta) = sum_rule_0(alpha, beta) &
860 + apt_total_dcdr(alpha, beta, lambda)
861 sum_rule_0_second(alpha, beta) = sum_rule_0_second(alpha, beta) &
862 + apt_total_nvpt(alpha, beta, lambda)
863 END DO
864
865 ! 1: sum_gamma epsilon_(alpha beta gamma) mu_gamma
866 DO gamma = 1, 3
867 sum_rule_1(alpha, beta) = sum_rule_1(alpha, beta) &
868 + levi_civita(alpha, beta, gamma)*vcd_env%dcdr_env%dipole_pos(gamma)
869 END DO
870
871 ! 2: sum_(lambda gamma delta) R^lambda_gamma apt(delta, alpha, lambda)
872 DO lambda = 1, natom
873 DO gamma = 1, 3
874 DO delta = 1, 3
875 sum_rule_2(alpha, beta) = sum_rule_2(alpha, beta) &
876 + levi_civita(beta, gamma, delta) &
877 *particle_set(lambda)%r(gamma) &
878 *apt_total_dcdr(delta, alpha, lambda)
879 sum_rule_2_second(alpha, beta) = sum_rule_2_second(alpha, beta) &
880 + levi_civita(beta, gamma, delta) &
881 *particle_set(lambda)%r(gamma) &
882 *apt_total_nvpt(delta, alpha, lambda)
883 END DO
884 END DO
885 END DO
886
887 ! 3: 2c * sum_lambda aat(alpha, beta, lambda)
888 DO lambda = 1, natom
889 sum_rule_3_second(alpha, beta) = sum_rule_3_second(alpha, beta) &
890 + vcd_env%aat_atom_nvpt(alpha, beta, lambda)
891 ! + 2._dp*c_light_au*vcd_env%aat_atom_nvpt(alpha, beta, lambda)
892 END DO
893
894 IF (vcd_env%do_mfp) THEN
895 ! 3: 2c * sum_lambda aat(alpha, beta, lambda)
896 DO lambda = 1, natom
897 sum_rule_3_mfp(alpha, beta) = sum_rule_3_mfp(alpha, beta) &
898 + vcd_env%aat_atom_mfp(alpha, beta, lambda)
899 END DO
900 END IF
901
902 END DO ! beta
903 END DO ! alpha
904
905 IF (vcd_env%output_unit > 0) WRITE (vcd_env%output_unit, "(A)") "APT | Position perturbation sum rules"
906 IF (vcd_env%output_unit > 0) WRITE (vcd_env%output_unit, "(A,T19,A,T35,A,T50,A,T65,A)") &
907 "APT |", " Total APT", "Dipole", "R * APT", "AAT"
908 standard_deviation_sum = 0._dp
909 DO alpha = 1, 3
910 DO beta = 1, 3
911 mean = (sum_rule_1(alpha, beta) + sum_rule_2(alpha, beta) + sum_rule_3_mfp(alpha, beta))/3
912 standard_deviation = &
913 sqrt((sum_rule_1(alpha, beta)**2 + sum_rule_2(alpha, beta)**2 + sum_rule_3_mfp(alpha, beta)**2)/3 &
914 - mean**2)
915 standard_deviation_sum = standard_deviation_sum + standard_deviation
916
917 IF (vcd_env%output_unit > 0) WRITE (vcd_env%output_unit, &
918 "(A,I3,I3,F15.6,F15.6,F15.6,F15.6,F15.6)") &
919 "APT | ", &
920 alpha, beta, &
921 sum_rule_0(alpha, beta), &
922 sum_rule_1(alpha, beta), &
923 sum_rule_2(alpha, beta), &
924 sum_rule_3_mfp(alpha, beta), &
925 standard_deviation
926 END DO
927 END DO
928 IF (vcd_env%output_unit > 0) WRITE (vcd_env%output_unit, "(T73,F15.6)") standard_deviation_sum
929
930 IF (vcd_env%output_unit > 0) THEN
931 WRITE (vcd_env%output_unit, "(A)") "NVP | Velocity perturbation sum rules"
932 WRITE (vcd_env%output_unit, "(A,T19,A,T35,A,T50,A,T65,A)") "NVP |", " Total APT", "Dipole", "R * APT", "AAT"
933 END IF
934
935 standard_deviation_sum = 0._dp
936 DO alpha = 1, 3
937 DO beta = 1, 3
938 mean = (sum_rule_1(alpha, beta) + sum_rule_2_second(alpha, beta) + sum_rule_3_second(alpha, beta))/3
939 standard_deviation = &
940 sqrt((sum_rule_1(alpha, beta)**2 + sum_rule_2_second(alpha, beta)**2 + sum_rule_3_second(alpha, beta)**2)/3 &
941 - mean**2)
942 standard_deviation_sum = standard_deviation_sum + standard_deviation
943 IF (vcd_env%output_unit > 0) WRITE (vcd_env%output_unit, &
944 "(A,I3,I3,F15.6,F15.6,F15.6,F15.6,F15.6)") &
945 "NVP | ", &
946 alpha, &
947 beta, &
948 sum_rule_0_second(alpha, beta), &
949 sum_rule_1(alpha, beta), &
950 sum_rule_2_second(alpha, beta), &
951 sum_rule_3_second(alpha, beta), &
952 standard_deviation
953 END DO
954 END DO
955 IF (vcd_env%output_unit > 0) WRITE (vcd_env%output_unit, "(T73,F15.6)") standard_deviation_sum
956
957 CALL timestop(handle)
958 END SUBROUTINE vcd_print
959
960END MODULE qs_vcd_utils
Handles all functions related to the CELL.
Definition cell_types.F:15
Calculation of the non-local pseudopotential contribution to the core Hamiltonian <a|V(non-local)|b> ...
subroutine, public build_com_mom_nl(qs_kind_set, sab_all, sap_ppnl, eps_ppnl, particle_set, cell, matrix_rv, matrix_rxrv, matrix_rrv, matrix_rvr, matrix_rrv_vrr, matrix_r_rxvr, matrix_rxvr_r, matrix_r_doublecom, pseudoatom, ref_point)
Calculate [r,Vnl] (matrix_rv), r x [r,Vnl] (matrix_rxrv) or [rr,Vnl] (matrix_rrv) in AO basis....
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_init_p(matrix)
...
subroutine, public dbcsr_set(matrix, alpha)
...
DBCSR operations in CP2K.
Utility routines to open and close files.
Definition cp_files.F:22
logical function, public file_exists(file_name)
Checks if a file exists, considering also the file discovery mechanism.
Definition cp_files.F:518
subroutine, public open_file(file_name, unit_number, file_status, file_form, file_action, file_position, file_pad, file_access, debug)
Opens a file and returns its logical unit number.
Definition cp_files.F:197
subroutine, public close_file(unit_number, file_status)
Closes an open file given by its logical unit number.
Definition cp_files.F:64
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_submatrix(fm, new_values, start_row, start_col, n_rows, n_cols, alpha, beta, transpose)
sets a submatrix of a full matrix fm(start_row:start_row+n_rows,start_col:start_col+n_cols) = alpha*o...
subroutine, public cp_fm_create(matrix, matrix_struct, name, nrow, ncol, set_zero)
creates a new full matrix with the given structure
subroutine, public cp_fm_get_submatrix(fm, target_m, start_row, start_col, n_rows, n_cols, transpose)
gets a submatrix of a full matrix op(target_m)(1:n_rows,1:n_cols) =fm(start_row:start_row+n_rows,...
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)
...
character(len=default_path_length) function, public cp_print_key_generate_filename(logger, print_key, middle_name, extension, my_local)
Utility function that returns a unit number to write the print key. Might open a file with a unique f...
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
set of type/routines to handle the storage of results in force_envs
Calculation of the incomplete Gamma function F_n(t) for multi-center integrals over Cartesian Gaussia...
Definition gamma.F:15
collects all constants needed in input so that they can be used without circular dependencies
integer, parameter, public use_mom_ref_user
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
integer, parameter, public default_path_length
Definition kinds.F:58
Interface to the message passing library MPI.
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)
...
Provides Cartesian and spherical orbital pointers and indices.
subroutine, public init_orbital_pointers(maxl)
Initialize or update the orbital pointers.
Define the data structure for the particle information.
Calculate the derivatives of the MO coefficients wrt nuclear coordinates.
subroutine, public dcdr_env_cleanup(qs_env, dcdr_env)
Deallocate the dcdr environment.
subroutine, public dcdr_env_init(dcdr_env, qs_env)
Initialize the dcdr environment.
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.
Define the quickstep kind type and their sub types.
Type definitiona for linear response calculations.
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.
Calculates the moment integrals <a|r^m|b> and <a|r x d/dr|b>.
Definition qs_moments.F:14
subroutine, public build_local_moments_der_matrix(qs_env, moments_der, nmoments_der, nmoments, ref_point, moments, basis_type, minimum_image, ordered, lambda, deltar, neighbor_image)
Calculate right-hand sided derivatives of multipole moments, e. g. < a | xy d/dz | b > Optionally sto...
Definition qs_moments.F:502
Define the neighbor list data types and the corresponding functionality.
subroutine, public build_lin_mom_matrix(qs_env, matrix, minimum_image)
Calculation of the linear momentum matrix <mu|∂|nu> over Cartesian Gaussian functions.
subroutine, public build_com_rpnl_r(matrix_rcomr, matrix_rrcom, qs_kind_set, sab_all, sap_ppnl, eps_ppnl, particle_set, cell)
Build the two ordered nonlocal second-position products.
Definition qs_vcd_ao.F:1522
subroutine, public build_matrix_hr_rh(vcd_env, qs_env, rc)
Build the matrix Hr*delta_nu^\lambda - rH*delta_mu^\lambda.
Definition qs_vcd_ao.F:120
subroutine, public vcd_print(vcd_env, qs_env)
Print the APTs, AATs, and sum rules.
subroutine, public vcd_env_cleanup(qs_env, vcd_env)
Deallocate the vcd environment.
subroutine, public vcd_write_restart(qs_env, linres_section, vec, lambda, beta, tag)
Copied from linres_write_restart.
subroutine, public vcd_env_init(vcd_env, qs_env)
Initialize the vcd environment.
subroutine, public vcd_read_restart(qs_env, linres_section, vec, lambda, beta, tag)
Copied from linres_read_restart.
Utilities for string manipulations.
elemental subroutine, public xstring(string, ia, ib)
...
Type defining parameters related to the simulation cell.
Definition cell_types.F:60
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
stores all the informations relevant to an mpi environment
Provides all information about a quickstep kind.
calculation environment to calculate the ks matrix, holds all the needed vars. assumes that the core ...