34 use,
intrinsic :: iso_fortran_env
65 integer,
public,
parameter :: &
66 INDEPENDENT_PARTICLES = 2, &
77 integer :: theory_level = independent_particles
78 logical :: needs_vtau = .false.
80 real(real64),
public,
allocatable :: vhartree(:)
81 real(real64),
public,
allocatable :: vxc(:,:)
82 real(real64),
public,
allocatable :: vhxc(:,:)
85 real(real64),
allocatable :: vtau(:,:)
86 real(real64),
allocatable :: lapl_vtau(:,:)
88 type(accel_mem_t) :: vtau_accel
89 type(accel_mem_t) :: lapl_vtau_accel
91 type(derivatives_t),
pointer :: der => null()
126 real(real64),
public,
allocatable :: vhxc(:,:)
127 real(real64),
allocatable :: vtau(:,:)
128 real(real64),
allocatable :: lapl_vtau(:,:)
137 subroutine ks_potential_init(this, der, np, np_part, nspin, theory_level, needs_vtau)
138 class(ks_potential_t),
intent(inout) :: this
139 type(derivatives_t),
target,
intent(in) :: der
140 integer,
intent(in) :: np, np_part
141 integer,
intent(in) :: nspin
142 integer,
intent(in) :: theory_level
143 logical,
intent(in) :: needs_vtau
147 this%theory_level = theory_level
148 this%needs_vtau = needs_vtau
155 safe_allocate(this%vhxc(1:np, 1:nspin))
156 this%vhxc(1:np, 1:nspin) =
m_zero
158 if (theory_level /= independent_particles)
then
160 safe_allocate(this%vhartree(1:np_part))
163 safe_allocate(this%vxc(1:np, 1:nspin))
167 safe_allocate(this%vtau(1:np_part, 1:nspin))
169 safe_allocate(this%lapl_vtau(1:np, 1:nspin))
190 safe_deallocate_a(this%vhxc)
191 safe_deallocate_a(this%vhartree)
192 safe_deallocate_a(this%vxc)
193 safe_deallocate_a(this%vtau)
194 safe_deallocate_a(this%lapl_vtau)
207 real(real64),
contiguous,
intent(in) :: vtau(:,:)
211 assert(this%needs_vtau)
213 call lalg_copy(this%np, this%nspin, vtau, this%vtau)
224 integer :: offset, ispin
228 assert(this%needs_vtau)
230 do ispin = 1, this%nspin
236 do ispin = 1, this%nspin
237 call accel_write_buffer(this%vtau_accel, this%np, this%vtau(:, ispin), offset = offset)
238 call accel_write_buffer(this%lapl_vtau_accel, this%np, this%lapl_vtau(:, ispin), offset = offset)
249 real(real64),
contiguous,
intent(inout) :: pot(:,:)
250 integer,
optional,
intent(in) :: nspin
258 assert(
size(pot, dim=1) >= this%np)
259 assert(
size(pot, dim=2) >= nspin_)
273 class(
space_t),
intent(in) :: space
274 class(
mesh_t),
intent(in) :: mesh
275 integer,
intent(out) :: ierr
277 integer :: iunit, err, err2(2), isp
278 character(len=MAX_PATH_LEN) :: filename
279 character(len=100) :: lines(2)
285 if (
restart_skip(restart) .or. this%theory_level == independent_particles)
then
291 message(1) =
"Debug: Writing Vhxc restart."
297 lines(1) =
'# #spin #nspin filename'
300 if (err /= 0) ierr = ierr + 1
303 do isp = 1, this%nspin
305 write(lines(1),
'(i8,a,i8,a)') isp,
' | ', this%nspin,
' | "'//trim(adjustl(filename))//
'"'
307 if (err /= 0) err2(1) = err2(1) + 1
310 if (err /= 0) err2(2) = err2(2) + 1
313 if (err2(1) /= 0) ierr = ierr + 2
314 if (err2(2) /= 0) ierr = ierr + 4
318 if (err /= 0) ierr = ierr + 4
321 if (this%needs_vtau)
then
322 lines(1) =
'# #spin #nspin filename'
325 if (err /= 0) ierr = ierr + 8
328 do isp = 1, this%nspin
330 write(lines(1),
'(i8,a,i8,a)') isp,
' | ', this%nspin,
' | "'//trim(adjustl(filename))//
'"'
332 if (err /= 0) err2(1) = err2(1) + 16
335 if (err /= 0) err2(1) = err2(1) + 1
338 if (err2(1) /= 0) ierr = ierr + 32
339 if (err2(2) /= 0) ierr = ierr + 64
343 if (err /= 0) ierr = ierr + 128
349 message(1) =
"Debug: Writing Vhxc restart done."
362 class(
space_t),
intent(in) :: space
364 integer,
intent(out) :: ierr
366 integer :: err, err2, isp
367 character(len=MAX_PATH_LEN) :: filename
373 if (
restart_skip(restart) .or. this%theory_level == independent_particles)
then
380 message(1) =
"Debug: Reading Vhxc restart."
385 do isp = 1, this%nspin
389 if (err /= 0) err2 = err2 + 1
392 if (err2 /= 0) ierr = ierr + 1
396 if (this%needs_vtau)
then
397 do isp = 1, this%nspin
401 if (err /= 0) err2 = err2 + 1
405 if (err2 /= 0) ierr = ierr + 2
409 message(1) =
"Debug: Reading Vhxc restart done."
420 integer,
optional,
intent(in) :: order
445 real(real64),
intent(in) :: current_time
446 real(real64),
intent(in) :: dt
461 integer,
intent(in) :: history
464 if (this%theory_level == independent_particles)
return
468 if (.not.
present(storage))
then
469 if (this%needs_vtau)
then
477 if (this%needs_vtau)
then
491 integer,
intent(in) :: history
493 if (this%theory_level == independent_particles)
return
497 if (this%needs_vtau)
then
511 integer,
intent(in) :: order
512 real(real64),
intent(in) :: current_time
513 real(real64),
intent(in) :: dt
514 real(real64),
intent(in) :: interpolation_time
516 if (this%theory_level == independent_particles)
return
520 if (this%needs_vtau)
then
522 this%vhxc, vtau = this%vtau)
574 integer(int64),
intent(in) :: how
575 character(len=*),
intent(in) :: dir
576 class(
space_t),
intent(in) :: space
577 class(
mesh_t),
intent(in) :: mesh
578 real(real64),
optional,
intent(in) :: pos(:,:)
579 type(
atom_t),
optional,
intent(in) :: atoms(:)
580 type(
mpi_grp_t),
optional,
intent(in) :: grp
582 character(len=MAX_PATH_LEN) :: fname
588 space, mesh, this%vhartree,
units_out%energy, err, pos=pos, atoms=atoms, grp = grp)
590 do is = 1, this%nspin
593 mesh, this%vxc(:, is),
units_out%energy, err, pos=pos, atoms=atoms, grp = grp)
595 if (this%needs_vtau)
then
598 mesh, this%vtau(:, is),
units_out%energy, err, pos=pos, atoms=atoms, grp = grp)
612 if (.not.
allocated(copy%vhxc))
then
613 safe_allocate(copy%vhxc(1:this%np, 1:this%nspin))
615 if (this%needs_vtau)
then
616 if (.not.
allocated(copy%vtau))
then
617 safe_allocate(copy%vtau(1:this%np, 1:this%nspin))
629 if (this%theory_level == independent_particles)
return
634 call lalg_copy(this%np, this%nspin, this%vhxc, copy%vhxc)
635 if (this%needs_vtau)
then
636 call lalg_copy(this%np, this%nspin, this%vtau, copy%vtau)
647 if (this%theory_level == independent_particles)
return
651 assert(
allocated(copy%vhxc))
652 call lalg_copy(this%np, this%nspin, copy%vhxc, this%vhxc)
653 if (this%needs_vtau)
then
654 assert(
allocated(copy%vtau))
655 call this%set_vtau(copy%vtau)
664 integer(int64),
intent(in) :: np
665 integer,
intent(in) :: nspin
666 integer(int64),
intent(in) :: pnp
684 safe_deallocate_a(this%vhxc)
685 safe_deallocate_a(this%vtau)
694 real(real64) function ks_potential_check_convergence(this, copy, mesh, rho, qtot) result(diff)
697 class(
mesh_t),
intent(in) :: mesh
698 real(real64),
intent(in) :: rho(:,:)
699 real(real64),
intent(in) :: qtot
701 real(real64),
allocatable :: diff_pot(:)
704 push_sub(ks_potential_check_convergence)
706 safe_allocate(diff_pot(1:this%np))
711 diff_pot(ip) = abs(copy%vhxc(ip, 1) - this%vhxc(ip, 1))*rho(ip, 1)
713 do is = 2, this%nspin
716 diff_pot(ip) = diff_pot(ip) + abs(copy%vhxc(ip, is) - this%vhxc(ip, is))*rho(ip, is)
722 safe_deallocate_a(diff_pot)
724 pop_sub(ks_potential_check_convergence)
730 type(potential_interpolation_t),
intent(inout) :: vksold
731 real(real64),
intent(in) :: times(:)
732 real(real64),
intent(in) :: current_time
736 assert(
size(times) == 3)
738 call interpolate(times, vksold%v_old(:, :, 1:3), current_time, vksold%v_old(:, :, 0))
739 if (this%needs_vtau)
then
740 call interpolate(times, vksold%vtau_old(:, :, 1:3), current_time, vksold%vtau_old(:, :, 0))
750 real(real64),
intent(in) :: dt
756 assert(not_in_openmp())
759 do ispin = 1, this%nspin
762 vold%vhxc(ip, ispin) = m_half*dt*(this%vhxc(ip, ispin) - vold%vhxc(ip, ispin))
765 if (this%needs_vtau)
then
768 vold%vtau(ip, ispin) = m_half*dt*(this%vtau(ip, ispin) - vold%vtau(ip, ispin))
779#include "complex.F90"
780#include "ks_potential_inc.F90"
784#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
This module calculates the derivatives (gradients, Laplacians, etc.) of a function.
subroutine, public dderivatives_lapl(der, ff, op_ff, ghost_update, set_bc, factor)
apply the Laplacian to a mesh function
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 dks_potential_apply_lapl_vtau_psi(this, mesh, d, ispin, psib, vpsib)
Wrapper to hamiltonian_elec_base_local_sub to hide the data of lapl_vtau.
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.
subroutine ks_potential_init(this, der, np, np_part, nspin, theory_level, needs_vtau)
Allocate the memory for the KS potentials.
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_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.
subroutine zks_potential_apply_lapl_vtau_psi(this, mesh, d, ispin, psib, vpsib)
Wrapper to hamiltonian_elec_base_local_sub to hide the data of lapl_vtau.
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.