19 neighbor_kind_pairs_type
23 fist_nonbond_env_type,&
29 pair_potential_pp_type
31 #include "./base/base_uses.f90"
37 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'manybody_eam'
50 TYPE(fist_nonbond_env_type),
POINTER :: fist_nonbond_env
51 TYPE(particle_type),
DIMENSION(:),
INTENT(INOUT) :: particle_set
52 TYPE(cell_type),
POINTER :: cell
53 TYPE(mp_para_env_type),
POINTER :: para_env
55 CHARACTER(LEN=*),
PARAMETER :: routinen =
'density_nonbond'
57 INTEGER :: atom_a, atom_b, handle, i, i_a, i_b, &
58 iend, igrp, ikind, ilist, ipair, &
59 iparticle, istart, jkind, kind_a, &
60 kind_b, nkinds, nparticle
61 INTEGER,
ALLOCATABLE,
DIMENSION(:, :) :: eam_kinds_index
63 REAL(kind=
dp) ::
fac, rab2, rab2_max
64 REAL(kind=
dp),
DIMENSION(3) :: cell_v, rab
65 REAL(kind=
dp),
DIMENSION(:),
POINTER :: rho
66 TYPE(eam_pot_type),
POINTER :: eam_a, eam_b
67 TYPE(eam_type),
DIMENSION(:),
POINTER :: eam_data
68 TYPE(fist_neighbor_type),
POINTER :: nonbonded
69 TYPE(neighbor_kind_pairs_type),
POINTER :: neighbor_kind_pair
70 TYPE(pair_potential_pp_type),
POINTER :: potparm
71 TYPE(pos_type),
DIMENSION(:),
POINTER :: r_last_update, r_last_update_pbc
73 CALL timeset(routinen, handle)
76 potparm=potparm, r_last_update=r_last_update, &
77 r_last_update_pbc=r_last_update_pbc, eam_data=eam_data)
78 nkinds =
SIZE(potparm%pot, 1)
79 ALLOCATE (eam_kinds_index(nkinds, nkinds))
82 DO jkind = ikind, nkinds
83 DO i = 1,
SIZE(potparm%pot(ikind, jkind)%pot%type)
84 IF (potparm%pot(ikind, jkind)%pot%type(i) ==
ea_type)
THEN
86 cpassert(eam_kinds_index(ikind, jkind) == -1)
87 cpassert(eam_kinds_index(jkind, ikind) == -1)
88 eam_kinds_index(ikind, jkind) = i
89 eam_kinds_index(jkind, ikind) = i
96 nparticle =
SIZE(particle_set)
99 IF (.NOT.
ASSOCIATED(eam_data))
THEN
100 ALLOCATE (eam_data(nparticle))
104 eam_data(i)%rho = 0.0_dp
105 eam_data(i)%f_embed = 0.0_dp
113 NULLIFY (eam_a, eam_b)
114 ALLOCATE (rho(nparticle))
117 DO ilist = 1, nonbonded%nlists
118 neighbor_kind_pair => nonbonded%neighbor_kind_pairs(ilist)
119 IF (neighbor_kind_pair%npairs == 0) cycle
120 kind_group_loop:
DO igrp = 1, neighbor_kind_pair%ngrp_kind
121 istart = neighbor_kind_pair%grp_kind_start(igrp)
122 iend = neighbor_kind_pair%grp_kind_end(igrp)
123 ikind = neighbor_kind_pair%ij_kind(1, igrp)
124 jkind = neighbor_kind_pair%ij_kind(2, igrp)
126 i = eam_kinds_index(ikind, jkind)
128 rab2_max = potparm%pot(ikind, jkind)%pot%rcutsq
129 cell_v = matmul(cell%hmat, real(neighbor_kind_pair%cell_vector, kind=
dp))
130 DO ipair = istart, iend
131 atom_a = neighbor_kind_pair%list(1, ipair)
132 atom_b = neighbor_kind_pair%list(2, ipair)
134 IF (atom_a == atom_b)
fac = 0.5_dp
135 rab = r_last_update_pbc(atom_b)%r - r_last_update_pbc(atom_a)%r
137 rab2 = rab(1)*rab(1) + rab(2)*rab(2) + rab(3)*rab(3)
138 IF (rab2 <= rab2_max)
THEN
139 kind_a = particle_set(atom_a)%atomic_kind%kind_number
140 kind_b = particle_set(atom_b)%atomic_kind%kind_number
141 i_a = eam_kinds_index(kind_a, kind_a)
142 i_b = eam_kinds_index(kind_b, kind_b)
143 eam_a => potparm%pot(kind_a, kind_a)%pot%set(i_a)%eam
144 eam_b => potparm%pot(kind_b, kind_b)%pot%set(i_b)%eam
145 CALL get_rho_eam(eam_a, eam_b, rab2, atom_a, atom_b, rho,
fac)
148 END DO kind_group_loop
150 CALL para_env%sum(rho)
151 DO iparticle = 1, nparticle
152 eam_data(iparticle)%rho = rho(iparticle)
157 DEALLOCATE (eam_kinds_index)
158 CALL timestop(handle)
173 SUBROUTINE get_rho_eam(eam_a, eam_b, rab2, atom_a, atom_b, rho, fac)
174 TYPE(eam_pot_type),
POINTER :: eam_a, eam_b
175 REAL(
dp),
INTENT(IN) :: rab2
176 INTEGER,
INTENT(IN) :: atom_a, atom_b
177 REAL(
dp),
INTENT(INOUT) :: rho(:)
178 REAL(
dp),
INTENT(IN) ::
fac
181 REAL(
dp) :: qq, rab, rhoi, rhoj
186 index = int(rab/eam_b%drar) + 1
187 IF (index > eam_b%npoints)
THEN
188 index = eam_b%npoints
189 ELSEIF (index < 1)
THEN
192 qq = rab - eam_b%rval(index)
193 rhoi = eam_b%rho(index) + qq*eam_b%rhop(index)
196 index = int(rab/eam_a%drar) + 1
197 IF (index > eam_a%npoints)
THEN
198 index = eam_a%npoints
199 ELSEIF (index < 1)
THEN
202 qq = rab - eam_a%rval(index)
203 rhoj = eam_a%rho(index) + qq*eam_a%rhop(index)
205 rho(atom_a) = rho(atom_a) + rhoi*
fac
206 rho(atom_b) = rho(atom_b) + rhoj*
fac
207 END SUBROUTINE get_rho_eam
220 SUBROUTINE get_force_eam(rab2, eam_a, eam_b, eam_data, atom_a, atom_b, f_eam)
221 REAL(
dp),
INTENT(IN) :: rab2
222 TYPE(eam_pot_type),
POINTER :: eam_a, eam_b
223 TYPE(eam_type),
INTENT(IN) :: eam_data(:)
224 INTEGER,
INTENT(IN) :: atom_a, atom_b
225 REAL(
dp),
INTENT(OUT) :: f_eam
228 REAL(kind=
dp) :: denspi, denspj, fcp, qq, rab
233 index = int(rab/eam_a%drar) + 1
234 IF (index > eam_a%npoints)
THEN
235 index = eam_a%npoints
236 ELSEIF (index < 1)
THEN
239 qq = rab - eam_a%rval(index)
240 IF (index == eam_a%npoints)
THEN
241 denspi = eam_a%rhop(index) + qq*(eam_a%rhop(index) - eam_a%rhop(index - 1))/eam_a%drar
243 denspi = eam_a%rhop(index) + qq*(eam_a%rhop(index + 1) - eam_a%rhop(index))/eam_a%drar
247 index = int(rab/eam_b%drar) + 1
248 IF (index > eam_b%npoints)
THEN
249 index = eam_b%npoints
250 ELSEIF (index < 1)
THEN
253 qq = rab - eam_b%rval(index)
254 IF (index == eam_b%npoints)
THEN
255 denspj = eam_b%rhop(index) + qq*(eam_b%rhop(index) - eam_b%rhop(index - 1))/eam_b%drar
257 denspj = eam_b%rhop(index) + qq*(eam_b%rhop(index + 1) - eam_b%rhop(index))/eam_b%drar
260 fcp = denspj*eam_data(atom_a)%f_embed + denspi*eam_data(atom_b)%f_embed
static GRID_HOST_DEVICE double fac(const int i)
Factorial function, e.g. fac(5) = 5! = 120.
collects all references to literature in CP2K as new algorithms / method are included from literature...
integer, save, public foiles1986
Handles all functions related to the CELL.
Define the neighbor list data types and the corresponding functionality.
subroutine, public fist_nonbond_env_get(fist_nonbond_env, potparm14, potparm, nonbonded, rlist_cut, rlist_lowsq, aup, lup, ei_scale14, vdw_scale14, shift_cutoff, do_electrostatics, r_last_update, r_last_update_pbc, rshell_last_update_pbc, rcore_last_update_pbc, cell_last_update, num_update, last_update, counter, natom_types, long_range_correction, ij_kind_full_fac, eam_data, quip_data, nequip_data, allegro_data, deepmd_data, charges)
sets a fist_nonbond_env
subroutine, public fist_nonbond_env_set(fist_nonbond_env, potparm14, potparm, rlist_cut, rlist_lowsq, nonbonded, aup, lup, ei_scale14, vdw_scale14, shift_cutoff, do_electrostatics, r_last_update, r_last_update_pbc, rshell_last_update_pbc, rcore_last_update_pbc, cell_last_update, num_update, last_update, counter, natom_types, long_range_correction, eam_data, quip_data, nequip_data, allegro_data, deepmd_data, charges)
sets a fist_nonbond_env
Defines the basic variable types.
integer, parameter, public dp
subroutine, public get_force_eam(rab2, eam_a, eam_b, eam_data, atom_a, atom_b, f_eam)
...
subroutine, public density_nonbond(fist_nonbond_env, particle_set, cell, para_env)
...
Interface to the message passing library MPI.
integer, parameter, public ea_type
Define the data structure for the particle information.