82#include "./base/base_uses.f90"
88 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'qs_efield_berry'
109 LOGICAL,
INTENT(IN) :: just_energy, calculate_forces
111 CHARACTER(LEN=*),
PARAMETER :: routinen =
'qs_efield_berry_phase'
114 LOGICAL :: s_mstruct_changed
117 CALL timeset(routinen, handle)
119 NULLIFY (dft_control)
120 CALL get_qs_env(qs_env, s_mstruct_changed=s_mstruct_changed, &
121 dft_control=dft_control)
123 IF (dft_control%apply_period_efield)
THEN
125 IF (dft_control%period_efield%start_frame <= qs_env%sim_step .AND. &
126 (dft_control%period_efield%end_frame == -1 .OR. dft_control%period_efield%end_frame >= qs_env%sim_step))
THEN
128 IF (s_mstruct_changed)
CALL qs_efield_integrals(qs_env)
129 IF (dft_control%period_efield%displacement_field)
THEN
130 CALL qs_dispfield_derivatives(qs_env, just_energy, calculate_forces)
132 CALL qs_efield_derivatives(qs_env, just_energy, calculate_forces)
137 CALL timestop(handle)
145 SUBROUTINE qs_efield_integrals(qs_env)
149 CHARACTER(LEN=*),
PARAMETER :: routinen =
'qs_efield_integrals'
152 REAL(
dp),
DIMENSION(3) :: kvec
154 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: cosmat, matrix_s, sinmat
158 CALL timeset(routinen, handle)
159 cpassert(
ASSOCIATED(qs_env))
161 CALL get_qs_env(qs_env=qs_env, dft_control=dft_control)
163 CALL get_qs_env(qs_env=qs_env, efield=efield, cell=cell, matrix_s=matrix_s)
165 ALLOCATE (cosmat(3), sinmat(3))
167 ALLOCATE (cosmat(i)%matrix, sinmat(i)%matrix)
169 CALL dbcsr_copy(cosmat(i)%matrix, matrix_s(1)%matrix,
'COS MAT')
170 CALL dbcsr_copy(sinmat(i)%matrix, matrix_s(1)%matrix,
'SIN MAT')
174 kvec(:) =
twopi*cell%h_inv(i, :)
179 CALL timestop(handle)
181 END SUBROUTINE qs_efield_integrals
189 SUBROUTINE qs_efield_derivatives(qs_env, just_energy, calculate_forces)
191 LOGICAL,
INTENT(IN) :: just_energy, calculate_forces
193 CHARACTER(LEN=*),
PARAMETER :: routinen =
'qs_efield_derivatives'
195 COMPLEX(dp) :: zdet, zdeta, zi(3)
196 INTEGER :: atom_a, atom_b, handle, i, ia, iatom, icol, idir, ikind, irow, iset, ispin, j, &
197 jatom, jkind, jset, ldab, ldsa, ldsb, lsab, n1, n2, nao, natom, ncoa, ncob, nkind, nmo, &
198 nseta, nsetb, sgfa, sgfb
199 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: atom_of_kind
200 INTEGER,
DIMENSION(:),
POINTER :: la_max, la_min, lb_max, lb_min, npgfa, &
202 INTEGER,
DIMENSION(:, :),
POINTER :: first_sgfa, first_sgfb
203 LOGICAL :: found, uniform, use_virial
204 REAL(
dp) :: charge, ci(3), cqi(3), dab, dd, &
205 ener_field, f0, fab, fieldpol(3), &
206 focc, fpolvec(3), hmat(3, 3), occ, &
207 qi(3), strength, ti(3)
208 REAL(
dp),
DIMENSION(3) :: forcea, forceb, kvec, ra, rab, rb, ria
209 REAL(
dp),
DIMENSION(:, :),
POINTER :: cosab, iblock, rblock, sinab, work
210 REAL(
dp),
DIMENSION(:, :, :),
POINTER :: dcosab, dsinab
211 REAL(kind=
dp),
DIMENSION(:),
POINTER :: set_radius_a, set_radius_b
212 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: rpgfa, rpgfb, sphi_a, sphi_b, zeta, zetb
216 TYPE(
cp_cfm_type),
ALLOCATABLE,
DIMENSION(:) :: eigrmat, inv_mat
218 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:) :: mo_coeff_tmp, mo_derivs_tmp
219 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:, :) :: inv_work, op_fm_set, opvec
221 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_s, mo_derivs
223 TYPE(
dbcsr_type),
POINTER :: cosmat, mo_coeff_b, sinmat
231 DIMENSION(:),
POINTER :: nl_iterator
237 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
241 CALL timeset(routinen, handle)
243 NULLIFY (dft_control, cell, particle_set)
244 CALL get_qs_env(qs_env, dft_control=dft_control, cell=cell, &
245 particle_set=particle_set, virial=virial)
246 NULLIFY (qs_kind_set, efield, para_env, sab_orb)
247 CALL get_qs_env(qs_env=qs_env, qs_kind_set=qs_kind_set, &
248 efield=efield, energy=energy, para_env=para_env, sab_orb=sab_orb)
251 use_virial = virial%pv_availability .AND. (.NOT. virial%pv_numer)
252 use_virial = use_virial .AND. calculate_forces
255 cpabort(
"Stress tensor for periodic E-field not implemented")
259 strength = dft_control%period_efield%strength
260 IF (
ALLOCATED(dft_control%period_efield%strength_list))
THEN
261 strength = dft_control%period_efield%strength_list(mod(qs_env%sim_step &
262 - dft_control%period_efield%start_frame,
SIZE(dft_control%period_efield%strength_list)) + 1)
265 fieldpol = dft_control%period_efield%polarisation
266 fieldpol = fieldpol/sqrt(dot_product(fieldpol, fieldpol))
267 fieldpol = -fieldpol*strength
268 hmat = cell%hmat(:, :)/
twopi
270 fpolvec(idir) = fieldpol(1)*hmat(1, idir) + fieldpol(2)*hmat(2, idir) + fieldpol(3)*hmat(3, idir)
274 natom =
SIZE(particle_set)
275 IF (calculate_forces)
THEN
276 CALL get_qs_env(qs_env=qs_env, atomic_kind_set=atomic_kind_set, force=force)
279 zi(:) = cmplx(1._dp, 0._dp,
dp)
282 CALL get_qs_kind(qs_kind_set(ikind), core_charge=charge)
283 ria = particle_set(ia)%r
286 kvec(:) =
twopi*cell%h_inv(idir, :)
287 dd = sum(kvec(:)*ria(:))
288 zdeta = cmplx(cos(dd), sin(dd), kind=
dp)**charge
289 zi(idir) = zi(idir)*zdeta
291 IF (calculate_forces)
THEN
292 IF (para_env%mepos == 0)
THEN
293 iatom = atom_of_kind(ia)
294 forcea(:) = fieldpol(:)*charge
295 force(ikind)%efield(:, iatom) = force(ikind)%efield(:, iatom) + forcea(:)
299 IF (para_env%mepos == 0) &
308 DO ispin = 1, dft_control%nspins
309 CALL get_mo_set(mo_set=mos(ispin), maxocc=occ, uniform_occupation=uniform)
310 IF (.NOT. uniform)
THEN
311 cpabort(
"Berry phase moments for non uniform MOs' occupation numbers not implemented")
316 CALL get_qs_env(qs_env=qs_env, mo_derivs=mo_derivs)
318 ALLOCATE (op_fm_set(2, dft_control%nspins))
319 ALLOCATE (opvec(2, dft_control%nspins))
320 ALLOCATE (eigrmat(dft_control%nspins))
321 ALLOCATE (inv_mat(dft_control%nspins))
322 ALLOCATE (inv_work(2, dft_control%nspins))
323 ALLOCATE (mo_derivs_tmp(
SIZE(mo_derivs)))
324 ALLOCATE (mo_coeff_tmp(
SIZE(mo_derivs)))
327 DO ispin = 1, dft_control%nspins
328 NULLIFY (tmp_fm_struct, mo_coeff)
329 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, nao=nao, nmo=nmo)
331 ncol_global=nmo, para_env=para_env, context=mo_coeff%matrix_struct%context)
332 CALL cp_fm_create(mo_derivs_tmp(ispin), mo_coeff%matrix_struct)
333 CALL cp_fm_create(mo_coeff_tmp(ispin), mo_coeff%matrix_struct)
335 DO i = 1,
SIZE(op_fm_set, 1)
336 CALL cp_fm_create(opvec(i, ispin), mo_coeff%matrix_struct)
338 CALL cp_fm_create(inv_work(i, ispin), op_fm_set(i, ispin)%matrix_struct)
340 CALL cp_cfm_create(eigrmat(ispin), op_fm_set(1, ispin)%matrix_struct)
341 CALL cp_cfm_create(inv_mat(ispin), op_fm_set(1, ispin)%matrix_struct)
345 IF (calculate_forces)
THEN
347 CALL get_qs_env(qs_env=qs_env, matrix_s=matrix_s)
348 ALLOCATE (tempmat(2, dft_control%nspins))
349 DO ispin = 1, dft_control%nspins
350 ALLOCATE (tempmat(1, ispin)%matrix, tempmat(2, ispin)%matrix)
351 CALL dbcsr_copy(tempmat(1, ispin)%matrix, matrix_s(1)%matrix,
'TEMPMAT')
352 CALL dbcsr_copy(tempmat(2, ispin)%matrix, matrix_s(1)%matrix,
'TEMPMAT')
353 CALL dbcsr_set(tempmat(1, ispin)%matrix, 0.0_dp)
354 CALL dbcsr_set(tempmat(2, ispin)%matrix, 0.0_dp)
358 ALLOCATE (cosab(ldab, ldab), sinab(ldab, ldab), work(ldab, ldab))
359 ALLOCATE (dcosab(ldab, ldab, 3), dsinab(ldab, ldab, 3))
360 lsab = max(ldab, lsab)
362 ALLOCATE (dcost(i, 1)%block(lsab, lsab), dsint(i, 1)%block(lsab, lsab))
363 ALLOCATE (dcost(i, 2)%block(lsab, lsab), dsint(i, 2)%block(lsab, lsab))
372 IF (abs(fpolvec(idir)) .GT. 1.0e-12_dp)
THEN
373 cosmat => efield%cosmat(idir)%matrix
374 sinmat => efield%sinmat(idir)%matrix
377 DO ispin = 1, dft_control%nspins
378 IF (mos(ispin)%use_mo_coeff_b)
THEN
379 CALL get_mo_set(mo_set=mos(ispin), nao=nao, mo_coeff_b=mo_coeff_b, nmo=nmo)
382 CALL get_mo_set(mo_set=mos(ispin), nao=nao, mo_coeff=mo_coeff, nmo=nmo)
383 mo_coeff_tmp(ispin) = mo_coeff
386 CALL parallel_gemm(
"T",
"N", nmo, nmo, nao, 1.0_dp, mo_coeff_tmp(ispin), opvec(1, ispin), 0.0_dp, &
389 CALL parallel_gemm(
"T",
"N", nmo, nmo, nao, 1.0_dp, mo_coeff_tmp(ispin), opvec(2, ispin), 0.0_dp, &
394 DO ispin = 1, dft_control%nspins
398 CALL cp_cfm_solve(eigrmat(ispin), inv_mat(ispin), zdeta)
402 ci(idir) = aimag(log(zdet**occ))
404 IF (.NOT. just_energy)
THEN
407 DO ispin = 1, dft_control%nspins
408 inv_work(1, ispin)%local_data(:, :) = real(inv_mat(ispin)%local_data(:, :),
dp)
409 inv_work(2, ispin)%local_data(:, :) = aimag(inv_mat(ispin)%local_data(:, :))
410 CALL get_mo_set(mo_set=mos(ispin), nao=nao, nmo=nmo)
411 CALL parallel_gemm(
"N",
"N", nao, nmo, nmo, focc, opvec(1, ispin), inv_work(2, ispin), &
412 1.0_dp, mo_derivs_tmp(ispin))
413 CALL parallel_gemm(
"N",
"N", nao, nmo, nmo, -focc, opvec(2, ispin), inv_work(1, ispin), &
414 1.0_dp, mo_derivs_tmp(ispin))
419 IF (calculate_forces)
THEN
420 nkind =
SIZE(qs_kind_set)
421 natom =
SIZE(particle_set)
422 kvec(:) =
twopi*cell%h_inv(idir, :)
426 DO ispin = 1, dft_control%nspins
427 CALL dbcsr_set(tempmat(1, ispin)%matrix, 0.0_dp)
428 CALL dbcsr_set(tempmat(2, ispin)%matrix, 0.0_dp)
429 CALL get_mo_set(mo_set=mos(ispin), nao=nao, nmo=nmo)
430 CALL parallel_gemm(
"N",
"N", nao, nmo, nmo, 1.0_dp, mo_coeff_tmp(ispin), inv_work(1, ispin), 0.0_dp, &
432 CALL parallel_gemm(
"N",
"N", nao, nmo, nmo, 1.0_dp, mo_coeff_tmp(ispin), inv_work(2, ispin), 0.0_dp, &
435 matrix_v=opvec(1, ispin), matrix_g=mo_coeff_tmp(ispin), ncol=nmo)
437 matrix_v=opvec(2, ispin), matrix_g=mo_coeff_tmp(ispin), ncol=nmo)
441 ALLOCATE (basis_set_list(nkind))
443 qs_kind => qs_kind_set(ikind)
444 CALL get_qs_kind(qs_kind=qs_kind, basis_set=basis_set_a)
445 IF (
ASSOCIATED(basis_set_a))
THEN
446 basis_set_list(ikind)%gto_basis_set => basis_set_a
448 NULLIFY (basis_set_list(ikind)%gto_basis_set)
455 iatom=iatom, jatom=jatom, r=rab)
456 basis_set_a => basis_set_list(ikind)%gto_basis_set
457 IF (.NOT.
ASSOCIATED(basis_set_a)) cycle
458 basis_set_b => basis_set_list(jkind)%gto_basis_set
459 IF (.NOT.
ASSOCIATED(basis_set_b)) cycle
461 first_sgfa => basis_set_a%first_sgf
462 la_max => basis_set_a%lmax
463 la_min => basis_set_a%lmin
464 npgfa => basis_set_a%npgf
465 nseta = basis_set_a%nset
466 nsgfa => basis_set_a%nsgf_set
467 rpgfa => basis_set_a%pgf_radius
468 set_radius_a => basis_set_a%set_radius
469 sphi_a => basis_set_a%sphi
470 zeta => basis_set_a%zet
472 first_sgfb => basis_set_b%first_sgf
473 lb_max => basis_set_b%lmax
474 lb_min => basis_set_b%lmin
475 npgfb => basis_set_b%npgf
476 nsetb = basis_set_b%nset
477 nsgfb => basis_set_b%nsgf_set
478 rpgfb => basis_set_b%pgf_radius
479 set_radius_b => basis_set_b%set_radius
480 sphi_b => basis_set_b%sphi
481 zetb => basis_set_b%zet
483 atom_a = atom_of_kind(iatom)
484 atom_b = atom_of_kind(jatom)
486 ldsa =
SIZE(sphi_a, 1)
487 ldsb =
SIZE(sphi_b, 1)
488 ra(:) =
pbc(particle_set(iatom)%r(:), cell)
490 dab = sqrt(rab(1)*rab(1) + rab(2)*rab(2) + rab(3)*rab(3))
492 IF (iatom <= jatom)
THEN
500 IF (iatom == jatom .AND. dab < 1.e-10_dp)
THEN
507 dcost(i, 1)%block = 0.0_dp
508 dsint(i, 1)%block = 0.0_dp
509 dcost(i, 2)%block = 0.0_dp
510 dsint(i, 2)%block = 0.0_dp
514 ncoa = npgfa(iset)*
ncoset(la_max(iset))
515 sgfa = first_sgfa(1, iset)
517 IF (set_radius_a(iset) + set_radius_b(jset) < dab) cycle
518 ncob = npgfb(jset)*
ncoset(lb_max(jset))
519 sgfb = first_sgfb(1, jset)
521 CALL cossin(la_max(iset), npgfa(iset), zeta(:, iset), rpgfa(:, iset), la_min(iset), &
522 lb_max(jset), npgfb(jset), zetb(:, jset), rpgfb(:, jset), lb_min(jset), &
523 ra, rb, kvec, cosab, sinab, dcosab, dsinab)
525 CALL contract_all(dcost(i, 1)%block, dsint(i, 1)%block, &
526 ncoa, nsgfa(iset), sgfa, sphi_a, ldsa, &
527 ncob, nsgfb(jset), sgfb, sphi_b, ldsb, &
528 dcosab(:, :, i), dsinab(:, :, i), ldab, work, ldab)
531 CALL cossin(lb_max(jset), npgfb(jset), zetb(:, jset), rpgfb(:, jset), lb_min(jset), &
532 la_max(iset), npgfa(iset), zeta(:, iset), rpgfa(:, iset), la_min(iset), &
533 rb, ra, kvec, cosab, sinab, dcosab, dsinab)
535 dcosab(1:ncoa, 1:ncob, i) = transpose(dcosab(1:ncob, 1:ncoa, i))
536 dsinab(1:ncoa, 1:ncob, i) = transpose(dsinab(1:ncob, 1:ncoa, i))
537 CALL contract_all(dcost(i, 2)%block, dsint(i, 2)%block, &
538 ncoa, nsgfa(iset), sgfa, sphi_a, ldsa, &
539 ncob, nsgfb(jset), sgfb, sphi_b, ldsb, &
540 dcosab(:, :, i), dsinab(:, :, i), ldab, work, ldab)
546 DO ispin = 1, dft_control%nspins
547 NULLIFY (rblock, iblock)
549 row=irow, col=icol, block=rblock, found=found)
552 row=irow, col=icol, block=iblock, found=found)
556 cpassert(
SIZE(iblock, 1) == n1)
557 cpassert(
SIZE(iblock, 2) == n2)
560 IF (iatom <= jatom)
THEN
562 forcea(i) = forcea(i) + sum(rblock(1:n1, 1:n2)*dsint(i, 1)%block(1:n1, 1:n2)) &
563 - sum(iblock(1:n1, 1:n2)*dcost(i, 1)%block(1:n1, 1:n2))
564 forceb(i) = forceb(i) + sum(rblock(1:n1, 1:n2)*dsint(i, 2)%block(1:n1, 1:n2)) &
565 - sum(iblock(1:n1, 1:n2)*dcost(i, 2)%block(1:n1, 1:n2))
569 forcea(i) = forcea(i) + sum(transpose(rblock(1:n1, 1:n2))*dsint(i, 1)%block(1:n2, 1:n1)) &
570 - sum(transpose(iblock(1:n1, 1:n2))*dcost(i, 1)%block(1:n2, 1:n1))
571 forceb(i) = forceb(i) + sum(transpose(rblock(1:n1, 1:n2))*dsint(i, 2)%block(1:n2, 1:n1)) &
572 - sum(transpose(iblock(1:n1, 1:n2))*dcost(i, 2)%block(1:n2, 1:n1))
576 force(ikind)%efield(1:3, atom_a) = force(ikind)%efield(1:3, atom_a) - fab*fpolvec(idir)*forcea(1:3)
577 force(jkind)%efield(1:3, atom_b) = force(jkind)%efield(1:3, atom_b) - fab*fpolvec(idir)*forceb(1:3)
579 f0 = -fab*fpolvec(idir)
586 DEALLOCATE (basis_set_list)
597 cqi(idir) = qi(idir) + ci(idir)
598 IF (cqi(idir) >
pi) cqi(idir) = cqi(idir) -
twopi
599 IF (cqi(idir) < -
pi) cqi(idir) = cqi(idir) +
twopi
601 IF (abs(efield%polarisation(idir) - cqi(idir)) >
pi)
THEN
602 ti(idir) = (efield%polarisation(idir) - cqi(idir))/
pi
604 cqi(idir) = cqi(idir) + sign(1.0_dp, ti(idir))*
twopi
605 IF (abs(efield%polarisation(idir) - cqi(idir)) <
pi)
EXIT
608 ener_field = ener_field + fpolvec(idir)*cqi(idir)
612 IF (calculate_forces)
THEN
614 IF (abs(efield%field_energy - ener_field) >
pi*abs(sum(fpolvec)))
THEN
615 cpwarn(
"Large change of e-field energy detected. Correct for non-smooth energy surface")
617 efield%field_energy = ener_field
618 efield%polarisation(:) = cqi(:)
620 energy%efield = ener_field
622 IF (.NOT. just_energy)
THEN
624 DO ispin = 1, dft_control%nspins
631 ti(j) = ti(j) + hmat(j, i)*cqi(i)
636 virial%pv_virial(i, j) = virial%pv_virial(i, j) - fieldpol(i)*ti(j)
642 DO ispin = 1, dft_control%nspins
646 IF (mos(ispin)%use_mo_coeff_b)
CALL cp_fm_release(mo_coeff_tmp(ispin))
647 DO i = 1,
SIZE(op_fm_set, 1)
653 DEALLOCATE (inv_mat, inv_work, op_fm_set, opvec, eigrmat)
654 DEALLOCATE (mo_coeff_tmp, mo_derivs_tmp)
656 IF (calculate_forces)
THEN
657 DO ikind = 1,
SIZE(atomic_kind_set)
658 CALL para_env%sum(force(ikind)%efield)
660 DEALLOCATE (cosab, sinab, work, dcosab, dsinab)
662 DEALLOCATE (dcost(i, 1)%block, dsint(i, 1)%block)
663 DEALLOCATE (dcost(i, 2)%block, dsint(i, 2)%block)
667 CALL timestop(handle)
669 END SUBROUTINE qs_efield_derivatives
677 SUBROUTINE qs_dispfield_derivatives(qs_env, just_energy, calculate_forces)
679 LOGICAL,
INTENT(IN) :: just_energy, calculate_forces
681 CHARACTER(LEN=*),
PARAMETER :: routinen =
'qs_dispfield_derivatives'
683 COMPLEX(dp) :: zdet, zdeta, zi(3)
684 INTEGER :: handle, i, ia, iatom, icol, idir, ikind, iodeb, irow, iset, ispin, jatom, jkind, &
685 jset, ldab, ldsa, ldsb, lsab, n1, n2, nao, natom, ncoa, ncob, nkind, nmo, nseta, nsetb, &
687 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: atom_of_kind
688 INTEGER,
DIMENSION(:),
POINTER :: la_max, la_min, lb_max, lb_min, npgfa, &
690 INTEGER,
DIMENSION(:, :),
POINTER :: first_sgfa, first_sgfb
691 LOGICAL :: found, uniform, use_virial
692 REAL(
dp) :: charge, ci(3), cqi(3), dab, dd, di(3), ener_field, fab, fieldpol(3), focc, &
693 hmat(3, 3), occ, omega, qi(3), rlog(3), strength, zlog(3)
694 REAL(
dp),
DIMENSION(3) :: dfilter, forcea, forceb, kvec, ra, rab, &
696 REAL(
dp),
DIMENSION(:, :),
POINTER :: cosab, iblock, rblock, sinab, work
697 REAL(
dp),
DIMENSION(:, :, :),
POINTER :: dcosab, dsinab, force_tmp
698 REAL(kind=
dp),
DIMENSION(:),
POINTER :: set_radius_a, set_radius_b
699 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: rpgfa, rpgfb, sphi_a, sphi_b, zeta, zetb
703 TYPE(
cp_cfm_type),
ALLOCATABLE,
DIMENSION(:) :: eigrmat, inv_mat
705 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:) :: mo_coeff_tmp
706 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:, :) :: inv_work, mo_derivs_tmp, op_fm_set, opvec
708 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_s, mo_derivs
710 TYPE(
dbcsr_type),
POINTER :: cosmat, mo_coeff_b, sinmat
718 DIMENSION(:),
POINTER :: nl_iterator
724 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
728 CALL timeset(routinen, handle)
730 NULLIFY (dft_control, cell, particle_set)
731 CALL get_qs_env(qs_env, dft_control=dft_control, cell=cell, &
732 particle_set=particle_set, virial=virial)
733 NULLIFY (qs_kind_set, efield, para_env, sab_orb)
734 CALL get_qs_env(qs_env=qs_env, qs_kind_set=qs_kind_set, &
735 efield=efield, energy=energy, para_env=para_env, sab_orb=sab_orb)
738 use_virial = virial%pv_availability .AND. (.NOT. virial%pv_numer)
739 use_virial = use_virial .AND. calculate_forces
742 cpabort(
"Stress tensor for periodic D-field not implemented")
745 dfilter(1:3) = dft_control%period_efield%d_filter(1:3)
748 strength = dft_control%period_efield%strength
749 IF (
ALLOCATED(dft_control%period_efield%strength_list))
THEN
750 strength = dft_control%period_efield%strength_list(mod(qs_env%sim_step &
751 - dft_control%period_efield%start_frame,
SIZE(dft_control%period_efield%strength_list)) + 1)
754 fieldpol = dft_control%period_efield%polarisation
755 fieldpol = fieldpol/sqrt(dot_product(fieldpol, fieldpol))
756 fieldpol = fieldpol*strength
759 hmat = cell%hmat(:, :)/(
twopi*omega)
762 natom =
SIZE(particle_set)
763 IF (calculate_forces)
THEN
764 CALL get_qs_env(qs_env=qs_env, atomic_kind_set=atomic_kind_set, force=force)
766 ALLOCATE (force_tmp(natom, 3, 3))
769 zi(:) = cmplx(1._dp, 0._dp,
dp)
772 CALL get_qs_kind(qs_kind_set(ikind), core_charge=charge)
773 ria = particle_set(ia)%r
776 kvec(:) =
twopi*cell%h_inv(idir, :)
777 dd = sum(kvec(:)*ria(:))
778 zdeta = cmplx(cos(dd), sin(dd), kind=
dp)**charge
779 zi(idir) = zi(idir)*zdeta
781 IF (calculate_forces)
THEN
782 IF (para_env%mepos == 0)
THEN
784 force_tmp(ia, i, i) = force_tmp(ia, i, i) + charge/omega
789 rlog = aimag(log(zi))
794 DO ispin = 1, dft_control%nspins
795 CALL get_mo_set(mo_set=mos(ispin), maxocc=occ, uniform_occupation=uniform)
796 IF (.NOT. uniform)
THEN
797 cpabort(
"Berry phase moments for non uniform MO occupation numbers not implemented")
803 CALL get_qs_env(qs_env=qs_env, mo_derivs=mo_derivs)
804 ALLOCATE (op_fm_set(2, dft_control%nspins))
805 ALLOCATE (opvec(2, dft_control%nspins))
806 ALLOCATE (eigrmat(dft_control%nspins))
807 ALLOCATE (inv_mat(dft_control%nspins))
808 ALLOCATE (inv_work(2, dft_control%nspins))
809 ALLOCATE (mo_derivs_tmp(3,
SIZE(mo_derivs)))
810 ALLOCATE (mo_coeff_tmp(
SIZE(mo_derivs)))
813 DO ispin = 1, dft_control%nspins
814 NULLIFY (tmp_fm_struct, mo_coeff)
815 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, nao=nao, nmo=nmo)
817 ncol_global=nmo, para_env=para_env, context=mo_coeff%matrix_struct%context)
818 CALL cp_fm_create(mo_coeff_tmp(ispin), mo_coeff%matrix_struct)
820 CALL cp_fm_create(mo_derivs_tmp(i, ispin), mo_coeff%matrix_struct)
821 CALL cp_fm_set_all(matrix=mo_derivs_tmp(i, ispin), alpha=0.0_dp)
823 DO i = 1,
SIZE(op_fm_set, 1)
824 CALL cp_fm_create(opvec(i, ispin), mo_coeff%matrix_struct)
826 CALL cp_fm_create(inv_work(i, ispin), op_fm_set(i, ispin)%matrix_struct)
828 CALL cp_cfm_create(eigrmat(ispin), op_fm_set(1, ispin)%matrix_struct)
829 CALL cp_cfm_create(inv_mat(ispin), op_fm_set(1, ispin)%matrix_struct)
833 IF (calculate_forces)
THEN
835 CALL get_qs_env(qs_env=qs_env, matrix_s=matrix_s)
836 ALLOCATE (tempmat(2, dft_control%nspins))
837 DO ispin = 1, dft_control%nspins
838 ALLOCATE (tempmat(1, ispin)%matrix, tempmat(2, ispin)%matrix)
839 CALL dbcsr_copy(tempmat(1, ispin)%matrix, matrix_s(1)%matrix,
'TEMPMAT')
840 CALL dbcsr_copy(tempmat(2, ispin)%matrix, matrix_s(1)%matrix,
'TEMPMAT')
841 CALL dbcsr_set(tempmat(1, ispin)%matrix, 0.0_dp)
842 CALL dbcsr_set(tempmat(2, ispin)%matrix, 0.0_dp)
846 ALLOCATE (cosab(ldab, ldab), sinab(ldab, ldab), work(ldab, ldab))
847 ALLOCATE (dcosab(ldab, ldab, 3), dsinab(ldab, ldab, 3))
848 lsab = max(lsab, ldab)
850 ALLOCATE (dcost(i, 1)%block(lsab, lsab), dsint(i, 1)%block(lsab, lsab))
851 ALLOCATE (dcost(i, 2)%block(lsab, lsab), dsint(i, 2)%block(lsab, lsab))
859 cosmat => efield%cosmat(idir)%matrix
860 sinmat => efield%sinmat(idir)%matrix
863 DO ispin = 1, dft_control%nspins
864 IF (mos(ispin)%use_mo_coeff_b)
THEN
865 CALL get_mo_set(mo_set=mos(ispin), nao=nao, mo_coeff_b=mo_coeff_b, nmo=nmo)
868 CALL get_mo_set(mo_set=mos(ispin), nao=nao, mo_coeff=mo_coeff, nmo=nmo)
869 mo_coeff_tmp(ispin) = mo_coeff
872 CALL parallel_gemm(
"T",
"N", nmo, nmo, nao, 1.0_dp, mo_coeff_tmp(ispin), opvec(1, ispin), 0.0_dp, &
875 CALL parallel_gemm(
"T",
"N", nmo, nmo, nao, 1.0_dp, mo_coeff_tmp(ispin), opvec(2, ispin), 0.0_dp, &
880 DO ispin = 1, dft_control%nspins
884 CALL cp_cfm_solve(eigrmat(ispin), inv_mat(ispin), zdeta)
888 zlog(idir) = aimag(log(zi(idir)))
890 IF (.NOT. just_energy)
THEN
892 DO ispin = 1, dft_control%nspins
893 inv_work(1, ispin)%local_data(:, :) = real(inv_mat(ispin)%local_data(:, :),
dp)
894 inv_work(2, ispin)%local_data(:, :) = aimag(inv_mat(ispin)%local_data(:, :))
895 CALL get_mo_set(mo_set=mos(ispin), nao=nao, nmo=nmo)
898 CALL parallel_gemm(
"N",
"N", nao, nmo, nmo, focc, opvec(1, ispin), inv_work(2, ispin), &
899 1.0_dp, mo_derivs_tmp(idir, ispin))
900 CALL parallel_gemm(
"N",
"N", nao, nmo, nmo, -focc, opvec(2, ispin), inv_work(1, ispin), &
901 1.0_dp, mo_derivs_tmp(idir, ispin))
907 IF (calculate_forces)
THEN
908 nkind =
SIZE(qs_kind_set)
909 natom =
SIZE(particle_set)
910 kvec(:) =
twopi*cell%h_inv(idir, :)
914 DO ispin = 1, dft_control%nspins
915 CALL dbcsr_set(tempmat(1, ispin)%matrix, 0.0_dp)
916 CALL dbcsr_set(tempmat(2, ispin)%matrix, 0.0_dp)
917 CALL get_mo_set(mo_set=mos(ispin), nao=nao, nmo=nmo)
918 CALL parallel_gemm(
"N",
"N", nao, nmo, nmo, 1.0_dp, mo_coeff_tmp(ispin), inv_work(1, ispin), 0.0_dp, &
920 CALL parallel_gemm(
"N",
"N", nao, nmo, nmo, 1.0_dp, mo_coeff_tmp(ispin), inv_work(2, ispin), 0.0_dp, &
923 matrix_v=opvec(1, ispin), matrix_g=mo_coeff_tmp(ispin), ncol=nmo)
925 matrix_v=opvec(2, ispin), matrix_g=mo_coeff_tmp(ispin), ncol=nmo)
929 ALLOCATE (basis_set_list(nkind))
931 qs_kind => qs_kind_set(ikind)
932 CALL get_qs_kind(qs_kind=qs_kind, basis_set=basis_set_a)
933 IF (
ASSOCIATED(basis_set_a))
THEN
934 basis_set_list(ikind)%gto_basis_set => basis_set_a
936 NULLIFY (basis_set_list(ikind)%gto_basis_set)
943 iatom=iatom, jatom=jatom, r=rab)
944 basis_set_a => basis_set_list(ikind)%gto_basis_set
945 IF (.NOT.
ASSOCIATED(basis_set_a)) cycle
946 basis_set_b => basis_set_list(jkind)%gto_basis_set
947 IF (.NOT.
ASSOCIATED(basis_set_b)) cycle
949 first_sgfa => basis_set_a%first_sgf
950 la_max => basis_set_a%lmax
951 la_min => basis_set_a%lmin
952 npgfa => basis_set_a%npgf
953 nseta = basis_set_a%nset
954 nsgfa => basis_set_a%nsgf_set
955 rpgfa => basis_set_a%pgf_radius
956 set_radius_a => basis_set_a%set_radius
957 sphi_a => basis_set_a%sphi
958 zeta => basis_set_a%zet
960 first_sgfb => basis_set_b%first_sgf
961 lb_max => basis_set_b%lmax
962 lb_min => basis_set_b%lmin
963 npgfb => basis_set_b%npgf
964 nsetb = basis_set_b%nset
965 nsgfb => basis_set_b%nsgf_set
966 rpgfb => basis_set_b%pgf_radius
967 set_radius_b => basis_set_b%set_radius
968 sphi_b => basis_set_b%sphi
969 zetb => basis_set_b%zet
971 ldsa =
SIZE(sphi_a, 1)
972 ldsb =
SIZE(sphi_b, 1)
973 ra(:) =
pbc(particle_set(iatom)%r(:), cell)
975 dab = sqrt(rab(1)*rab(1) + rab(2)*rab(2) + rab(3)*rab(3))
977 IF (iatom <= jatom)
THEN
985 IF (iatom == jatom .AND. dab < 1.e-10_dp)
THEN
992 dcost(i, 1)%block = 0.0_dp
993 dsint(i, 1)%block = 0.0_dp
994 dcost(i, 2)%block = 0.0_dp
995 dsint(i, 2)%block = 0.0_dp
999 ncoa = npgfa(iset)*
ncoset(la_max(iset))
1000 sgfa = first_sgfa(1, iset)
1002 IF (set_radius_a(iset) + set_radius_b(jset) < dab) cycle
1003 ncob = npgfb(jset)*
ncoset(lb_max(jset))
1004 sgfb = first_sgfb(1, jset)
1006 CALL cossin(la_max(iset), npgfa(iset), zeta(:, iset), rpgfa(:, iset), la_min(iset), &
1007 lb_max(jset), npgfb(jset), zetb(:, jset), rpgfb(:, jset), lb_min(jset), &
1008 ra, rb, kvec, cosab, sinab, dcosab, dsinab)
1010 CALL contract_all(dcost(i, 1)%block, dsint(i, 1)%block, &
1011 ncoa, nsgfa(iset), sgfa, sphi_a, ldsa, &
1012 ncob, nsgfb(jset), sgfb, sphi_b, ldsb, &
1013 dcosab(:, :, i), dsinab(:, :, i), ldab, work, ldab)
1016 CALL cossin(lb_max(jset), npgfb(jset), zetb(:, jset), rpgfb(:, jset), lb_min(jset), &
1017 la_max(iset), npgfa(iset), zeta(:, iset), rpgfa(:, iset), la_min(iset), &
1018 rb, ra, kvec, cosab, sinab, dcosab, dsinab)
1020 dcosab(1:ncoa, 1:ncob, i) = transpose(dcosab(1:ncob, 1:ncoa, i))
1021 dsinab(1:ncoa, 1:ncob, i) = transpose(dsinab(1:ncob, 1:ncoa, i))
1022 CALL contract_all(dcost(i, 2)%block, dsint(i, 2)%block, &
1023 ncoa, nsgfa(iset), sgfa, sphi_a, ldsa, &
1024 ncob, nsgfb(jset), sgfb, sphi_b, ldsb, &
1025 dcosab(:, :, i), dsinab(:, :, i), ldab, work, ldab)
1031 DO ispin = 1, dft_control%nspins
1032 NULLIFY (rblock, iblock)
1034 row=irow, col=icol, block=rblock, found=found)
1037 row=irow, col=icol, block=iblock, found=found)
1039 n1 =
SIZE(rblock, 1)
1040 n2 =
SIZE(rblock, 2)
1041 cpassert(
SIZE(iblock, 1) == n1)
1042 cpassert(
SIZE(iblock, 2) == n2)
1043 cpassert(lsab >= n1)
1044 cpassert(lsab >= n2)
1045 IF (iatom <= jatom)
THEN
1047 forcea(i) = forcea(i) + sum(rblock(1:n1, 1:n2)*dsint(i, 1)%block(1:n1, 1:n2)) &
1048 - sum(iblock(1:n1, 1:n2)*dcost(i, 1)%block(1:n1, 1:n2))
1049 forceb(i) = forceb(i) + sum(rblock(1:n1, 1:n2)*dsint(i, 2)%block(1:n1, 1:n2)) &
1050 - sum(iblock(1:n1, 1:n2)*dcost(i, 2)%block(1:n1, 1:n2))
1054 forcea(i) = forcea(i) + sum(transpose(rblock(1:n1, 1:n2))*dsint(i, 1)%block(1:n2, 1:n1)) &
1055 - sum(transpose(iblock(1:n1, 1:n2))*dcost(i, 1)%block(1:n2, 1:n1))
1056 forceb(i) = forceb(i) + sum(transpose(rblock(1:n1, 1:n2))*dsint(i, 2)%block(1:n2, 1:n1)) &
1057 - sum(transpose(iblock(1:n1, 1:n2))*dcost(i, 2)%block(1:n2, 1:n1))
1062 force_tmp(iatom, :, i) = force_tmp(iatom, :, i) - fab*hmat(i, idir)*forcea(:)
1063 force_tmp(jatom, :, i) = force_tmp(jatom, :, i) - fab*hmat(i, idir)*forceb(:)
1067 DEALLOCATE (basis_set_list)
1073 cqi(idir) = rlog(idir) + zlog(idir)
1074 IF (cqi(idir) >
pi) cqi(idir) = cqi(idir) -
twopi
1075 IF (cqi(idir) < -
pi) cqi(idir) = cqi(idir) +
twopi
1077 IF (calculate_forces)
THEN
1078 IF (abs(efield%polarisation(idir) - cqi(idir)) >
pi)
THEN
1079 di(idir) = (efield%polarisation(idir) - cqi(idir))/
pi
1081 cqi(idir) = cqi(idir) + sign(1.0_dp, di(idir))*
twopi
1082 IF (abs(efield%polarisation(idir) - cqi(idir)) <
pi)
EXIT
1091 ci(idir) = ci(idir) + hmat(idir, i)*cqi(i)
1096 IF (calculate_forces)
THEN
1097 ener_field = sum(ci)
1099 IF (abs(efield%field_energy - ener_field) >
pi*abs(sum(hmat)))
THEN
1100 cpwarn(
"Large change of e-field energy detected. Correct for non-smooth energy surface")
1102 efield%field_energy = ener_field
1103 efield%polarisation(:) = cqi(:)
1109 ener_field = ener_field + dfilter(i)*(fieldpol(i) - 2._dp*
twopi*ci(i))**2
1111 energy%efield = 0.25_dp*omega/
twopi*ener_field
1114 IF (para_env%is_source())
THEN
1117 WRITE (iodeb,
'(A,T61,F20.10)')
" Polarisation Quantum: ", 2._dp*
twopi*
twopi*hmat(3, 3)
1118 WRITE (iodeb,
'(A,T21,3F20.10)')
" Polarisation: ", 2._dp*
twopi*ci(1:3)
1119 WRITE (iodeb,
'(A,T21,3F20.10)')
" Displacement: ", fieldpol(1:3)
1120 WRITE (iodeb,
'(A,T21,3F20.10)')
" E-Field: ", ((fieldpol(i) - 2._dp*
twopi*ci(i)), i=1, 3)
1121 WRITE (iodeb,
'(A,T61,F20.10)')
" Disp Free Energy:", energy%efield
1125 IF (.NOT. just_energy)
THEN
1127 di(i) = -omega*(fieldpol(i) - 2._dp*
twopi*ci(i))*dfilter(i)
1130 DO ispin = 1, dft_control%nspins
1134 mo_derivs_tmp(idir, ispin))
1137 DO ispin = 1, dft_control%nspins
1142 IF (calculate_forces)
THEN
1146 iatom = atom_of_kind(ia)
1147 force(ikind)%efield(1:3, iatom) = force(ikind)%efield(1:3, iatom) + di(i)*force_tmp(ia, 1:3, i)
1152 DO ispin = 1, dft_control%nspins
1155 IF (mos(ispin)%use_mo_coeff_b)
CALL cp_fm_release(mo_coeff_tmp(ispin))
1159 DO i = 1,
SIZE(op_fm_set, 1)
1165 DEALLOCATE (inv_mat, inv_work, op_fm_set, opvec, eigrmat)
1166 DEALLOCATE (mo_coeff_tmp, mo_derivs_tmp)
1168 IF (calculate_forces)
THEN
1169 DO ikind = 1,
SIZE(atomic_kind_set)
1170 CALL para_env%sum(force(ikind)%efield)
1172 DEALLOCATE (force_tmp)
1173 DEALLOCATE (cosab, sinab, work, dcosab, dsinab)
1175 DEALLOCATE (dcost(i, 1)%block, dsint(i, 1)%block)
1176 DEALLOCATE (dcost(i, 2)%block, dsint(i, 2)%block)
1180 CALL timestop(handle)
1182 END SUBROUTINE qs_dispfield_derivatives
1204 SUBROUTINE contract_all(cos_block, sin_block, &
1205 ncoa, nsgfa, sgfa, sphi_a, ldsa, &
1206 ncob, nsgfb, sgfb, sphi_b, ldsb, &
1207 cosab, sinab, ldab, work, ldwork)
1209 REAL(
dp),
DIMENSION(:, :),
POINTER :: cos_block, sin_block
1210 INTEGER,
INTENT(IN) :: ncoa, nsgfa, sgfa
1211 REAL(
dp),
DIMENSION(:, :),
INTENT(IN) :: sphi_a
1212 INTEGER,
INTENT(IN) :: ldsa, ncob, nsgfb, sgfb
1213 REAL(
dp),
DIMENSION(:, :),
INTENT(IN) :: sphi_b
1214 INTEGER,
INTENT(IN) :: ldsb
1215 REAL(
dp),
DIMENSION(:, :),
INTENT(IN) :: cosab, sinab
1216 INTEGER,
INTENT(IN) :: ldab
1217 REAL(
dp),
DIMENSION(:, :) :: work
1218 INTEGER,
INTENT(IN) :: ldwork
1222 CALL dgemm(
"N",
"N", ncoa, nsgfb, ncob, 1.0_dp, cosab(1, 1), ldab, &
1223 sphi_b(1, sgfb), ldsb, 0.0_dp, work(1, 1), ldwork)
1225 CALL dgemm(
"T",
"N", nsgfa, nsgfb, ncoa, 1.0_dp, sphi_a(1, sgfa), ldsa, &
1226 work(1, 1), ldwork, 1.0_dp, cos_block(sgfa, sgfb),
SIZE(cos_block, 1))
1229 CALL dgemm(
"N",
"N", ncoa, nsgfb, ncob, 1.0_dp, sinab(1, 1), ldab, &
1230 sphi_b(1, sgfb), ldsb, 0.0_dp, work(1, 1), ldwork)
1232 CALL dgemm(
"T",
"N", nsgfa, nsgfb, ncoa, 1.0_dp, sphi_a(1, sgfa), ldsa, &
1233 work(1, 1), ldwork, 1.0_dp, sin_block(sgfa, sgfb),
SIZE(sin_block, 1))
1235 END SUBROUTINE contract_all
static void dgemm(const char transa, const char transb, const int m, const int n, const int k, const double alpha, const double *a, const int lda, const double *b, const int ldb, const double beta, double *c, const int ldc)
Convenient wrapper to hide Fortran nature of dgemm_, swapping a and b.
Calculation of the moment integrals over Cartesian Gaussian-type functions.
subroutine, public cossin(la_max_set, npgfa, zeta, rpgfa, la_min_set, lb_max, npgfb, zetb, rpgfb, lb_min, rac, rbc, kvec, cosab, sinab, dcosab, dsinab)
...
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.
collect pointers to a block of reals
Handles all functions related to the CELL.
Basic linear algebra operations for complex full matrices.
subroutine, public cp_cfm_solve(matrix_a, general_a, determinant)
Solve the system of linear equations A*b=A_general using LU decomposition. Pay attention that both ma...
subroutine, public cp_cfm_scale_and_add_fm(alpha, matrix_a, beta, matrix_b)
Scale and add two BLACS matrices (a = alpha*a + beta*b). where b is a real matrix (adapted from cp_cf...
Represents a complex full matrix distributed on many processors.
subroutine, public cp_cfm_create(matrix, matrix_struct, name)
Creates a new full matrix with the given structure.
subroutine, public cp_cfm_release(matrix)
Releases a full matrix.
subroutine, public cp_cfm_set_all(matrix, alpha, beta)
Set all elements of the full matrix to alpha. Besides, set all diagonal matrix elements to beta (if g...
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
subroutine, public dbcsr_copy(matrix_b, matrix_a, name, keep_sparsity, keep_imaginary)
...
subroutine, public dbcsr_get_block_p(matrix, row, col, block, found, row_size, col_size)
...
subroutine, public dbcsr_set(matrix, alpha)
...
DBCSR operations in CP2K.
subroutine, public cp_dbcsr_sm_fm_multiply(matrix, fm_in, fm_out, ncol, alpha, beta)
multiply a dbcsr with a fm matrix
subroutine, public copy_dbcsr_to_fm(matrix, fm)
Copy a DBCSR matrix to a BLACS matrix.
subroutine, public cp_dbcsr_plus_fm_fm_t(sparse_matrix, matrix_v, matrix_g, ncol, alpha, keep_sparsity, symmetry_mode)
performs the multiplication sparse_matrix+dense_mat*dens_mat^T if matrix_g is not explicitly given,...
subroutine, public copy_fm_to_dbcsr(fm, matrix, keep_sparsity)
Copy a BLACS matrix to a dbcsr matrix.
basic linear algebra operations for full matrices
subroutine, public cp_fm_scale_and_add(alpha, matrix_a, beta, matrix_b)
calc A <- alpha*A + beta*B optimized for alpha == 1.0 (just add beta*B) and beta == 0....
represent the structure of a full matrix
subroutine, public cp_fm_struct_create(fmstruct, para_env, context, nrow_global, ncol_global, nrow_block, ncol_block, descriptor, first_p_pos, local_leading_dimension, template_fmstruct, square_blocks, force_block)
allocates and initializes a full matrix structure
subroutine, public cp_fm_struct_release(fmstruct)
releases a full matrix structure
represent a full matrix distributed on many processors
subroutine, public cp_fm_set_all(matrix, alpha, beta)
set all elements of a matrix to the same value, and optionally the diagonal to a different one
subroutine, public cp_fm_create(matrix, matrix_struct, name, use_sp)
creates a new full matrix with the given structure
Defines the basic variable types.
integer, parameter, public dp
Definition of mathematical constants and functions.
real(kind=dp), parameter, public pi
complex(kind=dp), parameter, public z_one
complex(kind=dp), parameter, public gaussi
real(kind=dp), parameter, public twopi
complex(kind=dp), parameter, public z_zero
Interface to the message passing library MPI.
Provides Cartesian and spherical orbital pointers and indices.
integer, dimension(:), allocatable, public ncoset
basic linear algebra operations for full matrixes
Define the data structure for the particle information.
Calculates the energy contribution and the mo_derivative of a static periodic electric field.
subroutine, public qs_efield_berry_phase(qs_env, just_energy, calculate_forces)
...
subroutine, public get_qs_env(qs_env, atomic_kind_set, qs_kind_set, cell, super_cell, cell_ref, use_ref_cell, kpoints, dft_control, mos, sab_orb, sab_all, qmmm, qmmm_periodic, sac_ae, sac_ppl, sac_lri, sap_ppnl, sab_vdw, sab_scp, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_pp, sab_xtb_nonbond, sab_almo, sab_kp, sab_kp_nosym, particle_set, energy, force, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, run_rtp, rtp, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_ks_im_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_ri_aux_kp, matrix_s, matrix_s_ri_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, rho, rho_xc, pw_env, ewald_env, ewald_pw, active_space, mpools, input, para_env, blacs_env, scf_control, rel_control, kinetic, qs_charges, vppl, rho_core, rho_nlcc, rho_nlcc_g, ks_env, ks_qmmm_env, wf_history, scf_env, local_particles, local_molecules, distribution_2d, dbcsr_dist, molecule_kind_set, molecule_set, subsys, cp_subsys, oce, local_rho_set, rho_atom_set, task_list, task_list_soft, rho0_atom_set, rho0_mpole, rhoz_set, ecoul_1c, rho0_s_rs, rho0_s_gs, do_kpoints, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, nkind, natom, nelectron_total, nelectron_spin, efield, neighbor_list_id, linres_control, xas_env, virial, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, results, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, lri_env, lri_density, exstate_env, ec_env, harris_env, dispersion_env, gcp_env, vee, rho_external, external_vxc, mask, mp2_env, bs_env, kg_env, wanniercentres, atprop, ls_scf_env, do_transport, transport_env, v_hartree_rspace, s_mstruct_changed, rho_changed, potential_changed, forces_up_to_date, mscfg_env, almo_scf_env, gradient_history, variable_history, embed_pot, spin_embed_pot, polar_env, mos_last_converged, eeq, rhs)
Get the QUICKSTEP environment.
subroutine, public set_qs_env(qs_env, super_cell, mos, qmmm, qmmm_periodic, ewald_env, ewald_pw, mpools, rho_external, external_vxc, mask, scf_control, rel_control, qs_charges, ks_env, ks_qmmm_env, wf_history, scf_env, active_space, input, oce, rho_atom_set, rho0_atom_set, rho0_mpole, run_rtp, rtp, rhoz_set, rhoz_tot, ecoul_1c, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, efield, linres_control, xas_env, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, ls_scf_env, do_transport, transport_env, lri_env, lri_density, exstate_env, ec_env, dispersion_env, harris_env, gcp_env, mp2_env, bs_env, kg_env, force, kpoints, wanniercentres, almo_scf_env, gradient_history, variable_history, embed_pot, spin_embed_pot, polar_env, mos_last_converged, eeq, rhs)
Set the QUICKSTEP environment.
Define the quickstep kind type and their sub types.
subroutine, public get_qs_kind(qs_kind, basis_set, basis_type, ncgf, nsgf, all_potential, tnadd_potential, gth_potential, sgp_potential, upf_potential, se_parameter, dftb_parameter, xtb_parameter, dftb3_param, zatom, zeff, elec_conf, mao, lmax_dftb, alpha_core_charge, ccore_charge, core_charge, core_charge_radius, paw_proj_set, paw_atom, hard_radius, hard0_radius, max_rad_local, covalent_radius, vdw_radius, gpw_type_forced, harmonics, max_iso_not0, max_s_harm, grid_atom, ngrid_ang, ngrid_rad, lmax_rho0, dft_plus_u_atom, l_of_dft_plus_u, n_of_dft_plus_u, u_minus_j, u_of_dft_plus_u, j_of_dft_plus_u, alpha_of_dft_plus_u, beta_of_dft_plus_u, j0_of_dft_plus_u, occupation_of_dft_plus_u, dispersion, bs_occupation, magnetization, no_optimize, addel, laddel, naddel, orbitals, max_scf, eps_scf, smear, u_ramping, u_minus_j_target, eps_u_ramping, init_u_ramping_each_scf, reltmat, ghost, floating, name, element_symbol, pao_basis_size, pao_model_file, pao_potentials, pao_descriptors, nelec)
Get attributes of an atomic kind.
subroutine, public get_qs_kind_set(qs_kind_set, all_potential_present, tnadd_potential_present, gth_potential_present, sgp_potential_present, paw_atom_present, dft_plus_u_atom_present, maxcgf, maxsgf, maxco, maxco_proj, maxgtops, maxlgto, maxlprj, maxnset, maxsgf_set, ncgf, npgf, nset, nsgf, nshell, maxpol, maxlppl, maxlppnl, maxppnl, nelectron, maxder, max_ngrid_rad, max_sph_harm, maxg_iso_not0, lmax_rho0, basis_rcut, basis_type, total_zeff_corr, npgf_seg)
Get attributes of an atomic kind set.
Definition and initialisation of the mo data type.
subroutine, public get_mo_set(mo_set, maxocc, homo, lfomo, nao, nelectron, n_el_f, nmo, eigenvalues, occupation_numbers, mo_coeff, mo_coeff_b, uniform_occupation, kts, mu, flexible_electron_count)
Get the components of a MO set data structure.
Calculates the moment integrals <a|r^m|b> and <a|r x d/dr|b>
subroutine, public build_berry_moment_matrix(qs_env, cosmat, sinmat, kvec, sab_orb_external, basis_type)
...
Define the neighbor list data types and the corresponding functionality.
subroutine, public neighbor_list_iterator_create(iterator_set, nl, search, nthread)
Neighbor list iterator functions.
subroutine, public neighbor_list_iterator_release(iterator_set)
...
integer function, public neighbor_list_iterate(iterator_set, mepos)
...
subroutine, public get_iterator_info(iterator_set, mepos, ikind, jkind, nkind, ilist, nlist, inode, nnode, iatom, jatom, r, cell)
...
type for berry phase efield matrices. At the moment only used for cosmat and sinmat
subroutine, public set_efield_matrices(efield, sinmat, cosmat, dipmat)
...
subroutine, public init_efield_matrices(efield)
...
pure subroutine, public virial_pair_force(pv_virial, f0, force, rab)
Computes the contribution to the stress tensor from two-body pair-wise forces.
Provides all information about an atomic kind.
Type defining parameters related to the simulation cell.
Represent a complex full matrix.
keeps the information about the structure of a full matrix
stores all the informations relevant to an mpi environment
Provides all information about a quickstep kind.