54 USE iso_c_binding,
ONLY: c_int, c_double, c_char
56#if defined(__HAS_IEEE_EXCEPTIONS)
57 USE ieee_exceptions,
ONLY: ieee_get_halting_mode, &
58 ieee_set_halting_mode, &
62#include "./base/base_uses.f90"
68 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'voronoi_interface'
70 INTEGER :: step_count = 0
78 INTEGER(C_INT) FUNCTION libvori_setbqbskipfirst(i) bind(C, NAME='libvori_setBQBSkipFirst')
79 USE iso_c_binding,
ONLY: c_int
80 INTEGER(C_INT),
VALUE :: i
82 END FUNCTION libvori_setbqbskipfirst
84 INTEGER(C_INT) FUNCTION libvori_setbqbstorestep(i) bind(C, NAME='libvori_setBQBStoreStep')
85 USE iso_c_binding,
ONLY: c_int
86 INTEGER(C_INT),
VALUE :: i
88 END FUNCTION libvori_setbqbstorestep
90 INTEGER(C_INT) FUNCTION libvori_setvoronoiskipfirst(i) bind(C, NAME='libvori_setVoronoiSkipFirst')
91 USE iso_c_binding,
ONLY: c_int
92 INTEGER(C_INT),
VALUE :: i
94 END FUNCTION libvori_setvoronoiskipfirst
96 INTEGER(C_INT) FUNCTION libvori_setbqbcheck(i) bind(C, NAME='libvori_setBQBCheck')
97 USE iso_c_binding,
ONLY: c_int
98 INTEGER(C_INT),
VALUE :: i
100 END FUNCTION libvori_setbqbcheck
102 INTEGER(C_INT) FUNCTION libvori_setbqbfilename(len, s) bind(C, NAME='libvori_setBQBFilename')
103 USE iso_c_binding,
ONLY: c_int, c_char
104 INTEGER(C_INT),
VALUE :: len
105 CHARACTER(C_CHAR) :: s(*)
107 END FUNCTION libvori_setbqbfilename
109 INTEGER(C_INT) FUNCTION libvori_setbqbparmstring(len, s) bind(C, NAME='libvori_setBQBParmString')
110 USE iso_c_binding,
ONLY: c_int, c_char
111 INTEGER(C_INT),
VALUE :: len
112 CHARACTER(C_CHAR) :: s(*)
114 END FUNCTION libvori_setbqbparmstring
116 INTEGER(C_INT) FUNCTION libvori_setbqbhistory(i) bind(C, NAME='libvori_setBQBHistory')
117 USE iso_c_binding,
ONLY: c_int
118 INTEGER(C_INT),
VALUE :: i
120 END FUNCTION libvori_setbqbhistory
122 INTEGER(C_INT) FUNCTION libvori_setbqboptimization(i) bind(C, NAME='libvori_setBQBOptimization')
123 USE iso_c_binding,
ONLY: c_int
124 INTEGER(C_INT),
VALUE :: i
126 END FUNCTION libvori_setbqboptimization
128 INTEGER(C_INT) FUNCTION libvori_processbqbframe(step, t) bind(C, NAME='libvori_processBQBFrame')
129 USE iso_c_binding,
ONLY: c_int, c_double
130 INTEGER(C_INT),
VALUE :: step
131 REAL(C_DOUBLE),
VALUE :: t
133 END FUNCTION libvori_processbqbframe
135 INTEGER(C_INT) FUNCTION libvori_setprefix_voronoi() bind(C, NAME='libvori_setPrefix_Voronoi')
136 USE iso_c_binding,
ONLY: c_int
137 END FUNCTION libvori_setprefix_voronoi
139 INTEGER(C_INT) FUNCTION libvori_setprefix_bqb() bind(C, NAME='libvori_setPrefix_BQB')
140 USE iso_c_binding,
ONLY: c_int
141 END FUNCTION libvori_setprefix_bqb
143 INTEGER(C_INT) FUNCTION libvori_setrefinementfactor(i) bind(C, NAME='libvori_setRefinementFactor')
144 USE iso_c_binding,
ONLY: c_int
145 INTEGER(C_INT),
VALUE :: i
147 END FUNCTION libvori_setrefinementfactor
149 INTEGER(C_INT) FUNCTION libvori_setjitter(i) bind(C, NAME='libvori_setJitter')
150 USE iso_c_binding,
ONLY: c_int
151 INTEGER(C_INT),
VALUE :: i
153 END FUNCTION libvori_setjitter
155 INTEGER(C_INT) FUNCTION libvori_setjitteramplitude(amp) bind(C, NAME='libvori_setJitterAmplitude')
156 USE iso_c_binding,
ONLY: c_int, c_double
157 REAL(C_DOUBLE),
VALUE :: amp
159 END FUNCTION libvori_setjitteramplitude
161 INTEGER(C_INT) FUNCTION libvori_setjitterseed(seed) bind(C, NAME='libvori_setJitterSeed')
162 USE iso_c_binding,
ONLY: c_int
163 INTEGER(C_INT),
VALUE :: seed
165 END FUNCTION libvori_setjitterseed
167 INTEGER(C_INT) FUNCTION libvori_setempoutput(i) bind(C, NAME='libvori_setEMPOutput')
168 USE iso_c_binding,
ONLY: c_int
169 INTEGER(C_INT),
VALUE :: i
171 END FUNCTION libvori_setempoutput
173 INTEGER(C_INT) FUNCTION libvori_setprintlevel_verbose() bind(C, NAME='libvori_setPrintLevel_Verbose')
174 USE iso_c_binding,
ONLY: c_int
175 END FUNCTION libvori_setprintlevel_verbose
177 INTEGER(C_INT) FUNCTION libvori_setradii_unity() bind(C, NAME='libvori_setRadii_Unity')
178 USE iso_c_binding,
ONLY: c_int
179 END FUNCTION libvori_setradii_unity
181 INTEGER(C_INT) FUNCTION libvori_setradii_covalent() bind(C, NAME='libvori_setRadii_Covalent')
182 USE iso_c_binding,
ONLY: c_int
183 END FUNCTION libvori_setradii_covalent
185 INTEGER(C_INT) FUNCTION libvori_setradii_user(factor, rad) bind(C, NAME='libvori_setRadii_User')
186 USE iso_c_binding,
ONLY: c_int, c_double
187 REAL(C_DOUBLE),
VALUE :: factor
188 REAL(C_DOUBLE) :: rad(*)
190 END FUNCTION libvori_setradii_user
192 INTEGER(C_INT) FUNCTION libvori_step(step, t) bind(C, NAME='libvori_step')
193 USE iso_c_binding,
ONLY: c_int, c_double
194 INTEGER(C_INT),
VALUE :: step
195 REAL(C_DOUBLE),
VALUE :: t
197 END FUNCTION libvori_step
199 INTEGER(C_INT) FUNCTION libvori_sanitycheck(step, t) bind(C, NAME='libvori_sanitycheck')
200 USE iso_c_binding,
ONLY: c_int, c_double
201 INTEGER(C_INT),
VALUE :: step
202 REAL(C_DOUBLE),
VALUE :: t
204 END FUNCTION libvori_sanitycheck
206 INTEGER(C_INT) FUNCTION libvori_setgrid(rx, ry, rz, ax, ay, az, bx, by, bz, cx, cy, cz, tax, tay, taz, tbx, tby, tbz, &
207 tcx, tcy, tcz) bind(C, NAME='libvori_setGrid')
208 USE iso_c_binding,
ONLY: c_int, c_double
209 INTEGER(C_INT),
VALUE :: rx, ry, rz
210 REAL(C_DOUBLE),
VALUE :: ax, ay, az, bx, by, bz, cx, cy, cz, tax, &
211 tay, taz, tbx, tby, tbz, tcx, tcy, tcz
213 END FUNCTION libvori_setgrid
215 INTEGER(C_INT) FUNCTION libvori_pushatoms(n, pord, pchg, posx, posy, posz) bind(C, NAME='libvori_pushAtoms')
216 USE iso_c_binding,
ONLY: c_int, c_double
217 INTEGER(C_INT),
VALUE :: n
218 INTEGER(C_INT) :: pord(*)
219 REAL(C_DOUBLE) :: pchg(*), posx(*), posy(*), posz(*)
221 END FUNCTION libvori_pushatoms
223 INTEGER(C_INT) FUNCTION libvori_push_rho_zrow(ix, iy, length, buf) bind(C, NAME='libvori_push_rho_zrow')
224 USE iso_c_binding,
ONLY: c_int, c_double
225 INTEGER(C_INT),
VALUE :: ix, iy, length
226 REAL(C_DOUBLE) :: buf(*)
228 END FUNCTION libvori_push_rho_zrow
230 INTEGER(C_INT) FUNCTION libvori_setbqboverwrite(i) bind(C, NAME='libvori_setBQBOverwrite')
231 USE iso_c_binding,
ONLY: c_int
232 INTEGER(C_INT),
VALUE :: i
234 END FUNCTION libvori_setbqboverwrite
236 INTEGER(C_INT) FUNCTION libvori_setvorioverwrite(i) bind(C, NAME='libvori_setVoriOverwrite')
237 USE iso_c_binding,
ONLY: c_int
238 INTEGER(C_INT),
VALUE :: i
240 END FUNCTION libvori_setvorioverwrite
242 INTEGER(C_INT) FUNCTION libvori_get_radius(length, buf) bind(C, NAME='libvori_get_radius')
243 USE iso_c_binding,
ONLY: c_int, c_double
244 INTEGER(C_INT),
VALUE :: length
245 REAL(C_DOUBLE) :: buf(*)
247 END FUNCTION libvori_get_radius
249 INTEGER(C_INT) FUNCTION libvori_get_volume(length, buf) bind(C, NAME='libvori_get_volume')
250 USE iso_c_binding,
ONLY: c_int, c_double
251 INTEGER(C_INT),
VALUE :: length
252 REAL(C_DOUBLE) :: buf(*)
254 END FUNCTION libvori_get_volume
256 INTEGER(C_INT) FUNCTION libvori_get_charge(length, buf) bind(C, NAME='libvori_get_charge')
257 USE iso_c_binding,
ONLY: c_int, c_double
258 INTEGER(C_INT),
VALUE :: length
259 REAL(C_DOUBLE) :: buf(*)
261 END FUNCTION libvori_get_charge
263 INTEGER(C_INT) FUNCTION libvori_get_dipole(component, length, buf) bind(C, NAME='libvori_get_dipole')
264 USE iso_c_binding,
ONLY: c_int, c_double
265 INTEGER(C_INT),
VALUE :: component, length
266 REAL(C_DOUBLE) :: buf(*)
268 END FUNCTION libvori_get_dipole
270 INTEGER(C_INT) FUNCTION libvori_get_quadrupole(component, length, buf) bind(C, NAME='libvori_get_quadrupole')
271 USE iso_c_binding,
ONLY: c_int, c_double
272 INTEGER(C_INT),
VALUE :: component, length
273 REAL(C_DOUBLE) :: buf(*)
275 END FUNCTION libvori_get_quadrupole
277 INTEGER(C_INT) FUNCTION libvori_get_wrapped_pos(component, length, buf) bind(C, NAME='libvori_get_wrapped_pos')
278 USE iso_c_binding,
ONLY: c_int, c_double
279 INTEGER(C_INT),
VALUE :: component, length
280 REAL(C_DOUBLE) :: buf(*)
282 END FUNCTION libvori_get_wrapped_pos
284 INTEGER(C_INT) FUNCTION libvori_get_charge_center(component, length, buf) bind(C, NAME='libvori_get_charge_center')
285 USE iso_c_binding,
ONLY: c_int, c_double
286 INTEGER(C_INT),
VALUE :: component, length
287 REAL(C_DOUBLE) :: buf(*)
289 END FUNCTION libvori_get_charge_center
291 INTEGER(C_INT) FUNCTION libvori_finalize() bind(C, NAME='libvori_finalize')
292 USE iso_c_binding,
ONLY: c_int
293 END FUNCTION libvori_finalize
315 INTEGER :: do_voro, do_bqb
317 INTEGER,
INTENT(IN) :: unit_voro
321#if defined(__LIBVORI)
323 CHARACTER(len=*),
PARAMETER :: routinen =
'entry_voronoi_or_bqb'
324 INTEGER :: handle, iounit, &
326 nkind, natom, ikind, iat, ord, source, dest, &
327 ip, i1, i2, reffac, radius_type, bqb_optimize, &
328 bqb_history, nspins, jitter_seed
329 LOGICAL :: outemp, bqb_skip_first, voro_skip_first, &
330 bqb_store_step, bqb_check, voro_sanity, &
331 bqb_overwrite, vori_overwrite, molprop, &
333 REAL(kind=
dp) :: zeff, qa, fn0, fn1, jitter_amplitude
336 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: buf
337 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: particles_z
338 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: particles_r
339 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: particles_c
340 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: particles_radius
343 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
348 INTEGER,
DIMENSION(:),
POINTER :: atom_list
351 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: voro_radii
352 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: voro_charge
353 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: voro_volume
354 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: voro_dipole
355 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: voro_quadrupole
356 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: voro_buffer
357 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: voro_wrapped_pos
358 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: voro_charge_center
359 REAL(kind=
dp),
DIMENSION(:),
POINTER :: user_radii
360 CHARACTER(len=default_path_length) :: bqb_file_name, mp_file_name
361 CHARACTER(len=128) :: bqb_parm_string
363#if defined(__HAS_IEEE_EXCEPTIONS)
364 LOGICAL,
DIMENSION(5) :: halt
367 CALL timeset(routinen, handle)
372 CALL get_qs_env(qs_env=qs_env, rho=rho, qs_kind_set=qs_kind_set, &
373 atomic_kind_set=atomic_kind_set, para_env=para_env, &
374 nkind=nkind, natom=natom, subsys=subsys, dft_control=dft_control, &
379 IF (do_voro /= 0)
THEN
392 IF (qs_env%single_point_run)
THEN
393 voro_skip_first = .false.
405 IF (do_bqb /= 0)
THEN
414 IF (qs_env%single_point_run)
THEN
415 bqb_skip_first = .false.
418 IF (bqb_history < 1)
THEN
427#if defined(__HAS_IEEE_EXCEPTIONS)
428 CALL ieee_get_halting_mode(ieee_all, halt)
429 CALL ieee_set_halting_mode(ieee_all, .false.)
432 associate(ionode => para_env%is_source(), my_rank => para_env%mepos, &
433 num_pe => para_env%num_pe, &
434 sim_step => qs_env%sim_step, sim_time => qs_env%sim_time, &
435 l1 => rspace_pw%pw_grid%bounds(1, 1), l2 => rspace_pw%pw_grid%bounds(1, 2), &
436 l3 => rspace_pw%pw_grid%bounds(1, 3), u1 => rspace_pw%pw_grid%bounds(2, 1), &
437 u2 => rspace_pw%pw_grid%bounds(2, 2), u3 => rspace_pw%pw_grid%bounds(2, 3))
444 IF (do_voro /= 0)
THEN
445 ret = libvori_setprefix_voronoi()
446 ret = libvori_setrefinementfactor(reffac)
447 ret = libvori_setjitter(merge(1, 0, jitter))
448 ret = libvori_setjitteramplitude(jitter_amplitude*
angstrom)
449 ret = libvori_setjitterseed(jitter_seed)
450 ret = libvori_setvoronoiskipfirst(merge(1, 0, voro_skip_first))
451 ret = libvori_setvorioverwrite(merge(1, 0, vori_overwrite))
452 ret = libvori_setempoutput(merge(1, 0, outemp))
454 ret = libvori_setprefix_bqb()
457 IF (do_bqb /= 0)
THEN
459 ret = libvori_setbqbparmstring(128, bqb_parm_string)
460 SELECT CASE (bqb_optimize)
472 ret = libvori_setbqboptimization(bqb_optimize)
473 ret = libvori_setbqbhistory(bqb_history)
474 ret = libvori_setbqbskipfirst(merge(1, 0, bqb_skip_first))
475 ret = libvori_setbqbcheck(merge(1, 0, bqb_check))
476 ret = libvori_setbqboverwrite(merge(1, 0, bqb_overwrite))
477 ret = libvori_setbqbstorestep(merge(1, 0, bqb_store_step))
480 ret = libvori_setgrid( &
484 rspace_pw%pw_grid%dh(1, 1)*(u1 - l1 + 1), &
485 rspace_pw%pw_grid%dh(2, 1)*(u1 - l1 + 1), &
486 rspace_pw%pw_grid%dh(3, 1)*(u1 - l1 + 1), &
487 rspace_pw%pw_grid%dh(1, 2)*(u2 - l2 + 1), &
488 rspace_pw%pw_grid%dh(2, 2)*(u2 - l2 + 1), &
489 rspace_pw%pw_grid%dh(3, 2)*(u2 - l2 + 1), &
490 rspace_pw%pw_grid%dh(1, 3)*(u3 - l3 + 1), &
491 rspace_pw%pw_grid%dh(2, 3)*(u3 - l3 + 1), &
492 rspace_pw%pw_grid%dh(3, 3)*(u3 - l3 + 1), &
505 cpabort(
"The library returned an error. Aborting.")
508 ALLOCATE (particles_z(natom))
509 ALLOCATE (particles_c(natom))
510 ALLOCATE (particles_r(3, natom))
511 ALLOCATE (particles_radius(natom))
514 CALL get_qs_kind(qs_kind_set(ikind), zeff=zeff, vdw_radius=r)
516 atomic_kind => atomic_kind_set(ikind)
518 DO iat = 1,
SIZE(atom_list)
520 particles_c(i) = zeff
522 particles_r(:, i) = particles%els(i)%r(:)
523 particles_radius(i) = r
527 ret = libvori_pushatoms(natom, particles_z, particles_c, particles_r(1, :), particles_r(2, :), particles_r(3, :))
530 cpabort(
"The library returned an error. Aborting.")
536 IF (do_voro /= 0)
THEN
537 WRITE (iounit, *)
"VORONOI| Collecting electron density from MPI ranks and sending to library..."
539 WRITE (iounit, *)
"BQB| Collecting electron density from MPI ranks and sending to library..."
543 ALLOCATE (buf(l3:u3))
552 DO ip = 0, num_pe - 1
553 IF (rspace_pw%pw_grid%para%bo(1, 1, ip, 1) <= i1 - l1 + 1 &
554 .AND. rspace_pw%pw_grid%para%bo(2, 1, ip, 1) >= i1 - l1 + 1 .AND. &
555 rspace_pw%pw_grid%para%bo(1, 2, ip, 1) <= i2 - l2 + 1 &
556 .AND. rspace_pw%pw_grid%para%bo(2, 2, ip, 1) >= i2 - l2 + 1)
THEN
564 IF (source == dest)
THEN
565 IF (my_rank == source)
THEN
566 buf(:) = rspace_pw%array(i1, i2, :)
569 IF (my_rank == source)
THEN
570 buf(:) = rspace_pw%array(i1, i2, :)
571 CALL para_env%send(buf, dest, tag)
573 IF (my_rank == dest)
THEN
574 CALL para_env%recv(buf, source, tag)
578 IF (my_rank == dest)
THEN
579 ret = libvori_push_rho_zrow(i1 - l1, i2 - l2, u3 - l3 + 1, buf)
581 cpabort(
"The library returned an error. Aborting.")
601 IF (dft_control%qs_control%method_id ==
do_method_gapw) gapw = .true.
603 IF (do_voro /= 0)
THEN
606 ret = libvori_setradii_unity()
609 ret = libvori_setradii_covalent()
612 ret = libvori_setradii_user(100.0_dp, particles_radius)
615 IF (natom /=
SIZE(user_radii))
THEN
616 CALL cp_abort(__location__, &
617 "Length of keyword VORONOI\USER_RADII does not "// &
618 "match number of atoms in the input coordinate file.")
620 ret = libvori_setradii_user(100.0_dp, user_radii)
622 cpabort(
"No valid radius type was specified for VORONOI")
625 IF (voro_sanity)
THEN
627 ret = libvori_sanitycheck(sim_step, sim_time)
630 cpabort(
"The library returned an error. Aborting.")
635 ret = libvori_step(sim_step, sim_time)
637 step_count = step_count + 1
640 cpabort(
"The library returned an error. Aborting.")
643 IF ((step_count > 1) .OR. (.NOT. voro_skip_first))
THEN
645 ALLOCATE (voro_radii(natom))
646 ALLOCATE (voro_charge(natom))
647 ALLOCATE (voro_volume(natom))
648 ALLOCATE (voro_dipole(natom, 3))
649 ALLOCATE (voro_quadrupole(natom, 9))
650 ALLOCATE (voro_buffer(natom))
651 ALLOCATE (voro_wrapped_pos(natom, 3))
652 ALLOCATE (voro_charge_center(natom, 3))
654 ret = libvori_get_radius(natom, voro_radii)
656 ret = libvori_get_charge(natom, voro_charge)
658 ret = libvori_get_volume(natom, voro_volume)
661 ret = libvori_get_dipole(i1, natom, voro_buffer)
662 voro_dipole(:, i1) = voro_buffer(:)
666 ret = libvori_get_quadrupole(i1, natom, voro_buffer)
667 voro_quadrupole(:, i1) = voro_buffer(:)
671 ret = libvori_get_wrapped_pos(i1, natom, voro_buffer)
672 voro_wrapped_pos(:, i1) = voro_buffer(:)
676 ret = libvori_get_charge_center(i1, natom, voro_buffer)
677 voro_charge_center(:, i1) = voro_buffer(:)
681 CALL get_qs_env(qs_env=qs_env, rho0_mpole=rho0_mpole)
682 nspins = dft_control%nspins
684 voro_charge(i1) = voro_charge(i1) - sum(rho0_mpole%mp_rho(i1)%Q0(1:nspins))
685 fn0 = rho0_mpole%norm_g0l_h(1)/
bohr*100._dp
686 voro_dipole(i1, 1:3) = voro_dipole(i1, 1:3) + rho0_mpole%mp_rho(i1)%Qlm_car(2:4)/fn0
687 qa = voro_charge(i1) - particles_c(i1)
688 voro_charge_center(i1, 1:3) = voro_dipole(i1, 1:3)/qa
689 fn1 = rho0_mpole%norm_g0l_h(2)/
bohr/
bohr*10000._dp
690 voro_quadrupole(i1, 1) = voro_quadrupole(i1, 1) + rho0_mpole%mp_rho(i1)%Qlm_car(5)/fn1
691 voro_quadrupole(i1, 2) = voro_quadrupole(i1, 2) + rho0_mpole%mp_rho(i1)%Qlm_car(6)/fn1
692 voro_quadrupole(i1, 3) = voro_quadrupole(i1, 3) + rho0_mpole%mp_rho(i1)%Qlm_car(7)/fn1
693 voro_quadrupole(i1, 4) = voro_quadrupole(i1, 4) + rho0_mpole%mp_rho(i1)%Qlm_car(6)/fn1
694 voro_quadrupole(i1, 5) = voro_quadrupole(i1, 5) + rho0_mpole%mp_rho(i1)%Qlm_car(8)/fn1
695 voro_quadrupole(i1, 6) = voro_quadrupole(i1, 6) + rho0_mpole%mp_rho(i1)%Qlm_car(9)/fn1
696 voro_quadrupole(i1, 7) = voro_quadrupole(i1, 7) + rho0_mpole%mp_rho(i1)%Qlm_car(7)/fn1
697 voro_quadrupole(i1, 8) = voro_quadrupole(i1, 8) + rho0_mpole%mp_rho(i1)%Qlm_car(9)/fn1
698 voro_quadrupole(i1, 9) = voro_quadrupole(i1, 9) + rho0_mpole%mp_rho(i1)%Qlm_car(10)/fn1
702 IF (unit_voro > 0)
THEN
703 WRITE (unit_voro, fmt=
"(T2,I0)") natom
704 WRITE (unit_voro, fmt=
"(A,I8,A,F12.4,A)")
"# Step ", sim_step,
", Time ", &
706 WRITE (unit_voro, fmt=
"(A,9F20.10)")
"# Cell ", &
710 WRITE (unit_voro, fmt=
"(A,22A20)")
"# Atom Z", &
711 "Radius",
"Position(X)",
"Position(Y)",
"Position(Z)", &
712 "Voronoi_Volume",
"Z(eff)",
"Charge",
"Dipole(X)",
"Dipole(Y)",
"Dipole(Z)", &
713 "ChargeCenter(X)",
"ChargeCenter(Y)",
"ChargeCenter(Z)", &
714 "Quadrupole(XX)",
"Quadrupole(XY)",
"Quadrupole(XZ)", &
715 "Quadrupole(YX)",
"Quadrupole(YY)",
"Quadrupole(YZ)", &
716 "Quadrupole(ZX)",
"Quadrupole(ZY)",
"Quadrupole(ZZ)"
718 WRITE (unit_voro, fmt=
"(2I6,22F20.10)") &
721 voro_radii(i1)/100.0_dp, &
723 voro_volume(i1)/1000000.0_dp, &
726 voro_dipole(i1, 1:3), &
727 voro_charge_center(i1, 1:3)/100.0_dp, &
728 voro_quadrupole(i1, 1:9)
733 CALL molecular_properties(subsys, cell, sim_step, sim_time, iounit, &
734 particles_r, particles_c, &
735 voro_charge, voro_charge_center, mp_file_name)
738 DEALLOCATE (voro_radii)
739 DEALLOCATE (voro_charge)
740 DEALLOCATE (voro_volume)
741 DEALLOCATE (voro_dipole)
742 DEALLOCATE (voro_quadrupole)
743 DEALLOCATE (voro_buffer)
744 DEALLOCATE (voro_wrapped_pos)
745 DEALLOCATE (voro_charge_center)
750 WRITE (iounit, *)
"VORONOI| Voronoi integration finished."
755 IF (do_bqb /= 0)
THEN
757 ret = libvori_processbqbframe(sim_step, sim_time*
femtoseconds)
760 cpabort(
"The library returned an error. Aborting.")
763 IF (do_voro /= 0)
THEN
765 WRITE (iounit, *)
"VORONOI| BQB compression finished."
769 WRITE (iounit, *)
"BQB| BQB compression finished."
778 DEALLOCATE (particles_z)
779 DEALLOCATE (particles_c)
780 DEALLOCATE (particles_r)
781 DEALLOCATE (particles_radius)
785#if defined(__HAS_IEEE_EXCEPTIONS)
786 CALL ieee_set_halting_mode(ieee_all, halt)
789 CALL timestop(handle)
795 mark_used(input_voro)
801 CALL cp_warn(__location__, &
802 "Voronoi integration and BQB output require CP2k to be compiled"// &
803 " with the -D__LIBVORI preprocessor option.")
813#if defined(__LIBVORI)
814 INTEGER(KIND=C_INT) :: ret
815 ret = libvori_finalize()
832 SUBROUTINE molecular_properties(subsys, cell, sim_step, sim_time, iounit, &
833 particles_r, particles_c, voro_charge, &
834 voro_charge_center, mp_file_name)
837 INTEGER,
INTENT(IN) :: sim_step
838 REAL(kind=
dp),
INTENT(IN) :: sim_time
839 INTEGER,
INTENT(IN) :: iounit
840 REAL(kind=
dp),
DIMENSION(:, :) :: particles_r
841 REAL(kind=
dp),
DIMENSION(:) :: particles_c, voro_charge
842 REAL(kind=
dp),
DIMENSION(:, :) :: voro_charge_center
843 CHARACTER(len=default_path_length) :: mp_file_name
845 CHARACTER(len=3) :: fstatus
846 CHARACTER(len=default_path_length) :: fname
847 INTEGER :: ia, imol, mk, mpunit, na, na1, na2, &
849 REAL(kind=
dp) :: cm, ddip
850 REAL(kind=
dp),
DIMENSION(3) :: dipm, posa, posc, ref
855 WRITE (iounit, *)
"VORONOI| Start Calculation of Molecular Properties from Voronoi Integration"
859 IF (index(mp_file_name,
"__STD_OUT__") /= 0)
THEN
862 fname = adjustl(mp_file_name)
863 IF (fname(1:2) /=
"./")
THEN
864 fname = trim(fname)//
".molprop"
871 CALL open_file(file_name=fname, file_status=fstatus, file_action=
"write", &
872 file_position=
"append", unit_number=mpunit)
874 nmolecule =
SIZE(molecule_set)
875 WRITE (mpunit, fmt=
"(T2,I0)") nmolecule
876 WRITE (mpunit, fmt=
"(A,I8,A,F12.4,A)")
" # Step ", sim_step,
", Time ", &
878 WRITE (mpunit, fmt=
"(A,T25,A)")
" # Mol Type Charge", &
879 " Dipole[Debye] Total Dipole[Debye]"
880 DO imol = 1, nmolecule
881 molecule_kind => molecule_set(imol)%molecule_kind
882 mk = molecule_kind%kind_number
883 na1 = molecule_set(imol)%first_atom
884 na2 = molecule_set(imol)%last_atom
888 ref(1:3) = ref(1:3) +
pbc(particles_r(1:3, ia), cell)
890 ref(1:3) = ref(1:3)/real(na, kind=
dp)
893 posa(1:3) = particles_r(1:3, ia) - ref(1:3)
894 posa(1:3) =
pbc(posa, cell)
895 posc(1:3) = posa(1:3) +
bohr*voro_charge_center(ia, 1:3)/100.0_dp
896 posc(1:3) =
pbc(posc, cell)
897 cm = -particles_c(ia) + voro_charge(ia)
898 dipm(1:3) = dipm(1:3) + posa(1:3)*particles_c(ia) + posc(1:3)*cm
900 dipm(1:3) = dipm(1:3)*
debye
901 ddip = sqrt(sum(dipm**2))
902 cm = sum(voro_charge(na1:na2))
903 WRITE (mpunit, fmt=
"(I8,I6,F12.4,T25,3F12.4,8X,F12.4)") imol, mk, cm, dipm(1:3), ddip
905 IF (mpunit /= iounit)
THEN
909 END SUBROUTINE molecular_properties
Define the atomic kind types and their sub types.
subroutine, public get_atomic_kind(atomic_kind, fist_potential, element_symbol, name, mass, kind_number, natom, atom_list, rcov, rvdw, z, qeff, apol, cpol, mm_radius, shell, shell_active, damping)
Get attributes of an atomic kind.
collects all references to literature in CP2K as new algorithms / method are included from literature...
integer, save, public brehm2021
integer, save, public brehm2020
integer, save, public thomas2015
integer, save, public brehm2018
integer, save, public rycroft2009
Handles all functions related to the CELL.
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
Utility routines to open and close files. Tracking of preconnections.
subroutine, public open_file(file_name, file_status, file_form, file_action, file_position, file_pad, unit_number, debug, skip_get_unit_number, file_access)
Opens the requested file using a free unit number.
subroutine, public close_file(unit_number, file_status, keep_preconnection)
Close an open file given by its logical unit number. Optionally, keep the file and unit preconnected.
logical function, public file_exists(file_name)
Checks if file exists, considering also the file discovery mechanism.
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
Defines the basic variable types.
integer, parameter, public dp
integer, parameter, public default_path_length
Definition of mathematical constants and functions.
real(kind=dp), parameter, public fourpi
Interface to the message passing library MPI.
Define the molecule kind structure types and the corresponding functionality.
subroutine, public write_molecule_kind_set(molecule_kind_set, subsys_section)
Write a moleculeatomic kind set data set to the output unit.
Define the data structure for the molecule information.
Provides Cartesian and spherical orbital pointers and indices.
integer, dimension(:, :), allocatable, public indco
represent a simple array based list of the given type
Define the data structure for the particle information.
Definition of physical constants:
real(kind=dp), parameter, public femtoseconds
real(kind=dp), parameter, public angstrom
real(kind=dp), parameter, public bohr
real(kind=dp), parameter, public debye
integer, parameter, public pw_mode_local
subroutine, public get_qs_env(qs_env, atomic_kind_set, qs_kind_set, cell, super_cell, cell_ref, use_ref_cell, kpoints, dft_control, mos, sab_orb, sab_all, qmmm, qmmm_periodic, sac_ae, sac_ppl, sac_lri, sap_ppnl, sab_vdw, sab_scp, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_pp, sab_xtb_nonbond, sab_almo, sab_kp, sab_kp_nosym, 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, 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)
Get the QUICKSTEP environment.
Define the quickstep kind type and their sub types.
subroutine, public get_qs_kind(qs_kind, basis_set, basis_type, ncgf, nsgf, all_potential, tnadd_potential, gth_potential, sgp_potential, upf_potential, se_parameter, dftb_parameter, xtb_parameter, dftb3_param, zatom, zeff, elec_conf, mao, lmax_dftb, alpha_core_charge, ccore_charge, core_charge, core_charge_radius, paw_proj_set, paw_atom, hard_radius, hard0_radius, max_rad_local, covalent_radius, vdw_radius, gpw_type_forced, harmonics, max_iso_not0, max_s_harm, grid_atom, ngrid_ang, ngrid_rad, lmax_rho0, dft_plus_u_atom, l_of_dft_plus_u, n_of_dft_plus_u, u_minus_j, u_of_dft_plus_u, j_of_dft_plus_u, alpha_of_dft_plus_u, beta_of_dft_plus_u, j0_of_dft_plus_u, occupation_of_dft_plus_u, dispersion, bs_occupation, magnetization, no_optimize, addel, laddel, naddel, orbitals, max_scf, eps_scf, smear, u_ramping, u_minus_j_target, eps_u_ramping, init_u_ramping_each_scf, reltmat, ghost, floating, name, element_symbol, pao_basis_size, pao_model_file, pao_potentials, pao_descriptors, nelec)
Get attributes of an atomic kind.
superstucture that hold various representations of the density and keeps track of which ones are vali...
subroutine, public qs_rho_get(rho_struct, rho_ao, rho_ao_im, rho_ao_kp, rho_ao_im_kp, rho_r, drho_r, rho_g, drho_g, tau_r, tau_g, rho_r_valid, drho_r_valid, rho_g_valid, drho_g_valid, tau_r_valid, tau_g_valid, tot_rho_r, tot_rho_g, rho_r_sccs, soft_valid, complex_rho_ao)
returns info about the density described by this object. If some representation is not available an e...
types that represent a quickstep subsys
subroutine, public qs_subsys_get(subsys, atomic_kinds, atomic_kind_set, particles, particle_set, local_particles, molecules, molecule_set, molecule_kinds, molecule_kind_set, local_molecules, para_env, colvar_p, shell_particles, core_particles, gci, multipoles, natom, nparticle, ncore, nshell, nkind, atprop, virial, results, cell, cell_ref, use_ref_cell, energy, force, qs_kind_set, cp_subsys, nelectron_total, nelectron_spin)
...
Interface for Voronoi Integration and output of BQB files.
subroutine, public finalize_libvori()
Call libvori's finalize if support is compiled in.
subroutine, public entry_voronoi_or_bqb(do_voro, do_bqb, input_voro, input_bqb, unit_voro, qs_env, rspace_pw)
Does a Voronoi integration of density or stores the density to compressed BQB format.
Provides all information about an atomic kind.
Type defining parameters related to the simulation cell.
type of a logger, at the moment it contains just a print level starting at which level it should be l...
stores all the informations relevant to an mpi environment
represent a list of objects
Provides all information about a quickstep kind.
keeps the density in various representations, keeping track of which ones are valid.