63 type(ions_t),
pointer :: ions => null()
70 integer :: atom1, atom2
71 real(real64),
allocatable :: mix1(:,:)
72 real(real64),
allocatable :: mix2(:,:)
77 real(real64),
allocatable :: dvxc_core(:,:)
81 generic ::
assignment(=) => copy_to
95 procedure perturbation_ionic_constructor
106 class(perturbation_ionic_t),
pointer :: pert
107 type(namespace_t),
intent(in) :: namespace
108 type(ions_t),
target,
intent(in) :: ions
122 type(perturbation_ionic_t),
intent(out) :: this
123 type(namespace_t),
intent(in) :: namespace
124 type(ions_t),
target,
intent(in) :: ions
135 this%pure_dir = .false.
137 safe_allocate(this%mix1(1:ions%natoms, 1:ions%space%dim))
138 safe_allocate(this%mix2(1:ions%natoms, 1:ions%space%dim))
145 class(perturbation_ionic_t),
intent(out) :: this
146 class(perturbation_ionic_t),
intent(in) :: source
151 this%atom1 = source%atom1
152 this%atom2 = source%atom2
153 this%ions => source%ions
155 this%pure_dir = source%pure_dir
157 safe_allocate(this%mix1(1:source%ions%natoms, 1:source%ions%space%dim))
158 safe_allocate(this%mix2(1:source%ions%natoms, 1:source%ions%space%dim))
159 this%mix1 = source%mix1
160 this%mix2 = source%mix2
162 if (
allocated(source%dvxc_core))
then
163 safe_allocate(this%dvxc_core(1:
size(source%dvxc_core, dim=1), 1:
size(source%dvxc_core, dim=2)))
164 this%dvxc_core = source%dvxc_core
177 safe_deallocate_a(this%mix1)
178 safe_deallocate_a(this%mix2)
179 safe_deallocate_a(this%dvxc_core)
196 integer,
intent(in) :: dir
197 integer,
optional,
intent(in) :: dir2
202 if (
present(dir2)) this%dir2 = dir2
204 this%pure_dir = .
true.
209 if (this%dir > 0 .and. this%atom1 > 0) this%mix1(this%atom1, this%dir ) =
m_one
210 if (this%dir2 > 0 .and. this%atom2 > 0) this%mix2(this%atom2, this%dir2) =
m_one
218 integer,
intent(in) :: iatom
219 integer,
optional,
intent(in) :: iatom2
224 if (
present(iatom2)) this%atom2 = iatom2
226 this%pure_dir = .
true.
231 if (this%dir > 0 .and. this%atom1 > 0) this%mix1(this%atom1, this%dir ) =
m_one
232 if (this%dir2 > 0 .and. this%atom2 > 0) this%mix2(this%atom2, this%dir2) =
m_one
240 integer,
intent(in) :: iatom
241 integer,
intent(in) :: idir
242 real(real64),
intent(in) :: val
243 integer,
optional,
intent(in) :: jatom
244 integer,
optional,
intent(in) :: jdir
245 real(real64),
optional,
intent(in) :: valuej
247 logical :: have_dir_2
251 this%pure_dir = .false.
253 this%mix1(iatom, idir) = val
255 have_dir_2 =
present(jatom) .and.
present(jdir) .and.
present(jatom)
258 this%mix1(jatom, jdir) = valuej
260 assert(.not.
present(jatom) .and. .not.
present(jdir) .and. .not.
present(jatom))
272 real(real64),
intent(in) :: dvxc_core(:,:)
276 safe_deallocate_a(this%dvxc_core)
277 safe_allocate(this%dvxc_core(1:
size(dvxc_core, dim=1), 1:
size(dvxc_core, dim=2)))
278 this%dvxc_core = dvxc_core
287#include "perturbation_ionic_inc.F90"
290#include "complex.F90"
291#include "perturbation_ionic_inc.F90"
This module implements common operations on batches of mesh functions.
Module implementing boundary conditions in Octopus.
This module calculates the derivatives (gradients, Laplacians, etc.) of a function.
real(real64), parameter, public m_zero
real(real64), parameter, public m_one
This module implements the underlying real-space grid.
This module is intended to contain "only mathematical" functions and procedures.
This module defines functions over batches of mesh functions.
This module defines various routines, operating on mesh functions.
This module defines the meshes, which are used in Octopus.
subroutine perturbation_ionic_setup_mixed_dir(this, iatom, idir, val, jatom, jdir, valuej)
subroutine, public zionic_pert_matrix_elements_2(gr, namespace, space, ions, hm, ik, st, vib, matrix)
Computes the second order term.
subroutine perturbation_ionic_setup_atom(this, iatom, iatom2)
subroutine perturbation_ionic_init(this, namespace, ions)
subroutine perturbation_ionic_set_nlcc_response(this, dvxc_core)
Variation of the xc potential with respect to the atom position. This is solely due to the displaced ...
subroutine perturbation_ionic_copy(this, source)
subroutine dperturbation_ionic_apply(this, namespace, space, gr, hm, ik, f_in, f_out, set_bc)
Returns f_out = H' f_in, where H' is perturbation Hamiltonian Note that e^ikr phase is applied to f_i...
subroutine, public dionic_pert_matrix_elements_2(gr, namespace, space, ions, hm, ik, st, vib, matrix)
Computes the second order term.
subroutine perturbation_ionic_info(this)
subroutine zperturbation_ionic_apply_order_2(this, namespace, space, gr, hm, ik, f_in, f_out)
subroutine zperturbation_ionic_apply(this, namespace, space, gr, hm, ik, f_in, f_out, set_bc)
Returns f_out = H' f_in, where H' is perturbation Hamiltonian Note that e^ikr phase is applied to f_i...
subroutine perturbation_ionic_finalize(this)
subroutine perturbation_ionic_setup_dir(this, dir, dir2)
class(perturbation_ionic_t) function, pointer perturbation_ionic_constructor(namespace, ions)
The factory routine (or constructor) allocates a pointer of the corresponding type and then calls the...
subroutine dperturbation_ionic_apply_order_2(this, namespace, space, gr, hm, ik, f_in, f_out)
subroutine, public perturbation_copy(this, source)
This module handles spin dimensions of the states and the k-point distribution.