62 type(ions_t),
pointer :: ions => null()
69 integer :: atom1, atom2
70 real(real64),
allocatable :: mix1(:,:)
71 real(real64),
allocatable :: mix2(:,:)
75 generic ::
assignment(=) => copy_to
88 procedure perturbation_ionic_constructor
99 class(perturbation_ionic_t),
pointer :: pert
100 type(namespace_t),
intent(in) :: namespace
101 type(ions_t),
target,
intent(in) :: ions
115 type(perturbation_ionic_t),
intent(out) :: this
116 type(namespace_t),
intent(in) :: namespace
117 type(ions_t),
target,
intent(in) :: ions
128 this%pure_dir = .false.
130 safe_allocate(this%mix1(1:ions%natoms, 1:ions%space%dim))
131 safe_allocate(this%mix2(1:ions%natoms, 1:ions%space%dim))
138 class(perturbation_ionic_t),
intent(out) :: this
139 class(perturbation_ionic_t),
intent(in) :: source
144 this%atom1 = source%atom1
145 this%atom2 = source%atom2
146 this%ions => source%ions
148 this%pure_dir = source%pure_dir
150 safe_allocate(this%mix1(1:source%ions%natoms, 1:source%ions%space%dim))
151 safe_allocate(this%mix2(1:source%ions%natoms, 1:source%ions%space%dim))
152 this%mix1 = source%mix1
153 this%mix2 = source%mix2
165 safe_deallocate_a(this%mix1)
166 safe_deallocate_a(this%mix2)
183 integer,
intent(in) :: dir
184 integer,
optional,
intent(in) :: dir2
189 if (
present(dir2)) this%dir2 = dir2
191 this%pure_dir = .
true.
196 if (this%dir > 0 .and. this%atom1 > 0) this%mix1(this%atom1, this%dir ) =
m_one
197 if (this%dir2 > 0 .and. this%atom2 > 0) this%mix2(this%atom2, this%dir2) =
m_one
205 integer,
intent(in) :: iatom
206 integer,
optional,
intent(in) :: iatom2
211 if (
present(iatom2)) this%atom2 = iatom2
213 this%pure_dir = .
true.
218 if (this%dir > 0 .and. this%atom1 > 0) this%mix1(this%atom1, this%dir ) =
m_one
219 if (this%dir2 > 0 .and. this%atom2 > 0) this%mix2(this%atom2, this%dir2) =
m_one
227 integer,
intent(in) :: iatom
228 integer,
intent(in) :: idir
229 real(real64),
intent(in) :: val
230 integer,
optional,
intent(in) :: jatom
231 integer,
optional,
intent(in) :: jdir
232 real(real64),
optional,
intent(in) :: valuej
234 logical :: have_dir_2
238 this%pure_dir = .false.
240 this%mix1(iatom, idir) = val
242 have_dir_2 =
present(jatom) .and.
present(jdir) .and.
present(jatom)
245 this%mix1(jatom, jdir) = valuej
247 assert(.not.
present(jatom) .and. .not.
present(jdir) .and. .not.
present(jatom))
257#include "perturbation_ionic_inc.F90"
260#include "complex.F90"
261#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_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.