17 #include "./base/base_uses.f90"
22 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'negf_vectors'
43 atomlist_screening, atomlist_bulk, subsys)
44 REAL(kind=
dp),
DIMENSION(3),
INTENT(out) :: origin, direction_vector, origin_bias, &
46 INTEGER,
DIMENSION(:),
INTENT(in) :: atomlist_screening, atomlist_bulk
47 TYPE(qs_subsys_type),
POINTER :: subsys
49 CHARACTER(LEN=*),
PARAMETER :: routinen =
'contact_direction_vector'
51 INTEGER :: handle, iatom, natoms_bulk, &
52 natoms_screening, nparticles
53 REAL(kind=
dp) :: proj, proj_max, proj_min, proj_min_bias
54 REAL(kind=
dp),
DIMENSION(3) :: vector
55 TYPE(particle_type),
DIMENSION(:),
POINTER :: particle_set
57 CALL timeset(routinen, handle)
60 natoms_screening =
SIZE(atomlist_screening)
61 natoms_bulk =
SIZE(atomlist_bulk)
62 nparticles =
SIZE(particle_set)
64 cpassert(natoms_screening > 0)
65 cpassert(natoms_bulk > 0)
66 cpassert(nparticles > 0)
69 origin = particle_set(atomlist_screening(1))%r
70 DO iatom = 2, natoms_screening
71 origin = origin + particle_set(atomlist_screening(iatom))%r
73 origin = origin/real(natoms_screening, kind=
dp)
76 direction_vector = particle_set(atomlist_bulk(1))%r
77 DO iatom = 2, natoms_bulk
78 direction_vector = direction_vector + particle_set(atomlist_bulk(iatom))%r
80 direction_vector = direction_vector/real(natoms_bulk, kind=
dp)
83 direction_vector = direction_vector - origin
88 proj_min_bias = 0.0_dp
89 DO iatom = 1, natoms_screening
90 vector = particle_set(atomlist_screening(iatom))%r - origin
93 IF (proj < proj_min) proj_min = proj
94 IF (proj > proj_min_bias) proj_min_bias = proj
99 DO iatom = 1, nparticles
100 vector = particle_set(iatom)%r - origin
103 IF (proj > proj_max) proj_max = proj
107 origin_bias = origin + proj_min_bias*direction_vector
108 origin = origin + proj_min*direction_vector
112 direction_vector_bias = (proj_max - proj_min_bias)*direction_vector
113 direction_vector = (proj_max - proj_min)*direction_vector
115 CALL timestop(handle)
134 REAL(kind=
dp),
DIMENSION(3),
INTENT(in) :: vector, vector0
135 REAL(kind=
dp) :: proj
137 REAL(kind=
dp) :: len2, len2_v0, len2_v1
138 REAL(kind=
dp),
DIMENSION(3) :: vector1
140 vector1 = vector - vector0
141 len2 = dot_product(vector, vector)
142 len2_v0 = dot_product(vector0, vector0)
143 len2_v1 = dot_product(vector1, vector1)
145 proj = 0.5_dp*((len2 - len2_v1)/len2_v0 + 1.0_dp)
Defines the basic variable types.
integer, parameter, public dp
Routines to deal with vectors in 3-D real space.
pure real(kind=dp) function, public projection_on_direction_vector(vector, vector0)
project the 'vector' onto the direction 'vector0'. Both vectors should have the same origin.
subroutine, public contact_direction_vector(origin, direction_vector, origin_bias, direction_vector_bias, atomlist_screening, atomlist_bulk, subsys)
compute direction vector of the given contact
Define the data structure for the particle information.
types that represent a quickstep subsys
subroutine, public qs_subsys_get(subsys, atomic_kinds, atomic_kind_set, particles, particle_set, local_particles, molecules, molecule_set, molecule_kinds, molecule_kind_set, local_molecules, para_env, colvar_p, shell_particles, core_particles, gci, multipoles, natom, nparticle, ncore, nshell, nkind, atprop, virial, results, cell, cell_ref, use_ref_cell, energy, force, qs_kind_set, cp_subsys, nelectron_total, nelectron_spin)
...