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),
contiguous,
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),
contiguous,
intent(inout) :: pot(:,:)
228 integer,
optional,
intent(in) :: nspin
236 assert(
size(pot, dim=1) >= this%np)
237 assert(
size(pot, dim=2) >= nspin_)
251 class(
space_t),
intent(in) :: space
252 class(
mesh_t),
intent(in) :: mesh
253 integer,
intent(out) :: ierr
255 integer :: iunit, err, err2(2), isp
256 character(len=MAX_PATH_LEN) :: filename
257 character(len=100) :: lines(2)
263 if (
restart_skip(restart) .or. this%theory_level == independent_particles)
then
269 message(1) =
"Debug: Writing Vhxc restart."
275 lines(1) =
'# #spin #nspin filename'
278 if (err /= 0) ierr = ierr + 1
281 do isp = 1, this%nspin
283 write(lines(1),
'(i8,a,i8,a)') isp,
' | ', this%nspin,
' | "'//trim(adjustl(filename))//
'"'
285 if (err /= 0) err2(1) = err2(1) + 1
288 if (err /= 0) err2(2) = err2(2) + 1
291 if (err2(1) /= 0) ierr = ierr + 2
292 if (err2(2) /= 0) ierr = ierr + 4
296 if (err /= 0) ierr = ierr + 4
299 if (this%needs_vtau)
then
300 lines(1) =
'# #spin #nspin filename'
303 if (err /= 0) ierr = ierr + 8
306 do isp = 1, this%nspin
308 write(lines(1),
'(i8,a,i8,a)') isp,
' | ', this%nspin,
' | "'//trim(adjustl(filename))//
'"'
310 if (err /= 0) err2(1) = err2(1) + 16
313 if (err /= 0) err2(1) = err2(1) + 1
316 if (err2(1) /= 0) ierr = ierr + 32
317 if (err2(2) /= 0) ierr = ierr + 64
321 if (err /= 0) ierr = ierr + 128
327 message(1) =
"Debug: Writing Vhxc restart done."
340 class(
space_t),
intent(in) :: space
342 integer,
intent(out) :: ierr
344 integer :: err, err2, isp
345 character(len=MAX_PATH_LEN) :: filename
351 if (
restart_skip(restart) .or. this%theory_level == independent_particles)
then
358 message(1) =
"Debug: Reading Vhxc restart."
363 do isp = 1, this%nspin
367 if (err /= 0) err2 = err2 + 1
370 if (err2 /= 0) ierr = ierr + 1
374 if (this%needs_vtau)
then
375 do isp = 1, this%nspin
379 if (err /= 0) err2 = err2 + 1
383 if (err2 /= 0) ierr = ierr + 2
387 message(1) =
"Debug: Reading Vhxc restart done."
398 integer,
optional,
intent(in) :: order
423 real(real64),
intent(in) :: current_time
424 real(real64),
intent(in) :: dt
439 integer,
intent(in) :: history
442 if (this%theory_level == independent_particles)
return
446 if (.not.
present(storage))
then
447 if (this%needs_vtau)
then
455 if (this%needs_vtau)
then
469 integer,
intent(in) :: history
471 if (this%theory_level == independent_particles)
return
475 if (this%needs_vtau)
then
489 integer,
intent(in) :: order
490 real(real64),
intent(in) :: current_time
491 real(real64),
intent(in) :: dt
492 real(real64),
intent(in) :: interpolation_time
494 if (this%theory_level == independent_particles)
return
498 if (this%needs_vtau)
then
500 this%vhxc, vtau = this%vtau)
552 integer(int64),
intent(in) :: how
553 character(len=*),
intent(in) :: dir
554 class(
space_t),
intent(in) :: space
555 class(
mesh_t),
intent(in) :: mesh
556 real(real64),
optional,
intent(in) :: pos(:,:)
557 type(
atom_t),
optional,
intent(in) :: atoms(:)
558 type(
mpi_grp_t),
optional,
intent(in) :: grp
560 character(len=MAX_PATH_LEN) :: fname
566 space, mesh, this%vhartree,
units_out%energy, err, pos=pos, atoms=atoms, grp = grp)
568 do is = 1, this%nspin
571 mesh, this%vxc(:, is),
units_out%energy, err, pos=pos, atoms=atoms, grp = grp)
573 if (this%needs_vtau)
then
576 mesh, this%vtau(:, is),
units_out%energy, err, pos=pos, atoms=atoms, grp = grp)
590 if (.not.
allocated(copy%vhxc))
then
591 safe_allocate(copy%vhxc(1:this%np, 1:this%nspin))
593 if (this%needs_vtau)
then
594 if (.not.
allocated(copy%vtau))
then
595 safe_allocate(copy%vtau(1:this%np, 1:this%nspin))
607 if (this%theory_level == independent_particles)
return
612 call lalg_copy(this%np, this%nspin, this%vhxc, copy%vhxc)
613 if (this%needs_vtau)
then
614 call lalg_copy(this%np, this%nspin, this%vtau, copy%vtau)
625 if (this%theory_level == independent_particles)
return
629 assert(
allocated(copy%vhxc))
630 call lalg_copy(this%np, this%nspin, copy%vhxc, this%vhxc)
631 if (this%needs_vtau)
then
632 assert(
allocated(copy%vtau))
633 call this%set_vtau(copy%vtau)
642 integer(int64),
intent(in) :: np
643 integer,
intent(in) :: nspin
644 integer(int64),
intent(in) :: pnp
662 safe_deallocate_a(this%vhxc)
663 safe_deallocate_a(this%vtau)
672 real(real64) function ks_potential_check_convergence(this, copy, mesh, rho, qtot) result(diff)
675 class(
mesh_t),
intent(in) :: mesh
676 real(real64),
intent(in) :: rho(:,:)
677 real(real64),
intent(in) :: qtot
679 real(real64),
allocatable :: diff_pot(:)
682 push_sub(ks_potential_check_convergence)
684 safe_allocate(diff_pot(1:this%np))
689 diff_pot(ip) = abs(copy%vhxc(ip, 1) - this%vhxc(ip, 1))*rho(ip, 1)
691 do is = 2, this%nspin
694 diff_pot(ip) = diff_pot(ip) + abs(copy%vhxc(ip, is) - this%vhxc(ip, is))*rho(ip, is)
700 safe_deallocate_a(diff_pot)
702 pop_sub(ks_potential_check_convergence)
708 type(potential_interpolation_t),
intent(inout) :: vksold
709 real(real64),
intent(in) :: times(:)
710 real(real64),
intent(in) :: current_time
714 assert(
size(times) == 3)
716 call interpolate(times, vksold%v_old(:, :, 1:3), current_time, vksold%v_old(:, :, 0))
717 if (this%needs_vtau)
then
718 call interpolate(times, vksold%vtau_old(:, :, 1:3), current_time, vksold%vtau_old(:, :, 0))
728 real(real64),
intent(in) :: dt
734 assert(not_in_openmp())
737 do ispin = 1, this%nspin
740 vold%vhxc(ip, ispin) = m_half*dt*(this%vhxc(ip, ispin) - vold%vhxc(ip, ispin))
743 if (this%needs_vtau)
then
746 vold%vtau(ip, ispin) = m_half*dt*(this%vtau(ip, ispin) - vold%vtau(ip, ispin))
757#include "complex.F90"
758#include "ks_potential_inc.F90"
762#include "ks_potential_inc.F90"
constant times a vector plus a vector
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()
real(real64), parameter, public m_one
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.
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.