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'
143 INTEGER :: handle, i, iatom, igroup, ind(3), ip, j, &
144 jatom, jp, k, natom, np(3), nskipped
145 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: catom
146 INTEGER,
DIMENSION(2, 3) :: bo, bo_conf
147 LOGICAL :: in_memory, my_just_gradients
148 LOGICAL,
ALLOCATABLE,
DIMENSION(:) :: is_constraint, skip_me
149 LOGICAL,
ALLOCATABLE,
DIMENSION(:, :) :: atom_in_group
150 REAL(kind=
dp) :: dist1, dist2, dmyexp, dvol, eps_cavity, &
151 my1, my1_homo, myexp, sum_cell_f_all, &
153 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: cell_functions, ds_dr_i, ds_dr_j, &
155 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: d_sum_pm_dr, dp_i_dri
156 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: dp_i_drj
157 REAL(kind=
dp),
DIMENSION(3) :: cell_v, dist_vec, dmy_dr_i, dmy_dr_j, &
158 dr, dr1_r2, dr_i_dr, dr_ij_dr, &
159 dr_j_dr, grid_p, r, r1, shift
160 REAL(kind=
dp),
DIMENSION(:),
POINTER :: cutoffs
169 NULLIFY (cutoffs, cell, dft_control, particle_set, group, charge, cdft_control)
170 CALL timeset(routinen, handle)
174 particle_set=particle_set, &
176 dft_control=dft_control)
177 cdft_control => dft_control%qs_control%cdft_control
178 becke_control => cdft_control%becke_control
179 group => cdft_control%group
180 cutoffs => becke_control%cutoffs
181 IF (cdft_control%atomic_charges)
THEN
182 charge => cdft_control%charge
185 IF (cdft_control%save_pot)
THEN
186 in_memory = becke_control%in_memory
188 eps_cavity = becke_control%eps_cavity
190 my_just_gradients = .false.
191 IF (
PRESENT(just_gradients)) my_just_gradients = just_gradients
192 IF (my_just_gradients)
THEN
195 IF (becke_control%vector_buffer%store_vectors)
THEN
196 ALLOCATE (becke_control%vector_buffer%distances(natom))
197 ALLOCATE (becke_control%vector_buffer%distance_vecs(3, natom))
198 IF (in_memory)
ALLOCATE (becke_control%vector_buffer%pair_dist_vecs(3, natom, natom))
199 ALLOCATE (becke_control%vector_buffer%position_vecs(3, natom))
201 ALLOCATE (becke_control%vector_buffer%R12(natom, natom))
203 cell_v(i) = cell%hmat(i, i)
205 DO iatom = 1, natom - 1
206 DO jatom = iatom + 1, natom
207 r = particle_set(iatom)%r
208 r1 = particle_set(jatom)%r
210 r(i) =
modulo(r(i), cell%hmat(i, i)) - cell%hmat(i, i)/2._dp
211 r1(i) =
modulo(r1(i), cell%hmat(i, i)) - cell%hmat(i, i)/2._dp
213 dist_vec = (r - r1) - anint((r - r1)/cell_v)*cell_v
214 IF (becke_control%vector_buffer%store_vectors)
THEN
215 becke_control%vector_buffer%position_vecs(:, iatom) = r(:)
216 IF (iatom == 1 .AND. jatom == natom) becke_control%vector_buffer%position_vecs(:, jatom) = r1(:)
218 becke_control%vector_buffer%pair_dist_vecs(:, iatom, jatom) = dist_vec(:)
219 becke_control%vector_buffer%pair_dist_vecs(:, jatom, iatom) = -dist_vec(:)
222 becke_control%vector_buffer%R12(iatom, jatom) = norm2(dist_vec)
223 becke_control%vector_buffer%R12(jatom, iatom) = becke_control%vector_buffer%R12(iatom, jatom)
227 ALLOCATE (catom(cdft_control%natoms))
228 IF (cdft_control%save_pot .OR. &
229 becke_control%cavity_confine .OR. &
230 becke_control%should_skip)
THEN
231 ALLOCATE (is_constraint(natom))
232 is_constraint = .false.
237 ALLOCATE (skip_me(natom))
238 DO i = 1, cdft_control%natoms
239 catom(i) = cdft_control%atoms(i)
242 IF (cdft_control%save_pot .OR. &
243 becke_control%cavity_confine .OR. &
244 becke_control%should_skip)
THEN
245 is_constraint(catom(i)) = .true.
248 bo = group(1)%weight%pw_grid%bounds_local
249 dvol = group(1)%weight%pw_grid%dvol
250 dr = group(1)%weight%pw_grid%dr
251 np = group(1)%weight%pw_grid%npts
252 shift = -real(
modulo(np, 2),
dp)*dr/2.0_dp
254 cell_v(i) = cell%hmat(i, i)
261 IF (becke_control%cavity_confine)
THEN
262 bo_conf(1, 3) = becke_control%confine_bounds(1)
263 bo_conf(2, 3) = becke_control%confine_bounds(2)
265 ALLOCATE (atom_in_group(
SIZE(group), natom))
266 atom_in_group = .false.
267 DO igroup = 1,
SIZE(group)
268 ALLOCATE (group(igroup)%gradients(3*natom, bo_conf(1, 1):bo_conf(2, 1), &
269 bo_conf(1, 2):bo_conf(2, 2), &
270 bo_conf(1, 3):bo_conf(2, 3)))
271 group(igroup)%gradients = 0.0_dp
272 ALLOCATE (group(igroup)%d_sum_const_dR(3, natom))
273 group(igroup)%d_sum_const_dR = 0.0_dp
274 DO ip = 1,
SIZE(group(igroup)%atoms)
275 atom_in_group(igroup, group(igroup)%atoms(ip)) = .true.
280 ALLOCATE (sum_cell_f_group(
SIZE(group)))
281 ALLOCATE (cell_functions(natom))
283 ALLOCATE (ds_dr_j(3))
284 ALLOCATE (ds_dr_i(3))
285 ALLOCATE (d_sum_pm_dr(3, natom))
286 ALLOCATE (dp_i_drj(3, natom, natom))
287 ALLOCATE (dp_i_dri(3, natom))
291 DO k = bo(1, 1), bo(2, 1)
292 DO j = bo(1, 2), bo(2, 2)
293 DO i = bo(1, 3), bo(2, 3)
296 IF (becke_control%cavity_confine)
THEN
297 IF (becke_control%cavity%array(k, j, i) < eps_cavity) cycle
300 grid_p(1) = k*dr(1) + shift(1)
301 grid_p(2) = j*dr(2) + shift(2)
302 grid_p(3) = i*dr(3) + shift(3)
304 cell_functions = 1.0_dp
306 IF (becke_control%vector_buffer%store_vectors) becke_control%vector_buffer%distances = 0.0_dp
309 DO igroup = 1,
SIZE(group)
310 group(igroup)%d_sum_const_dR = 0.0_dp
316 IF (skip_me(iatom))
THEN
317 cell_functions(iatom) = 0.0_dp
318 IF (becke_control%should_skip)
THEN
319 IF (is_constraint(iatom)) nskipped = nskipped + 1
320 IF (nskipped == cdft_control%natoms)
THEN
322 IF (becke_control%cavity_confine)
THEN
323 becke_control%cavity%array(k, j, i) = 0.0_dp
331 IF (becke_control%vector_buffer%store_vectors)
THEN
332 IF (becke_control%vector_buffer%distances(iatom) == 0.0_dp)
THEN
333 r = becke_control%vector_buffer%position_vecs(:, iatom)
334 dist_vec = (r - grid_p) - anint((r - grid_p)/cell_v)*cell_v
335 dist1 = norm2(dist_vec)
336 becke_control%vector_buffer%distance_vecs(:, iatom) = dist_vec
337 becke_control%vector_buffer%distances(iatom) = dist1
339 dist_vec = becke_control%vector_buffer%distance_vecs(:, iatom)
340 dist1 = becke_control%vector_buffer%distances(iatom)
343 r = particle_set(iatom)%r
345 r(ip) =
modulo(r(ip), cell%hmat(ip, ip)) - cell%hmat(ip, ip)/2._dp
347 dist_vec = (r - grid_p) - anint((r - grid_p)/cell_v)*cell_v
348 dist1 = norm2(dist_vec)
350 IF (dist1 <= cutoffs(iatom))
THEN
352 IF (dist1 <= th) dist1 = th
353 dr_i_dr(:) = dist_vec(:)/dist1
356 IF (jatom /= iatom)
THEN
362 IF (jatom < iatom)
THEN
363 IF (.NOT. skip_me(jatom)) cycle
365 IF (becke_control%vector_buffer%store_vectors)
THEN
366 IF (becke_control%vector_buffer%distances(jatom) == 0.0_dp)
THEN
367 r1 = becke_control%vector_buffer%position_vecs(:, jatom)
368 dist_vec = (r1 - grid_p) - anint((r1 - grid_p)/cell_v)*cell_v
369 dist2 = norm2(dist_vec)
370 becke_control%vector_buffer%distance_vecs(:, jatom) = dist_vec
371 becke_control%vector_buffer%distances(jatom) = dist2
373 dist_vec = becke_control%vector_buffer%distance_vecs(:, jatom)
374 dist2 = becke_control%vector_buffer%distances(jatom)
377 r1 = particle_set(jatom)%r
379 r1(ip) =
modulo(r1(ip), cell%hmat(ip, ip)) - cell%hmat(ip, ip)/2._dp
381 dist_vec = (r1 - grid_p) - anint((r1 - grid_p)/cell_v)*cell_v
382 dist2 = norm2(dist_vec)
385 IF (becke_control%vector_buffer%store_vectors)
THEN
386 dr1_r2 = becke_control%vector_buffer%pair_dist_vecs(:, iatom, jatom)
388 dr1_r2 = (r - r1) - anint((r - r1)/cell_v)*cell_v
390 IF (dist2 <= th) dist2 = th
391 tmp_const = (becke_control%vector_buffer%R12(iatom, jatom)**3)
392 dr_ij_dr(:) = dr1_r2(:)/tmp_const
394 dr_j_dr = dist_vec(:)/dist2
395 dmy_dr_j(:) = -(dr_j_dr(:)/becke_control%vector_buffer%R12(iatom, jatom) - (dist1 - dist2)*dr_ij_dr(:))
397 dmy_dr_i(:) = dr_i_dr(:)/becke_control%vector_buffer%R12(iatom, jatom) - (dist1 - dist2)*dr_ij_dr(:)
400 my1 = (dist1 - dist2)/becke_control%vector_buffer%R12(iatom, jatom)
401 IF (becke_control%adjust)
THEN
403 my1 = my1 + becke_control%aij(iatom, jatom)*(1.0_dp - my1**2)
406 myexp = 1.5_dp*my1 - 0.5_dp*my1**3
408 dmyexp = 1.5_dp - 1.5_dp*my1**2
409 tmp_const = (1.5_dp**2)*dmyexp*(1 - myexp**2)* &
410 (1.0_dp - ((1.5_dp*myexp - 0.5_dp*(myexp**3))**2))
412 ds_dr_i(:) = -0.5_dp*tmp_const*dmy_dr_i(:)
414 ds_dr_j(:) = -0.5_dp*tmp_const*dmy_dr_j(:)
415 IF (becke_control%adjust)
THEN
416 tmp_const = 1.0_dp - 2.0_dp*my1_homo* &
417 becke_control%aij(iatom, jatom)
418 ds_dr_i(:) = ds_dr_i(:)*tmp_const
420 ds_dr_j(:) = ds_dr_j(:)*tmp_const
424 myexp = 1.5_dp*myexp - 0.5_dp*myexp**3
425 myexp = 1.5_dp*myexp - 0.5_dp*myexp**3
426 tmp_const = 0.5_dp*(1.0_dp - myexp)
427 cell_functions(iatom) = cell_functions(iatom)*tmp_const
429 IF (abs(tmp_const) <= th) tmp_const = tmp_const + th
431 dp_i_dri(:, iatom) = dp_i_dri(:, iatom) + ds_dr_i(:)/tmp_const
433 dp_i_drj(:, iatom, jatom) = ds_dr_j(:)/tmp_const
436 IF (dist2 <= cutoffs(jatom))
THEN
437 tmp_const = 0.5_dp*(1.0_dp + myexp)
438 cell_functions(jatom) = cell_functions(jatom)*tmp_const
440 IF (abs(tmp_const) <= th) tmp_const = tmp_const + th
443 dp_i_drj(:, jatom, iatom) = -ds_dr_i(:)/tmp_const
446 dp_i_dri(:, jatom) = dp_i_dri(:, jatom) - ds_dr_j(:)/tmp_const
449 skip_me(jatom) = .true.
455 dp_i_dri(:, iatom) = cell_functions(iatom)*dp_i_dri(:, iatom)
457 d_sum_pm_dr(:, iatom) = d_sum_pm_dr(:, iatom) + dp_i_dri(:, iatom)
458 IF (is_constraint(iatom))
THEN
459 DO igroup = 1,
SIZE(group)
460 IF (.NOT. atom_in_group(igroup, iatom)) cycle
461 DO jp = 1,
SIZE(group(igroup)%atoms)
462 IF (iatom == group(igroup)%atoms(jp))
THEN
467 group(igroup)%d_sum_const_dR(1:3, iatom) = group(igroup)%d_sum_const_dR(1:3, iatom) + &
468 group(igroup)%coeff(ip)*dp_i_dri(:, iatom)
472 IF (jatom /= iatom)
THEN
474 dp_i_drj(:, iatom, jatom) = cell_functions(iatom)*dp_i_drj(:, iatom, jatom)
476 d_sum_pm_dr(:, jatom) = d_sum_pm_dr(:, jatom) + dp_i_drj(:, iatom, jatom)
477 IF (is_constraint(iatom))
THEN
478 DO igroup = 1,
SIZE(group)
479 IF (.NOT. atom_in_group(igroup, iatom)) cycle
481 DO jp = 1,
SIZE(group(igroup)%atoms)
482 IF (iatom == group(igroup)%atoms(jp))
THEN
487 group(igroup)%d_sum_const_dR(1:3, jatom) = group(igroup)%d_sum_const_dR(1:3, jatom) + &
488 group(igroup)%coeff(ip)* &
489 dp_i_drj(:, iatom, jatom)
496 cell_functions(iatom) = 0.0_dp
497 skip_me(iatom) = .true.
498 IF (becke_control%should_skip)
THEN
499 IF (is_constraint(iatom)) nskipped = nskipped + 1
500 IF (nskipped == cdft_control%natoms)
THEN
502 IF (becke_control%cavity_confine)
THEN
503 becke_control%cavity%array(k, j, i) = 0.0_dp
511 IF (nskipped == cdft_control%natoms) cycle
513 sum_cell_f_group = 0.0_dp
514 DO igroup = 1,
SIZE(group)
515 DO ip = 1,
SIZE(group(igroup)%atoms)
516 sum_cell_f_group(igroup) = sum_cell_f_group(igroup) + group(igroup)%coeff(ip)* &
517 cell_functions(group(igroup)%atoms(ip))
520 sum_cell_f_all = 0.0_dp
522 sum_cell_f_all = sum_cell_f_all + cell_functions(ip)
525 IF (in_memory .AND. abs(sum_cell_f_all) > 0.0_dp)
THEN
526 DO igroup = 1,
SIZE(group)
528 group(igroup)%gradients(3*(iatom - 1) + 1:3*(iatom - 1) + 3, k, j, i) = &
529 group(igroup)%d_sum_const_dR(1:3, iatom)/sum_cell_f_all - sum_cell_f_group(igroup)* &
530 d_sum_pm_dr(1:3, iatom)/(sum_cell_f_all**2)
535 IF (.NOT. my_just_gradients .AND. abs(sum_cell_f_all) > 0.000001)
THEN
536 DO igroup = 1,
SIZE(group)
537 group(igroup)%weight%array(k, j, i) = sum_cell_f_group(igroup)/sum_cell_f_all
539 IF (cdft_control%atomic_charges)
THEN
540 DO iatom = 1, cdft_control%natoms
541 charge(iatom)%array(k, j, i) = cell_functions(catom(iatom))/sum_cell_f_all
552 DEALLOCATE (d_sum_pm_dr)
553 DEALLOCATE (dp_i_drj)
554 DEALLOCATE (dp_i_dri)
555 DO igroup = 1,
SIZE(group)
556 DEALLOCATE (group(igroup)%d_sum_const_dR)
558 DEALLOCATE (atom_in_group)
559 IF (becke_control%vector_buffer%store_vectors)
THEN
560 DEALLOCATE (becke_control%vector_buffer%pair_dist_vecs)
564 IF (
ALLOCATED(is_constraint))
THEN
565 DEALLOCATE (is_constraint)
568 DEALLOCATE (cell_functions)
570 DEALLOCATE (sum_cell_f_group)
571 DEALLOCATE (becke_control%vector_buffer%R12)
572 IF (becke_control%vector_buffer%store_vectors)
THEN
573 DEALLOCATE (becke_control%vector_buffer%distances)
574 DEALLOCATE (becke_control%vector_buffer%distance_vecs)
575 DEALLOCATE (becke_control%vector_buffer%position_vecs)
577 CALL timestop(handle)
579 END SUBROUTINE becke_constraint_low
589 LOGICAL :: calc_pot, calculate_forces
591 CHARACTER(len=*),
PARAMETER :: routinen =
'hirshfeld_constraint'
597 CALL timeset(routinen, handle)
598 CALL get_qs_env(qs_env, dft_control=dft_control)
599 cdft_control => dft_control%qs_control%cdft_control
605 CALL hirshfeld_constraint_low(qs_env)
609 CALL cdft_constraint_integrate(qs_env)
610 IF (calculate_forces)
CALL cdft_constraint_force(qs_env)
612 CALL timestop(handle)
621 SUBROUTINE hirshfeld_constraint_low(qs_env, just_gradients)
623 LOGICAL,
OPTIONAL :: just_gradients
625 CHARACTER(len=*),
PARAMETER :: routinen =
'hirshfeld_constraint_low'
627 INTEGER :: atom_a, atoms_memory, atoms_memory_num, handle, i, iatom, iex, igroup, ikind, &
628 ithread, j, k, natom, npme, nthread, num_atoms, num_species, numexp, subpatch_pattern
629 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: num_species_small
630 INTEGER,
DIMENSION(2, 3) :: bo
631 INTEGER,
DIMENSION(3) :: lb_pw, lb_rs, ub_pw, ub_rs
632 INTEGER,
DIMENSION(:),
POINTER :: atom_list, cores
633 LOGICAL :: my_just_gradients
634 LOGICAL,
ALLOCATABLE,
DIMENSION(:) :: compute_charge, is_constraint
635 REAL(kind=
dp) :: alpha, coef, eps_rho_rspace, exp_eval, &
637 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: coefficients
638 REAL(kind=
dp),
DIMENSION(3) :: dr_rs, r2, r_pbc, ra
639 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: pab
656 DIMENSION(:) :: rs_single, rs_single_charge, rs_single_dr
658 NULLIFY (atom_list, atomic_kind_set, dft_control, &
659 hirshfeld_env, particle_set, pw_env, auxbas_pw_pool, para_env, &
660 auxbas_rs_desc, cdft_control, pab, &
661 hirshfeld_control, cell, rho_r, rho)
663 CALL timeset(routinen, handle)
665 atomic_kind_set=atomic_kind_set, &
666 particle_set=particle_set, &
670 dft_control=dft_control, &
677 cdft_control => dft_control%qs_control%cdft_control
678 hirshfeld_control => cdft_control%hirshfeld_control
679 hirshfeld_env => hirshfeld_control%hirshfeld_env
682 my_just_gradients = .false.
683 IF (
PRESENT(just_gradients)) my_just_gradients = just_gradients
684 IF (my_just_gradients)
THEN
685 cdft_control%in_memory = .true.
686 hirshfeld_control%print_density = .false.
689 ALLOCATE (coefficients(natom))
690 ALLOCATE (is_constraint(natom))
693 eps_rho_rspace = dft_control%qs_control%eps_rho_rspace
696 lb_pw(1:3) = rho_r(1)%pw_grid%bounds_local(1, 1:3)
697 ub_pw(1:3) = rho_r(1)%pw_grid%bounds_local(2, 1:3)
699 CALL pw_env_get(pw_env, auxbas_rs_desc=auxbas_rs_desc, &
700 auxbas_pw_pool=auxbas_pw_pool)
704 dr_rs(1) = rs_rho_all%desc%dh(1, 1)
705 dr_rs(2) = rs_rho_all%desc%dh(2, 2)
706 dr_rs(3) = rs_rho_all%desc%dh(3, 3)
707 lb_rs(1) = lbound(rs_rho_all%r(:, :, :), 1)
708 lb_rs(2) = lbound(rs_rho_all%r(:, :, :), 2)
709 lb_rs(3) = lbound(rs_rho_all%r(:, :, :), 3)
710 ub_rs(1) = ubound(rs_rho_all%r(:, :, :), 1)
711 ub_rs(2) = ubound(rs_rho_all%r(:, :, :), 2)
712 ub_rs(3) = ubound(rs_rho_all%r(:, :, :), 3)
715 DO igroup = 1,
SIZE(cdft_control%group)
717 IF (igroup == 2 .AND. .NOT. cdft_control%in_memory)
THEN
720 bo = cdft_control%group(igroup)%weight%pw_grid%bounds_local
723 coefficients(:) = 0.0_dp
724 is_constraint = .false.
725 DO i = 1,
SIZE(cdft_control%group(igroup)%atoms)
726 coefficients(cdft_control%group(igroup)%atoms(i)) = cdft_control%group(igroup)%coeff(i)
727 is_constraint(cdft_control%group(igroup)%atoms(i)) = .true.
735 IF (hirshfeld_control%print_density .AND. igroup == 1)
THEN
736 ALLOCATE (cdft_control%group(igroup)%hw_rho_atomic(cdft_control%natoms))
737 ALLOCATE (rs_single(cdft_control%natoms))
738 DO i = 1, cdft_control%natoms
745 CALL pw_zero(cdft_control%group(igroup)%weight)
747 CALL auxbas_pw_pool%create_pw(cdft_control%group(igroup)%hw_rho_total_constraint)
748 CALL pw_set(cdft_control%group(igroup)%hw_rho_total_constraint, 1.0_dp)
750 IF (igroup == 1)
THEN
751 CALL auxbas_pw_pool%create_pw(cdft_control%hw_rho_total)
752 CALL pw_set(cdft_control%hw_rho_total, 1.0_dp)
754 IF (hirshfeld_control%print_density)
THEN
755 DO iatom = 1, cdft_control%natoms
756 CALL auxbas_pw_pool%create_pw(cdft_control%group(igroup)%hw_rho_atomic(iatom))
757 CALL pw_set(cdft_control%group(igroup)%hw_rho_atomic(iatom), 1.0_dp)
762 IF (cdft_control%atomic_charges .AND. igroup == 1)
THEN
763 ALLOCATE (cdft_control%group(igroup)%hw_rho_atomic_charge(cdft_control%natoms))
764 ALLOCATE (rs_single_charge(cdft_control%natoms))
765 ALLOCATE (compute_charge(natom))
766 compute_charge = .false.
768 DO i = 1, cdft_control%natoms
771 compute_charge(cdft_control%atoms(i)) = .true.
774 DO iatom = 1, cdft_control%natoms
775 CALL auxbas_pw_pool%create_pw(cdft_control%group(igroup)%hw_rho_atomic_charge(iatom))
776 CALL pw_set(cdft_control%group(igroup)%hw_rho_atomic_charge(iatom), 1.0_dp)
784 DO ikind = 1,
SIZE(atomic_kind_set)
785 numexp = hirshfeld_env%kind_shape_fn(ikind)%numexp
786 IF (numexp <= 0) cycle
787 CALL get_atomic_kind(atomic_kind_set(ikind), natom=num_species, atom_list=atom_list)
788 ALLOCATE (cores(num_species))
791 alpha = hirshfeld_env%kind_shape_fn(ikind)%zet(iex)
792 coef = hirshfeld_env%kind_shape_fn(ikind)%coef(iex)
795 DO iatom = 1, num_species
796 atom_a = atom_list(iatom)
797 ra(:) =
pbc(particle_set(atom_a)%r, cell)
798 IF (rs_rho_all%desc%parallel .AND. .NOT. rs_rho_all%desc%distributed)
THEN
799 IF (
modulo(iatom, rs_rho_all%desc%group_size) == rs_rho_all%desc%my_pos)
THEN
810 atom_a = atom_list(iatom)
811 pab(1, 1) = coef*hirshfeld_env%charges(atom_a)
812 ra(:) =
pbc(particle_set(atom_a)%r, cell)
814 IF (hirshfeld_control%use_atomic_cutoff)
THEN
816 ra=ra, rb=ra, rp=ra, &
817 zetp=alpha, eps=hirshfeld_control%atomic_cutoff, &
818 pab=pab, o1=0, o2=0, &
819 prefactor=1.0_dp, cutoff=0.0_dp)
822 IF (igroup == 1)
THEN
824 [0.0_dp, 0.0_dp, 0.0_dp], 1.0_dp, pab, 0, 0, &
825 rs_rho_all, radius=radius, &
827 subpatch_pattern=subpatch_pattern)
830 IF (is_constraint(atom_a))
THEN
832 [0.0_dp, 0.0_dp, 0.0_dp], coefficients(atom_a), &
833 pab, 0, 0, rs_rho_constr, &
836 subpatch_pattern=subpatch_pattern)
839 IF (hirshfeld_control%print_density .AND. igroup == 1)
THEN
840 IF (is_constraint(atom_a))
THEN
841 DO iatom = 1, cdft_control%natoms
842 IF (atom_a == cdft_control%atoms(iatom))
EXIT
844 cpassert(iatom <= cdft_control%natoms)
846 [0.0_dp, 0.0_dp, 0.0_dp], 1.0_dp, pab, 0, 0, &
847 rs_single(iatom), radius=radius, &
849 subpatch_pattern=subpatch_pattern)
853 IF (cdft_control%atomic_charges .AND. igroup == 1)
THEN
854 IF (compute_charge(atom_a))
THEN
855 DO iatom = 1, cdft_control%natoms
856 IF (atom_a == cdft_control%atoms(iatom))
EXIT
858 cpassert(iatom <= cdft_control%natoms)
860 [0.0_dp, 0.0_dp, 0.0_dp], 1.0_dp, pab, 0, 0, &
861 rs_single_charge(iatom), radius=radius, &
863 subpatch_pattern=subpatch_pattern)
873 IF (igroup == 1)
THEN
877 CALL transfer_rs2pw(rs_rho_constr, cdft_control%group(igroup)%hw_rho_total_constraint)
881 CALL hfun_scale(cdft_control%group(igroup)%weight%array, &
882 cdft_control%group(igroup)%hw_rho_total_constraint%array, &
883 cdft_control%hw_rho_total%array, divide=.true., &
884 small=hirshfeld_control%eps_cutoff)
887 IF (cdft_control%atomic_charges .AND. igroup == 1)
THEN
888 DO i = 1, cdft_control%natoms
889 CALL transfer_rs2pw(rs_single_charge(i), cdft_control%group(igroup)%hw_rho_atomic_charge(i))
890 CALL hfun_scale(cdft_control%charge(i)%array, &
891 cdft_control%group(igroup)%hw_rho_atomic_charge(i)%array, &
892 cdft_control%hw_rho_total%array, divide=.true., &
893 small=hirshfeld_control%eps_cutoff)
898 IF (hirshfeld_control%print_density .AND. igroup == 1)
THEN
899 DO i = 1, cdft_control%natoms
900 CALL transfer_rs2pw(rs_single(i), cdft_control%group(igroup)%hw_rho_atomic(i))
907 DO igroup = 1,
SIZE(cdft_control%group)
909 CALL auxbas_pw_pool%give_back_pw(cdft_control%group(igroup)%hw_rho_total_constraint)
911 IF (.NOT. cdft_control%in_memory .AND. igroup == 1)
THEN
912 CALL auxbas_pw_pool%give_back_pw(cdft_control%hw_rho_total)
915 IF (hirshfeld_control%print_density .AND. igroup == 1)
THEN
916 DO i = 1, cdft_control%natoms
918 CALL auxbas_pw_pool%give_back_pw(cdft_control%group(igroup)%hw_rho_atomic(i))
920 DEALLOCATE (rs_single)
921 DEALLOCATE (cdft_control%group(igroup)%hw_rho_atomic)
924 IF (cdft_control%atomic_charges .AND. igroup == 1)
THEN
925 DO i = 1, cdft_control%natoms
927 CALL auxbas_pw_pool%give_back_pw(cdft_control%group(igroup)%hw_rho_atomic_charge(i))
929 DEALLOCATE (rs_single_charge)
930 DEALLOCATE (compute_charge)
931 DEALLOCATE (cdft_control%group(igroup)%hw_rho_atomic_charge)
936 IF (cdft_control%in_memory)
THEN
937 DO igroup = 1,
SIZE(cdft_control%group)
938 ALLOCATE (cdft_control%group(igroup)%gradients_x(1*natom, lb_pw(1):ub_pw(1), &
939 lb_pw(2):ub_pw(2), lb_pw(3):ub_pw(3)))
940 cdft_control%group(igroup)%gradients_x(:, :, :, :) = 0.0_dp
944 IF (cdft_control%in_memory)
THEN
945 DO igroup = 1,
SIZE(cdft_control%group)
950 atoms_memory = hirshfeld_control%atoms_memory
952 DO ikind = 1,
SIZE(atomic_kind_set)
953 numexp = hirshfeld_env%kind_shape_fn(ikind)%numexp
954 IF (numexp <= 0) cycle
955 CALL get_atomic_kind(atomic_kind_set(ikind), natom=num_species, atom_list=atom_list)
957 ALLOCATE (pw_single_dr(num_species))
958 ALLOCATE (rs_single_dr(num_species))
960 DO i = 1, num_species
961 CALL auxbas_pw_pool%create_pw(pw_single_dr(i))
965 atoms_memory_num =
SIZE([(j, j=1, num_species, atoms_memory)])
969 IF (num_species > atoms_memory)
THEN
970 ALLOCATE (num_species_small(atoms_memory_num + 1))
971 num_species_small(1:atoms_memory_num) = [(j, j=1, num_species, atoms_memory)]
972 num_species_small(atoms_memory_num + 1) = num_species
974 ALLOCATE (num_species_small(2))
975 num_species_small(:) = [1, num_species]
978 DO k = 1,
SIZE(num_species_small) - 1
979 IF (num_species > atoms_memory)
THEN
980 ALLOCATE (cores(num_species_small(k + 1) - (num_species_small(k) - 1)))
982 ALLOCATE (cores(num_species))
985 DO i = num_species_small(k), num_species_small(k + 1)
991 alpha = hirshfeld_env%kind_shape_fn(ikind)%zet(iex)
992 coef = hirshfeld_env%kind_shape_fn(ikind)%coef(iex)
993 prefactor = 2.0_dp*alpha
997 DO iatom = 1,
SIZE(cores)
998 atom_a = atom_list(iatom + (num_species_small(k) - 1))
999 ra(:) =
pbc(particle_set(atom_a)%r, cell)
1001 IF (rs_rho_all%desc%parallel .AND. .NOT. rs_rho_all%desc%distributed)
THEN
1002 IF (
modulo(iatom, rs_rho_all%desc%group_size) == rs_rho_all%desc%my_pos)
THEN
1013 atom_a = atom_list(iatom + (num_species_small(k) - 1))
1014 pab(1, 1) = coef*hirshfeld_env%charges(atom_a)
1015 ra(:) =
pbc(particle_set(atom_a)%r, cell)
1016 subpatch_pattern = 0
1019 IF (hirshfeld_control%use_atomic_cutoff)
THEN
1021 ra=ra, rb=ra, rp=ra, &
1022 zetp=alpha, eps=hirshfeld_control%atomic_cutoff, &
1023 pab=pab, o1=0, o2=0, &
1024 prefactor=1.0_dp, cutoff=0.0_dp)
1028 [0.0_dp, 0.0_dp, 0.0_dp], prefactor, &
1029 pab, 0, 0, rs_single_dr(iatom + (num_species_small(k) - 1)), &
1032 subpatch_pattern=subpatch_pattern)
1037 DO iatom = num_species_small(k), num_species_small(k + 1)
1045 DO iatom = 1, num_species
1046 atom_a = atom_list(iatom)
1047 cdft_control%group(igroup)%gradients_x(atom_a, :, :, :) = pw_single_dr(iatom)%array(:, :, :)
1048 CALL auxbas_pw_pool%give_back_pw(pw_single_dr(iatom))
1051 DEALLOCATE (rs_single_dr)
1052 DEALLOCATE (num_species_small)
1053 DEALLOCATE (pw_single_dr)
1059 IF (cdft_control%in_memory)
THEN
1060 DO igroup = 1,
SIZE(cdft_control%group)
1061 ALLOCATE (cdft_control%group(igroup)%gradients_y(1*num_atoms, lb_pw(1):ub_pw(1), &
1062 lb_pw(2):ub_pw(2), lb_pw(3):ub_pw(3)))
1063 ALLOCATE (cdft_control%group(igroup)%gradients_z(1*num_atoms, lb_pw(1):ub_pw(1), &
1064 lb_pw(2):ub_pw(2), lb_pw(3):ub_pw(3)))
1065 cdft_control%group(igroup)%gradients_y(:, :, :, :) = cdft_control%group(igroup)%gradients_x(:, :, :, :)
1066 cdft_control%group(igroup)%gradients_z(:, :, :, :) = cdft_control%group(igroup)%gradients_x(:, :, :, :)
1071 IF (cdft_control%in_memory)
THEN
1073 DO igroup = 1,
SIZE(cdft_control%group)
1076 coefficients(:) = 0.0_dp
1077 is_constraint = .false.
1078 DO i = 1,
SIZE(cdft_control%group(igroup)%atoms)
1079 coefficients(cdft_control%group(igroup)%atoms(i)) = cdft_control%group(igroup)%coeff(i)
1080 is_constraint(cdft_control%group(igroup)%atoms(i)) = .true.
1083 DO k = lb_pw(3), ub_pw(3)
1084 DO j = lb_pw(2), ub_pw(2)
1085 DO i = lb_pw(1), ub_pw(1)
1088 ra(:) = particle_set(iatom)%r
1090 IF (cdft_control%hw_rho_total%array(i, j, k) > hirshfeld_control%eps_cutoff)
THEN
1092 exp_eval = (coefficients(iatom) - &
1093 cdft_control%group(igroup)%weight%array(i, j, k))/ &
1094 cdft_control%hw_rho_total%array(i, j, k)
1096 r2 = real(i - rho_r(1)%pw_grid%bounds(1, 1),
dp)* &
1097 rho_r(1)%pw_grid%dh(:, 1) + &
1098 REAL(j - rho_r(1)%pw_grid%bounds(1, 2),
dp)* &
1099 rho_r(1)%pw_grid%dh(:, 2) + &
1100 REAL(k - rho_r(1)%pw_grid%bounds(1, 3),
dp)* &
1101 rho_r(1)%pw_grid%dh(:, 3)
1102 r_pbc =
pbc(ra, r2, cell)
1105 cdft_control%group(igroup)%gradients_x(iatom, i, j, k) = &
1106 cdft_control%group(igroup)%gradients_x(iatom, i, j, k)* &
1110 cdft_control%group(igroup)%gradients_y(iatom, i, j, k) = &
1111 cdft_control%group(igroup)%gradients_y(iatom, i, j, k)* &
1115 cdft_control%group(igroup)%gradients_z(iatom, i, j, k) = &
1116 cdft_control%group(igroup)%gradients_z(iatom, i, j, k)* &
1125 CALL auxbas_pw_pool%give_back_pw(cdft_control%hw_rho_total)
1130 IF (
ALLOCATED(coefficients))
DEALLOCATE (coefficients)
1131 IF (
ALLOCATED(is_constraint))
DEALLOCATE (is_constraint)
1133 CALL timestop(handle)
1135 END SUBROUTINE hirshfeld_constraint_low
1142 SUBROUTINE cdft_constraint_integrate(qs_env)
1145 CHARACTER(len=*),
PARAMETER :: routinen =
'cdft_constraint_integrate'
1147 INTEGER :: handle, i, iatom, igroup, ivar, iw, nvar
1149 REAL(kind=
dp) :: dvol, eps_cavity, sign
1150 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: de, strength, target_val
1151 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: electronic_charge
1163 NULLIFY (para_env, dft_control, rho_r, energy, rho, &
1164 logger, cdft_constraint_section, group, charge)
1165 CALL timeset(routinen, handle)
1169 dft_control=dft_control, &
1173 iw =
cp_print_key_unit_nr(logger, cdft_constraint_section,
"PROGRAM_RUN_INFO", extension=
".cdftLog")
1174 cdft_control => dft_control%qs_control%cdft_control
1176 becke_control => cdft_control%becke_control
1177 IF (is_becke .AND. .NOT.
ASSOCIATED(becke_control))
THEN
1178 cpabort(
"Becke control has not been allocated.")
1180 group => cdft_control%group
1182 nvar =
SIZE(cdft_control%target)
1183 ALLOCATE (strength(nvar))
1184 ALLOCATE (target_val(nvar))
1186 strength(:) = cdft_control%strength(:)
1187 target_val(:) = cdft_control%target(:)
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)
1246 cdft_control%value(:) = de(:)
1247 energy%cdft = 0.0_dp
1249 energy%cdft = energy%cdft + (de(ivar) - target_val(ivar))*strength(ivar)
1252 IF (.NOT. dft_control%qs_control%gapw)
THEN
1256 DEALLOCATE (de, strength, target_val)
1257 IF (cdft_control%atomic_charges)
DEALLOCATE (electronic_charge)
1259 CALL timestop(handle)
1261 END SUBROUTINE cdft_constraint_integrate
1267 SUBROUTINE cdft_constraint_force(qs_env)
1270 CHARACTER(len=*),
PARAMETER :: routinen =
'cdft_constraint_force'
1272 INTEGER :: handle, i, iatom, igroup, ikind, ispin, &
1274 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: atom_of_kind, kind_of
1275 INTEGER,
DIMENSION(2, 3) :: bo
1276 INTEGER,
DIMENSION(3) :: lb, ub
1277 REAL(kind=
dp) :: dvol, eps_cavity, sign
1278 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: strength
1279 REAL(kind=
dp),
DIMENSION(:),
POINTER :: cutoffs
1292 CALL timeset(routinen, handle)
1293 NULLIFY (atomic_kind_set, cell, para_env, dft_control, particle_set, &
1294 rho, rho_r, force, cutoffs, becke_control, group)
1297 atomic_kind_set=atomic_kind_set, &
1299 particle_set=particle_set, &
1303 dft_control=dft_control, &
1307 cdft_control => dft_control%qs_control%cdft_control
1308 becke_control => cdft_control%becke_control
1309 group => cdft_control%group
1310 nvar =
SIZE(cdft_control%target)
1311 ALLOCATE (strength(nvar))
1312 strength(:) = cdft_control%strength(:)
1313 cutoffs => cdft_control%becke_control%cutoffs
1314 eps_cavity = cdft_control%becke_control%eps_cavity
1317 atom_of_kind=atom_of_kind, &
1319 DO igroup = 1,
SIZE(cdft_control%group)
1320 ALLOCATE (cdft_control%group(igroup)%integrated(3, natom))
1321 cdft_control%group(igroup)%integrated = 0.0_dp
1324 lb(1:3) = rho_r(1)%pw_grid%bounds_local(1, 1:3)
1325 ub(1:3) = rho_r(1)%pw_grid%bounds_local(2, 1:3)
1326 bo = cdft_control%group(1)%weight%pw_grid%bounds_local
1327 dvol = cdft_control%group(1)%weight%pw_grid%dvol
1331 IF (.NOT. cdft_control%becke_control%in_memory)
THEN
1332 CALL becke_constraint_low(qs_env, just_gradients=.true.)
1336 IF (.NOT. cdft_control%in_memory)
THEN
1337 CALL hirshfeld_constraint_low(qs_env, just_gradients=.true.)
1342 IF (.NOT.
ASSOCIATED(becke_control%cavity_mat))
THEN
1344 DO k = bo(1, 1), bo(2, 1)
1345 DO j = bo(1, 2), bo(2, 2)
1346 DO i = bo(1, 3), bo(2, 3)
1348 IF (cdft_control%becke_control%cavity_confine)
THEN
1349 IF (cdft_control%becke_control%cavity%array(k, j, i) < eps_cavity) cycle
1352 DO igroup = 1,
SIZE(cdft_control%group)
1354 DO ispin = 1, dft_control%nspins
1356 SELECT CASE (cdft_control%group(igroup)%constraint_type)
1360 IF (ispin == 1)
THEN
1367 IF (ispin == 2) cycle
1370 IF (ispin == 1) cycle
1372 cpabort(
"Unknown constraint type.")
1377 cdft_control%group(igroup)%integrated(:, iatom) = &
1378 cdft_control%group(igroup)%integrated(:, iatom) + sign* &
1379 cdft_control%group(igroup)%gradients(3*(iatom - 1) + 1:3*(iatom - 1) + 3, k, j, i) &
1380 *rho_r(ispin)%array(k, j, i) &
1385 cdft_control%group(igroup)%integrated(1, iatom) = &
1386 cdft_control%group(igroup)%integrated(1, iatom) + sign* &
1387 cdft_control%group(igroup)%gradients_x(iatom, k, j, i) &
1388 *rho_r(ispin)%array(k, j, i) &
1391 cdft_control%group(igroup)%integrated(2, iatom) = &
1392 cdft_control%group(igroup)%integrated(2, iatom) + sign* &
1393 cdft_control%group(igroup)%gradients_y(iatom, k, j, i) &
1394 *rho_r(ispin)%array(k, j, i) &
1397 cdft_control%group(igroup)%integrated(3, iatom) = &
1398 cdft_control%group(igroup)%integrated(3, iatom) + sign* &
1399 cdft_control%group(igroup)%gradients_z(iatom, k, j, i) &
1400 *rho_r(ispin)%array(k, j, i) &
1414 DO k = lbound(cdft_control%becke_control%cavity_mat, 1), ubound(cdft_control%becke_control%cavity_mat, 1)
1415 DO j = lbound(cdft_control%becke_control%cavity_mat, 2), ubound(cdft_control%becke_control%cavity_mat, 2)
1416 DO i = lbound(cdft_control%becke_control%cavity_mat, 3), ubound(cdft_control%becke_control%cavity_mat, 3)
1419 IF (cdft_control%becke_control%cavity_mat(k, j, i) < eps_cavity) cycle
1421 DO igroup = 1,
SIZE(group)
1423 DO ispin = 1, dft_control%nspins
1424 SELECT CASE (group(igroup)%constraint_type)
1428 IF (ispin == 1)
THEN
1435 IF (ispin == 2) cycle
1438 IF (ispin == 1) cycle
1440 cpabort(
"Unknown constraint type.")
1446 cdft_control%group(igroup)%integrated(:, iatom) = &
1447 cdft_control%group(igroup)%integrated(:, iatom) + sign* &
1448 cdft_control%group(igroup)%gradients(3*(iatom - 1) + 1:3*(iatom - 1) + 3, k, j, i) &
1449 *rho_r(ispin)%array(k, j, i) &
1454 cdft_control%group(igroup)%integrated(1, iatom) = &
1455 cdft_control%group(igroup)%integrated(1, iatom) + sign* &
1456 cdft_control%group(igroup)%gradients_x(iatom, k, j, i) &
1457 *rho_r(ispin)%array(k, j, i) &
1460 cdft_control%group(igroup)%integrated(2, iatom) = &
1461 cdft_control%group(igroup)%integrated(2, iatom) + sign* &
1462 cdft_control%group(igroup)%gradients_y(iatom, k, j, i) &
1463 *rho_r(ispin)%array(k, j, i) &
1466 cdft_control%group(igroup)%integrated(3, iatom) = &
1467 cdft_control%group(igroup)%integrated(3, iatom) + sign* &
1468 cdft_control%group(igroup)%gradients_z(iatom, k, j, i) &
1469 *rho_r(ispin)%array(k, j, i) &
1482 IF (.NOT. cdft_control%transfer_pot)
THEN
1484 DO igroup = 1,
SIZE(group)
1485 DEALLOCATE (cdft_control%group(igroup)%gradients)
1488 DO igroup = 1,
SIZE(group)
1489 DEALLOCATE (cdft_control%group(igroup)%gradients_x)
1490 DEALLOCATE (cdft_control%group(igroup)%gradients_y)
1491 DEALLOCATE (cdft_control%group(igroup)%gradients_z)
1496 DO igroup = 1,
SIZE(group)
1497 CALL para_env%sum(group(igroup)%integrated)
1503 IF (para_env%is_source())
THEN
1504 DO igroup = 1,
SIZE(group)
1506 ikind = kind_of(iatom)
1507 i = atom_of_kind(iatom)
1508 force(ikind)%rho_elec(:, i) = force(ikind)%rho_elec(:, i) + group(igroup)%integrated(:, iatom)*strength(igroup)
1513 DEALLOCATE (strength)
1514 DO igroup = 1,
SIZE(group)
1515 DEALLOCATE (group(igroup)%integrated)
1519 CALL timestop(handle)
1521 END SUBROUTINE cdft_constraint_force
1528 SUBROUTINE prepare_fragment_constraint(qs_env)
1531 CHARACTER(len=*),
PARAMETER :: routinen =
'prepare_fragment_constraint'
1533 INTEGER :: handle, i, iatom, igroup, natom, &
1534 nelectron_total, nfrag_spins
1535 LOGICAL :: is_becke, needs_spin_density
1536 REAL(kind=
dp) :: dvol, multiplier(2), nelectron_frag
1548 NULLIFY (para_env, dft_control, logger, subsys, pw_env, auxbas_pw_pool, group)
1549 CALL timeset(routinen, handle)
1553 dft_control=dft_control, &
1556 cdft_control => dft_control%qs_control%cdft_control
1558 becke_control => cdft_control%becke_control
1559 IF (is_becke .AND. .NOT.
ASSOCIATED(becke_control))
THEN
1560 cpabort(
"Becke control has not been allocated.")
1562 group => cdft_control%group
1563 dvol = group(1)%weight%pw_grid%dvol
1565 IF (.NOT. qs_env%single_point_run)
THEN
1566 CALL cp_abort(__location__, &
1567 "CDFT fragment constraints are only compatible with single "// &
1568 "point calculations (run_type ENERGY or ENERGY_FORCE).")
1570 needs_spin_density = .false.
1573 DO igroup = 1,
SIZE(group)
1574 SELECT CASE (group(igroup)%constraint_type)
1578 needs_spin_density = .true.
1580 CALL cp_abort(__location__, &
1581 "CDFT fragment constraint not yet compatible with "// &
1582 "spin specific constraints.")
1584 cpabort(
"Unknown constraint type.")
1587 IF (needs_spin_density)
THEN
1590 IF (cdft_control%flip_fragment(i)) multiplier(i) = -1.0_dp
1594 ALLOCATE (cdft_control%fragments(nfrag_spins, 2))
1595 ALLOCATE (rho_frag(nfrag_spins))
1597 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
1598 IF (dft_control%qs_control%gapw)
THEN
1599 CALL verify_gapw_fragment_cube(cdft_control%fragment_a_fname, spin_density=.false.)
1600 CALL verify_gapw_fragment_cube(cdft_control%fragment_b_fname, spin_density=.false.)
1601 IF (needs_spin_density)
THEN
1602 CALL verify_gapw_fragment_cube(cdft_control%fragment_a_spin_fname, spin_density=.true.)
1603 CALL verify_gapw_fragment_cube(cdft_control%fragment_b_spin_fname, spin_density=.true.)
1607 CALL auxbas_pw_pool%create_pw(cdft_control%fragments(1, 1))
1609 cdft_control%fragment_a_fname, 1.0_dp)
1610 CALL auxbas_pw_pool%create_pw(cdft_control%fragments(1, 2))
1612 cdft_control%fragment_b_fname, 1.0_dp)
1614 IF (needs_spin_density)
THEN
1615 CALL auxbas_pw_pool%create_pw(cdft_control%fragments(2, 1))
1617 cdft_control%fragment_a_spin_fname, multiplier(1))
1618 CALL auxbas_pw_pool%create_pw(cdft_control%fragments(2, 2))
1620 cdft_control%fragment_b_spin_fname, multiplier(2))
1623 DO i = 1, nfrag_spins
1624 CALL auxbas_pw_pool%create_pw(rho_frag(i))
1625 CALL pw_copy(cdft_control%fragments(i, 1), rho_frag(i))
1626 CALL pw_axpy(cdft_control%fragments(i, 2), rho_frag(i), 1.0_dp)
1627 CALL auxbas_pw_pool%give_back_pw(cdft_control%fragments(i, 1))
1628 CALL auxbas_pw_pool%give_back_pw(cdft_control%fragments(i, 2))
1630 DEALLOCATE (cdft_control%fragments)
1635 IF (nint(nelectron_frag) /= nelectron_total)
THEN
1636 CALL cp_abort(__location__, &
1637 "The number of electrons in the reference and interacting "// &
1638 "configurations does not match. Check your fragment cube files.")
1641 cdft_control%target = 0.0_dp
1642 DO igroup = 1,
SIZE(group)
1648 IF (is_becke .AND. (cdft_control%external_control .AND. becke_control%cavity_confine))
THEN
1649 cdft_control%target(igroup) = cdft_control%target(igroup) + &
1651 becke_control%cavity_mat, becke_control%eps_cavity)*dvol
1653 cdft_control%target(igroup) = cdft_control%target(igroup) + &
1654 pw_integral_ab(group(igroup)%weight, rho_frag(i), local_only=.true.)
1657 CALL para_env%sum(cdft_control%target)
1659 IF (cdft_control%atomic_charges)
THEN
1660 ALLOCATE (cdft_control%charges_fragment(cdft_control%natoms, nfrag_spins))
1661 DO i = 1, nfrag_spins
1662 DO iatom = 1, cdft_control%natoms
1663 cdft_control%charges_fragment(iatom, i) = &
1664 pw_integral_ab(cdft_control%charge(iatom), rho_frag(i), local_only=.true.)
1667 CALL para_env%sum(cdft_control%charges_fragment)
1669 DO i = 1, nfrag_spins
1670 CALL auxbas_pw_pool%give_back_pw(rho_frag(i))
1672 DEALLOCATE (rho_frag)
1673 cdft_control%fragments_integrated = .true.
1675 CALL timestop(handle)
1684 SUBROUTINE verify_gapw_fragment_cube(filename, spin_density)
1685 CHARACTER(LEN=*),
INTENT(IN) :: filename
1686 LOGICAL,
INTENT(IN) :: spin_density
1688 CHARACTER(LEN=256) :: title
1689 INTEGER :: input_unit, io_status
1690 LOGICAL :: usable_cube
1692 usable_cube = .false.
1693 IF (para_env%is_source())
THEN
1694 CALL open_file(file_name=trim(filename), file_status=
"OLD", &
1695 file_action=
"READ", unit_number=input_unit)
1696 READ (input_unit,
'(A)', iostat=io_status) title
1697 IF (io_status == 0)
THEN
1698 READ (input_unit,
'(A)', iostat=io_status) title
1699 usable_cube = io_status == 0
1702 IF (usable_cube)
THEN
1703 IF (spin_density)
THEN
1704 IF (index(title,
"SPIN DENSITY") > 0 .AND. &
1705 index(title,
"TOTAL SPIN DENSITY") == 0) usable_cube = .false.
1707 IF (index(title,
"ELECTRON DENSITY") > 0 .AND. &
1708 index(title,
"TOTAL ELECTRON DENSITY") == 0) usable_cube = .false.
1712 CALL para_env%bcast(usable_cube, 0)
1713 IF (.NOT. usable_cube)
THEN
1714 CALL cp_abort(__location__, &
1715 "GAPW fragment CDFT cannot use a regular CP2K GAPW density cube. "// &
1716 "Generate the reference with "// &
1717 "E_DENSITY_CUBE% DENSITY_INCLUDE TOTAL_DENSITY. "// &
1718 "Invalid reference: "//trim(filename))
1720 END SUBROUTINE verify_gapw_fragment_cube
1722 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. 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.
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.