77#include "./base/base_uses.f90"
83 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'qs_cdft_methods'
84 LOGICAL,
PARAMETER,
PRIVATE :: debug_this_module = .false.
103 LOGICAL :: calc_pot, calculate_forces
105 CHARACTER(len=*),
PARAMETER :: routinen =
'becke_constraint'
111 CALL timeset(routinen, handle)
112 CALL get_qs_env(qs_env, dft_control=dft_control)
113 cdft_control => dft_control%qs_control%cdft_control
119 CALL becke_constraint_low(qs_env)
123 CALL cdft_constraint_integrate(qs_env)
124 IF (calculate_forces)
CALL cdft_constraint_force(qs_env)
126 CALL timestop(handle)
137 SUBROUTINE becke_constraint_low(qs_env, just_gradients)
139 LOGICAL,
OPTIONAL :: just_gradients
141 CHARACTER(len=*),
PARAMETER :: routinen =
'becke_constraint_low'
142 REAL(kind=
dp),
PARAMETER :: eps_sum_cell_f_all = 1.0e-06_dp
144 INTEGER :: handle, i, iatom, igroup, ind(3), ip, j, &
145 jatom, jp, k, natom, np(3), nskipped
146 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: catom
147 INTEGER,
DIMENSION(2, 3) :: bo, bo_conf
148 LOGICAL :: in_memory, my_just_gradients
149 LOGICAL,
ALLOCATABLE,
DIMENSION(:) :: is_constraint, skip_me
150 LOGICAL,
ALLOCATABLE,
DIMENSION(:, :) :: atom_in_group
151 REAL(kind=
dp) :: dist1, dist2, dmyexp, dvol, eps_cavity, &
152 my1, my1_homo, myexp, sum_cell_f_all, &
154 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: cell_functions, ds_dr_i, ds_dr_j, &
156 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: d_sum_pm_dr, dp_i_dri
157 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: dp_i_drj
158 REAL(kind=
dp),
DIMENSION(3) :: cell_v, dist_vec, dmy_dr_i, dmy_dr_j, &
159 dr, dr1_r2, dr_i_dr, dr_ij_dr, &
160 dr_j_dr, grid_p, r, r1, shift
161 REAL(kind=
dp),
DIMENSION(:),
POINTER :: cutoffs
170 NULLIFY (cutoffs, cell, dft_control, particle_set, group, charge, cdft_control)
171 CALL timeset(routinen, handle)
175 particle_set=particle_set, &
177 dft_control=dft_control)
178 cdft_control => dft_control%qs_control%cdft_control
179 becke_control => cdft_control%becke_control
180 group => cdft_control%group
181 cutoffs => becke_control%cutoffs
182 IF (cdft_control%atomic_charges)
THEN
183 charge => cdft_control%charge
186 IF (cdft_control%save_pot)
THEN
187 in_memory = becke_control%in_memory
189 eps_cavity = becke_control%eps_cavity
191 my_just_gradients = .false.
192 IF (
PRESENT(just_gradients)) my_just_gradients = just_gradients
193 IF (my_just_gradients)
THEN
196 IF (becke_control%vector_buffer%store_vectors)
THEN
197 ALLOCATE (becke_control%vector_buffer%distances(natom))
198 ALLOCATE (becke_control%vector_buffer%distance_vecs(3, natom))
199 IF (in_memory)
ALLOCATE (becke_control%vector_buffer%pair_dist_vecs(3, natom, natom))
200 ALLOCATE (becke_control%vector_buffer%position_vecs(3, natom))
202 ALLOCATE (becke_control%vector_buffer%R12(natom, natom))
204 cell_v(i) = cell%hmat(i, i)
206 DO iatom = 1, natom - 1
207 DO jatom = iatom + 1, natom
208 r = particle_set(iatom)%r
209 r1 = particle_set(jatom)%r
211 r(i) =
modulo(r(i), cell%hmat(i, i)) - cell%hmat(i, i)/2._dp
212 r1(i) =
modulo(r1(i), cell%hmat(i, i)) - cell%hmat(i, i)/2._dp
214 dist_vec = (r - r1) - anint((r - r1)/cell_v)*cell_v
215 IF (becke_control%vector_buffer%store_vectors)
THEN
216 becke_control%vector_buffer%position_vecs(:, iatom) = r(:)
217 IF (iatom == 1 .AND. jatom == natom) becke_control%vector_buffer%position_vecs(:, jatom) = r1(:)
219 becke_control%vector_buffer%pair_dist_vecs(:, iatom, jatom) = dist_vec(:)
220 becke_control%vector_buffer%pair_dist_vecs(:, jatom, iatom) = -dist_vec(:)
223 becke_control%vector_buffer%R12(iatom, jatom) = norm2(dist_vec)
224 becke_control%vector_buffer%R12(jatom, iatom) = becke_control%vector_buffer%R12(iatom, jatom)
228 ALLOCATE (catom(cdft_control%natoms))
229 IF (cdft_control%save_pot .OR. &
230 becke_control%cavity_confine .OR. &
231 becke_control%should_skip)
THEN
232 ALLOCATE (is_constraint(natom))
233 is_constraint = .false.
238 ALLOCATE (skip_me(natom))
239 DO i = 1, cdft_control%natoms
240 catom(i) = cdft_control%atoms(i)
243 IF (cdft_control%save_pot .OR. &
244 becke_control%cavity_confine .OR. &
245 becke_control%should_skip)
THEN
246 is_constraint(catom(i)) = .true.
249 bo = group(1)%weight%pw_grid%bounds_local
250 dvol = group(1)%weight%pw_grid%dvol
251 dr = group(1)%weight%pw_grid%dr
252 np = group(1)%weight%pw_grid%npts
253 shift = -real(
modulo(np, 2),
dp)*dr/2.0_dp
255 cell_v(i) = cell%hmat(i, i)
262 IF (becke_control%cavity_confine)
THEN
263 bo_conf(1, 3) = becke_control%confine_bounds(1)
264 bo_conf(2, 3) = becke_control%confine_bounds(2)
266 ALLOCATE (atom_in_group(
SIZE(group), natom))
267 atom_in_group = .false.
268 DO igroup = 1,
SIZE(group)
269 ALLOCATE (group(igroup)%gradients(3*natom, bo_conf(1, 1):bo_conf(2, 1), &
270 bo_conf(1, 2):bo_conf(2, 2), &
271 bo_conf(1, 3):bo_conf(2, 3)))
272 group(igroup)%gradients = 0.0_dp
273 ALLOCATE (group(igroup)%d_sum_const_dR(3, natom))
274 group(igroup)%d_sum_const_dR = 0.0_dp
275 DO ip = 1,
SIZE(group(igroup)%atoms)
276 atom_in_group(igroup, group(igroup)%atoms(ip)) = .true.
281 ALLOCATE (sum_cell_f_group(
SIZE(group)))
282 ALLOCATE (cell_functions(natom))
284 ALLOCATE (ds_dr_j(3))
285 ALLOCATE (ds_dr_i(3))
286 ALLOCATE (d_sum_pm_dr(3, natom))
287 ALLOCATE (dp_i_drj(3, natom, natom))
288 ALLOCATE (dp_i_dri(3, natom))
292 DO k = bo(1, 1), bo(2, 1)
293 DO j = bo(1, 2), bo(2, 2)
294 DO i = bo(1, 3), bo(2, 3)
297 IF (becke_control%cavity_confine)
THEN
298 IF (becke_control%cavity%array(k, j, i) < eps_cavity) cycle
301 grid_p(1) = k*dr(1) + shift(1)
302 grid_p(2) = j*dr(2) + shift(2)
303 grid_p(3) = i*dr(3) + shift(3)
305 cell_functions = 1.0_dp
307 IF (becke_control%vector_buffer%store_vectors) becke_control%vector_buffer%distances = 0.0_dp
310 DO igroup = 1,
SIZE(group)
311 group(igroup)%d_sum_const_dR = 0.0_dp
317 IF (skip_me(iatom))
THEN
318 cell_functions(iatom) = 0.0_dp
319 IF (becke_control%should_skip)
THEN
320 IF (is_constraint(iatom)) nskipped = nskipped + 1
321 IF (nskipped == cdft_control%natoms)
THEN
323 IF (becke_control%cavity_confine)
THEN
324 becke_control%cavity%array(k, j, i) = 0.0_dp
332 IF (becke_control%vector_buffer%store_vectors)
THEN
333 IF (becke_control%vector_buffer%distances(iatom) == 0.0_dp)
THEN
334 r = becke_control%vector_buffer%position_vecs(:, iatom)
335 dist_vec = (r - grid_p) - anint((r - grid_p)/cell_v)*cell_v
336 dist1 = norm2(dist_vec)
337 becke_control%vector_buffer%distance_vecs(:, iatom) = dist_vec
338 becke_control%vector_buffer%distances(iatom) = dist1
340 dist_vec = becke_control%vector_buffer%distance_vecs(:, iatom)
341 dist1 = becke_control%vector_buffer%distances(iatom)
344 r = particle_set(iatom)%r
346 r(ip) =
modulo(r(ip), cell%hmat(ip, ip)) - cell%hmat(ip, ip)/2._dp
348 dist_vec = (r - grid_p) - anint((r - grid_p)/cell_v)*cell_v
349 dist1 = norm2(dist_vec)
351 IF (dist1 <= cutoffs(iatom))
THEN
353 IF (dist1 <= th) dist1 = th
354 dr_i_dr(:) = dist_vec(:)/dist1
357 IF (jatom /= iatom)
THEN
363 IF (jatom < iatom)
THEN
364 IF (.NOT. skip_me(jatom)) cycle
366 IF (becke_control%vector_buffer%store_vectors)
THEN
367 IF (becke_control%vector_buffer%distances(jatom) == 0.0_dp)
THEN
368 r1 = becke_control%vector_buffer%position_vecs(:, jatom)
369 dist_vec = (r1 - grid_p) - anint((r1 - grid_p)/cell_v)*cell_v
370 dist2 = norm2(dist_vec)
371 becke_control%vector_buffer%distance_vecs(:, jatom) = dist_vec
372 becke_control%vector_buffer%distances(jatom) = dist2
374 dist_vec = becke_control%vector_buffer%distance_vecs(:, jatom)
375 dist2 = becke_control%vector_buffer%distances(jatom)
378 r1 = particle_set(jatom)%r
380 r1(ip) =
modulo(r1(ip), cell%hmat(ip, ip)) - cell%hmat(ip, ip)/2._dp
382 dist_vec = (r1 - grid_p) - anint((r1 - grid_p)/cell_v)*cell_v
383 dist2 = norm2(dist_vec)
386 IF (becke_control%vector_buffer%store_vectors)
THEN
387 dr1_r2 = becke_control%vector_buffer%pair_dist_vecs(:, iatom, jatom)
389 dr1_r2 = (r - r1) - anint((r - r1)/cell_v)*cell_v
391 IF (dist2 <= th) dist2 = th
392 tmp_const = (becke_control%vector_buffer%R12(iatom, jatom)**3)
393 dr_ij_dr(:) = dr1_r2(:)/tmp_const
395 dr_j_dr = dist_vec(:)/dist2
396 dmy_dr_j(:) = -(dr_j_dr(:)/becke_control%vector_buffer%R12(iatom, jatom) - (dist1 - dist2)*dr_ij_dr(:))
398 dmy_dr_i(:) = dr_i_dr(:)/becke_control%vector_buffer%R12(iatom, jatom) - (dist1 - dist2)*dr_ij_dr(:)
401 my1 = (dist1 - dist2)/becke_control%vector_buffer%R12(iatom, jatom)
402 IF (becke_control%adjust)
THEN
404 my1 = my1 + becke_control%aij(iatom, jatom)*(1.0_dp - my1**2)
407 myexp = 1.5_dp*my1 - 0.5_dp*my1**3
409 dmyexp = 1.5_dp - 1.5_dp*my1**2
410 tmp_const = (1.5_dp**2)*dmyexp*(1 - myexp**2)* &
411 (1.0_dp - ((1.5_dp*myexp - 0.5_dp*(myexp**3))**2))
413 ds_dr_i(:) = -0.5_dp*tmp_const*dmy_dr_i(:)
415 ds_dr_j(:) = -0.5_dp*tmp_const*dmy_dr_j(:)
416 IF (becke_control%adjust)
THEN
417 tmp_const = 1.0_dp - 2.0_dp*my1_homo* &
418 becke_control%aij(iatom, jatom)
419 ds_dr_i(:) = ds_dr_i(:)*tmp_const
421 ds_dr_j(:) = ds_dr_j(:)*tmp_const
425 myexp = 1.5_dp*myexp - 0.5_dp*myexp**3
426 myexp = 1.5_dp*myexp - 0.5_dp*myexp**3
427 tmp_const = 0.5_dp*(1.0_dp - myexp)
428 cell_functions(iatom) = cell_functions(iatom)*tmp_const
430 IF (abs(tmp_const) <= th) tmp_const = tmp_const + th
432 dp_i_dri(:, iatom) = dp_i_dri(:, iatom) + ds_dr_i(:)/tmp_const
434 dp_i_drj(:, iatom, jatom) = ds_dr_j(:)/tmp_const
437 IF (dist2 <= cutoffs(jatom))
THEN
438 tmp_const = 0.5_dp*(1.0_dp + myexp)
439 cell_functions(jatom) = cell_functions(jatom)*tmp_const
441 IF (abs(tmp_const) <= th) tmp_const = tmp_const + th
444 dp_i_drj(:, jatom, iatom) = -ds_dr_i(:)/tmp_const
447 dp_i_dri(:, jatom) = dp_i_dri(:, jatom) - ds_dr_j(:)/tmp_const
450 skip_me(jatom) = .true.
456 dp_i_dri(:, iatom) = cell_functions(iatom)*dp_i_dri(:, iatom)
458 d_sum_pm_dr(:, iatom) = d_sum_pm_dr(:, iatom) + dp_i_dri(:, iatom)
459 IF (is_constraint(iatom))
THEN
460 DO igroup = 1,
SIZE(group)
461 IF (.NOT. atom_in_group(igroup, iatom)) cycle
462 DO jp = 1,
SIZE(group(igroup)%atoms)
463 IF (iatom == group(igroup)%atoms(jp))
THEN
468 group(igroup)%d_sum_const_dR(1:3, iatom) = group(igroup)%d_sum_const_dR(1:3, iatom) + &
469 group(igroup)%coeff(ip)*dp_i_dri(:, iatom)
473 IF (jatom /= iatom)
THEN
475 dp_i_drj(:, iatom, jatom) = cell_functions(iatom)*dp_i_drj(:, iatom, jatom)
477 d_sum_pm_dr(:, jatom) = d_sum_pm_dr(:, jatom) + dp_i_drj(:, iatom, jatom)
478 IF (is_constraint(iatom))
THEN
479 DO igroup = 1,
SIZE(group)
480 IF (.NOT. atom_in_group(igroup, iatom)) cycle
482 DO jp = 1,
SIZE(group(igroup)%atoms)
483 IF (iatom == group(igroup)%atoms(jp))
THEN
488 group(igroup)%d_sum_const_dR(1:3, jatom) = group(igroup)%d_sum_const_dR(1:3, jatom) + &
489 group(igroup)%coeff(ip)* &
490 dp_i_drj(:, iatom, jatom)
497 cell_functions(iatom) = 0.0_dp
498 skip_me(iatom) = .true.
499 IF (becke_control%should_skip)
THEN
500 IF (is_constraint(iatom)) nskipped = nskipped + 1
501 IF (nskipped == cdft_control%natoms)
THEN
503 IF (becke_control%cavity_confine)
THEN
504 becke_control%cavity%array(k, j, i) = 0.0_dp
512 IF (nskipped == cdft_control%natoms) cycle
514 sum_cell_f_group = 0.0_dp
515 DO igroup = 1,
SIZE(group)
516 DO ip = 1,
SIZE(group(igroup)%atoms)
517 sum_cell_f_group(igroup) = sum_cell_f_group(igroup) + group(igroup)%coeff(ip)* &
518 cell_functions(group(igroup)%atoms(ip))
521 sum_cell_f_all = 0.0_dp
523 sum_cell_f_all = sum_cell_f_all + cell_functions(ip)
526 IF (in_memory .AND. abs(sum_cell_f_all) > 0.0_dp)
THEN
527 DO igroup = 1,
SIZE(group)
529 group(igroup)%gradients(3*(iatom - 1) + 1:3*(iatom - 1) + 3, k, j, i) = &
530 group(igroup)%d_sum_const_dR(1:3, iatom)/sum_cell_f_all - sum_cell_f_group(igroup)* &
531 d_sum_pm_dr(1:3, iatom)/(sum_cell_f_all**2)
536 IF (.NOT. my_just_gradients .AND. abs(sum_cell_f_all) > eps_sum_cell_f_all)
THEN
537 DO igroup = 1,
SIZE(group)
538 group(igroup)%weight%array(k, j, i) = sum_cell_f_group(igroup)/sum_cell_f_all
540 IF (cdft_control%atomic_charges)
THEN
541 DO iatom = 1, cdft_control%natoms
542 charge(iatom)%array(k, j, i) = cell_functions(catom(iatom))/sum_cell_f_all
553 DEALLOCATE (d_sum_pm_dr)
554 DEALLOCATE (dp_i_drj)
555 DEALLOCATE (dp_i_dri)
556 DO igroup = 1,
SIZE(group)
557 DEALLOCATE (group(igroup)%d_sum_const_dR)
559 DEALLOCATE (atom_in_group)
560 IF (becke_control%vector_buffer%store_vectors)
THEN
561 DEALLOCATE (becke_control%vector_buffer%pair_dist_vecs)
565 IF (
ALLOCATED(is_constraint))
THEN
566 DEALLOCATE (is_constraint)
569 DEALLOCATE (cell_functions)
571 DEALLOCATE (sum_cell_f_group)
572 DEALLOCATE (becke_control%vector_buffer%R12)
573 IF (becke_control%vector_buffer%store_vectors)
THEN
574 DEALLOCATE (becke_control%vector_buffer%distances)
575 DEALLOCATE (becke_control%vector_buffer%distance_vecs)
576 DEALLOCATE (becke_control%vector_buffer%position_vecs)
578 CALL timestop(handle)
580 END SUBROUTINE becke_constraint_low
590 LOGICAL :: calc_pot, calculate_forces
592 CHARACTER(len=*),
PARAMETER :: routinen =
'hirshfeld_constraint'
598 CALL timeset(routinen, handle)
599 CALL get_qs_env(qs_env, dft_control=dft_control)
600 cdft_control => dft_control%qs_control%cdft_control
606 CALL hirshfeld_constraint_low(qs_env)
610 CALL cdft_constraint_integrate(qs_env)
611 IF (calculate_forces)
CALL cdft_constraint_force(qs_env)
613 CALL timestop(handle)
622 SUBROUTINE hirshfeld_constraint_low(qs_env, just_gradients)
624 LOGICAL,
OPTIONAL :: just_gradients
626 CHARACTER(len=*),
PARAMETER :: routinen =
'hirshfeld_constraint_low'
628 INTEGER :: atom_a, atoms_memory, atoms_memory_num, handle, i, iatom, iex, igroup, ikind, &
629 ithread, j, k, natom, npme, nthread, num_atoms, num_species, numexp, subpatch_pattern
630 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: num_species_small
631 INTEGER,
DIMENSION(2, 3) :: bo
632 INTEGER,
DIMENSION(3) :: lb_pw, lb_rs, ub_pw, ub_rs
633 INTEGER,
DIMENSION(:),
POINTER :: atom_list, cores
634 LOGICAL :: my_just_gradients
635 LOGICAL,
ALLOCATABLE,
DIMENSION(:) :: compute_charge, is_constraint
636 REAL(kind=
dp) :: alpha, coef, eps_rho_rspace, exp_eval, &
638 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: coefficients
639 REAL(kind=
dp),
DIMENSION(3) :: dr_rs, r2, r_pbc, ra
640 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: pab
657 DIMENSION(:) :: rs_single, rs_single_charge, rs_single_dr
659 NULLIFY (atom_list, atomic_kind_set, dft_control, &
660 hirshfeld_env, particle_set, pw_env, auxbas_pw_pool, para_env, &
661 auxbas_rs_desc, cdft_control, pab, &
662 hirshfeld_control, cell, rho_r, rho)
664 CALL timeset(routinen, handle)
666 atomic_kind_set=atomic_kind_set, &
667 particle_set=particle_set, &
671 dft_control=dft_control, &
678 cdft_control => dft_control%qs_control%cdft_control
679 hirshfeld_control => cdft_control%hirshfeld_control
680 hirshfeld_env => hirshfeld_control%hirshfeld_env
683 my_just_gradients = .false.
684 IF (
PRESENT(just_gradients)) my_just_gradients = just_gradients
685 IF (my_just_gradients)
THEN
686 cdft_control%in_memory = .true.
687 hirshfeld_control%print_density = .false.
690 ALLOCATE (coefficients(natom))
691 ALLOCATE (is_constraint(natom))
694 eps_rho_rspace = dft_control%qs_control%eps_rho_rspace
697 lb_pw(1:3) = rho_r(1)%pw_grid%bounds_local(1, 1:3)
698 ub_pw(1:3) = rho_r(1)%pw_grid%bounds_local(2, 1:3)
700 CALL pw_env_get(pw_env, auxbas_rs_desc=auxbas_rs_desc, &
701 auxbas_pw_pool=auxbas_pw_pool)
705 dr_rs(1) = rs_rho_all%desc%dh(1, 1)
706 dr_rs(2) = rs_rho_all%desc%dh(2, 2)
707 dr_rs(3) = rs_rho_all%desc%dh(3, 3)
708 lb_rs(1) = lbound(rs_rho_all%r(:, :, :), 1)
709 lb_rs(2) = lbound(rs_rho_all%r(:, :, :), 2)
710 lb_rs(3) = lbound(rs_rho_all%r(:, :, :), 3)
711 ub_rs(1) = ubound(rs_rho_all%r(:, :, :), 1)
712 ub_rs(2) = ubound(rs_rho_all%r(:, :, :), 2)
713 ub_rs(3) = ubound(rs_rho_all%r(:, :, :), 3)
716 DO igroup = 1,
SIZE(cdft_control%group)
718 IF (igroup == 2 .AND. .NOT. cdft_control%in_memory)
THEN
721 bo = cdft_control%group(igroup)%weight%pw_grid%bounds_local
724 coefficients(:) = 0.0_dp
725 is_constraint = .false.
726 DO i = 1,
SIZE(cdft_control%group(igroup)%atoms)
727 coefficients(cdft_control%group(igroup)%atoms(i)) = cdft_control%group(igroup)%coeff(i)
728 is_constraint(cdft_control%group(igroup)%atoms(i)) = .true.
736 IF (hirshfeld_control%print_density .AND. igroup == 1)
THEN
737 ALLOCATE (cdft_control%group(igroup)%hw_rho_atomic(cdft_control%natoms))
738 ALLOCATE (rs_single(cdft_control%natoms))
739 DO i = 1, cdft_control%natoms
746 CALL pw_zero(cdft_control%group(igroup)%weight)
748 CALL auxbas_pw_pool%create_pw(cdft_control%group(igroup)%hw_rho_total_constraint)
749 CALL pw_set(cdft_control%group(igroup)%hw_rho_total_constraint, 1.0_dp)
751 IF (igroup == 1)
THEN
752 CALL auxbas_pw_pool%create_pw(cdft_control%hw_rho_total)
753 CALL pw_set(cdft_control%hw_rho_total, 1.0_dp)
755 IF (hirshfeld_control%print_density)
THEN
756 DO iatom = 1, cdft_control%natoms
757 CALL auxbas_pw_pool%create_pw(cdft_control%group(igroup)%hw_rho_atomic(iatom))
758 CALL pw_set(cdft_control%group(igroup)%hw_rho_atomic(iatom), 1.0_dp)
763 IF (cdft_control%atomic_charges .AND. igroup == 1)
THEN
764 ALLOCATE (cdft_control%group(igroup)%hw_rho_atomic_charge(cdft_control%natoms))
765 ALLOCATE (rs_single_charge(cdft_control%natoms))
766 ALLOCATE (compute_charge(natom))
767 compute_charge = .false.
769 DO i = 1, cdft_control%natoms
772 compute_charge(cdft_control%atoms(i)) = .true.
775 DO iatom = 1, cdft_control%natoms
776 CALL auxbas_pw_pool%create_pw(cdft_control%group(igroup)%hw_rho_atomic_charge(iatom))
777 CALL pw_set(cdft_control%group(igroup)%hw_rho_atomic_charge(iatom), 1.0_dp)
785 DO ikind = 1,
SIZE(atomic_kind_set)
786 numexp = hirshfeld_env%kind_shape_fn(ikind)%numexp
787 IF (numexp <= 0) cycle
788 CALL get_atomic_kind(atomic_kind_set(ikind), natom=num_species, atom_list=atom_list)
789 ALLOCATE (cores(num_species))
792 alpha = hirshfeld_env%kind_shape_fn(ikind)%zet(iex)
793 coef = hirshfeld_env%kind_shape_fn(ikind)%coef(iex)
796 DO iatom = 1, num_species
797 atom_a = atom_list(iatom)
798 ra(:) =
pbc(particle_set(atom_a)%r, cell)
799 IF (rs_rho_all%desc%parallel .AND. .NOT. rs_rho_all%desc%distributed)
THEN
800 IF (
modulo(iatom, rs_rho_all%desc%group_size) == rs_rho_all%desc%my_pos)
THEN
811 atom_a = atom_list(iatom)
812 pab(1, 1) = coef*hirshfeld_env%charges(atom_a)
813 ra(:) =
pbc(particle_set(atom_a)%r, cell)
815 IF (hirshfeld_control%use_atomic_cutoff)
THEN
817 ra=ra, rb=ra, rp=ra, &
818 zetp=alpha, eps=hirshfeld_control%atomic_cutoff, &
819 pab=pab, o1=0, o2=0, &
820 prefactor=1.0_dp, cutoff=0.0_dp)
823 IF (igroup == 1)
THEN
825 [0.0_dp, 0.0_dp, 0.0_dp], 1.0_dp, pab, 0, 0, &
826 rs_rho_all, radius=radius, &
828 subpatch_pattern=subpatch_pattern)
831 IF (is_constraint(atom_a))
THEN
833 [0.0_dp, 0.0_dp, 0.0_dp], coefficients(atom_a), &
834 pab, 0, 0, rs_rho_constr, &
837 subpatch_pattern=subpatch_pattern)
840 IF (hirshfeld_control%print_density .AND. igroup == 1)
THEN
841 IF (is_constraint(atom_a))
THEN
842 DO iatom = 1, cdft_control%natoms
843 IF (atom_a == cdft_control%atoms(iatom))
EXIT
845 cpassert(iatom <= cdft_control%natoms)
847 [0.0_dp, 0.0_dp, 0.0_dp], 1.0_dp, pab, 0, 0, &
848 rs_single(iatom), radius=radius, &
850 subpatch_pattern=subpatch_pattern)
854 IF (cdft_control%atomic_charges .AND. igroup == 1)
THEN
855 IF (compute_charge(atom_a))
THEN
856 DO iatom = 1, cdft_control%natoms
857 IF (atom_a == cdft_control%atoms(iatom))
EXIT
859 cpassert(iatom <= cdft_control%natoms)
861 [0.0_dp, 0.0_dp, 0.0_dp], 1.0_dp, pab, 0, 0, &
862 rs_single_charge(iatom), radius=radius, &
864 subpatch_pattern=subpatch_pattern)
874 IF (igroup == 1)
THEN
878 CALL transfer_rs2pw(rs_rho_constr, cdft_control%group(igroup)%hw_rho_total_constraint)
882 CALL hfun_scale(cdft_control%group(igroup)%weight%array, &
883 cdft_control%group(igroup)%hw_rho_total_constraint%array, &
884 cdft_control%hw_rho_total%array, divide=.true., &
885 small=hirshfeld_control%eps_cutoff)
888 IF (cdft_control%atomic_charges .AND. igroup == 1)
THEN
889 DO i = 1, cdft_control%natoms
890 CALL transfer_rs2pw(rs_single_charge(i), cdft_control%group(igroup)%hw_rho_atomic_charge(i))
891 CALL hfun_scale(cdft_control%charge(i)%array, &
892 cdft_control%group(igroup)%hw_rho_atomic_charge(i)%array, &
893 cdft_control%hw_rho_total%array, divide=.true., &
894 small=hirshfeld_control%eps_cutoff)
899 IF (hirshfeld_control%print_density .AND. igroup == 1)
THEN
900 DO i = 1, cdft_control%natoms
901 CALL transfer_rs2pw(rs_single(i), cdft_control%group(igroup)%hw_rho_atomic(i))
908 DO igroup = 1,
SIZE(cdft_control%group)
910 CALL auxbas_pw_pool%give_back_pw(cdft_control%group(igroup)%hw_rho_total_constraint)
912 IF (.NOT. cdft_control%in_memory .AND. igroup == 1)
THEN
913 CALL auxbas_pw_pool%give_back_pw(cdft_control%hw_rho_total)
916 IF (hirshfeld_control%print_density .AND. igroup == 1)
THEN
917 DO i = 1, cdft_control%natoms
919 CALL auxbas_pw_pool%give_back_pw(cdft_control%group(igroup)%hw_rho_atomic(i))
921 DEALLOCATE (rs_single)
922 DEALLOCATE (cdft_control%group(igroup)%hw_rho_atomic)
925 IF (cdft_control%atomic_charges .AND. igroup == 1)
THEN
926 DO i = 1, cdft_control%natoms
928 CALL auxbas_pw_pool%give_back_pw(cdft_control%group(igroup)%hw_rho_atomic_charge(i))
930 DEALLOCATE (rs_single_charge)
931 DEALLOCATE (compute_charge)
932 DEALLOCATE (cdft_control%group(igroup)%hw_rho_atomic_charge)
937 IF (cdft_control%in_memory)
THEN
938 DO igroup = 1,
SIZE(cdft_control%group)
939 ALLOCATE (cdft_control%group(igroup)%gradients_x(1*natom, lb_pw(1):ub_pw(1), &
940 lb_pw(2):ub_pw(2), lb_pw(3):ub_pw(3)))
941 cdft_control%group(igroup)%gradients_x(:, :, :, :) = 0.0_dp
945 IF (cdft_control%in_memory)
THEN
946 DO igroup = 1,
SIZE(cdft_control%group)
951 atoms_memory = hirshfeld_control%atoms_memory
953 DO ikind = 1,
SIZE(atomic_kind_set)
954 numexp = hirshfeld_env%kind_shape_fn(ikind)%numexp
955 IF (numexp <= 0) cycle
956 CALL get_atomic_kind(atomic_kind_set(ikind), natom=num_species, atom_list=atom_list)
958 ALLOCATE (pw_single_dr(num_species))
959 ALLOCATE (rs_single_dr(num_species))
961 DO i = 1, num_species
962 CALL auxbas_pw_pool%create_pw(pw_single_dr(i))
966 atoms_memory_num =
SIZE([(j, j=1, num_species, atoms_memory)])
970 IF (num_species > atoms_memory)
THEN
971 ALLOCATE (num_species_small(atoms_memory_num + 1))
972 num_species_small(1:atoms_memory_num) = [(j, j=1, num_species, atoms_memory)]
973 num_species_small(atoms_memory_num + 1) = num_species
975 ALLOCATE (num_species_small(2))
976 num_species_small(:) = [1, num_species]
979 DO k = 1,
SIZE(num_species_small) - 1
980 IF (num_species > atoms_memory)
THEN
981 ALLOCATE (cores(num_species_small(k + 1) - (num_species_small(k) - 1)))
983 ALLOCATE (cores(num_species))
986 DO i = num_species_small(k), num_species_small(k + 1)
992 alpha = hirshfeld_env%kind_shape_fn(ikind)%zet(iex)
993 coef = hirshfeld_env%kind_shape_fn(ikind)%coef(iex)
994 prefactor = 2.0_dp*alpha
998 DO iatom = 1,
SIZE(cores)
999 atom_a = atom_list(iatom + (num_species_small(k) - 1))
1000 ra(:) =
pbc(particle_set(atom_a)%r, cell)
1002 IF (rs_rho_all%desc%parallel .AND. .NOT. rs_rho_all%desc%distributed)
THEN
1003 IF (
modulo(iatom, rs_rho_all%desc%group_size) == rs_rho_all%desc%my_pos)
THEN
1014 atom_a = atom_list(iatom + (num_species_small(k) - 1))
1015 pab(1, 1) = coef*hirshfeld_env%charges(atom_a)
1016 ra(:) =
pbc(particle_set(atom_a)%r, cell)
1017 subpatch_pattern = 0
1020 IF (hirshfeld_control%use_atomic_cutoff)
THEN
1022 ra=ra, rb=ra, rp=ra, &
1023 zetp=alpha, eps=hirshfeld_control%atomic_cutoff, &
1024 pab=pab, o1=0, o2=0, &
1025 prefactor=1.0_dp, cutoff=0.0_dp)
1029 [0.0_dp, 0.0_dp, 0.0_dp], prefactor, &
1030 pab, 0, 0, rs_single_dr(iatom + (num_species_small(k) - 1)), &
1033 subpatch_pattern=subpatch_pattern)
1038 DO iatom = num_species_small(k), num_species_small(k + 1)
1046 DO iatom = 1, num_species
1047 atom_a = atom_list(iatom)
1048 cdft_control%group(igroup)%gradients_x(atom_a, :, :, :) = pw_single_dr(iatom)%array(:, :, :)
1049 CALL auxbas_pw_pool%give_back_pw(pw_single_dr(iatom))
1052 DEALLOCATE (rs_single_dr)
1053 DEALLOCATE (num_species_small)
1054 DEALLOCATE (pw_single_dr)
1060 IF (cdft_control%in_memory)
THEN
1061 DO igroup = 1,
SIZE(cdft_control%group)
1062 ALLOCATE (cdft_control%group(igroup)%gradients_y(1*num_atoms, lb_pw(1):ub_pw(1), &
1063 lb_pw(2):ub_pw(2), lb_pw(3):ub_pw(3)))
1064 ALLOCATE (cdft_control%group(igroup)%gradients_z(1*num_atoms, lb_pw(1):ub_pw(1), &
1065 lb_pw(2):ub_pw(2), lb_pw(3):ub_pw(3)))
1066 cdft_control%group(igroup)%gradients_y(:, :, :, :) = cdft_control%group(igroup)%gradients_x(:, :, :, :)
1067 cdft_control%group(igroup)%gradients_z(:, :, :, :) = cdft_control%group(igroup)%gradients_x(:, :, :, :)
1072 IF (cdft_control%in_memory)
THEN
1074 DO igroup = 1,
SIZE(cdft_control%group)
1077 coefficients(:) = 0.0_dp
1078 is_constraint = .false.
1079 DO i = 1,
SIZE(cdft_control%group(igroup)%atoms)
1080 coefficients(cdft_control%group(igroup)%atoms(i)) = cdft_control%group(igroup)%coeff(i)
1081 is_constraint(cdft_control%group(igroup)%atoms(i)) = .true.
1084 DO k = lb_pw(3), ub_pw(3)
1085 DO j = lb_pw(2), ub_pw(2)
1086 DO i = lb_pw(1), ub_pw(1)
1089 ra(:) = particle_set(iatom)%r
1091 IF (cdft_control%hw_rho_total%array(i, j, k) > hirshfeld_control%eps_cutoff)
THEN
1093 exp_eval = (coefficients(iatom) - &
1094 cdft_control%group(igroup)%weight%array(i, j, k))/ &
1095 cdft_control%hw_rho_total%array(i, j, k)
1097 r2 = real(i - rho_r(1)%pw_grid%bounds(1, 1),
dp)* &
1098 rho_r(1)%pw_grid%dh(:, 1) + &
1099 REAL(j - rho_r(1)%pw_grid%bounds(1, 2),
dp)* &
1100 rho_r(1)%pw_grid%dh(:, 2) + &
1101 REAL(k - rho_r(1)%pw_grid%bounds(1, 3),
dp)* &
1102 rho_r(1)%pw_grid%dh(:, 3)
1103 r_pbc =
pbc(ra, r2, cell)
1106 cdft_control%group(igroup)%gradients_x(iatom, i, j, k) = &
1107 cdft_control%group(igroup)%gradients_x(iatom, i, j, k)* &
1111 cdft_control%group(igroup)%gradients_y(iatom, i, j, k) = &
1112 cdft_control%group(igroup)%gradients_y(iatom, i, j, k)* &
1116 cdft_control%group(igroup)%gradients_z(iatom, i, j, k) = &
1117 cdft_control%group(igroup)%gradients_z(iatom, i, j, k)* &
1126 CALL auxbas_pw_pool%give_back_pw(cdft_control%hw_rho_total)
1131 IF (
ALLOCATED(coefficients))
DEALLOCATE (coefficients)
1132 IF (
ALLOCATED(is_constraint))
DEALLOCATE (is_constraint)
1134 CALL timestop(handle)
1136 END SUBROUTINE hirshfeld_constraint_low
1143 SUBROUTINE cdft_constraint_integrate(qs_env)
1146 CHARACTER(len=*),
PARAMETER :: routinen =
'cdft_constraint_integrate'
1148 INTEGER :: handle, i, iatom, igroup, ivar, iw, nvar
1150 REAL(kind=
dp) :: dvol, eps_cavity, sign
1151 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: de, strength, target_val
1152 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: electronic_charge
1164 NULLIFY (para_env, dft_control, rho_r, energy, rho, &
1165 logger, cdft_constraint_section, group, charge)
1166 CALL timeset(routinen, handle)
1170 dft_control=dft_control, &
1174 iw =
cp_print_key_unit_nr(logger, cdft_constraint_section,
"PROGRAM_RUN_INFO", extension=
".cdftLog")
1175 cdft_control => dft_control%qs_control%cdft_control
1177 becke_control => cdft_control%becke_control
1178 IF (is_becke .AND. .NOT.
ASSOCIATED(becke_control))
THEN
1179 cpabort(
"Becke control has not been allocated.")
1181 group => cdft_control%group
1183 nvar =
SIZE(cdft_control%target)
1184 ALLOCATE (strength(nvar))
1185 ALLOCATE (target_val(nvar))
1187 strength(:) = cdft_control%strength(:)
1190 dvol = group(1)%weight%pw_grid%dvol
1191 IF (cdft_control%atomic_charges)
THEN
1192 charge => cdft_control%charge
1193 ALLOCATE (electronic_charge(cdft_control%natoms, dft_control%nspins))
1194 electronic_charge = 0.0_dp
1197 DO i = 1, dft_control%nspins
1198 DO igroup = 1,
SIZE(group)
1199 SELECT CASE (group(igroup)%constraint_type)
1215 cpabort(
"Unknown constraint type.")
1217 IF (is_becke .AND. (cdft_control%external_control .AND. becke_control%cavity_confine))
THEN
1219 eps_cavity = becke_control%eps_cavity
1220 IF (igroup /= 1)
THEN
1221 CALL cp_abort(__location__, &
1222 "Multiple constraints not yet supported by parallel mixed calculations.")
1224 de(igroup) = de(igroup) + sign*
accurate_dot_product(group(igroup)%weight%array, rho_r(i)%array, &
1225 becke_control%cavity_mat, eps_cavity)*dvol
1227 de(igroup) = de(igroup) + sign*
pw_integral_ab(group(igroup)%weight, rho_r(i), local_only=.true.)
1230 IF (cdft_control%atomic_charges)
THEN
1231 DO iatom = 1, cdft_control%natoms
1232 electronic_charge(iatom, i) =
pw_integral_ab(charge(iatom), rho_r(i), local_only=.true.)
1237 CALL para_env%sum(de)
1238 IF (cdft_control%atomic_charges)
THEN
1239 CALL para_env%sum(electronic_charge)
1242 IF (cdft_control%fragment_density .AND. .NOT. cdft_control%fragments_integrated)
THEN
1243 CALL prepare_fragment_constraint(qs_env)
1247 target_val(:) = cdft_control%target(:)
1248 cdft_control%value(:) = de(:)
1249 energy%cdft = 0.0_dp
1251 energy%cdft = energy%cdft + (de(ivar) - target_val(ivar))*strength(ivar)
1254 IF (.NOT. dft_control%qs_control%gapw)
THEN
1258 DEALLOCATE (de, strength, target_val)
1259 IF (cdft_control%atomic_charges)
DEALLOCATE (electronic_charge)
1261 CALL timestop(handle)
1263 END SUBROUTINE cdft_constraint_integrate
1269 SUBROUTINE cdft_constraint_force(qs_env)
1272 CHARACTER(len=*),
PARAMETER :: routinen =
'cdft_constraint_force'
1274 INTEGER :: handle, i, iatom, igroup, ikind, ispin, &
1276 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: atom_of_kind, kind_of
1277 INTEGER,
DIMENSION(2, 3) :: bo
1278 INTEGER,
DIMENSION(3) :: lb, ub
1279 REAL(kind=
dp) :: dvol, eps_cavity, sign
1280 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: strength
1281 REAL(kind=
dp),
DIMENSION(:),
POINTER :: cutoffs
1294 CALL timeset(routinen, handle)
1295 NULLIFY (atomic_kind_set, cell, para_env, dft_control, particle_set, &
1296 rho, rho_r, force, cutoffs, becke_control, group)
1299 atomic_kind_set=atomic_kind_set, &
1301 particle_set=particle_set, &
1305 dft_control=dft_control, &
1309 cdft_control => dft_control%qs_control%cdft_control
1310 becke_control => cdft_control%becke_control
1311 group => cdft_control%group
1312 nvar =
SIZE(cdft_control%target)
1313 ALLOCATE (strength(nvar))
1314 strength(:) = cdft_control%strength(:)
1315 cutoffs => cdft_control%becke_control%cutoffs
1316 eps_cavity = cdft_control%becke_control%eps_cavity
1319 atom_of_kind=atom_of_kind, &
1321 DO igroup = 1,
SIZE(cdft_control%group)
1322 ALLOCATE (cdft_control%group(igroup)%integrated(3, natom))
1323 cdft_control%group(igroup)%integrated = 0.0_dp
1326 lb(1:3) = rho_r(1)%pw_grid%bounds_local(1, 1:3)
1327 ub(1:3) = rho_r(1)%pw_grid%bounds_local(2, 1:3)
1328 bo = cdft_control%group(1)%weight%pw_grid%bounds_local
1329 dvol = cdft_control%group(1)%weight%pw_grid%dvol
1333 IF (.NOT. cdft_control%becke_control%in_memory)
THEN
1334 CALL becke_constraint_low(qs_env, just_gradients=.true.)
1338 IF (.NOT. cdft_control%in_memory)
THEN
1339 CALL hirshfeld_constraint_low(qs_env, just_gradients=.true.)
1344 IF (.NOT.
ASSOCIATED(becke_control%cavity_mat))
THEN
1346 DO k = bo(1, 1), bo(2, 1)
1347 DO j = bo(1, 2), bo(2, 2)
1348 DO i = bo(1, 3), bo(2, 3)
1350 IF (cdft_control%becke_control%cavity_confine)
THEN
1351 IF (cdft_control%becke_control%cavity%array(k, j, i) < eps_cavity) cycle
1354 DO igroup = 1,
SIZE(cdft_control%group)
1356 DO ispin = 1, dft_control%nspins
1358 SELECT CASE (cdft_control%group(igroup)%constraint_type)
1362 IF (ispin == 1)
THEN
1369 IF (ispin == 2) cycle
1372 IF (ispin == 1) cycle
1374 cpabort(
"Unknown constraint type.")
1379 cdft_control%group(igroup)%integrated(:, iatom) = &
1380 cdft_control%group(igroup)%integrated(:, iatom) + sign* &
1381 cdft_control%group(igroup)%gradients(3*(iatom - 1) + 1:3*(iatom - 1) + 3, k, j, i) &
1382 *rho_r(ispin)%array(k, j, i) &
1387 cdft_control%group(igroup)%integrated(1, iatom) = &
1388 cdft_control%group(igroup)%integrated(1, iatom) + sign* &
1389 cdft_control%group(igroup)%gradients_x(iatom, k, j, i) &
1390 *rho_r(ispin)%array(k, j, i) &
1393 cdft_control%group(igroup)%integrated(2, iatom) = &
1394 cdft_control%group(igroup)%integrated(2, iatom) + sign* &
1395 cdft_control%group(igroup)%gradients_y(iatom, k, j, i) &
1396 *rho_r(ispin)%array(k, j, i) &
1399 cdft_control%group(igroup)%integrated(3, iatom) = &
1400 cdft_control%group(igroup)%integrated(3, iatom) + sign* &
1401 cdft_control%group(igroup)%gradients_z(iatom, k, j, i) &
1402 *rho_r(ispin)%array(k, j, i) &
1416 DO k = lbound(cdft_control%becke_control%cavity_mat, 1), ubound(cdft_control%becke_control%cavity_mat, 1)
1417 DO j = lbound(cdft_control%becke_control%cavity_mat, 2), ubound(cdft_control%becke_control%cavity_mat, 2)
1418 DO i = lbound(cdft_control%becke_control%cavity_mat, 3), ubound(cdft_control%becke_control%cavity_mat, 3)
1421 IF (cdft_control%becke_control%cavity_mat(k, j, i) < eps_cavity) cycle
1423 DO igroup = 1,
SIZE(group)
1425 DO ispin = 1, dft_control%nspins
1426 SELECT CASE (group(igroup)%constraint_type)
1430 IF (ispin == 1)
THEN
1437 IF (ispin == 2) cycle
1440 IF (ispin == 1) cycle
1442 cpabort(
"Unknown constraint type.")
1448 cdft_control%group(igroup)%integrated(:, iatom) = &
1449 cdft_control%group(igroup)%integrated(:, iatom) + sign* &
1450 cdft_control%group(igroup)%gradients(3*(iatom - 1) + 1:3*(iatom - 1) + 3, k, j, i) &
1451 *rho_r(ispin)%array(k, j, i) &
1456 cdft_control%group(igroup)%integrated(1, iatom) = &
1457 cdft_control%group(igroup)%integrated(1, iatom) + sign* &
1458 cdft_control%group(igroup)%gradients_x(iatom, k, j, i) &
1459 *rho_r(ispin)%array(k, j, i) &
1462 cdft_control%group(igroup)%integrated(2, iatom) = &
1463 cdft_control%group(igroup)%integrated(2, iatom) + sign* &
1464 cdft_control%group(igroup)%gradients_y(iatom, k, j, i) &
1465 *rho_r(ispin)%array(k, j, i) &
1468 cdft_control%group(igroup)%integrated(3, iatom) = &
1469 cdft_control%group(igroup)%integrated(3, iatom) + sign* &
1470 cdft_control%group(igroup)%gradients_z(iatom, k, j, i) &
1471 *rho_r(ispin)%array(k, j, i) &
1484 IF (.NOT. cdft_control%transfer_pot)
THEN
1486 DO igroup = 1,
SIZE(group)
1487 DEALLOCATE (cdft_control%group(igroup)%gradients)
1490 DO igroup = 1,
SIZE(group)
1491 DEALLOCATE (cdft_control%group(igroup)%gradients_x)
1492 DEALLOCATE (cdft_control%group(igroup)%gradients_y)
1493 DEALLOCATE (cdft_control%group(igroup)%gradients_z)
1498 DO igroup = 1,
SIZE(group)
1499 CALL para_env%sum(group(igroup)%integrated)
1505 IF (para_env%is_source())
THEN
1506 DO igroup = 1,
SIZE(group)
1508 ikind = kind_of(iatom)
1509 i = atom_of_kind(iatom)
1510 force(ikind)%rho_elec(:, i) = force(ikind)%rho_elec(:, i) + group(igroup)%integrated(:, iatom)*strength(igroup)
1515 DEALLOCATE (strength)
1516 DO igroup = 1,
SIZE(group)
1517 DEALLOCATE (group(igroup)%integrated)
1521 CALL timestop(handle)
1523 END SUBROUTINE cdft_constraint_force
1530 SUBROUTINE prepare_fragment_constraint(qs_env)
1533 CHARACTER(len=*),
PARAMETER :: routinen =
'prepare_fragment_constraint'
1535 INTEGER :: handle, i, iatom, igroup, natom, &
1536 nelectron_total, nfrag_spins
1537 LOGICAL :: is_becke, needs_spin_density
1538 REAL(kind=
dp) :: dvol, multiplier(2), nelectron_frag
1550 NULLIFY (para_env, dft_control, logger, subsys, pw_env, auxbas_pw_pool, group)
1551 CALL timeset(routinen, handle)
1555 dft_control=dft_control, &
1558 cdft_control => dft_control%qs_control%cdft_control
1560 becke_control => cdft_control%becke_control
1561 IF (is_becke .AND. .NOT.
ASSOCIATED(becke_control))
THEN
1562 cpabort(
"Becke control has not been allocated.")
1564 group => cdft_control%group
1565 dvol = group(1)%weight%pw_grid%dvol
1567 IF (.NOT. qs_env%single_point_run)
THEN
1568 CALL cp_abort(__location__, &
1569 "CDFT fragment constraints are only compatible with single "// &
1570 "point calculations (run_type ENERGY or ENERGY_FORCE).")
1572 needs_spin_density = .false.
1575 DO igroup = 1,
SIZE(group)
1576 SELECT CASE (group(igroup)%constraint_type)
1580 needs_spin_density = .true.
1582 CALL cp_abort(__location__, &
1583 "CDFT fragment constraint not yet compatible with "// &
1584 "spin specific constraints.")
1586 cpabort(
"Unknown constraint type.")
1589 IF (needs_spin_density)
THEN
1592 IF (cdft_control%flip_fragment(i)) multiplier(i) = -1.0_dp
1596 ALLOCATE (cdft_control%fragments(nfrag_spins, 2))
1597 ALLOCATE (rho_frag(nfrag_spins))
1599 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
1600 IF (dft_control%qs_control%gapw)
THEN
1601 CALL verify_gapw_fragment_cube(cdft_control%fragment_a_fname, spin_density=.false.)
1602 CALL verify_gapw_fragment_cube(cdft_control%fragment_b_fname, spin_density=.false.)
1603 IF (needs_spin_density)
THEN
1604 CALL verify_gapw_fragment_cube(cdft_control%fragment_a_spin_fname, spin_density=.true.)
1605 CALL verify_gapw_fragment_cube(cdft_control%fragment_b_spin_fname, spin_density=.true.)
1609 CALL auxbas_pw_pool%create_pw(cdft_control%fragments(1, 1))
1611 cdft_control%fragment_a_fname, 1.0_dp)
1612 CALL auxbas_pw_pool%create_pw(cdft_control%fragments(1, 2))
1614 cdft_control%fragment_b_fname, 1.0_dp)
1616 IF (needs_spin_density)
THEN
1617 CALL auxbas_pw_pool%create_pw(cdft_control%fragments(2, 1))
1619 cdft_control%fragment_a_spin_fname, multiplier(1))
1620 CALL auxbas_pw_pool%create_pw(cdft_control%fragments(2, 2))
1622 cdft_control%fragment_b_spin_fname, multiplier(2))
1625 DO i = 1, nfrag_spins
1626 CALL auxbas_pw_pool%create_pw(rho_frag(i))
1627 CALL pw_copy(cdft_control%fragments(i, 1), rho_frag(i))
1628 CALL pw_axpy(cdft_control%fragments(i, 2), rho_frag(i), 1.0_dp)
1629 CALL auxbas_pw_pool%give_back_pw(cdft_control%fragments(i, 1))
1630 CALL auxbas_pw_pool%give_back_pw(cdft_control%fragments(i, 2))
1632 DEALLOCATE (cdft_control%fragments)
1637 IF (nint(nelectron_frag) /= nelectron_total)
THEN
1638 CALL cp_abort(__location__, &
1639 "The number of electrons in the reference and interacting "// &
1640 "configurations does not match. Check your fragment cube files.")
1643 cdft_control%target = 0.0_dp
1644 DO igroup = 1,
SIZE(group)
1650 IF (is_becke .AND. (cdft_control%external_control .AND. becke_control%cavity_confine))
THEN
1651 cdft_control%target(igroup) = cdft_control%target(igroup) + &
1653 becke_control%cavity_mat, becke_control%eps_cavity)*dvol
1655 cdft_control%target(igroup) = cdft_control%target(igroup) + &
1656 pw_integral_ab(group(igroup)%weight, rho_frag(i), local_only=.true.)
1659 CALL para_env%sum(cdft_control%target)
1661 IF (cdft_control%atomic_charges)
THEN
1662 ALLOCATE (cdft_control%charges_fragment(cdft_control%natoms, nfrag_spins))
1663 DO i = 1, nfrag_spins
1664 DO iatom = 1, cdft_control%natoms
1665 cdft_control%charges_fragment(iatom, i) = &
1666 pw_integral_ab(cdft_control%charge(iatom), rho_frag(i), local_only=.true.)
1669 CALL para_env%sum(cdft_control%charges_fragment)
1671 DO i = 1, nfrag_spins
1672 CALL auxbas_pw_pool%give_back_pw(rho_frag(i))
1674 DEALLOCATE (rho_frag)
1675 cdft_control%fragments_integrated = .true.
1677 CALL timestop(handle)
1686 SUBROUTINE verify_gapw_fragment_cube(filename, spin_density)
1687 CHARACTER(LEN=*),
INTENT(IN) :: filename
1688 LOGICAL,
INTENT(IN) :: spin_density
1690 CHARACTER(LEN=256) :: title
1691 INTEGER :: input_unit, io_status
1692 LOGICAL :: usable_cube
1694 usable_cube = .false.
1695 IF (para_env%is_source())
THEN
1696 CALL open_file(file_name=trim(filename), file_status=
"OLD", &
1697 file_action=
"READ", unit_number=input_unit)
1698 READ (input_unit,
'(A)', iostat=io_status) title
1699 IF (io_status == 0)
THEN
1700 READ (input_unit,
'(A)', iostat=io_status) title
1701 usable_cube = io_status == 0
1704 IF (usable_cube)
THEN
1705 IF (spin_density)
THEN
1706 IF (index(title,
"SPIN DENSITY") > 0 .AND. &
1707 index(title,
"TOTAL SPIN DENSITY") == 0) usable_cube = .false.
1709 IF (index(title,
"ELECTRON DENSITY") > 0 .AND. &
1710 index(title,
"TOTAL ELECTRON DENSITY") == 0) usable_cube = .false.
1714 CALL para_env%bcast(usable_cube, 0)
1715 IF (.NOT. usable_cube)
THEN
1716 CALL cp_abort(__location__, &
1717 "GAPW fragment CDFT cannot use a regular CP2K GAPW density cube. "// &
1718 "Generate the reference with "// &
1719 "E_DENSITY_CUBE% DENSITY_INCLUDE TOTAL_DENSITY. "// &
1720 "Invalid reference: "//trim(filename))
1722 END SUBROUTINE verify_gapw_fragment_cube
1724 END SUBROUTINE prepare_fragment_constraint
static GRID_HOST_DEVICE int modulo(int a, int m)
Equivalent of Fortran's MODULO, which always return a positive number. https://gcc....
All kind of helpful little routines.
real(kind=dp) function, public exp_radius_very_extended(la_min, la_max, lb_min, lb_max, pab, o1, o2, ra, rb, rp, zetp, eps, prefactor, cutoff, epsabs)
computes the radius of the Gaussian outside of which it is smaller than eps
Define the atomic kind types and their sub types.
subroutine, public get_atomic_kind_set(atomic_kind_set, atom_of_kind, kind_of, natom_of_kind, maxatom, natom, nshell, fist_potential_present, shell_present, shell_adiabatic, shell_check_distance, damping_present)
Get attributes of an atomic kind set.
subroutine, public get_atomic_kind(atomic_kind, fist_potential, element_symbol, name, mass, kind_number, natom, atom_list, rcov, rvdw, z, qeff, apol, cpol, mm_radius, shell, shell_active, damping)
Get attributes of an atomic kind.
Handles all functions related to the CELL.
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
Utility routines to open and close files.
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.
subroutine, public close_file(unit_number, file_status)
Closes an open file given by its logical unit number.
various routines to log and control the output. The idea is that decisions about where to log should ...
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,...
A wrapper around pw_to_cube() which accepts particle_list_type.
subroutine, public cp_cube_to_pw(grid, filename, scaling, silent)
Thin wrapper around routine cube_to_pw.
Fortran API for the grid package, which is written in C.
integer, parameter, public grid_func_ab
subroutine, public collocate_pgf_product(la_max, zeta, la_min, lb_max, zetb, lb_min, ra, rab, scale, pab, o1, o2, rsgrid, ga_gb_function, radius, use_subpatch, subpatch_pattern)
low level collocation of primitive gaussian functions
The types needed for the calculation of Hirshfeld charges and related functions.
sums arrays of real/complex numbers with much reduced round-off as compared to a naive implementation...
Defines the basic variable types.
integer, parameter, public dp
Interface to the message passing library MPI.
Define the data structure for the particle information.
container for various plainwaves related things
subroutine, public pw_env_get(pw_env, pw_pools, cube_info, gridlevel_info, auxbas_pw_pool, auxbas_grid, auxbas_rs_desc, auxbas_rs_grid, rs_descs, rs_grids, xc_pw_pool, vdw_pw_pool, poisson_env, interp_section)
returns the various attributes of the pw env
Manages a pool of grids (to be used for example as tmp objects), but can also be used to instantiate ...
Subroutines for building CDFT constraints.
subroutine, public becke_constraint(qs_env, calc_pot, calculate_forces)
Driver routine for calculating a Becke constraint.
subroutine, public hirshfeld_constraint(qs_env, calc_pot, calculate_forces)
Driver routine for calculating a Hirshfeld constraint.
Defines CDFT control structures.
Utility subroutines for CDFT calculations.
subroutine, public cdft_constraint_print(qs_env, electronic_charge)
Prints information about CDFT constraints.
subroutine, public hirshfeld_constraint_init(qs_env)
Initializes Gaussian Hirshfeld constraints.
subroutine, public becke_constraint_init(qs_env)
Initializes the Becke constraint environment.
subroutine, public hfun_scale(fout, fun1, fun2, divide, small)
Calculate fout = fun1/fun2 or fout = fun1*fun2.
subroutine, public cdft_print_hirshfeld_density(qs_env)
Prints Hirshfeld weight function and promolecule density.
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.
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)
...
subroutine, public rs_grid_create(rs, desc)
...
subroutine, public transfer_rs2pw(rs, pw)
...
subroutine, public rs_grid_release(rs_grid)
releases the given rs grid (see doc/ReferenceCounting.html)
subroutine, public rs_grid_zero(rs)
Initialize grid to zero.
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...
quantities needed for a Hirshfeld based partitioning of real space
stores all the informations relevant to an mpi environment
contained for different pw related things
Manages a pool of grids (to be used for example as tmp objects), but can also be used to instantiate ...
control parameters for CDFT simulations
keeps the density in various representations, keeping track of which ones are valid.