33 use,
intrinsic :: iso_fortran_env
64 integer,
public,
parameter :: &
65 INDEPENDENT_PARTICLES = 2, &
76 integer :: theory_level = independent_particles
77 logical :: needs_vtau = .false.
79 real(real64),
public,
allocatable :: vhartree(:)
80 real(real64),
public,
allocatable :: vxc(:,:)
81 real(real64),
public,
allocatable :: vhxc(:,:)
84 real(real64),
allocatable :: vtau(:,:)
86 type(accel_mem_t) :: vtau_accel
119 real(real64),
public,
allocatable :: vhxc(:,:)
120 real(real64),
allocatable :: vtau(:,:)
130 class(ks_potential_t),
intent(inout) :: this
131 integer,
intent(in) :: np, np_part
132 integer,
intent(in) :: nspin
133 integer,
intent(in) :: theory_level
134 logical,
intent(in) :: needs_vtau
138 this%theory_level = theory_level
139 this%needs_vtau = needs_vtau
145 safe_allocate(this%vhxc(1:np, 1:nspin))
146 this%vhxc(1:np, 1:nspin) =
m_zero
148 if (theory_level /= independent_particles)
then
150 safe_allocate(this%vhartree(1:np_part))
153 safe_allocate(this%vxc(1:np, 1:nspin))
157 safe_allocate(this%vtau(1:np, 1:nspin))
175 safe_deallocate_a(this%vhxc)
176 safe_deallocate_a(this%vhartree)
177 safe_deallocate_a(this%vxc)
178 safe_deallocate_a(this%vtau)
190 real(real64),
intent(in) :: vtau(:,:)
194 assert(this%needs_vtau)
207 integer :: offset, ispin
211 assert(this%needs_vtau)
215 do ispin = 1, this%nspin
227 real(real64),
intent(inout) :: pot(:,:)
228 integer,
optional,
intent(in) :: nspin
230 integer :: ispin, ip, nspin_
236 assert(
size(pot, dim=1) >= this%np)
237 assert(
size(pot, dim=2) >= nspin_)
245 pot(ip, ispin) = pot(ip, ispin) + this%vhxc(ip, ispin)
259 class(
space_t),
intent(in) :: space
260 class(
mesh_t),
intent(in) :: mesh
261 integer,
intent(out) :: ierr
263 integer :: iunit, err, err2(2), isp
264 character(len=MAX_PATH_LEN) :: filename
265 character(len=100) :: lines(2)
271 if (
restart_skip(restart) .or. this%theory_level == independent_particles)
then
277 message(1) =
"Debug: Writing Vhxc restart."
283 lines(1) =
'# #spin #nspin filename'
286 if (err /= 0) ierr = ierr + 1
289 do isp = 1, this%nspin
291 write(lines(1),
'(i8,a,i8,a)') isp,
' | ', this%nspin,
' | "'//trim(adjustl(filename))//
'"'
293 if (err /= 0) err2(1) = err2(1) + 1
296 if (err /= 0) err2(2) = err2(2) + 1
299 if (err2(1) /= 0) ierr = ierr + 2
300 if (err2(2) /= 0) ierr = ierr + 4
304 if (err /= 0) ierr = ierr + 4
307 if (this%needs_vtau)
then
308 lines(1) =
'# #spin #nspin filename'
311 if (err /= 0) ierr = ierr + 8
314 do isp = 1, this%nspin
316 write(lines(1),
'(i8,a,i8,a)') isp,
' | ', this%nspin,
' | "'//trim(adjustl(filename))//
'"'
318 if (err /= 0) err2(1) = err2(1) + 16
321 if (err /= 0) err2(1) = err2(1) + 1
324 if (err2(1) /= 0) ierr = ierr + 32
325 if (err2(2) /= 0) ierr = ierr + 64
329 if (err /= 0) ierr = ierr + 128
335 message(1) =
"Debug: Writing Vhxc restart done."
348 class(
space_t),
intent(in) :: space
350 integer,
intent(out) :: ierr
352 integer :: err, err2, isp
353 character(len=MAX_PATH_LEN) :: filename
359 if (
restart_skip(restart) .or. this%theory_level == independent_particles)
then
366 message(1) =
"Debug: Reading Vhxc restart."
371 do isp = 1, this%nspin
375 if (err /= 0) err2 = err2 + 1
378 if (err2 /= 0) ierr = ierr + 1
382 if (this%needs_vtau)
then
383 do isp = 1, this%nspin
387 if (err /= 0) err2 = err2 + 1
391 if (err2 /= 0) ierr = ierr + 2
395 message(1) =
"Debug: Reading Vhxc restart done."
406 integer,
optional,
intent(in) :: order
431 real(real64),
intent(in) :: current_time
432 real(real64),
intent(in) :: dt
447 integer,
intent(in) :: history
450 if (this%theory_level == independent_particles)
return
454 if (.not.
present(storage))
then
455 if (this%needs_vtau)
then
463 if (this%needs_vtau)
then
477 integer,
intent(in) :: history
479 if (this%theory_level == independent_particles)
return
483 if (this%needs_vtau)
then
497 integer,
intent(in) :: order
498 real(real64),
intent(in) :: current_time
499 real(real64),
intent(in) :: dt
500 real(real64),
intent(in) :: interpolation_time
502 if (this%theory_level == independent_particles)
return
506 if (this%needs_vtau)
then
508 this%vhxc, vtau = this%vtau)
560 integer(int64),
intent(in) :: how
561 character(len=*),
intent(in) :: dir
562 class(
space_t),
intent(in) :: space
563 class(
mesh_t),
intent(in) :: mesh
564 real(real64),
optional,
intent(in) :: pos(:,:)
565 type(
atom_t),
optional,
intent(in) :: atoms(:)
566 type(
mpi_grp_t),
optional,
intent(in) :: grp
568 character(len=MAX_PATH_LEN) :: fname
574 space, mesh, this%vhartree,
units_out%energy, err, pos=pos, atoms=atoms, grp = grp)
576 do is = 1, this%nspin
579 mesh, this%vxc(:, is),
units_out%energy, err, pos=pos, atoms=atoms, grp = grp)
581 if (this%needs_vtau)
then
584 mesh, this%vtau(:, is),
units_out%energy, err, pos=pos, atoms=atoms, grp = grp)
598 if (.not.
allocated(copy%vhxc))
then
599 safe_allocate(copy%vhxc(1:this%np, 1:this%nspin))
601 if (this%needs_vtau)
then
602 if (.not.
allocated(copy%vtau))
then
603 safe_allocate(copy%vtau(1:this%np, 1:this%nspin))
615 if (this%theory_level == independent_particles)
return
620 call lalg_copy(this%np, this%nspin, this%vhxc, copy%vhxc)
621 if (this%needs_vtau)
then
622 call lalg_copy(this%np, this%nspin, this%vtau, copy%vtau)
633 if (this%theory_level == independent_particles)
return
637 assert(
allocated(copy%vhxc))
638 call lalg_copy(this%np, this%nspin, copy%vhxc, this%vhxc)
639 if (this%needs_vtau)
then
640 assert(
allocated(copy%vtau))
641 call this%set_vtau(copy%vtau)
650 integer(int64),
intent(in) :: np
651 integer,
intent(in) :: nspin
652 integer(int64),
intent(in) :: pnp
670 safe_deallocate_a(this%vhxc)
671 safe_deallocate_a(this%vtau)
680 real(real64) function ks_potential_check_convergence(this, copy, mesh, rho, qtot) result(diff)
683 class(
mesh_t),
intent(in) :: mesh
684 real(real64),
intent(in) :: rho(:,:)
685 real(real64),
intent(in) :: qtot
687 real(real64),
allocatable :: diff_pot(:)
690 push_sub(ks_potential_check_convergence)
692 safe_allocate(diff_pot(1:this%np))
697 diff_pot(ip) = abs(copy%vhxc(ip, 1) - this%vhxc(ip, 1))*rho(ip, 1)
699 do is = 2, this%nspin
702 diff_pot(ip) = diff_pot(ip) + abs(copy%vhxc(ip, is) - this%vhxc(ip, is))*rho(ip, is)
708 safe_deallocate_a(diff_pot)
710 pop_sub(ks_potential_check_convergence)
716 type(potential_interpolation_t),
intent(inout) :: vksold
717 real(real64),
intent(in) :: times(:)
718 real(real64),
intent(in) :: current_time
722 assert(
size(times) == 3)
724 call interpolate(times, vksold%v_old(:, :, 1:3), current_time, vksold%v_old(:, :, 0))
725 if (this%needs_vtau)
then
726 call interpolate(times, vksold%vtau_old(:, :, 1:3), current_time, vksold%vtau_old(:, :, 0))
736 real(real64),
intent(in) :: dt
742 assert(not_in_openmp())
745 do ispin = 1, this%nspin
748 vold%vhxc(ip, ispin) = m_half*dt*(this%vhxc(ip, ispin) - vold%vhxc(ip, ispin))
751 if (this%needs_vtau)
then
754 vold%vtau(ip, ispin) = m_half*dt*(this%vtau(ip, ispin) - vold%vtau(ip, ispin))
765#include "complex.F90"
766#include "ks_potential_inc.F90"
770#include "ks_potential_inc.F90"
Copies a vector x, to a vector y.
subroutine, public accel_release_buffer(this)
pure logical function, public accel_is_enabled()
integer, parameter, public accel_mem_read_only
type(debug_t), save, public debug
real(real64), parameter, public m_zero
logical pure function, public not_in_openmp()
subroutine, public dio_function_output(how, dir, fname, namespace, space, mesh, ff, unit, ierr, pos, atoms, grp, root)
Top-level IO routine for functions defined on the mesh.
A module to handle KS potential, without the external potential.
subroutine ks_potential_set_interpolated_potentials(this, vksold, history)
Set the interpolated potentials to history.
subroutine zks_potential_current_mass_renormalization(this, gpsi, space_dim, ndim, ispin)
Nonlocal contribution of vtau for the current.
subroutine ks_potential_add_vhxc(this, pot, nspin)
Adds vHxc to the potential.
subroutine dks_potential_current_mass_renormalization(this, gpsi, space_dim, ndim, ispin)
Nonlocal contribution of vtau for the current.
subroutine ks_potential_load_vhxc(this, restart, space, mesh, ierr)
Loads the vhxc potentials.
subroutine, public vtau_set_vin(field, this)
subroutine ks_potential_get_interpolated_potentials(this, vksold, history, storage)
Get the interpolated potentials from history.
subroutine zks_potential_apply_vtau_psi(this, mesh, d, ispin, psib, vpsib)
Wrapper to hamiltonian_elec_base_local_sub to hide the data of vtau.
integer, parameter, public rdmft
subroutine, public vtau_set_vout(field, this)
subroutine zks_potential_mult_vhxc(this, mf, ispin)
Multiply a mesh function by vHxc.
integer, parameter, public hartree
subroutine ks_potential_interpolate_potentials(this, vksold, order, current_time, dt, interpolation_time)
Interpolate potentials to a new time.
integer, parameter, public hartree_fock
subroutine ks_potential_update_vtau_buffer(this)
Update vtau GPU buffer.
subroutine ks_potential_run_zero_iter(this, vksold)
Run zero iter for the interpolation.
subroutine ks_potential_store_copy(this, copy)
Copy the potentials to a storage object.
subroutine ks_potential_mix_potentials(this, vold, dt)
Replace vold potentials by 0.5*dt(vold + vhxc)
subroutine ks_potential_perform_interpolation(this, vksold, times, current_time)
Perform a time interpolation of the potentials.
subroutine, public vtau_get_vnew(field, this)
subroutine ks_potential_init_interpolation(this, vksold, order)
Initialize the potential interpolation.
real(real64) function ks_potential_check_convergence(this, copy, mesh, rho, qtot)
Check the convergence of a vhxc for predictor-corrector.
subroutine ks_potential_restore_copy(this, copy)
Copy the potentials from a storage object.
subroutine ks_potential_storage_allocate(this, copy)
Copy the potentials to a storage object.
subroutine ks_potential_interpolation_new(this, vksold, current_time, dt)
New interpolation point for the interpolation.
integer, parameter, public generalized_kohn_sham_dft
subroutine ks_potential_end(this)
Releases the memory for the KS potentials.
subroutine dks_potential_mult_vhxc(this, mf, ispin)
Multiply a mesh function by vHxc.
subroutine, public xc_copied_potentials_end(this)
Finalizer for the copied potentials.
integer, parameter, public kohn_sham_dft
subroutine ks_potential_dump_vhxc(this, restart, space, mesh, ierr)
Dumps the vhxc potentials.
subroutine dks_potential_apply_vtau_psi(this, mesh, d, ispin, psib, vpsib)
Wrapper to hamiltonian_elec_base_local_sub to hide the data of vtau.
subroutine ks_potential_init(this, np, np_part, nspin, theory_level, needs_vtau)
Allocate the memory for the KS potentials.
subroutine ks_potential_set_vtau(this, vtau)
Set vtau and update the corresponding GPU buffer.
subroutine xc_copied_potentials_copy_vhxc_to_buffer(this, np, nspin, pnp, buffer)
Copy the vhxc potential to a gpu buffer.
subroutine ks_potential_output_potentials(this, namespace, how, dir, space, mesh, pos, atoms, grp)
Outputs vh, vxc, and vtau potentials.
This module is intended to contain "only mathematical" functions and procedures.
This module defines various routines, operating on mesh functions.
real(real64) function, public dmf_integrate(mesh, ff, mask, reduce)
Integrate a function on the mesh.
This module defines the meshes, which are used in Octopus.
character(len=256), dimension(max_lines), public message
to be output by fatal, warning
subroutine, public messages_info(no_lines, iunit, debug_only, stress, all_nodes, namespace)
this module contains the low-level part of the output system
character(len=max_path_len) function, public get_filename_with_spin(output, nspin, spin_index)
Returns the filame as output, or output-spX is spin polarized.
subroutine, public potential_interpolation_interpolate(potential_interpolation, order, time, dt, t, vhxc, vtau)
subroutine, public potential_interpolation_set(potential_interpolation, np, nspin, i, vhxc, vtau)
subroutine, public potential_interpolation_new(potential_interpolation, np, nspin, time, dt, vhxc, vtau)
subroutine, public potential_interpolation_run_zero_iter(potential_interpolation, np, nspin, vhxc, vtau)
subroutine, public potential_interpolation_get(potential_interpolation, np, nspin, i, vhxc, vtau)
subroutine, public potential_interpolation_init(potential_interpolation, np, nspin, mgga_with_exc, order)
subroutine, public restart_close(restart, iunit)
Close a file previously opened with restart_open.
subroutine, public restart_write(restart, iunit, lines, nlines, ierr)
logical pure function, public restart_skip(restart)
Returns true if the restart information should neither be read nor written. This might happen because...
integer function, public restart_open(restart, filename, status, position, silent)
Open file "filename" found inside the current restart directory. Depending on the type of restart,...
This module handles spin dimensions of the states and the k-point distribution.
type(type_t), public type_float
brief This module defines the class unit_t which is used by the unit_systems_oct_m module.
This module defines the unit system, used for input and output.
type(unit_system_t), public units_out
Describes mesh distribution to nodes.
Quantities used in mixing: Input, output and new potentials, and the residuals.
This is defined even when running serial.