44 use,
intrinsic :: iso_fortran_env
94 type(namespace_t),
intent(in) :: namespace
95 type(grid_t),
intent(inout) :: gr
96 type(hamiltonian_elec_t),
intent(inout) :: hm
97 type(states_elec_t),
target,
intent(inout) :: st
98 type(ions_t),
intent(inout) :: ions
99 type(v_ks_t),
intent(in) :: ks
100 type(partner_list_t),
intent(in) :: ext_partners
102 real(real64),
allocatable :: rho_total(:)
103 real(real64) :: stress(3,3)
104 real(real64) :: stress_kin(3,3), stress_Hartree(3,3), stress_xc(3,3), stress_xc_nlcc(3,3)
105 real(real64) :: stress_ps(3,3), stress_ps_nl(3,3), stress_ps_local(3,3), stress_ii(3,3)
106 real(real64) :: stress_hubbard(3,3)
108 real(real64),
allocatable :: vh(:)
109 real(real64),
allocatable :: grad_vh(:,:)
110 real(real64) :: ehartree
111 real(real64),
contiguous,
pointer :: rho(:)
117 if (st%requires_generalized_overlap)
then
122 write(
message(1),
'(a)')
'The stress tensors for real wavefunctions has not been implemented!'
124 if (hm%kpoints%full%npoints == 1)
then
125 write(
message(2),
'(a)')
'For testing this feature, you can add ForceComplex=yes to the input file'
132 if (ions%space%periodic_dim == 1)
then
136 if (.not. ions%space%is_periodic())
then
137 write(
message(1),
'(a)')
'The stress tensor cannot be computed for isolated systems'
141 if (ks%vdw%vdw_correction /= option__vdwcorrection__none .and. .not. any(ks%vdw%vdw_correction ==
d3_lib_options))
then
142 write(
message(1),
'(a)')
'The stress tensor is currently only implemented with DFT-D3 vdW correction'
146 if (hm%pcm%run_pcm)
then
150 if (
allocated(hm%v_static))
then
154 if (ks%v_ks_photons%active())
then
160 if (.not. hm%vnl%apply_projector_matrices)
then
161 if (hm%vnl%has_non_local_potential)
then
162 call messages_not_implemented(
'Stress tensor with relativistic Kleinman-Bylander pseudopotential', namespace=namespace)
165 'user-defined or all-electron species)', namespace=namespace)
179 if ( .not.
in_family(hm%xc%family, [xc_family_lda, xc_family_gga, xc_family_mgga]))
then
180 write(
message(1),
'(a)')
'The stress tensor computation is currently only possible at the Kohn-Sham DFT level'
181 write(
message(2),
'(a)')
'with LDA, GGA and mGGA functionals or for independent particles.'
185 if (
in_family(hm%xc%family, [xc_family_gga, xc_family_mgga]) .and. st%d%ispin ==
spinors)
then
199 if (hm%xc%use_gi_ked)
then
212 safe_allocate(rho_total(1:gr%np_part))
214 rho_total(ip) = sum(st%rho(ip, 1:st%d%spin_channels))
223 safe_allocate(vh(1:gr%np_part))
224 safe_allocate(grad_vh(1:gr%np, 1:gr%der%dim))
226 call lalg_copy(gr%np, hm%ks_pot%vhartree, vh)
228 if (hm%d%spin_channels > 1)
then
229 safe_allocate(rho(1:gr%np_part))
237 if (hm%d%spin_channels > 1)
then
238 safe_deallocate_p(rho)
243 ehartree = hm%energy%hartree
250 call stress_from_kinetic(gr, ions%space, hm, st, gr%symm, ions%latt%rcell_volume, stress_kin)
251 stress = stress + stress_kin
258 call stress_from_hartree(gr, ions%space, ions%latt%rcell_volume, grad_vh, ehartree, stress_hartree)
259 stress = stress + stress_hartree
261 call stress_from_xc(gr, hm, st, ions%space, ions%latt%rcell_volume, stress_xc)
264 if (
allocated(st%rho_core))
then
265 call stress_from_xc_nlcc(ions%latt%rcell_volume, gr, st, ions, hm%ks_pot%vxc, stress_xc_nlcc)
270 stress_xc = stress_xc + ks%stress_xc / ions%latt%rcell_volume
271 stress = stress + stress_xc + stress_xc_nlcc
275 stress_ps = stress_ps_local
276 stress = stress + stress_ps_local
278 safe_deallocate_a(vh)
279 safe_deallocate_a(grad_vh)
282 stress_ps = stress_ps + stress_ps_nl
283 stress = stress + stress_ps_nl
285 call stress_from_hubbard(namespace, gr, st, hm, ions%space, ions%latt%rcell_volume, stress_hubbard)
286 stress = stress + stress_hubbard
288 call ion_interaction_stress(ions%ion_interaction, ions%space, ions%latt, ions%atom, ions%natoms, ions%pos, stress_ii)
289 stress = stress + stress_ii
295 st%stress_tensors%kinetic = -stress_kin
296 st%stress_tensors%Hartree = -stress_hartree
297 st%stress_tensors%xc = -stress_xc
298 st%stress_tensors%xc_nlcc = -stress_xc_nlcc
299 st%stress_tensors%ps_local = -stress_ps_local
300 st%stress_tensors%ps_nl = -stress_ps_nl
301 st%stress_tensors%hubbard = -stress_hubbard
302 st%stress_tensors%ion_ion = -stress_ii
305 if (ks%vdw%vdw_correction /= option__vdwcorrection__none)
then
306 st%stress_tensors%vdw = hm%ep%vdw_stress
308 st%stress_tensors%vdw =
m_zero
310 stress = stress + st%stress_tensors%vdw
313 if (hm%kpoints%use_symmetries)
then
319 st%stress_tensors%total = stress
323 st%stress_tensors%kinetic_sumrule =
m_zero
325 st%stress_tensors%Hartree_sumrule =
m_zero
326 if(ions%space%periodic_dim == 3)
then
327 st%stress_tensors%kinetic_sumrule = (stress_kin(1,1) + stress_kin(2,2) + stress_kin(3,3))*ions%latt%rcell_volume
328 st%stress_tensors%kinetic_sumrule = st%stress_tensors%kinetic_sumrule -
m_two * hm%energy%kinetic
330 st%stress_tensors%hartree_sumrule = (stress_hartree(1,1) + stress_hartree(2,2) + stress_hartree(3,3))*ions%latt%rcell_volume
331 st%stress_tensors%hartree_sumrule = st%stress_tensors%hartree_sumrule - hm%energy%hartree
334 safe_deallocate_a(rho_total)
356 type(
grid_t),
intent(in) :: gr
357 class(
space_t),
intent(in) :: space
361 real(real64),
intent(in) :: rcell_volume
362 real(real64),
intent(out) :: stress_kin(3, 3)
364 integer :: ik, ist, idir, jdir, ib, minst, maxst
365 complex(real64),
allocatable :: stress_l_block(:)
373 safe_allocate(stress_l_block(1:st%block_size))
375 do ik = st%d%kpt%start, st%d%kpt%end
378 do ib = st%group%block_start, st%group%block_end
382 call hm%phase%copy_and_set_phase(gr, st%d%kpt, st%group%psib(ib, ik), psib)
388 do idir = 1, space%periodic_dim
389 do jdir = idir, space%periodic_dim
392 do ist = minst, maxst
393 stress_kin(idir,jdir) = stress_kin(idir,jdir) &
394 + st%kweights(ik) * st%occ(ist, ik) &
395 * real(stress_l_block(ist - minst + 1), real64)
400 do idir = 1, space%dim
401 call gpsib(idir)%end()
408 if (st%parallel_in_states .or. st%d%kpt%parallel)
then
417 if (hm%kpoints%use_symmetries)
then
421 stress_kin = stress_kin / rcell_volume
445 type(
grid_t),
intent(in) :: gr
446 class(
space_t),
intent(in) :: space
447 real(real64),
intent(in) :: volume
448 real(real64),
contiguous,
intent(in) :: grad_vh(:,:)
449 real(real64),
intent(in) :: ehartree
450 real(real64),
intent(out) :: stress_Hartree(3, 3)
452 integer :: idir, jdir
457 stress_hartree(:,:) =
m_zero
459 do idir = 1, space%periodic_dim
460 do jdir = idir, space%periodic_dim
461 stress_hartree(idir, jdir) = -
dmf_dotp(gr, grad_vh(:,idir), grad_vh(:, jdir))/
m_four/
m_pi
463 stress_hartree(idir, idir) = stress_hartree(idir, idir) + ehartree
468 stress_hartree = stress_hartree/volume
503 subroutine stress_from_xc(gr, hm, st, space, rcell_volume, stress_xc)
504 type(
grid_t),
intent(in) :: gr
507 class(
space_t),
intent(in) :: space
508 real(real64),
intent(in) :: rcell_volume
509 real(real64),
intent(out) :: stress_xc(3, 3)
511 integer :: ik, ist, idir, jdir, ib, minst, maxst, ispin
512 real(real64) :: stress_tau(3,3)
513 complex(real64),
allocatable :: stress_l_block(:)
514 type(
wfs_elec_t) :: psib, gpsib(space%dim), vtau_gpsib(space%dim)
521 do idir = 1, space%periodic_dim
522 stress_xc(idir, idir) = - hm%energy%exchange - hm%energy%correlation + hm%energy%intnvxc
533 safe_allocate(stress_l_block(1:st%block_size))
537 do ik = st%d%kpt%start, st%d%kpt%end
540 ispin = st%d%get_spin_index(ik)
542 do ib = st%group%block_start, st%group%block_end
546 call hm%phase%copy_and_set_phase(gr, st%d%kpt, st%group%psib(ib, ik), psib)
552 do idir = 1, space%periodic_dim
553 call psib%copy_to(vtau_gpsib(idir))
555 call hm%ks_pot%zapply_vtau_psi(gr, hm%d, ispin, gpsib(idir), vtau_gpsib(idir))
559 do idir = 1, space%periodic_dim
560 do jdir = idir, space%periodic_dim
563 do ist = minst, maxst
564 stress_tau(idir, jdir) = stress_tau(idir, jdir) &
565 +
m_two * st%kweights(ik) * st%occ(ist, ik) * real(stress_l_block(ist - minst + 1), real64)
570 do idir = 1, space%dim
571 call gpsib(idir)%end()
573 do idir = 1, space%periodic_dim
574 call vtau_gpsib(idir)%end()
581 safe_deallocate_a(stress_l_block)
583 if (st%parallel_in_states .or. st%d%kpt%parallel)
then
591 if (hm%kpoints%use_symmetries)
then
595 stress_xc(:,:) = stress_xc(:,:) + stress_tau(:,:)
599 stress_xc(:,:) = stress_xc(:,:) / rcell_volume
624 real(real64),
intent(in) :: rcell_volume
625 type(
grid_t),
intent(in) :: gr
627 type(
ions_t),
intent(in) :: ions
628 real(real64),
contiguous,
intent(in) :: vxc(:,:)
629 real(real64),
intent(out) :: stress_xc_nlcc(3, 3)
631 integer :: idir, jdir, iat
632 real(real64),
allocatable :: vxc_tot(:), nlcc_grad_x(:,:,:)
637 assert(
allocated(st%rho_core))
641 safe_allocate(vxc_tot(1:gr%np))
642 safe_allocate(nlcc_grad_x(1:gr%np, 1:gr%der%dim, 1:gr%der%dim))
645 call lalg_copy(gr%np, vxc(:, 1), vxc_tot)
646 if (st%d%spin_channels > 1)
then
651 do iat = ions%atoms_dist%start, ions%atoms_dist%end
653 ions%pos(:,iat), gr, nlcc_grad_x)
655 do idir = 1, ions%space%periodic_dim
656 do jdir = idir, ions%space%periodic_dim
657 stress_xc_nlcc(idir, jdir) = stress_xc_nlcc(idir, jdir) &
658 -
dmf_dotp(gr, nlcc_grad_x(:, idir, jdir), vxc_tot)
662 safe_deallocate_a(nlcc_grad_x)
663 safe_deallocate_a(vxc_tot)
665 if (ions%atoms_dist%parallel)
then
671 stress_xc_nlcc(:,:) = stress_xc_nlcc(:,:) / rcell_volume
698 type(
grid_t),
target,
intent(in) :: gr
701 type(
ions_t),
intent(in) :: ions
702 real(real64),
intent(out) :: stress_ps_nl(3, 3)
704 integer :: ik, ist, idir, jdir
705 integer :: ib, minst, maxst
706 type(
wfs_elec_t) :: psib, rvnl_psib(3), gpsib(3)
707 complex(real64),
allocatable :: stress_tmp(:)
714 safe_allocate(stress_tmp(1:st%block_size))
718 do ik = st%d%kpt%start, st%d%kpt%end
722 do ib = st%group%block_start, st%group%block_end
726 call hm%phase%copy_and_set_phase(gr, st%d%kpt, st%group%psib(ib, ik), psib)
733 do idir = 1, gr%der%dim
734 call psib%copy_to(rvnl_psib(idir))
737 call hm%vnl%zr_vn_local(gr, st%d, gr%der%boundaries%spiral, psib, rvnl_psib)
739 do idir = 1, ions%space%periodic_dim
740 do jdir = idir, ions%space%periodic_dim
743 do ist = minst, maxst
744 stress_ps_nl(idir, jdir) = stress_ps_nl(idir, jdir) &
745 +
m_two * st%kweights(ik) * st%occ(ist, ik) * real(stress_tmp(ist-minst+1), real64)
751 do idir = 1, gr%der%dim
752 call rvnl_psib(idir)%end()
753 call gpsib(idir)%end()
759 safe_deallocate_a(stress_tmp)
761 if (st%parallel_in_states .or. st%d%kpt%parallel)
then
769 if (hm%kpoints%use_symmetries)
then
774 do idir = 1, ions%space%periodic_dim
775 stress_ps_nl(idir, idir) = stress_ps_nl(idir, idir) + hm%energy%extern_non_local
778 stress_ps_nl = stress_ps_nl/ions%latt%rcell_volume
807 type(
grid_t),
target,
intent(in) :: gr
809 type(
ions_t),
intent(in) :: ions
810 real(real64),
contiguous,
intent(inout) :: rho_total(:)
811 real(real64),
contiguous,
intent(in) :: grad_vh(:,:)
812 real(real64),
intent(out) :: stress_ps_local(3, 3)
815 real(real64) :: stress_SR(3, 3), stress_LR(3, 3)
816 real(real64) :: energy_ps_SR, charge, zi
817 real(real64),
allocatable :: vloc(:), rvloc(:,:), rho_local_lr(:), rho_lr(:)
818 real(real64),
allocatable :: grad_rho(:,:), rho_lr_x(:,:), vlr(:), grad_vlr(:,:)
819 integer :: idir, jdir, iatom
820 type(
ps_t),
pointer :: spec_ps
828 safe_allocate(vloc(1:gr%np))
830 safe_allocate(rvloc(1:gr%np, 1:gr%der%dim))
832 do iatom = 1, ions%natoms
835 safe_deallocate_a(vloc)
837 safe_allocate(grad_rho(1:gr%np,1:gr%der%dim))
840 energy_ps_sr = hm%energy%extern_local
841 do idir = 1, ions%space%periodic_dim
842 do jdir = idir, ions%space%periodic_dim
843 stress_sr(idir, jdir) = stress_sr(idir, jdir) &
844 +
dmf_dotp(gr, rvloc(:, jdir), grad_rho(:, idir))
846 stress_sr(idir,idir) = stress_sr(idir,idir) + energy_ps_sr
851 stress_sr = stress_sr/ions%latt%rcell_volume
853 safe_deallocate_a(rvloc)
854 safe_deallocate_a(grad_rho)
862 safe_allocate(rho_lr(1:gr%np_part))
863 safe_allocate(rho_lr_x(1:gr%np, 1:gr%der%dim))
866 safe_allocate(rho_local_lr(1:gr%np))
867 do iatom = ions%atoms_dist%start, ions%atoms_dist%end
868 assert(ions%atom(iatom)%species%is_ps())
870 ions%pos(:, iatom), gr, rho_local_lr, nlr_x=rho_lr_x)
874 safe_deallocate_a(rho_local_lr)
876 if (ions%atoms_dist%parallel)
then
881 do idir = 1, ions%space%periodic_dim
882 do jdir = idir, ions%space%periodic_dim
883 stress_lr(idir, jdir) = stress_lr(idir, jdir) +
dmf_dotp(gr, rho_lr_x(:,jdir), grad_vh(:, idir))
886 safe_deallocate_a(rho_lr_x)
888 safe_allocate(vlr(1:gr%np_part))
890 safe_deallocate_a(rho_lr)
892 safe_allocate(grad_vlr(1:gr%np, 1:gr%der%dim))
894 safe_deallocate_a(vlr)
896 do idir = 1, ions%space%periodic_dim
897 do jdir = idir, ions%space%periodic_dim
898 stress_lr(idir, jdir) = stress_lr(idir, jdir) -
dmf_dotp(gr, grad_vh(:,idir), grad_vlr(:, jdir))/
m_two/
m_pi
904 safe_deallocate_a(grad_vlr)
908 if (ions%space%periodic_dim == 3)
then
910 do iatom = 1, ions%natoms
911 charge = charge + ions%atom(iatom)%species%get_zval()
914 do iatom = 1, ions%natoms
915 select type(spec => ions%atom(iatom)%species)
920 do idir = 1, ions%space%periodic_dim
921 stress_lr(idir, idir) = stress_lr(idir, idir) &
922 +
m_two*
m_pi*spec_ps%sigma_erf**2*charge*zi /ions%latt%rcell_volume
928 stress_lr = stress_lr/ions%latt%rcell_volume
930 stress_ps_local = stress_sr + stress_lr
939 class(
mesh_t),
intent(in) :: mesh
940 type(
ions_t),
intent(in) :: ions
941 integer,
intent(in) :: iatom
942 real(real64),
contiguous,
intent(inout) :: vpsl(:)
943 real(real64),
contiguous,
intent(inout) :: rvpsl(:,:)
946 integer :: ip, idir, pd
947 real(real64) :: radius
948 real(real64),
allocatable :: vl_sm(:, :)
950 type(
ps_t),
pointer :: ps
954 if (.not. ions%atom(iatom)%species%is_ps())
then
961 select type(spec=>ions%atom(iatom)%species)
966 radius = ps%vl%x_threshold*1.05_real64
968 call submesh_init(sphere, ions%space, mesh, ions%latt, ions%pos(:, iatom), &
973 pd = ions%space%periodic_dim
974 safe_allocate(vl_sm(1:sphere%np, 1:pd + 1))
976 [(0, idir = 0, pd)], [(radius, idir = 0, pd)], vl_sm, cart_dir = [(idir, idir = 0, pd)])
981 vpsl(sphere%map(ip)) = vpsl(sphere%map(ip)) + vl_sm(ip, 1)
982 rvpsl(sphere%map(ip), 1:pd) = rvpsl(sphere%map(ip), 1:pd) + vl_sm(ip, 2:pd + 1)
985 safe_deallocate_a(vl_sm)
1012 subroutine stress_from_hubbard(namespace, gr, st, hm, space, rcell_volume, stress_hubbard)
1014 type(
grid_t),
target,
intent(in) :: gr
1017 type(
space_t),
intent(in) :: space
1018 real(real64),
intent(in) :: rcell_volume
1019 real(real64),
intent(out) :: stress_hubbard(3, 3)
1021 integer :: ik, ist, idir, jdir
1022 integer :: ib, minst, maxst
1023 type(
wfs_elec_t) :: psib, rvu_psib(3), gpsib(3)
1024 complex(real64),
allocatable :: stress_tmp(:)
1035 safe_allocate(stress_tmp(1:st%block_size))
1039 do ik = st%d%kpt%start, st%d%kpt%end
1043 do ib = st%group%block_start, st%group%block_end
1047 call hm%phase%copy_and_set_phase(gr, st%d%kpt, st%group%psib(ib, ik), psib)
1053 do idir = 1, gr%der%dim
1054 call psib%copy_to(rvu_psib(idir))
1058 call zlda_u_rvu(hm%lda_u, gr, space, hm%d, namespace, psib, rvu_psib)
1064 do ist = minst, maxst
1065 stress_hubbard(idir, jdir) = stress_hubbard(idir, jdir) &
1066 +
m_two * st%kweights(ik) * st%occ(ist, ik) * real(stress_tmp(ist-minst+1), real64)
1072 do idir = 1, gr%der%dim
1073 call rvu_psib(idir)%end()
1074 call gpsib(idir)%end()
1080 safe_deallocate_a(stress_tmp)
1082 if (st%parallel_in_states .or. st%d%kpt%parallel)
then
1090 if (hm%kpoints%use_symmetries)
then
1096 stress_hubbard(idir, idir) = stress_hubbard(idir, idir) + hm%energy%int_dft_u
1099 stress_hubbard = stress_hubbard/rcell_volume
1106 subroutine output_stress(iunit, space_dim, stress_tensors, mpi_grp, all_terms)
1107 integer,
intent(in) :: iunit
1108 integer,
intent(in) :: space_dim
1109 type(
stress_t),
intent(in) :: stress_tensors
1111 logical,
optional,
intent(in) :: all_terms
1113 logical :: write_all_terms
1114 character(len=16) :: stress_unit
1121 if (mpi_grp%is_root())
then
1123 if (write_all_terms)
then
1124 write(iunit,
'(3a)')
'Kinetic stress tensor [', trim(stress_unit),
'] ='
1126 if (space_dim == 3)
then
1127 write(iunit,
'(a, es15.6, 3a)')
'Kinetic pressure sumrule violation: ', &
1134 write(iunit,
'(3a)')
'Hartree stress tensor [', trim(stress_unit),
'] ='
1136 if (space_dim == 3)
then
1137 write(iunit,
'(a, es15.6, 3a)')
'Hartree pressure sumrule violation: ', &
1143 write(iunit,
'(3a)')
'XC stress tensor [', trim(stress_unit),
'] ='
1146 write(iunit,
'(3a)')
'XC NLCC stress tensor [', trim(stress_unit),
'] ='
1149 write(iunit,
'(3a)')
'Local pseudo. stress tensor [', trim(stress_unit),
'] ='
1152 write(iunit,
'(3a)')
'Nonlocal pseudo. stress tensor [', trim(stress_unit),
'] ='
1155 write(iunit,
'(3a)')
'Ion-ion stress tensor [', trim(stress_unit),
'] ='
1158 write(iunit,
'(3a)')
'vdW stress tensor [', trim(stress_unit),
'] ='
1161 write(iunit,
'(3a)')
'Hubbard stress tensor [', trim(stress_unit),
'] ='
1165 write(iunit,
'(3a)')
'Total stress tensor [', trim(stress_unit),
'] ='
1173 integer,
intent(in) :: iunit
1174 integer,
intent(in) :: space_dim
1175 real(real64),
intent(in) :: total_stress_tensor(3,3)
1178 real(real64) :: pressure
1179 character(len=16) :: stress_unit
1185 do idim = 1, space_dim
1186 pressure = pressure - total_stress_tensor(idim, idim) / real(space_dim, real64)
1189 write(iunit,
'(3a,es16.8)', advance=
"no")
'Pressure [', trim(stress_unit),
'] = ', &
1191 if (space_dim == 3)
then
1200 integer,
intent(in) :: ounit
1201 integer,
intent(in) :: space_dim
1202 real(real64),
intent(in) :: tensor(3,3)
1204 real(real64) :: tensor_with_unit(3,3)
1205 integer :: idim, jdim
1209 write(ounit,
'(a9,2x)', advance=
"no")
"T_{ij}"
1210 do jdim = 1, space_dim
1211 write(ounit,
'(i18)', advance=
"no") jdim
1214 do idim = 1, space_dim
1215 write(ounit,
'(i9,2x)', advance=
"no") idim
1216 do jdim = 1, space_dim
1217 write(ounit,
'(es18.9)', advance=
"no") tensor_with_unit(idim, jdim)
constant times a vector plus a vector
Copies a vector x, to a vector y.
scales a vector by a constant
This module implements common operations on batches of mesh functions.
subroutine, public batch_set_zero(this, np, async)
fill all mesh functions of the batch with zero
Module implementing boundary conditions in Octopus.
This module implements a calculator for the density and defines related functions.
This module calculates the derivatives (gradients, Laplacians, etc.) of a function.
subroutine, public dderivatives_grad(der, ff, op_ff, ghost_update, set_bc, to_cartesian)
apply the gradient to a mesh function
subroutine, public zderivatives_batch_grad(der, ffb, opffb, ghost_update, set_bc, to_cartesian, factor)
apply the gradient to a batch of mesh functions
The Ono-Hirose double-grid technique [T. Ono and K. Hirose, Phys. Rev. Lett. 82, 5016 (1999); Phys....
subroutine, public double_grid_transform(this, sm, nf, spl, ll, mm, rcut, feff, cart_dir)
Evaluate a batch of localized functions f_jf(x) = spl_jf(r) * Y_{ll,mm}(x) (or a purely radial spl_jf...
real(real64) function, public double_grid_margin(this, mesh)
Submesh radius enlargement needed to contain the effective support of a transformed function: the ten...
integer, parameter, public spinors
subroutine, public energy_calc_total(namespace, space, hm, gr, st, ext_partners, iunit, full)
This subroutine calculates the total energy of the system. Basically, it adds up the KS eigenvalues,...
integer, parameter, public scalar_relativistic_zora
integer, parameter, public fully_relativistic_zora
real(real64), parameter, public m_two
real(real64), parameter, public m_zero
real(real64), parameter, public m_four
real(real64), parameter, public m_pi
some mathematical constants
integer, parameter, public independent_particles
Theory level.
integer, parameter, public generalized_kohn_sham_dft
integer, parameter, public kohn_sham_dft
real(real64), parameter, public m_epsilon
real(real64), parameter, public m_half
real(real64), parameter, public m_one
This module implements the underlying real-space grid.
This module defines classes and functions for interaction partners.
subroutine, public ion_interaction_stress(this, space, latt, atom, natoms, pos, stress_ii)
Computes the contribution to the stress tensor the ion-ion energy.
A module to handle KS potential, without the external potential.
integer, parameter, public dft_u_none
subroutine, public zlda_u_rvu(this, mesh, space, d, namespace, psib, gpsib)
This routine computes .
This modules implements the routines for doing constrain DFT for noncollinear magnetism.
integer, parameter, public constrain_none
This module is intended to contain "only mathematical" functions and procedures.
This module defines functions over batches of mesh functions.
subroutine, public zmesh_batch_dotp_vector(mesh, aa, bb, dot, reduce, cproduct)
A simple switch between specialized kernels and generic kernels.
This module defines various routines, operating on mesh functions.
This module defines the meshes, which are used in Octopus.
subroutine, public messages_not_implemented(feature, namespace)
character(len=256), dimension(max_lines), public message
to be output by fatal, warning
subroutine, public messages_fatal(no_lines, only_root_writes, namespace)
subroutine, public dpoisson_solve(this, namespace, pot, rho, all_nodes, kernel, reset)
Calculates the Poisson equation. Given the density returns the corresponding potential.
/* To use the profiling module, call profiling_in and profiling_out with the label of the region as a...
subroutine, public profiling_out(label)
Increment out counter and sum up difference between entry and exit time.
subroutine, public profiling_in(label, exclude)
Increment in counter and save entry time.
subroutine, public species_get_long_range_density(species, namespace, space, latt, pos, mesh, rho, sphere_inout, nlr_x)
subroutine, public species_get_nlcc_grad(species, space, latt, pos, mesh, rho_core_grad_x)
Returns the (r-R_I)-weighted analytic gradient of the NLCC core density.
This module handles spin dimensions of the states and the k-point distribution.
integer pure function, public states_elec_block_max(st, ib)
return index of last state in block ib
integer pure function, public states_elec_block_min(st, ib)
return index of first state in block ib
This module implements the calculation of the stress tensor.
subroutine stress_from_hartree(gr, space, volume, grad_vh, ehartree, stress_Hartree)
Computes the contribution to the stress tensor from the Hartree energy.
subroutine, public output_stress(iunit, space_dim, stress_tensors, mpi_grp, all_terms)
subroutine stress_from_kinetic(gr, space, hm, st, symm, rcell_volume, stress_kin)
Computes the contribution to the stress tensor from the kinetic energy.
subroutine stress_from_pseudo_local(gr, hm, ions, rho_total, grad_vh, stress_ps_local)
Computes the contribution from the local part of the pseudopotential.
subroutine print_stress_tensor(ounit, space_dim, tensor)
subroutine, public output_pressure(iunit, space_dim, total_stress_tensor)
subroutine, public stress_calculate(namespace, gr, hm, st, ions, ks, ext_partners)
This computes the total stress on the lattice.
subroutine stress_from_hubbard(namespace, gr, st, hm, space, rcell_volume, stress_hubbard)
Computes the contribution to the stress tensor from the Hubbard energy.
subroutine stress_from_xc(gr, hm, st, space, rcell_volume, stress_xc)
Computes the contribution to the stress tensor from the xc energy.
subroutine epot_local_pseudopotential_sr(mesh, ions, iatom, vpsl, rvpsl, dgrid)
subroutine stress_from_xc_nlcc(rcell_volume, gr, st, ions, vxc, stress_xc_nlcc)
Computes the NLCC contribution to the stress tensor from the xc energy.
subroutine stress_from_pseudo_nonloc(gr, st, hm, ions, stress_ps_nl)
Computes the contribution to the stress tensor from the nonlocal part of the pseudopotentials.
subroutine, public submesh_end(this)
subroutine, public submesh_init(this, space, mesh, latt, center, rc)
subroutine, public dsymmetrize_tensor_cart(symm, tensor, use_non_symmorphic)
Symmetric a rank-2 tensor defined in Cartesian space.
type(type_t), parameter, public type_cmplx
brief This module defines the class unit_t which is used by the unit_systems_oct_m module.
character(len=20) pure function, public units_abbrev(this)
This module defines the unit system, used for input and output.
type(unit_system_t), public units_out
type(unit_t), public unit_gpa
For output pressure in GPa.
logical pure function, public family_is_mgga_with_exc(xcs)
Is the xc function part of the mGGA family with an energy functional.
logical pure function, public xc_is_energy_functional(xcs)
Is one of the x or c functional is not an energy functional.
pure logical function, public in_family(family, xc_families)
A module that takes care of xc contribution from vdW interactions.
integer(int64), dimension(5), parameter, public d3_lib_options
VDWCORRECTION options that correspond to the DFT-D3 library.
Description of the grid, containing information on derivatives, stencil, and symmetries.
Describes mesh distribution to nodes.
This is defined even when running serial.
A type storing the information and data about a pseudopotential.
The states_elec_t class contains all electronic wave functions.
A submesh is a type of mesh, used for the projectors in the pseudopotentials It contains points on a ...
batches of electronic states