Line data Source code
1 : !--------------------------------------------------------------------------------------------------!
2 : ! CP2K: A general program to perform molecular dynamics simulations !
3 : ! Copyright 2000-2026 CP2K developers group <https://cp2k.org> !
4 : ! !
5 : ! SPDX-License-Identifier: GPL-2.0-or-later !
6 : !--------------------------------------------------------------------------------------------------!
7 :
8 : ! **************************************************************************************************
9 : !> \brief Empirical interatomic potentials for Silicon
10 : !> \note
11 : !> Stefan Goedecker's OpenMP implementation of Bazant's EDIP & Lenosky's
12 : !> empirical interatomic potentials for Silicon.
13 : !> \par History
14 : !> 03.2006 initial create [tdk]
15 : !> \author Thomas D. Kuehne (tkuehne@cp2k.org)
16 : ! **************************************************************************************************
17 : MODULE eip_silicon
18 : USE atomic_kind_list_types, ONLY: atomic_kind_list_type
19 : USE atomic_kind_types, ONLY: atomic_kind_type,&
20 : get_atomic_kind
21 : USE cell_types, ONLY: cell_type,&
22 : get_cell
23 : USE cp_log_handling, ONLY: cp_get_default_logger,&
24 : cp_logger_type
25 : USE cp_output_handling, ONLY: cp_p_file,&
26 : cp_print_key_finished_output,&
27 : cp_print_key_should_output,&
28 : cp_print_key_unit_nr
29 : USE cp_subsys_types, ONLY: cp_subsys_get,&
30 : cp_subsys_type
31 : USE distribution_1d_types, ONLY: distribution_1d_type
32 : USE eip_environment_types, ONLY: eip_env_get,&
33 : eip_environment_type
34 : USE input_section_types, ONLY: section_vals_get_subs_vals,&
35 : section_vals_type
36 : USE kinds, ONLY: dp
37 : USE message_passing, ONLY: mp_para_env_type
38 : USE particle_types, ONLY: particle_type
39 : USE physcon, ONLY: angstrom,&
40 : evolt
41 :
42 : !$ USE OMP_LIB, ONLY: omp_get_max_threads, omp_get_thread_num, omp_get_num_threads
43 : #include "./base/base_uses.f90"
44 :
45 : IMPLICIT NONE
46 : PRIVATE
47 :
48 : CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'eip_silicon'
49 :
50 : ! *** Public subroutines ***
51 : PUBLIC :: eip_bazant, eip_lenosky, eip_stillinger_weber, eip_tersoff
52 :
53 : !***
54 :
55 : CONTAINS
56 :
57 : ! **************************************************************************************************
58 : !> \brief Interface routine of Goedecker's Bazant EDIP to CP2K
59 : !> \param eip_env ...
60 : !> \par Literature
61 : !> http://www-math.mit.edu/~bazant/EDIP
62 : !> M.Z. Bazant & E. Kaxiras: Modeling of Covalent Bonding in Solids by
63 : !> Inversion of Cohesive Energy Curves;
64 : !> Phys. Rev. Lett. 77, 4370 (1996)
65 : !> M.Z. Bazant, E. Kaxiras and J.F. Justo: Environment-dependent interatomic
66 : !> potential for bulk silicon;
67 : !> Phys. Rev. B 56, 8542-8552 (1997)
68 : !> S. Goedecker: Optimization and parallelization of a force field for silicon
69 : !> using OpenMP; CPC 148, 1 (2002)
70 : !> \par History
71 : !> 03.2006 initial create [tdk]
72 : !> \author Thomas D. Kuehne (tkuehne@cp2k.org)
73 : ! **************************************************************************************************
74 22 : SUBROUTINE eip_bazant(eip_env)
75 : TYPE(eip_environment_type), POINTER :: eip_env
76 :
77 : CHARACTER(len=*), PARAMETER :: routineN = 'eip_bazant'
78 :
79 : INTEGER :: handle, i, iparticle, iparticle_kind, &
80 : iparticle_local, iw, natom, &
81 : nparticle_kind, nparticle_local
82 : REAL(KIND=dp) :: ekin, ener, ener_var, mass
83 22 : REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :) :: rxyz
84 : REAL(KIND=dp), DIMENSION(3) :: abc
85 : TYPE(atomic_kind_list_type), POINTER :: atomic_kinds
86 22 : TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
87 : TYPE(atomic_kind_type), POINTER :: atomic_kind
88 : TYPE(cell_type), POINTER :: cell
89 : TYPE(cp_logger_type), POINTER :: logger
90 : TYPE(cp_subsys_type), POINTER :: subsys
91 : TYPE(distribution_1d_type), POINTER :: local_particles
92 : TYPE(mp_para_env_type), POINTER :: para_env
93 22 : TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
94 : TYPE(section_vals_type), POINTER :: eip_section
95 :
96 : ! ------------------------------------------------------------------------
97 :
98 22 : CALL timeset(routineN, handle)
99 :
100 22 : NULLIFY (cell, particle_set, eip_section, logger, atomic_kinds, &
101 22 : atomic_kind, local_particles, subsys, atomic_kind_set, para_env)
102 :
103 22 : ekin = 0.0_dp
104 :
105 22 : logger => cp_get_default_logger()
106 :
107 22 : CPASSERT(ASSOCIATED(eip_env))
108 :
109 : CALL eip_env_get(eip_env=eip_env, cell=cell, particle_set=particle_set, &
110 : subsys=subsys, local_particles=local_particles, &
111 22 : atomic_kind_set=atomic_kind_set)
112 22 : CALL get_cell(cell=cell, abc=abc)
113 :
114 22 : eip_section => section_vals_get_subs_vals(eip_env%force_env_input, "EIP")
115 22 : natom = SIZE(particle_set)
116 : !natom = local_particles%n_el(1)
117 :
118 66 : ALLOCATE (rxyz(3, natom))
119 :
120 22022 : DO i = 1, natom
121 : !iparticle = local_particles%list(1)%array(i)
122 88022 : rxyz(:, i) = particle_set(i)%r(:)*angstrom
123 : END DO
124 :
125 : CALL eip_bazant_silicon(nat=natom, alat=abc*angstrom, rxyz0=rxyz, &
126 : fxyz=eip_env%eip_forces, ener=ener, &
127 : coord=eip_env%coord_avg, ener_var=ener_var, &
128 88 : coord_var=eip_env%coord_var, count=eip_env%count)
129 :
130 : !CALL get_part_ke(md_env, tbmd_energy%E_kinetic, int_grp=globalenv%para_env)
131 22 : CALL cp_subsys_get(subsys=subsys, atomic_kinds=atomic_kinds)
132 :
133 22 : nparticle_kind = atomic_kinds%n_els
134 :
135 44 : DO iparticle_kind = 1, nparticle_kind
136 22 : atomic_kind => atomic_kind_set(iparticle_kind)
137 22 : CALL get_atomic_kind(atomic_kind=atomic_kind, mass=mass)
138 22 : nparticle_local = local_particles%n_el(iparticle_kind)
139 11044 : DO iparticle_local = 1, nparticle_local
140 11000 : iparticle = local_particles%list(iparticle_kind)%array(iparticle_local)
141 : ekin = ekin + 0.5_dp*mass* &
142 : (particle_set(iparticle)%v(1)*particle_set(iparticle)%v(1) &
143 : + particle_set(iparticle)%v(2)*particle_set(iparticle)%v(2) &
144 11022 : + particle_set(iparticle)%v(3)*particle_set(iparticle)%v(3))
145 : END DO
146 : END DO
147 :
148 : ! sum all contributions to energy over calculated parts on all processors
149 22 : CALL cp_subsys_get(subsys=subsys, para_env=para_env)
150 22 : CALL para_env%sum(ekin)
151 22 : eip_env%eip_kinetic_energy = ekin
152 :
153 22 : eip_env%eip_potential_energy = ener/evolt
154 22 : eip_env%eip_energy = eip_env%eip_kinetic_energy + eip_env%eip_potential_energy
155 22 : eip_env%eip_energy_var = ener_var/evolt
156 :
157 22022 : DO i = 1, natom
158 176022 : particle_set(i)%f(:) = eip_env%eip_forces(:, i)/evolt*angstrom
159 : END DO
160 :
161 22 : DEALLOCATE (rxyz)
162 :
163 : ! Print
164 22 : IF (BTEST(cp_print_key_should_output(logger%iter_info, &
165 : eip_section, "PRINT%ENERGIES"), cp_p_file)) THEN
166 : iw = cp_print_key_unit_nr(logger, eip_section, "PRINT%ENERGIES", &
167 0 : extension=".mmLog")
168 :
169 0 : CALL eip_print_energies(eip_env=eip_env, output_unit=iw)
170 : CALL cp_print_key_finished_output(iw, logger, eip_section, &
171 0 : "PRINT%ENERGIES")
172 : END IF
173 :
174 22 : IF (BTEST(cp_print_key_should_output(logger%iter_info, &
175 : eip_section, "PRINT%ENERGIES_VAR"), cp_p_file)) THEN
176 : iw = cp_print_key_unit_nr(logger, eip_section, "PRINT%ENERGIES_VAR", &
177 0 : extension=".mmLog")
178 :
179 0 : CALL eip_print_energy_var(eip_env=eip_env, output_unit=iw)
180 : CALL cp_print_key_finished_output(iw, logger, eip_section, &
181 0 : "PRINT%ENERGIES_VAR")
182 : END IF
183 :
184 22 : IF (BTEST(cp_print_key_should_output(logger%iter_info, &
185 : eip_section, "PRINT%FORCES"), cp_p_file)) THEN
186 : iw = cp_print_key_unit_nr(logger, eip_section, "PRINT%FORCES", &
187 0 : extension=".mmLog")
188 :
189 0 : CALL eip_print_forces(eip_env=eip_env, output_unit=iw)
190 : CALL cp_print_key_finished_output(iw, logger, eip_section, &
191 0 : "PRINT%FORCES")
192 : END IF
193 :
194 22 : IF (BTEST(cp_print_key_should_output(logger%iter_info, &
195 : eip_section, "PRINT%COORD_AVG"), cp_p_file)) THEN
196 : iw = cp_print_key_unit_nr(logger, eip_section, "PRINT%COORD_AVG", &
197 0 : extension=".mmLog")
198 :
199 0 : CALL eip_print_coord_avg(eip_env=eip_env, output_unit=iw)
200 : CALL cp_print_key_finished_output(iw, logger, eip_section, &
201 0 : "PRINT%COORD_AVG")
202 : END IF
203 :
204 22 : IF (BTEST(cp_print_key_should_output(logger%iter_info, &
205 : eip_section, "PRINT%COORD_VAR"), cp_p_file)) THEN
206 : iw = cp_print_key_unit_nr(logger, eip_section, "PRINT%COORD_VAR", &
207 0 : extension=".mmLog")
208 :
209 0 : CALL eip_print_coord_var(eip_env=eip_env, output_unit=iw)
210 : CALL cp_print_key_finished_output(iw, logger, eip_section, &
211 0 : "PRINT%COORD_VAR")
212 : END IF
213 :
214 22 : IF (BTEST(cp_print_key_should_output(logger%iter_info, &
215 : eip_section, "PRINT%COUNT"), cp_p_file)) THEN
216 : iw = cp_print_key_unit_nr(logger, eip_section, "PRINT%COUNT", &
217 0 : extension=".mmLog")
218 :
219 0 : CALL eip_print_count(eip_env=eip_env, output_unit=iw)
220 : CALL cp_print_key_finished_output(iw, logger, eip_section, &
221 0 : "PRINT%COUNT")
222 : END IF
223 :
224 22 : CALL timestop(handle)
225 :
226 22 : END SUBROUTINE eip_bazant
227 :
228 : ! **************************************************************************************************
229 : !> \brief Interface routine of Goedecker's Lenosky force field to CP2K
230 : !> \param eip_env ...
231 : !> \par Literature
232 : !> T. Lenosky, et. al.: Highly optimized empirical potential model of silicon;
233 : !> Modelling Simul. Sci. Eng., 8 (2000)
234 : !> S. Goedecker: Optimization and parallelization of a force field for silicon
235 : !> using OpenMP; CPC 148, 1 (2002)
236 : !> \par History
237 : !> 03.2006 initial create [tdk]
238 : !> \author Thomas D. Kuehne (tkuehne@cp2k.org)
239 : ! **************************************************************************************************
240 22 : SUBROUTINE eip_lenosky(eip_env)
241 : TYPE(eip_environment_type), POINTER :: eip_env
242 :
243 : CHARACTER(len=*), PARAMETER :: routineN = 'eip_lenosky'
244 :
245 : INTEGER :: handle, i, iparticle, iparticle_kind, &
246 : iparticle_local, iw, natom, &
247 : nparticle_kind, nparticle_local
248 : REAL(KIND=dp) :: ekin, ener, ener_var, mass
249 22 : REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :) :: rxyz
250 : REAL(KIND=dp), DIMENSION(3) :: abc
251 : TYPE(atomic_kind_list_type), POINTER :: atomic_kinds
252 22 : TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
253 : TYPE(atomic_kind_type), POINTER :: atomic_kind
254 : TYPE(cell_type), POINTER :: cell
255 : TYPE(cp_logger_type), POINTER :: logger
256 : TYPE(cp_subsys_type), POINTER :: subsys
257 : TYPE(distribution_1d_type), POINTER :: local_particles
258 : TYPE(mp_para_env_type), POINTER :: para_env
259 22 : TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
260 : TYPE(section_vals_type), POINTER :: eip_section
261 :
262 : ! ------------------------------------------------------------------------
263 :
264 22 : CALL timeset(routineN, handle)
265 :
266 22 : NULLIFY (cell, particle_set, eip_section, logger, atomic_kinds, &
267 22 : atomic_kind, local_particles, subsys, atomic_kind_set, para_env)
268 :
269 22 : ekin = 0.0_dp
270 :
271 22 : logger => cp_get_default_logger()
272 :
273 22 : CPASSERT(ASSOCIATED(eip_env))
274 :
275 : CALL eip_env_get(eip_env=eip_env, cell=cell, particle_set=particle_set, &
276 : subsys=subsys, local_particles=local_particles, &
277 22 : atomic_kind_set=atomic_kind_set)
278 22 : CALL get_cell(cell=cell, abc=abc)
279 :
280 22 : eip_section => section_vals_get_subs_vals(eip_env%force_env_input, "EIP")
281 22 : natom = SIZE(particle_set)
282 : !natom = local_particles%n_el(1)
283 :
284 66 : ALLOCATE (rxyz(3, natom))
285 :
286 22022 : DO i = 1, natom
287 : !iparticle = local_particles%list(1)%array(i)
288 88022 : rxyz(:, i) = particle_set(i)%r(:)*angstrom
289 : END DO
290 :
291 : CALL eip_lenosky_silicon(nat=natom, alat=abc*angstrom, rxyz0=rxyz, &
292 : fxyz=eip_env%eip_forces, ener=ener, &
293 : coord=eip_env%coord_avg, ener_var=ener_var, &
294 88 : coord_var=eip_env%coord_var, count=eip_env%count)
295 :
296 : !CALL get_part_ke(md_env, tbmd_energy%E_kinetic, int_grp=globalenv%para_env)
297 22 : CALL cp_subsys_get(subsys=subsys, atomic_kinds=atomic_kinds)
298 :
299 22 : nparticle_kind = atomic_kinds%n_els
300 :
301 44 : DO iparticle_kind = 1, nparticle_kind
302 22 : atomic_kind => atomic_kind_set(iparticle_kind)
303 22 : CALL get_atomic_kind(atomic_kind=atomic_kind, mass=mass)
304 22 : nparticle_local = local_particles%n_el(iparticle_kind)
305 11044 : DO iparticle_local = 1, nparticle_local
306 11000 : iparticle = local_particles%list(iparticle_kind)%array(iparticle_local)
307 : ekin = ekin + 0.5_dp*mass* &
308 : (particle_set(iparticle)%v(1)*particle_set(iparticle)%v(1) &
309 : + particle_set(iparticle)%v(2)*particle_set(iparticle)%v(2) &
310 11022 : + particle_set(iparticle)%v(3)*particle_set(iparticle)%v(3))
311 : END DO
312 : END DO
313 :
314 : ! sum all contributions to energy over calculated parts on all processors
315 22 : CALL cp_subsys_get(subsys=subsys, para_env=para_env)
316 22 : CALL para_env%sum(ekin)
317 22 : eip_env%eip_kinetic_energy = ekin
318 :
319 22 : eip_env%eip_potential_energy = ener/evolt
320 22 : eip_env%eip_energy = eip_env%eip_kinetic_energy + eip_env%eip_potential_energy
321 22 : eip_env%eip_energy_var = ener_var/evolt
322 :
323 22022 : DO i = 1, natom
324 176022 : particle_set(i)%f(:) = eip_env%eip_forces(:, i)/evolt*angstrom
325 : END DO
326 :
327 22 : DEALLOCATE (rxyz)
328 :
329 : ! Print
330 22 : IF (BTEST(cp_print_key_should_output(logger%iter_info, &
331 : eip_section, "PRINT%ENERGIES"), cp_p_file)) THEN
332 : iw = cp_print_key_unit_nr(logger, eip_section, "PRINT%ENERGIES", &
333 0 : extension=".mmLog")
334 :
335 0 : CALL eip_print_energies(eip_env=eip_env, output_unit=iw)
336 : CALL cp_print_key_finished_output(iw, logger, eip_section, &
337 0 : "PRINT%ENERGIES")
338 : END IF
339 :
340 22 : IF (BTEST(cp_print_key_should_output(logger%iter_info, &
341 : eip_section, "PRINT%ENERGIES_VAR"), cp_p_file)) THEN
342 : iw = cp_print_key_unit_nr(logger, eip_section, "PRINT%ENERGIES_VAR", &
343 0 : extension=".mmLog")
344 :
345 0 : CALL eip_print_energy_var(eip_env=eip_env, output_unit=iw)
346 : CALL cp_print_key_finished_output(iw, logger, eip_section, &
347 0 : "PRINT%ENERGIES_VAR")
348 : END IF
349 :
350 22 : IF (BTEST(cp_print_key_should_output(logger%iter_info, &
351 : eip_section, "PRINT%FORCES"), cp_p_file)) THEN
352 : iw = cp_print_key_unit_nr(logger, eip_section, "PRINT%FORCES", &
353 0 : extension=".mmLog")
354 :
355 0 : CALL eip_print_forces(eip_env=eip_env, output_unit=iw)
356 : CALL cp_print_key_finished_output(iw, logger, eip_section, &
357 0 : "PRINT%FORCES")
358 : END IF
359 :
360 22 : IF (BTEST(cp_print_key_should_output(logger%iter_info, &
361 : eip_section, "PRINT%COORD_AVG"), cp_p_file)) THEN
362 : iw = cp_print_key_unit_nr(logger, eip_section, "PRINT%COORD_AVG", &
363 0 : extension=".mmLog")
364 :
365 0 : CALL eip_print_coord_avg(eip_env=eip_env, output_unit=iw)
366 : CALL cp_print_key_finished_output(iw, logger, eip_section, &
367 0 : "PRINT%COORD_AVG")
368 : END IF
369 :
370 22 : IF (BTEST(cp_print_key_should_output(logger%iter_info, &
371 : eip_section, "PRINT%COORD_VAR"), cp_p_file)) THEN
372 : iw = cp_print_key_unit_nr(logger, eip_section, "PRINT%COORD_VAR", &
373 0 : extension=".mmLog")
374 :
375 0 : CALL eip_print_coord_var(eip_env=eip_env, output_unit=iw)
376 : CALL cp_print_key_finished_output(iw, logger, eip_section, &
377 0 : "PRINT%COORD_VAR")
378 : END IF
379 :
380 22 : IF (BTEST(cp_print_key_should_output(logger%iter_info, &
381 : eip_section, "PRINT%COUNT"), cp_p_file)) THEN
382 : iw = cp_print_key_unit_nr(logger, eip_section, "PRINT%COUNT", &
383 0 : extension=".mmLog")
384 :
385 0 : CALL eip_print_count(eip_env=eip_env, output_unit=iw)
386 : CALL cp_print_key_finished_output(iw, logger, eip_section, &
387 0 : "PRINT%COUNT")
388 : END IF
389 :
390 22 : CALL timestop(handle)
391 :
392 22 : END SUBROUTINE eip_lenosky
393 :
394 : ! **************************************************************************************************
395 : !> \brief Interface routine of the Stillinger-Weber force field to CP2K
396 : !> \param eip_env ...
397 : !> \par Literature
398 : !> F.H. Stillinger and T.A. Weber:
399 : !> Computer simulation of local order in condensed phases of silicon;
400 : !> Phys. Rev. B 31, 5262 (1985)
401 : !> \par History
402 : !> 04.2026 added [Thomas D. Kuehne, tkuehne@cp2k.org]
403 : ! **************************************************************************************************
404 22 : SUBROUTINE eip_stillinger_weber(eip_env)
405 : TYPE(eip_environment_type), POINTER :: eip_env
406 :
407 : CHARACTER(len=*), PARAMETER :: routineN = 'eip_stillinger_weber'
408 :
409 : INTEGER :: handle, i, iparticle, iparticle_kind, &
410 : iparticle_local, iw, natom, &
411 : nparticle_kind, nparticle_local
412 : REAL(KIND=dp) :: ekin, ener, mass
413 22 : REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :) :: rxyz
414 : REAL(KIND=dp), DIMENSION(3) :: abc
415 : TYPE(atomic_kind_list_type), POINTER :: atomic_kinds
416 22 : TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
417 : TYPE(atomic_kind_type), POINTER :: atomic_kind
418 : TYPE(cell_type), POINTER :: cell
419 : TYPE(cp_logger_type), POINTER :: logger
420 : TYPE(cp_subsys_type), POINTER :: subsys
421 : TYPE(distribution_1d_type), POINTER :: local_particles
422 : TYPE(mp_para_env_type), POINTER :: para_env
423 22 : TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
424 : TYPE(section_vals_type), POINTER :: eip_section
425 :
426 22 : CALL timeset(routineN, handle)
427 :
428 22 : NULLIFY (cell, particle_set, eip_section, logger, atomic_kinds, &
429 22 : atomic_kind, local_particles, subsys, atomic_kind_set, para_env)
430 :
431 22 : ekin = 0.0_dp
432 :
433 22 : logger => cp_get_default_logger()
434 :
435 22 : CPASSERT(ASSOCIATED(eip_env))
436 :
437 : CALL eip_env_get(eip_env=eip_env, cell=cell, particle_set=particle_set, &
438 : subsys=subsys, local_particles=local_particles, &
439 22 : atomic_kind_set=atomic_kind_set)
440 22 : CALL get_cell(cell=cell, abc=abc)
441 :
442 22 : eip_section => section_vals_get_subs_vals(eip_env%force_env_input, "EIP")
443 22 : natom = SIZE(particle_set)
444 :
445 66 : ALLOCATE (rxyz(3, natom))
446 :
447 22022 : DO i = 1, natom
448 88022 : rxyz(:, i) = particle_set(i)%r(:)*angstrom
449 : END DO
450 :
451 : CALL eip_stillinger_weber_silicon(nat=natom, alat=abc*angstrom, &
452 : rxyz0=rxyz, fxyz=eip_env%eip_forces, &
453 88 : etot=ener, count=eip_env%count)
454 :
455 22 : eip_env%coord_avg = 0.0_dp
456 22 : eip_env%coord_var = 0.0_dp
457 :
458 22 : CALL cp_subsys_get(subsys=subsys, atomic_kinds=atomic_kinds)
459 :
460 22 : nparticle_kind = atomic_kinds%n_els
461 :
462 44 : DO iparticle_kind = 1, nparticle_kind
463 22 : atomic_kind => atomic_kind_set(iparticle_kind)
464 22 : CALL get_atomic_kind(atomic_kind=atomic_kind, mass=mass)
465 22 : nparticle_local = local_particles%n_el(iparticle_kind)
466 11044 : DO iparticle_local = 1, nparticle_local
467 11000 : iparticle = local_particles%list(iparticle_kind)%array(iparticle_local)
468 : ekin = ekin + 0.5_dp*mass* &
469 : (particle_set(iparticle)%v(1)*particle_set(iparticle)%v(1) &
470 : + particle_set(iparticle)%v(2)*particle_set(iparticle)%v(2) &
471 11022 : + particle_set(iparticle)%v(3)*particle_set(iparticle)%v(3))
472 : END DO
473 : END DO
474 :
475 22 : CALL cp_subsys_get(subsys=subsys, para_env=para_env)
476 22 : CALL para_env%sum(ekin)
477 22 : eip_env%eip_kinetic_energy = ekin
478 :
479 22 : eip_env%eip_potential_energy = ener/evolt
480 22 : eip_env%eip_energy = eip_env%eip_kinetic_energy + eip_env%eip_potential_energy
481 22 : eip_env%eip_energy_var = 0.0_dp
482 :
483 22022 : DO i = 1, natom
484 176022 : particle_set(i)%f(:) = eip_env%eip_forces(:, i)/evolt*angstrom
485 : END DO
486 :
487 22 : DEALLOCATE (rxyz)
488 :
489 22 : IF (BTEST(cp_print_key_should_output(logger%iter_info, &
490 : eip_section, "PRINT%ENERGIES"), cp_p_file)) THEN
491 : iw = cp_print_key_unit_nr(logger, eip_section, "PRINT%ENERGIES", &
492 0 : extension=".mmLog")
493 :
494 0 : CALL eip_print_energies(eip_env=eip_env, output_unit=iw)
495 : CALL cp_print_key_finished_output(iw, logger, eip_section, &
496 0 : "PRINT%ENERGIES")
497 : END IF
498 :
499 22 : IF (BTEST(cp_print_key_should_output(logger%iter_info, &
500 : eip_section, "PRINT%ENERGIES_VAR"), cp_p_file)) THEN
501 : iw = cp_print_key_unit_nr(logger, eip_section, "PRINT%ENERGIES_VAR", &
502 0 : extension=".mmLog")
503 :
504 0 : CALL eip_print_energy_var(eip_env=eip_env, output_unit=iw)
505 : CALL cp_print_key_finished_output(iw, logger, eip_section, &
506 0 : "PRINT%ENERGIES_VAR")
507 : END IF
508 :
509 22 : IF (BTEST(cp_print_key_should_output(logger%iter_info, &
510 : eip_section, "PRINT%FORCES"), cp_p_file)) THEN
511 : iw = cp_print_key_unit_nr(logger, eip_section, "PRINT%FORCES", &
512 0 : extension=".mmLog")
513 :
514 0 : CALL eip_print_forces(eip_env=eip_env, output_unit=iw)
515 : CALL cp_print_key_finished_output(iw, logger, eip_section, &
516 0 : "PRINT%FORCES")
517 : END IF
518 :
519 22 : IF (BTEST(cp_print_key_should_output(logger%iter_info, &
520 : eip_section, "PRINT%COORD_AVG"), cp_p_file)) THEN
521 : iw = cp_print_key_unit_nr(logger, eip_section, "PRINT%COORD_AVG", &
522 0 : extension=".mmLog")
523 :
524 0 : CALL eip_print_coord_avg(eip_env=eip_env, output_unit=iw)
525 : CALL cp_print_key_finished_output(iw, logger, eip_section, &
526 0 : "PRINT%COORD_AVG")
527 : END IF
528 :
529 22 : IF (BTEST(cp_print_key_should_output(logger%iter_info, &
530 : eip_section, "PRINT%COORD_VAR"), cp_p_file)) THEN
531 : iw = cp_print_key_unit_nr(logger, eip_section, "PRINT%COORD_VAR", &
532 0 : extension=".mmLog")
533 :
534 0 : CALL eip_print_coord_var(eip_env=eip_env, output_unit=iw)
535 : CALL cp_print_key_finished_output(iw, logger, eip_section, &
536 0 : "PRINT%COORD_VAR")
537 : END IF
538 :
539 22 : IF (BTEST(cp_print_key_should_output(logger%iter_info, &
540 : eip_section, "PRINT%COUNT"), cp_p_file)) THEN
541 : iw = cp_print_key_unit_nr(logger, eip_section, "PRINT%COUNT", &
542 0 : extension=".mmLog")
543 :
544 0 : CALL eip_print_count(eip_env=eip_env, output_unit=iw)
545 : CALL cp_print_key_finished_output(iw, logger, eip_section, &
546 0 : "PRINT%COUNT")
547 : END IF
548 :
549 22 : CALL timestop(handle)
550 :
551 22 : END SUBROUTINE eip_stillinger_weber
552 :
553 : ! **************************************************************************************************
554 : !> \brief Interface routine of the Tersoff force field to CP2K
555 : !> \param eip_env ...
556 : !> \par Literature
557 : !> J. Tersoff:
558 : !> New empirical approach for the structure and energy of covalent systems;
559 : !> Phys. Rev. Lett. 61, 2879 (1988)
560 : !> J. Tersoff:
561 : !> Modeling solid-state chemistry: Interatomic potentials for multicomponent systems;
562 : !> Phys. Rev. B 39, 5566 (1989)
563 : !> \par History
564 : !> 04.2026 added [Thomas D. Kuehne, tkuehne@cp2k.org]
565 : ! **************************************************************************************************
566 22 : SUBROUTINE eip_tersoff(eip_env)
567 : TYPE(eip_environment_type), POINTER :: eip_env
568 :
569 : CHARACTER(len=*), PARAMETER :: routineN = 'eip_tersoff'
570 :
571 : INTEGER :: handle, i, iparticle, iparticle_kind, &
572 : iparticle_local, iw, natom, &
573 : nparticle_kind, nparticle_local
574 : REAL(KIND=dp) :: ekin, ener, mass
575 22 : REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :) :: rxyz
576 : REAL(KIND=dp), DIMENSION(3) :: abc
577 : TYPE(atomic_kind_list_type), POINTER :: atomic_kinds
578 22 : TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
579 : TYPE(atomic_kind_type), POINTER :: atomic_kind
580 : TYPE(cell_type), POINTER :: cell
581 : TYPE(cp_logger_type), POINTER :: logger
582 : TYPE(cp_subsys_type), POINTER :: subsys
583 : TYPE(distribution_1d_type), POINTER :: local_particles
584 : TYPE(mp_para_env_type), POINTER :: para_env
585 22 : TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
586 : TYPE(section_vals_type), POINTER :: eip_section
587 :
588 22 : CALL timeset(routineN, handle)
589 :
590 22 : NULLIFY (cell, particle_set, eip_section, logger, atomic_kinds, &
591 22 : atomic_kind, local_particles, subsys, atomic_kind_set, para_env)
592 :
593 22 : ekin = 0.0_dp
594 :
595 22 : logger => cp_get_default_logger()
596 :
597 22 : CPASSERT(ASSOCIATED(eip_env))
598 :
599 : CALL eip_env_get(eip_env=eip_env, cell=cell, particle_set=particle_set, &
600 : subsys=subsys, local_particles=local_particles, &
601 22 : atomic_kind_set=atomic_kind_set)
602 22 : CALL get_cell(cell=cell, abc=abc)
603 :
604 22 : eip_section => section_vals_get_subs_vals(eip_env%force_env_input, "EIP")
605 22 : natom = SIZE(particle_set)
606 :
607 66 : ALLOCATE (rxyz(3, natom))
608 :
609 22022 : DO i = 1, natom
610 88022 : rxyz(:, i) = particle_set(i)%r(:)*angstrom
611 : END DO
612 :
613 : CALL eip_tersoff_silicon(nat=natom, alat=abc*angstrom, rxyz=rxyz, &
614 : fxyz=eip_env%eip_forces, etot=ener, &
615 88 : count=eip_env%count)
616 :
617 22 : eip_env%coord_avg = 0.0_dp
618 22 : eip_env%coord_var = 0.0_dp
619 :
620 22 : CALL cp_subsys_get(subsys=subsys, atomic_kinds=atomic_kinds)
621 :
622 22 : nparticle_kind = atomic_kinds%n_els
623 :
624 44 : DO iparticle_kind = 1, nparticle_kind
625 22 : atomic_kind => atomic_kind_set(iparticle_kind)
626 22 : CALL get_atomic_kind(atomic_kind=atomic_kind, mass=mass)
627 22 : nparticle_local = local_particles%n_el(iparticle_kind)
628 11044 : DO iparticle_local = 1, nparticle_local
629 11000 : iparticle = local_particles%list(iparticle_kind)%array(iparticle_local)
630 : ekin = ekin + 0.5_dp*mass* &
631 : (particle_set(iparticle)%v(1)*particle_set(iparticle)%v(1) &
632 : + particle_set(iparticle)%v(2)*particle_set(iparticle)%v(2) &
633 11022 : + particle_set(iparticle)%v(3)*particle_set(iparticle)%v(3))
634 : END DO
635 : END DO
636 :
637 22 : CALL cp_subsys_get(subsys=subsys, para_env=para_env)
638 22 : CALL para_env%sum(ekin)
639 22 : eip_env%eip_kinetic_energy = ekin
640 :
641 22 : eip_env%eip_potential_energy = ener/evolt
642 22 : eip_env%eip_energy = eip_env%eip_kinetic_energy + eip_env%eip_potential_energy
643 22 : eip_env%eip_energy_var = 0.0_dp
644 :
645 22022 : DO i = 1, natom
646 176022 : particle_set(i)%f(:) = eip_env%eip_forces(:, i)/evolt*angstrom
647 : END DO
648 :
649 22 : DEALLOCATE (rxyz)
650 :
651 22 : IF (BTEST(cp_print_key_should_output(logger%iter_info, &
652 : eip_section, "PRINT%ENERGIES"), cp_p_file)) THEN
653 : iw = cp_print_key_unit_nr(logger, eip_section, "PRINT%ENERGIES", &
654 0 : extension=".mmLog")
655 :
656 0 : CALL eip_print_energies(eip_env=eip_env, output_unit=iw)
657 : CALL cp_print_key_finished_output(iw, logger, eip_section, &
658 0 : "PRINT%ENERGIES")
659 : END IF
660 :
661 22 : IF (BTEST(cp_print_key_should_output(logger%iter_info, &
662 : eip_section, "PRINT%ENERGIES_VAR"), cp_p_file)) THEN
663 : iw = cp_print_key_unit_nr(logger, eip_section, "PRINT%ENERGIES_VAR", &
664 0 : extension=".mmLog")
665 :
666 0 : CALL eip_print_energy_var(eip_env=eip_env, output_unit=iw)
667 : CALL cp_print_key_finished_output(iw, logger, eip_section, &
668 0 : "PRINT%ENERGIES_VAR")
669 : END IF
670 :
671 22 : IF (BTEST(cp_print_key_should_output(logger%iter_info, &
672 : eip_section, "PRINT%FORCES"), cp_p_file)) THEN
673 : iw = cp_print_key_unit_nr(logger, eip_section, "PRINT%FORCES", &
674 0 : extension=".mmLog")
675 :
676 0 : CALL eip_print_forces(eip_env=eip_env, output_unit=iw)
677 : CALL cp_print_key_finished_output(iw, logger, eip_section, &
678 0 : "PRINT%FORCES")
679 : END IF
680 :
681 22 : IF (BTEST(cp_print_key_should_output(logger%iter_info, &
682 : eip_section, "PRINT%COORD_AVG"), cp_p_file)) THEN
683 : iw = cp_print_key_unit_nr(logger, eip_section, "PRINT%COORD_AVG", &
684 0 : extension=".mmLog")
685 :
686 0 : CALL eip_print_coord_avg(eip_env=eip_env, output_unit=iw)
687 : CALL cp_print_key_finished_output(iw, logger, eip_section, &
688 0 : "PRINT%COORD_AVG")
689 : END IF
690 :
691 22 : IF (BTEST(cp_print_key_should_output(logger%iter_info, &
692 : eip_section, "PRINT%COORD_VAR"), cp_p_file)) THEN
693 : iw = cp_print_key_unit_nr(logger, eip_section, "PRINT%COORD_VAR", &
694 0 : extension=".mmLog")
695 :
696 0 : CALL eip_print_coord_var(eip_env=eip_env, output_unit=iw)
697 : CALL cp_print_key_finished_output(iw, logger, eip_section, &
698 0 : "PRINT%COORD_VAR")
699 : END IF
700 :
701 22 : IF (BTEST(cp_print_key_should_output(logger%iter_info, &
702 : eip_section, "PRINT%COUNT"), cp_p_file)) THEN
703 : iw = cp_print_key_unit_nr(logger, eip_section, "PRINT%COUNT", &
704 0 : extension=".mmLog")
705 :
706 0 : CALL eip_print_count(eip_env=eip_env, output_unit=iw)
707 : CALL cp_print_key_finished_output(iw, logger, eip_section, &
708 0 : "PRINT%COUNT")
709 : END IF
710 :
711 22 : CALL timestop(handle)
712 :
713 22 : END SUBROUTINE eip_tersoff
714 :
715 : ! **************************************************************************************************
716 : !> \brief Print routine for the EIP energies
717 : !> \param eip_env The eip environment of matter
718 : !> \param output_unit The output unit
719 : !> \par History
720 : !> 03.2006 initial create [tdk]
721 : !> \author Thomas D. Kuehne (tkuehne@cp2k.org)
722 : !> \note
723 : !> As usual the EIP energies differ from the DFT energies!
724 : !> Only the relative energy differences are correctly reproduced.
725 : ! **************************************************************************************************
726 0 : SUBROUTINE eip_print_energies(eip_env, output_unit)
727 : TYPE(eip_environment_type), POINTER :: eip_env
728 : INTEGER, INTENT(IN) :: output_unit
729 :
730 : ! ------------------------------------------------------------------------
731 :
732 0 : IF (output_unit > 0) THEN
733 : WRITE (UNIT=output_unit, FMT="(/,(T3,A,T55,F25.14))") &
734 0 : "Kinetic energy [Hartree]: ", eip_env%eip_kinetic_energy, &
735 0 : "Potential energy [Hartree]: ", eip_env%eip_potential_energy, &
736 0 : "Total EIP energy [Hartree]: ", eip_env%eip_energy
737 : END IF
738 :
739 0 : END SUBROUTINE eip_print_energies
740 :
741 : ! **************************************************************************************************
742 : !> \brief Print routine for the variance of the energy/atom
743 : !> \param eip_env The eip environment of matter
744 : !> \param output_unit The output unit
745 : !> \par History
746 : !> 03.2006 initial create [tdk]
747 : !> \author Thomas D. Kuehne (tkuehne@cp2k.org)
748 : ! **************************************************************************************************
749 0 : SUBROUTINE eip_print_energy_var(eip_env, output_unit)
750 : TYPE(eip_environment_type), POINTER :: eip_env
751 : INTEGER, INTENT(IN) :: output_unit
752 :
753 : INTEGER :: unit_nr
754 :
755 : ! ------------------------------------------------------------------------
756 :
757 0 : unit_nr = output_unit
758 :
759 0 : IF (unit_nr > 0) THEN
760 :
761 0 : WRITE (unit_nr, *) ""
762 0 : WRITE (unit_nr, *) "The variance of the EIP energy/atom!"
763 0 : WRITE (unit_nr, *) ""
764 0 : WRITE (unit_nr, *) eip_env%eip_energy_var
765 :
766 : END IF
767 :
768 0 : END SUBROUTINE eip_print_energy_var
769 :
770 : ! **************************************************************************************************
771 : !> \brief Print routine for the forces
772 : !> \param eip_env The eip environment of matter
773 : !> \param output_unit The output unit
774 : !> \par History
775 : !> 03.2006 initial create [tdk]
776 : !> \author Thomas D. Kuehne (tkuehne@cp2k.org)
777 : ! **************************************************************************************************
778 0 : SUBROUTINE eip_print_forces(eip_env, output_unit)
779 : TYPE(eip_environment_type), POINTER :: eip_env
780 : INTEGER, INTENT(IN) :: output_unit
781 :
782 : INTEGER :: iatom, natom, unit_nr
783 0 : TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
784 :
785 : ! ------------------------------------------------------------------------
786 :
787 0 : NULLIFY (particle_set)
788 :
789 0 : unit_nr = output_unit
790 :
791 0 : IF (unit_nr > 0) THEN
792 :
793 0 : CALL eip_env_get(eip_env=eip_env, particle_set=particle_set)
794 :
795 0 : natom = SIZE(particle_set)
796 :
797 0 : WRITE (unit_nr, *) ""
798 0 : WRITE (unit_nr, *) "The EIP forces!"
799 0 : WRITE (unit_nr, *) ""
800 0 : WRITE (unit_nr, *) "Total EIP forces [Hartree/Bohr]"
801 0 : DO iatom = 1, natom
802 0 : WRITE (unit_nr, *) eip_env%eip_forces(1:3, iatom)
803 : END DO
804 :
805 : END IF
806 :
807 0 : END SUBROUTINE eip_print_forces
808 :
809 : ! **************************************************************************************************
810 : !> \brief Print routine for the average coordination number
811 : !> \param eip_env The eip environment of matter
812 : !> \param output_unit The output unit
813 : !> \par History
814 : !> 03.2006 initial create [tdk]
815 : !> \author Thomas D. Kuehne (tkuehne@cp2k.org)
816 : ! **************************************************************************************************
817 0 : SUBROUTINE eip_print_coord_avg(eip_env, output_unit)
818 : TYPE(eip_environment_type), POINTER :: eip_env
819 : INTEGER, INTENT(IN) :: output_unit
820 :
821 : INTEGER :: unit_nr
822 :
823 : ! ------------------------------------------------------------------------
824 :
825 0 : unit_nr = output_unit
826 :
827 0 : IF (unit_nr > 0) THEN
828 :
829 0 : WRITE (unit_nr, *) ""
830 0 : WRITE (unit_nr, *) "The average coordination number!"
831 0 : WRITE (unit_nr, *) ""
832 0 : WRITE (unit_nr, *) eip_env%coord_avg
833 :
834 : END IF
835 :
836 0 : END SUBROUTINE eip_print_coord_avg
837 :
838 : ! **************************************************************************************************
839 : !> \brief Print routine for the variance of the coordination number
840 : !> \param eip_env The eip environment of matter
841 : !> \param output_unit The output unit
842 : !> \par History
843 : !> 03.2006 initial create [tdk]
844 : !> \author Thomas D. Kuehne (tkuehne@cp2k.org)
845 : ! **************************************************************************************************
846 0 : SUBROUTINE eip_print_coord_var(eip_env, output_unit)
847 : TYPE(eip_environment_type), POINTER :: eip_env
848 : INTEGER, INTENT(IN) :: output_unit
849 :
850 : INTEGER :: unit_nr
851 :
852 : ! ------------------------------------------------------------------------
853 :
854 0 : unit_nr = output_unit
855 :
856 0 : IF (unit_nr > 0) THEN
857 :
858 0 : WRITE (unit_nr, *) ""
859 0 : WRITE (unit_nr, *) "The variance of the coordination number!"
860 0 : WRITE (unit_nr, *) ""
861 0 : WRITE (unit_nr, *) eip_env%coord_var
862 :
863 : END IF
864 :
865 0 : END SUBROUTINE eip_print_coord_var
866 :
867 : ! **************************************************************************************************
868 : !> \brief Print routine for the function call counter
869 : !> \param eip_env The eip environment of matter
870 : !> \param output_unit The output unit
871 : !> \par History
872 : !> 03.2006 initial create [tdk]
873 : !> \author Thomas D. Kuehne (tkuehne@cp2k.org)
874 : ! **************************************************************************************************
875 0 : SUBROUTINE eip_print_count(eip_env, output_unit)
876 : TYPE(eip_environment_type), POINTER :: eip_env
877 : INTEGER, INTENT(IN) :: output_unit
878 :
879 : INTEGER :: unit_nr
880 :
881 : ! ------------------------------------------------------------------------
882 :
883 0 : unit_nr = output_unit
884 :
885 0 : IF (unit_nr > 0) THEN
886 :
887 0 : WRITE (unit_nr, *) ""
888 0 : WRITE (unit_nr, *) "The function call counter!"
889 0 : WRITE (unit_nr, *) ""
890 0 : WRITE (unit_nr, *) eip_env%count
891 :
892 : END IF
893 :
894 0 : END SUBROUTINE eip_print_count
895 :
896 : ! **************************************************************************************************
897 : !> \brief Bazant's EDIP (environment-dependent interatomic potential) for Silicon
898 : !> by Stefan Goedecker
899 : !> \param nat number of atoms
900 : !> \param alat lattice constants of the orthorombic box containing the particles
901 : !> \param rxyz0 atomic positions in Angstrom, may be modified on output.
902 : !> If an atom is outside the box the program will bring it back
903 : !> into the box by translations through alat
904 : !> \param fxyz forces in eV/A
905 : !> \param ener total energy in eV
906 : !> \param coord average coordination number
907 : !> \param ener_var variance of the energy/atom
908 : !> \param coord_var variance of the coordination number
909 : !> \param count count is increased by one per call, has to be initialized
910 : !> to 0.e0_dp before first call of eip_bazant
911 : !> \par Literature
912 : !> http://www-math.mit.edu/~bazant/EDIP
913 : !> M.Z. Bazant & E. Kaxiras: Modeling of Covalent Bonding in Solids by
914 : !> Inversion of Cohesive Energy Curves;
915 : !> Phys. Rev. Lett. 77, 4370 (1996)
916 : !> M.Z. Bazant, E. Kaxiras and J.F. Justo: Environment-dependent interatomic
917 : !> potential for bulk silicon;
918 : !> Phys. Rev. B 56, 8542-8552 (1997)
919 : !> S. Goedecker: Optimization and parallelization of a force field for silicon
920 : !> using OpenMP; CPC 148, 1 (2002)
921 : !> \par History
922 : !> 03.2006 initial create [tdk]
923 : !> \author Thomas D. Kuehne (tkuehne@cp2k.org)
924 : ! **************************************************************************************************
925 22 : SUBROUTINE eip_bazant_silicon(nat, alat, rxyz0, fxyz, ener, coord, ener_var, &
926 : coord_var, count)
927 :
928 : INTEGER :: nat
929 : REAL(KIND=dp) :: alat, rxyz0, fxyz, ener, coord, &
930 : ener_var, coord_var, count
931 :
932 : DIMENSION rxyz0(3, nat), fxyz(3, nat), alat(3)
933 22 : REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :) :: rxyz
934 22 : INTEGER, ALLOCATABLE, DIMENSION(:, :) :: lsta
935 22 : INTEGER, ALLOCATABLE, DIMENSION(:) :: lstb
936 22 : INTEGER, ALLOCATABLE, DIMENSION(:) :: lay
937 22 : INTEGER, ALLOCATABLE, DIMENSION(:, :, :, :) :: icell
938 22 : REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :) :: rel
939 22 : REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :) :: txyz
940 22 : REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :) :: s2, s3, sz
941 22 : INTEGER, ALLOCATABLE, DIMENSION(:) :: num2, num3, numz
942 :
943 : REAL(KIND=dp) :: coord2, cut, cut2, ener2, rlc1i, rlc2i, rlc3i, tcoord, &
944 : tcoord2, tener, tener2
945 : INTEGER :: iam, iat, iat1, iat2, ii, i, il, in, indlst, indlstx, istop, &
946 : istopg, l2, l3, laymx, ll1, ll2, ll3, lot, max_nbrs, myspace, &
947 : l1, myspaceout, ncx, nn, nnbrx, npr
948 :
949 : ! cut=par_a
950 22 : cut = 3.1213820e0_dp + 1.e-14_dp
951 :
952 22 : IF (count == 0) OPEN (unit=10, file='bazant.mon', status='unknown')
953 22 : count = count + 1.e0_dp
954 :
955 : ! linear scaling calculation of verlet list
956 22 : ll1 = INT(alat(1)/cut)
957 22 : IF (ll1 < 1) CPABORT("alat(1) too small")
958 22 : ll2 = INT(alat(2)/cut)
959 22 : IF (ll2 < 1) CPABORT("alat(2) too small")
960 22 : ll3 = INT(alat(3)/cut)
961 22 : IF (ll3 < 1) CPABORT("alat(3) too small")
962 :
963 : ! determine number of threads
964 22 : npr = 1
965 22 : !$OMP PARALLEL PRIVATE(iam) SHARED (npr) DEFAULT(NONE)
966 : !$ iam = omp_get_thread_num()
967 : !$ if (iam .eq. 0) npr = omp_get_num_threads()
968 : !$OMP END PARALLEL
969 :
970 : ! linear scaling calculation of verlet list
971 :
972 22 : IF (npr <= 1) THEN !serial if too few processors to gain by parallelizing
973 :
974 : ! set ncx for serial case, ncx for parallel case set below
975 22 : ncx = 16
976 0 : loop_ncx_s: DO
977 132 : ALLOCATE (icell(0:ncx, -1:ll1, -1:ll2, -1:ll3))
978 24442 : icell(0, -1:ll1, -1:ll2, -1:ll3) = 0
979 22 : rlc1i = ll1/alat(1)
980 22 : rlc2i = ll2/alat(2)
981 22 : rlc3i = ll3/alat(3)
982 :
983 22022 : loop_iat_s: DO iat = 1, nat
984 22000 : rxyz0(1, iat) = MODULO(MODULO(rxyz0(1, iat), alat(1)), alat(1))
985 22000 : rxyz0(2, iat) = MODULO(MODULO(rxyz0(2, iat), alat(2)), alat(2))
986 22000 : rxyz0(3, iat) = MODULO(MODULO(rxyz0(3, iat), alat(3)), alat(3))
987 22000 : l1 = INT(rxyz0(1, iat)*rlc1i)
988 22000 : l2 = INT(rxyz0(2, iat)*rlc2i)
989 22000 : l3 = INT(rxyz0(3, iat)*rlc3i)
990 :
991 22000 : ii = icell(0, l1, l2, l3)
992 22000 : ii = ii + 1
993 22000 : icell(0, l1, l2, l3) = ii
994 22000 : IF (ii > ncx) THEN
995 0 : WRITE (10, *) count, 'NCX too small', ncx
996 0 : DEALLOCATE (icell)
997 0 : ncx = ncx*2
998 : CYCLE loop_ncx_s
999 : END IF
1000 22022 : icell(ii, l1, l2, l3) = iat
1001 : END DO loop_iat_s
1002 : EXIT loop_ncx_s
1003 : END DO loop_ncx_s
1004 :
1005 : ELSE ! parallel case
1006 :
1007 : ! periodization of particles can be done in parallel
1008 0 : !$OMP PARALLEL DO SHARED (alat,nat,rxyz0) PRIVATE(iat) DEFAULT(NONE)
1009 : DO iat = 1, nat
1010 : rxyz0(1, iat) = MODULO(MODULO(rxyz0(1, iat), alat(1)), alat(1))
1011 : rxyz0(2, iat) = MODULO(MODULO(rxyz0(2, iat), alat(2)), alat(2))
1012 : rxyz0(3, iat) = MODULO(MODULO(rxyz0(3, iat), alat(3)), alat(3))
1013 : END DO
1014 : !$OMP END PARALLEL DO
1015 :
1016 : ! assignment to cell is done serially
1017 : ! set ncx for parallel case, ncx for serial case set above
1018 0 : ncx = 16
1019 0 : loop_ncx_p: DO
1020 0 : ALLOCATE (icell(0:ncx, -1:ll1, -1:ll2, -1:ll3))
1021 0 : icell(0, -1:ll1, -1:ll2, -1:ll3) = 0
1022 :
1023 0 : rlc1i = ll1/alat(1)
1024 0 : rlc2i = ll2/alat(2)
1025 0 : rlc3i = ll3/alat(3)
1026 :
1027 0 : loop_iat_p: DO iat = 1, nat
1028 0 : l1 = INT(rxyz0(1, iat)*rlc1i)
1029 0 : l2 = INT(rxyz0(2, iat)*rlc2i)
1030 0 : l3 = INT(rxyz0(3, iat)*rlc3i)
1031 0 : ii = icell(0, l1, l2, l3)
1032 0 : ii = ii + 1
1033 0 : icell(0, l1, l2, l3) = ii
1034 0 : IF (ii > ncx) THEN
1035 0 : WRITE (10, *) count, 'NCX too small', ncx
1036 0 : DEALLOCATE (icell)
1037 0 : ncx = ncx*2
1038 : CYCLE loop_ncx_p
1039 : END IF
1040 0 : icell(ii, l1, l2, l3) = iat
1041 : END DO loop_iat_p
1042 : EXIT loop_ncx_p
1043 : END DO loop_ncx_p
1044 :
1045 : END IF
1046 :
1047 : ! duplicate all atoms within boundary layer
1048 22 : laymx = ncx*(2*ll1*ll2 + 2*ll1*ll3 + 2*ll2*ll3 + 4*ll1 + 4*ll2 + 4*ll3 + 8)
1049 22 : nn = nat + laymx
1050 110 : ALLOCATE (rxyz(3, nn), lay(nn))
1051 22022 : DO iat = 1, nat
1052 22000 : lay(iat) = iat
1053 22000 : rxyz(1, iat) = rxyz0(1, iat)
1054 22000 : rxyz(2, iat) = rxyz0(2, iat)
1055 22022 : rxyz(3, iat) = rxyz0(3, iat)
1056 : END DO
1057 22 : il = nat
1058 : ! xy plane
1059 198 : DO l2 = 0, ll2 - 1
1060 1606 : DO l1 = 0, ll1 - 1
1061 :
1062 1408 : in = icell(0, l1, l2, 0)
1063 1408 : icell(0, l1, l2, ll3) = in
1064 4126 : DO ii = 1, in
1065 2718 : i = icell(ii, l1, l2, 0)
1066 2718 : il = il + 1
1067 2718 : IF (il > nn) CPABORT("enlarge laymx")
1068 2718 : lay(il) = i
1069 2718 : icell(ii, l1, l2, ll3) = il
1070 2718 : rxyz(1, il) = rxyz(1, i)
1071 2718 : rxyz(2, il) = rxyz(2, i)
1072 4126 : rxyz(3, il) = rxyz(3, i) + alat(3)
1073 : END DO
1074 :
1075 1408 : in = icell(0, l1, l2, ll3 - 1)
1076 1408 : icell(0, l1, l2, -1) = in
1077 4366 : DO ii = 1, in
1078 2782 : i = icell(ii, l1, l2, ll3 - 1)
1079 2782 : il = il + 1
1080 2782 : IF (il > nn) CPABORT("enlarge laymx")
1081 2782 : lay(il) = i
1082 2782 : icell(ii, l1, l2, -1) = il
1083 2782 : rxyz(1, il) = rxyz(1, i)
1084 2782 : rxyz(2, il) = rxyz(2, i)
1085 4190 : rxyz(3, il) = rxyz(3, i) - alat(3)
1086 : END DO
1087 :
1088 : END DO
1089 : END DO
1090 :
1091 : ! yz plane
1092 198 : DO l3 = 0, ll3 - 1
1093 1606 : DO l2 = 0, ll2 - 1
1094 :
1095 1408 : in = icell(0, 0, l2, l3)
1096 1408 : icell(0, ll1, l2, l3) = in
1097 4194 : DO ii = 1, in
1098 2786 : i = icell(ii, 0, l2, l3)
1099 2786 : il = il + 1
1100 2786 : IF (il > nn) CPABORT("enlarge laymx")
1101 2786 : lay(il) = i
1102 2786 : icell(ii, ll1, l2, l3) = il
1103 2786 : rxyz(1, il) = rxyz(1, i) + alat(1)
1104 2786 : rxyz(2, il) = rxyz(2, i)
1105 4194 : rxyz(3, il) = rxyz(3, i)
1106 : END DO
1107 :
1108 1408 : in = icell(0, ll1 - 1, l2, l3)
1109 1408 : icell(0, -1, l2, l3) = in
1110 4298 : DO ii = 1, in
1111 2714 : i = icell(ii, ll1 - 1, l2, l3)
1112 2714 : il = il + 1
1113 2714 : IF (il > nn) CPABORT("enlarge laymx")
1114 2714 : lay(il) = i
1115 2714 : icell(ii, -1, l2, l3) = il
1116 2714 : rxyz(1, il) = rxyz(1, i) - alat(1)
1117 2714 : rxyz(2, il) = rxyz(2, i)
1118 4122 : rxyz(3, il) = rxyz(3, i)
1119 : END DO
1120 :
1121 : END DO
1122 : END DO
1123 :
1124 : ! xz plane
1125 198 : DO l3 = 0, ll3 - 1
1126 1606 : DO l1 = 0, ll1 - 1
1127 :
1128 1408 : in = icell(0, l1, 0, l3)
1129 1408 : icell(0, l1, ll2, l3) = in
1130 4264 : DO ii = 1, in
1131 2856 : i = icell(ii, l1, 0, l3)
1132 2856 : il = il + 1
1133 2856 : IF (il > nn) CPABORT("enlarge laymx")
1134 2856 : lay(il) = i
1135 2856 : icell(ii, l1, ll2, l3) = il
1136 2856 : rxyz(1, il) = rxyz(1, i)
1137 2856 : rxyz(2, il) = rxyz(2, i) + alat(2)
1138 4264 : rxyz(3, il) = rxyz(3, i)
1139 : END DO
1140 :
1141 1408 : in = icell(0, l1, ll2 - 1, l3)
1142 1408 : icell(0, l1, -1, l3) = in
1143 4228 : DO ii = 1, in
1144 2644 : i = icell(ii, l1, ll2 - 1, l3)
1145 2644 : il = il + 1
1146 2644 : IF (il > nn) CPABORT("enlarge laymx")
1147 2644 : lay(il) = i
1148 2644 : icell(ii, l1, -1, l3) = il
1149 2644 : rxyz(1, il) = rxyz(1, i)
1150 2644 : rxyz(2, il) = rxyz(2, i) - alat(2)
1151 4052 : rxyz(3, il) = rxyz(3, i)
1152 : END DO
1153 :
1154 : END DO
1155 : END DO
1156 :
1157 : ! x axis
1158 198 : DO l1 = 0, ll1 - 1
1159 :
1160 176 : in = icell(0, l1, 0, 0)
1161 176 : icell(0, l1, ll2, ll3) = in
1162 564 : DO ii = 1, in
1163 388 : i = icell(ii, l1, 0, 0)
1164 388 : il = il + 1
1165 388 : IF (il > nn) CPABORT("enlarge laymx")
1166 388 : lay(il) = i
1167 388 : icell(ii, l1, ll2, ll3) = il
1168 388 : rxyz(1, il) = rxyz(1, i)
1169 388 : rxyz(2, il) = rxyz(2, i) + alat(2)
1170 564 : rxyz(3, il) = rxyz(3, i) + alat(3)
1171 : END DO
1172 :
1173 176 : in = icell(0, l1, 0, ll3 - 1)
1174 176 : icell(0, l1, ll2, -1) = in
1175 488 : DO ii = 1, in
1176 312 : i = icell(ii, l1, 0, ll3 - 1)
1177 312 : il = il + 1
1178 312 : IF (il > nn) CPABORT("enlarge laymx")
1179 312 : lay(il) = i
1180 312 : icell(ii, l1, ll2, -1) = il
1181 312 : rxyz(1, il) = rxyz(1, i)
1182 312 : rxyz(2, il) = rxyz(2, i) + alat(2)
1183 488 : rxyz(3, il) = rxyz(3, i) - alat(3)
1184 : END DO
1185 :
1186 176 : in = icell(0, l1, ll2 - 1, 0)
1187 176 : icell(0, l1, -1, ll3) = in
1188 466 : DO ii = 1, in
1189 290 : i = icell(ii, l1, ll2 - 1, 0)
1190 290 : il = il + 1
1191 290 : IF (il > nn) CPABORT("enlarge laymx")
1192 290 : lay(il) = i
1193 290 : icell(ii, l1, -1, ll3) = il
1194 290 : rxyz(1, il) = rxyz(1, i)
1195 290 : rxyz(2, il) = rxyz(2, i) - alat(2)
1196 466 : rxyz(3, il) = rxyz(3, i) + alat(3)
1197 : END DO
1198 :
1199 176 : in = icell(0, l1, ll2 - 1, ll3 - 1)
1200 176 : icell(0, l1, -1, -1) = in
1201 638 : DO ii = 1, in
1202 440 : i = icell(ii, l1, ll2 - 1, ll3 - 1)
1203 440 : il = il + 1
1204 440 : IF (il > nn) CPABORT("enlarge laymx")
1205 440 : lay(il) = i
1206 440 : icell(ii, l1, -1, -1) = il
1207 440 : rxyz(1, il) = rxyz(1, i)
1208 440 : rxyz(2, il) = rxyz(2, i) - alat(2)
1209 616 : rxyz(3, il) = rxyz(3, i) - alat(3)
1210 : END DO
1211 :
1212 : END DO
1213 :
1214 : ! y axis
1215 198 : DO l2 = 0, ll2 - 1
1216 :
1217 176 : in = icell(0, 0, l2, 0)
1218 176 : icell(0, ll1, l2, ll3) = in
1219 546 : DO ii = 1, in
1220 370 : i = icell(ii, 0, l2, 0)
1221 370 : il = il + 1
1222 370 : IF (il > nn) CPABORT("enlarge laymx")
1223 370 : lay(il) = i
1224 370 : icell(ii, ll1, l2, ll3) = il
1225 370 : rxyz(1, il) = rxyz(1, i) + alat(1)
1226 370 : rxyz(2, il) = rxyz(2, i)
1227 546 : rxyz(3, il) = rxyz(3, i) + alat(3)
1228 : END DO
1229 :
1230 176 : in = icell(0, 0, l2, ll3 - 1)
1231 176 : icell(0, ll1, l2, -1) = in
1232 546 : DO ii = 1, in
1233 370 : i = icell(ii, 0, l2, ll3 - 1)
1234 370 : il = il + 1
1235 370 : IF (il > nn) CPABORT("enlarge laymx")
1236 370 : lay(il) = i
1237 370 : icell(ii, ll1, l2, -1) = il
1238 370 : rxyz(1, il) = rxyz(1, i) + alat(1)
1239 370 : rxyz(2, il) = rxyz(2, i)
1240 546 : rxyz(3, il) = rxyz(3, i) - alat(3)
1241 : END DO
1242 :
1243 176 : in = icell(0, ll1 - 1, l2, 0)
1244 176 : icell(0, -1, l2, ll3) = in
1245 542 : DO ii = 1, in
1246 366 : i = icell(ii, ll1 - 1, l2, 0)
1247 366 : il = il + 1
1248 366 : IF (il > nn) CPABORT("enlarge laymx")
1249 366 : lay(il) = i
1250 366 : icell(ii, -1, l2, ll3) = il
1251 366 : rxyz(1, il) = rxyz(1, i) - alat(1)
1252 366 : rxyz(2, il) = rxyz(2, i)
1253 542 : rxyz(3, il) = rxyz(3, i) + alat(3)
1254 : END DO
1255 :
1256 176 : in = icell(0, ll1 - 1, l2, ll3 - 1)
1257 176 : icell(0, -1, l2, -1) = in
1258 522 : DO ii = 1, in
1259 324 : i = icell(ii, ll1 - 1, l2, ll3 - 1)
1260 324 : il = il + 1
1261 324 : IF (il > nn) CPABORT("enlarge laymx")
1262 324 : lay(il) = i
1263 324 : icell(ii, -1, l2, -1) = il
1264 324 : rxyz(1, il) = rxyz(1, i) - alat(1)
1265 324 : rxyz(2, il) = rxyz(2, i)
1266 500 : rxyz(3, il) = rxyz(3, i) - alat(3)
1267 : END DO
1268 :
1269 : END DO
1270 :
1271 : ! z axis
1272 198 : DO l3 = 0, ll3 - 1
1273 :
1274 176 : in = icell(0, 0, 0, l3)
1275 176 : icell(0, ll1, ll2, l3) = in
1276 556 : DO ii = 1, in
1277 380 : i = icell(ii, 0, 0, l3)
1278 380 : il = il + 1
1279 380 : IF (il > nn) CPABORT("enlarge laymx")
1280 380 : lay(il) = i
1281 380 : icell(ii, ll1, ll2, l3) = il
1282 380 : rxyz(1, il) = rxyz(1, i) + alat(1)
1283 380 : rxyz(2, il) = rxyz(2, i) + alat(2)
1284 556 : rxyz(3, il) = rxyz(3, i)
1285 : END DO
1286 :
1287 176 : in = icell(0, ll1 - 1, 0, l3)
1288 176 : icell(0, -1, ll2, l3) = in
1289 546 : DO ii = 1, in
1290 370 : i = icell(ii, ll1 - 1, 0, l3)
1291 370 : il = il + 1
1292 370 : IF (il > nn) CPABORT("enlarge laymx")
1293 370 : lay(il) = i
1294 370 : icell(ii, -1, ll2, l3) = il
1295 370 : rxyz(1, il) = rxyz(1, i) - alat(1)
1296 370 : rxyz(2, il) = rxyz(2, i) + alat(2)
1297 546 : rxyz(3, il) = rxyz(3, i)
1298 : END DO
1299 :
1300 176 : in = icell(0, 0, ll2 - 1, l3)
1301 176 : icell(0, ll1, -1, l3) = in
1302 522 : DO ii = 1, in
1303 346 : i = icell(ii, 0, ll2 - 1, l3)
1304 346 : il = il + 1
1305 346 : IF (il > nn) CPABORT("enlarge laymx")
1306 346 : lay(il) = i
1307 346 : icell(ii, ll1, -1, l3) = il
1308 346 : rxyz(1, il) = rxyz(1, i) + alat(1)
1309 346 : rxyz(2, il) = rxyz(2, i) - alat(2)
1310 522 : rxyz(3, il) = rxyz(3, i)
1311 : END DO
1312 :
1313 176 : in = icell(0, ll1 - 1, ll2 - 1, l3)
1314 176 : icell(0, -1, -1, l3) = in
1315 532 : DO ii = 1, in
1316 334 : i = icell(ii, ll1 - 1, ll2 - 1, l3)
1317 334 : il = il + 1
1318 334 : IF (il > nn) CPABORT("enlarge laymx")
1319 334 : lay(il) = i
1320 334 : icell(ii, -1, -1, l3) = il
1321 334 : rxyz(1, il) = rxyz(1, i) - alat(1)
1322 334 : rxyz(2, il) = rxyz(2, i) - alat(2)
1323 510 : rxyz(3, il) = rxyz(3, i)
1324 : END DO
1325 :
1326 : END DO
1327 :
1328 : ! corners
1329 22 : in = icell(0, 0, 0, 0)
1330 22 : icell(0, ll1, ll2, ll3) = in
1331 92 : DO ii = 1, in
1332 70 : i = icell(ii, 0, 0, 0)
1333 70 : il = il + 1
1334 70 : IF (il > nn) CPABORT("enlarge laymx")
1335 70 : lay(il) = i
1336 70 : icell(ii, ll1, ll2, ll3) = il
1337 70 : rxyz(1, il) = rxyz(1, i) + alat(1)
1338 70 : rxyz(2, il) = rxyz(2, i) + alat(2)
1339 92 : rxyz(3, il) = rxyz(3, i) + alat(3)
1340 : END DO
1341 :
1342 22 : in = icell(0, ll1 - 1, 0, 0)
1343 22 : icell(0, -1, ll2, ll3) = in
1344 42 : DO ii = 1, in
1345 20 : i = icell(ii, ll1 - 1, 0, 0)
1346 20 : il = il + 1
1347 20 : IF (il > nn) CPABORT("enlarge laymx")
1348 20 : lay(il) = i
1349 20 : icell(ii, -1, ll2, ll3) = il
1350 20 : rxyz(1, il) = rxyz(1, i) - alat(1)
1351 20 : rxyz(2, il) = rxyz(2, i) + alat(2)
1352 42 : rxyz(3, il) = rxyz(3, i) + alat(3)
1353 : END DO
1354 :
1355 22 : in = icell(0, 0, ll2 - 1, 0)
1356 22 : icell(0, ll1, -1, ll3) = in
1357 66 : DO ii = 1, in
1358 44 : i = icell(ii, 0, ll2 - 1, 0)
1359 44 : il = il + 1
1360 44 : IF (il > nn) CPABORT("enlarge laymx")
1361 44 : lay(il) = i
1362 44 : icell(ii, ll1, -1, ll3) = il
1363 44 : rxyz(1, il) = rxyz(1, i) + alat(1)
1364 44 : rxyz(2, il) = rxyz(2, i) - alat(2)
1365 66 : rxyz(3, il) = rxyz(3, i) + alat(3)
1366 : END DO
1367 :
1368 22 : in = icell(0, ll1 - 1, ll2 - 1, 0)
1369 22 : icell(0, -1, -1, ll3) = in
1370 86 : DO ii = 1, in
1371 64 : i = icell(ii, ll1 - 1, ll2 - 1, 0)
1372 64 : il = il + 1
1373 64 : IF (il > nn) CPABORT("enlarge laymx")
1374 64 : lay(il) = i
1375 64 : icell(ii, -1, -1, ll3) = il
1376 64 : rxyz(1, il) = rxyz(1, i) - alat(1)
1377 64 : rxyz(2, il) = rxyz(2, i) - alat(2)
1378 86 : rxyz(3, il) = rxyz(3, i) + alat(3)
1379 : END DO
1380 :
1381 22 : in = icell(0, 0, 0, ll3 - 1)
1382 22 : icell(0, ll1, ll2, -1) = in
1383 66 : DO ii = 1, in
1384 44 : i = icell(ii, 0, 0, ll3 - 1)
1385 44 : il = il + 1
1386 44 : IF (il > nn) CPABORT("enlarge laymx")
1387 44 : lay(il) = i
1388 44 : icell(ii, ll1, ll2, -1) = il
1389 44 : rxyz(1, il) = rxyz(1, i) + alat(1)
1390 44 : rxyz(2, il) = rxyz(2, i) + alat(2)
1391 66 : rxyz(3, il) = rxyz(3, i) - alat(3)
1392 : END DO
1393 :
1394 22 : in = icell(0, ll1 - 1, 0, ll3 - 1)
1395 22 : icell(0, -1, ll2, -1) = in
1396 50 : DO ii = 1, in
1397 28 : i = icell(ii, ll1 - 1, 0, ll3 - 1)
1398 28 : il = il + 1
1399 28 : IF (il > nn) CPABORT("enlarge laymx")
1400 28 : lay(il) = i
1401 28 : icell(ii, -1, ll2, -1) = il
1402 28 : rxyz(1, il) = rxyz(1, i) - alat(1)
1403 28 : rxyz(2, il) = rxyz(2, i) + alat(2)
1404 50 : rxyz(3, il) = rxyz(3, i) - alat(3)
1405 : END DO
1406 :
1407 22 : in = icell(0, 0, ll2 - 1, ll3 - 1)
1408 22 : icell(0, ll1, -1, -1) = in
1409 86 : DO ii = 1, in
1410 64 : i = icell(ii, 0, ll2 - 1, ll3 - 1)
1411 64 : il = il + 1
1412 64 : IF (il > nn) CPABORT("enlarge laymx")
1413 64 : lay(il) = i
1414 64 : icell(ii, ll1, -1, -1) = il
1415 64 : rxyz(1, il) = rxyz(1, i) + alat(1)
1416 64 : rxyz(2, il) = rxyz(2, i) - alat(2)
1417 86 : rxyz(3, il) = rxyz(3, i) - alat(3)
1418 : END DO
1419 :
1420 22 : in = icell(0, ll1 - 1, ll2 - 1, ll3 - 1)
1421 22 : icell(0, -1, -1, -1) = in
1422 62 : DO ii = 1, in
1423 40 : i = icell(ii, ll1 - 1, ll2 - 1, ll3 - 1)
1424 40 : il = il + 1
1425 40 : IF (il > nn) CPABORT("enlarge laymx")
1426 40 : lay(il) = i
1427 40 : icell(ii, -1, -1, -1) = il
1428 40 : rxyz(1, il) = rxyz(1, i) - alat(1)
1429 40 : rxyz(2, il) = rxyz(2, i) - alat(2)
1430 62 : rxyz(3, il) = rxyz(3, i) - alat(3)
1431 : END DO
1432 :
1433 66 : ALLOCATE (lsta(2, nat))
1434 22 : nnbrx = 12
1435 0 : loop_nnbrx: DO
1436 110 : ALLOCATE (lstb(nnbrx*nat), rel(5, nnbrx*nat))
1437 :
1438 22 : indlstx = 0
1439 :
1440 : !$OMP PARALLEL DEFAULT(NONE) &
1441 : !$OMP PRIVATE(iat,cut2,iam,ii,indlst,l1,l2,l3,myspace,npr) &
1442 : !$OMP SHARED (indlstx,nat,nn,nnbrx,ncx,ll1,ll2,ll3,icell,lsta,lstb,lay, &
1443 22 : !$OMP rel,rxyz,cut,myspaceout)
1444 :
1445 : npr = 1
1446 : !$ npr = omp_get_num_threads()
1447 : iam = 0
1448 : !$ iam = omp_get_thread_num()
1449 :
1450 : cut2 = cut**2
1451 : ! assign contiguous portions of the arrays lstb and rel to the threads
1452 : myspace = (nat*nnbrx)/npr
1453 : IF (iam == 0) myspaceout = myspace
1454 : ! Verlet list, relative positions
1455 : indlst = 0
1456 : loop_l3: DO l3 = 0, ll3 - 1
1457 : loop_l2: DO l2 = 0, ll2 - 1
1458 : loop_l1: DO l1 = 0, ll1 - 1
1459 : loop_ii: DO ii = 1, icell(0, l1, l2, l3)
1460 : iat = icell(ii, l1, l2, l3)
1461 : IF (((iat - 1)*npr)/nat == iam) THEN
1462 : ! write(*,*) 'sublstiat:iam,iat',iam,iat
1463 : lsta(1, iat) = iam*myspace + indlst + 1
1464 : CALL sublstiat_b(iat, nn, ncx, ll1, ll2, ll3, l1, l2, l3, myspace, &
1465 : rxyz, icell, lstb(iam*myspace + 1), lay, &
1466 : rel(1, iam*myspace + 1), cut2, indlst)
1467 : lsta(2, iat) = iam*myspace + indlst
1468 : ! write(*,'(a,4(x,i3),100(x,i2))') &
1469 : ! 'iam,iat,lsta',iam,iat,lsta(1,iat),lsta(2,iat), &
1470 : ! (lstb(j),j=lsta(1,iat),lsta(2,iat))
1471 : END IF
1472 : END DO loop_ii
1473 : END DO loop_l1
1474 : END DO loop_l2
1475 : END DO loop_l3
1476 : !$OMP ATOMIC UPDATE
1477 : indlstx = MAX(indlstx, indlst)
1478 : !$OMP END ATOMIC
1479 : !$OMP END PARALLEL
1480 :
1481 22 : IF (indlstx >= myspaceout) THEN
1482 0 : WRITE (10, *) count, 'NNBRX too small', nnbrx
1483 0 : DEALLOCATE (lstb, rel)
1484 0 : nnbrx = 3*nnbrx/2
1485 : CYCLE loop_nnbrx
1486 : END IF
1487 : EXIT loop_nnbrx
1488 : END DO loop_nnbrx
1489 :
1490 22 : istopg = 0
1491 :
1492 : !$OMP PARALLEL DEFAULT(NONE) &
1493 : !$OMP PRIVATE(iam,npr,iat,iat1,iat2,lot,istop,tcoord,tcoord2, &
1494 : !$OMP tener,tener2,txyz,s2,s3,sz,num2,num3,numz,max_nbrs) &
1495 22 : !$OMP SHARED (nat,nnbrx,lsta,lstb,rel,ener,ener2,fxyz,coord,coord2,istopg)
1496 :
1497 : npr = 1
1498 : !$ npr = omp_get_num_threads()
1499 : iam = 0
1500 : !$ iam = omp_get_thread_num()
1501 :
1502 : max_nbrs = 30
1503 :
1504 : IF (npr /= 1) THEN
1505 : ! PARALLEL CASE
1506 : ! create temporary private scalars for reduction sum on energies and
1507 : ! temporary private array for reduction sum on forces
1508 : !$OMP CRITICAL(omp_eip_bazant_silicon)
1509 : ALLOCATE (txyz(3, nat), s2(max_nbrs, 8), s3(max_nbrs, 7), sz(max_nbrs, 6), &
1510 : num2(max_nbrs), num3(max_nbrs), numz(max_nbrs))
1511 : !$OMP END CRITICAL(omp_eip_bazant_silicon)
1512 : IF (iam == 0) THEN
1513 : ener = 0.e0_dp
1514 : ener2 = 0.e0_dp
1515 : coord = 0.e0_dp
1516 : coord2 = 0.e0_dp
1517 : END IF
1518 : !$OMP DO
1519 : DO iat = 1, nat
1520 : fxyz(1, iat) = 0.e0_dp
1521 : fxyz(2, iat) = 0.e0_dp
1522 : fxyz(3, iat) = 0.e0_dp
1523 : END DO
1524 : !$OMP BARRIER
1525 :
1526 : ! Each thread treats at most lot atoms
1527 : lot = INT(REAL(nat, KIND=dp)/REAL(npr, KIND=dp) + .999999999999e0_dp)
1528 : iat1 = iam*lot + 1
1529 : iat2 = MIN((iam + 1)*lot, nat)
1530 : ! write(*,*) 'subfeniat:iat1,iat2,iam',iat1,iat2,iam
1531 : CALL subfeniat_b(iat1, iat2, nat, lsta, lstb, rel, tener, tener2, &
1532 : tcoord, tcoord2, nnbrx, txyz, max_nbrs, istop, &
1533 : s2(1, 1), s2(1, 2), s2(1, 3), s2(1, 4), s2(1, 5), s2(1, 6), s2(1, 7), s2(1, 8), &
1534 : num2, s3(1, 1), s3(1, 2), s3(1, 3), s3(1, 4), s3(1, 5), s3(1, 6), s3(1, 7), &
1535 : num3, sz(1, 1), sz(1, 2), sz(1, 3), sz(1, 4), sz(1, 5), sz(1, 6), numz)
1536 :
1537 : !$OMP CRITICAL(omp_eip_bazant_silicon)
1538 : ener = ener + tener
1539 : ener2 = ener2 + tener2
1540 : coord = coord + tcoord
1541 : coord2 = coord2 + tcoord2
1542 : istopg = istopg + istop
1543 : DO iat = 1, nat
1544 : fxyz(1, iat) = fxyz(1, iat) + txyz(1, iat)
1545 : fxyz(2, iat) = fxyz(2, iat) + txyz(2, iat)
1546 : fxyz(3, iat) = fxyz(3, iat) + txyz(3, iat)
1547 : END DO
1548 : DEALLOCATE (txyz, s2, s3, sz, num2, num3, numz)
1549 : !$OMP END CRITICAL(omp_eip_bazant_silicon)
1550 :
1551 : ELSE
1552 : ! SERIAL CASE
1553 : iat1 = 1
1554 : iat2 = nat
1555 : ALLOCATE (s2(max_nbrs, 8), s3(max_nbrs, 7), sz(max_nbrs, 6), &
1556 : num2(max_nbrs), num3(max_nbrs), numz(max_nbrs))
1557 : CALL subfeniat_b(iat1, iat2, nat, lsta, lstb, rel, ener, ener2, &
1558 : coord, coord2, nnbrx, fxyz, max_nbrs, istopg, &
1559 : s2(1, 1), s2(1, 2), s2(1, 3), s2(1, 4), s2(1, 5), s2(1, 6), s2(1, 7), s2(1, 8), &
1560 : num2, s3(1, 1), s3(1, 2), s3(1, 3), s3(1, 4), s3(1, 5), s3(1, 6), s3(1, 7), &
1561 : num3, sz(1, 1), sz(1, 2), sz(1, 3), sz(1, 4), sz(1, 5), sz(1, 6), numz)
1562 : DEALLOCATE (s2, s3, sz, num2, num3, numz)
1563 :
1564 : END IF
1565 : !$OMP END PARALLEL
1566 :
1567 : ! write(*,*) 'ener,norm force', &
1568 : ! ener,DNRM2(3*nat,fxyz,1)
1569 22 : IF (istopg > 0) CPABORT("DIMENSION ERROR (see WARNING above)")
1570 22 : ener_var = ener2/nat - (ener/nat)**2
1571 22 : coord = coord/nat
1572 22 : coord_var = coord2/nat - coord**2
1573 :
1574 22 : DEALLOCATE (rxyz, icell, lay, lsta, lstb, rel)
1575 :
1576 22 : END SUBROUTINE eip_bazant_silicon
1577 :
1578 : ! **************************************************************************************************
1579 : !> \brief ...
1580 : !> \param iat1 ...
1581 : !> \param iat2 ...
1582 : !> \param nat ...
1583 : !> \param lsta ...
1584 : !> \param lstb ...
1585 : !> \param rel ...
1586 : !> \param ener ...
1587 : !> \param ener2 ...
1588 : !> \param coord ...
1589 : !> \param coord2 ...
1590 : !> \param nnbrx ...
1591 : !> \param ff ...
1592 : !> \param max_nbrs ...
1593 : !> \param istop ...
1594 : !> \param s2_t0 ...
1595 : !> \param s2_t1 ...
1596 : !> \param s2_t2 ...
1597 : !> \param s2_t3 ...
1598 : !> \param s2_dx ...
1599 : !> \param s2_dy ...
1600 : !> \param s2_dz ...
1601 : !> \param s2_r ...
1602 : !> \param num2 ...
1603 : !> \param s3_g ...
1604 : !> \param s3_dg ...
1605 : !> \param s3_rinv ...
1606 : !> \param s3_dx ...
1607 : !> \param s3_dy ...
1608 : !> \param s3_dz ...
1609 : !> \param s3_r ...
1610 : !> \param num3 ...
1611 : !> \param sz_df ...
1612 : !> \param sz_sum ...
1613 : !> \param sz_dx ...
1614 : !> \param sz_dy ...
1615 : !> \param sz_dz ...
1616 : !> \param sz_r ...
1617 : !> \param numz ...
1618 : ! **************************************************************************************************
1619 22 : SUBROUTINE subfeniat_b(iat1, iat2, nat, lsta, lstb, rel, ener, ener2, &
1620 22 : coord, coord2, nnbrx, ff, max_nbrs, istop, &
1621 22 : s2_t0, s2_t1, s2_t2, s2_t3, s2_dx, s2_dy, s2_dz, s2_r, &
1622 22 : num2, s3_g, s3_dg, s3_rinv, s3_dx, s3_dy, s3_dz, s3_r, &
1623 22 : num3, sz_df, sz_sum, sz_dx, sz_dy, sz_dz, sz_r, numz)
1624 : ! This subroutine is a modification of a subroutine that is available at
1625 : ! http://www-math.mit.edu/~bazant/EDIP/ and for which Martin Z. Bazant
1626 : ! and Harvard University have a 1997 copyright.
1627 : ! The modifications were done by S. Goedecker on April 10, 2002.
1628 : ! The routines are included with the permission of M. Bazant into this package.
1629 :
1630 : ! ------------------------- VARIABLE DECLARATIONS -------------------------
1631 : INTEGER :: iat1, iat2, nat, lsta(2, nat)
1632 : REAL(KIND=dp) :: ener, ener2, coord, coord2
1633 : INTEGER :: nnbrx
1634 : REAL(KIND=dp) :: rel(5, nnbrx*nat)
1635 : INTEGER :: lstb(nnbrx*nat)
1636 : REAL(KIND=dp) :: ff(3, nat)
1637 : INTEGER :: max_nbrs, istop
1638 : REAL(KIND=dp) :: s2_t0(max_nbrs), s2_t1(max_nbrs), s2_t2(max_nbrs), s2_t3(max_nbrs), &
1639 : s2_dx(max_nbrs), s2_dy(max_nbrs), s2_dz(max_nbrs), s2_r(max_nbrs)
1640 : INTEGER :: num2(max_nbrs)
1641 : REAL(KIND=dp) :: s3_g(max_nbrs), s3_dg(max_nbrs), s3_rinv(max_nbrs), s3_dx(max_nbrs), &
1642 : s3_dy(max_nbrs), s3_dz(max_nbrs), s3_r(max_nbrs)
1643 : INTEGER :: num3(max_nbrs)
1644 : REAL(KIND=dp) :: sz_df(max_nbrs), sz_sum(max_nbrs), &
1645 : sz_dx(max_nbrs), sz_dy(max_nbrs), &
1646 : sz_dz(max_nbrs), sz_r(max_nbrs)
1647 : INTEGER :: numz(max_nbrs)
1648 :
1649 : INTEGER :: i, j, k, l, n, n2, n3, nj, nk, nl, nz
1650 : REAL(KIND=dp) :: bmc, cmbinv, coord_iat, dEdrl, dEdrlx, dEdrly, dEdrlz, den, dhdl, dHdx, &
1651 : dp1, dtau, dV2dZ, dV2ijx, dV2ijy, dV2ijz, dV2j, dV3dZ, dV3l, dV3ljx, dV3ljy, dV3ljz, &
1652 : dV3lkx, dV3lky, dV3lkz, dV3rij, dV3rijx, dV3rijy, dV3rijz, dV3rik, dV3rikx, dV3riky, &
1653 : dV3rikz, dwinv, dx, dxdZ, dy, dz, ener_iat, fjx, fjy, fjz, fkx, fky, fkz, fZ, H, lcos, &
1654 : muhalf, par_a, par_alp, par_b, par_bet, par_bg, par_c, par_cap_A, par_cap_B, par_delta, &
1655 : par_eta, par_gam, par_lam, par_mu, par_palp, par_Qo, par_rh, par_sig, pZ, Qort, r, rinv, &
1656 : rmainv, rmbinv, tau, temp0, temp1, u1, u2, u3, u4, u5, winv, x, xarg
1657 : REAL(KIND=dp) :: xinv, xinv3, Z
1658 :
1659 : ! size of s2[]
1660 : ! atom ID numbers for s2[]
1661 : ! size of s3[]
1662 : ! atom ID numbers for s3[]
1663 : ! size of sz[]
1664 : ! atom ID numbers for sz[]
1665 : ! indices for the store arrays
1666 : ! EDIP parameters
1667 :
1668 22 : par_cap_A = 5.6714030e0_dp
1669 22 : par_cap_B = 2.0002804e0_dp
1670 22 : par_rh = 1.2085196e0_dp
1671 22 : par_a = 3.1213820e0_dp
1672 22 : par_sig = 0.5774108e0_dp
1673 22 : par_lam = 1.4533108e0_dp
1674 22 : par_gam = 1.1247945e0_dp
1675 22 : par_b = 3.1213820e0_dp
1676 22 : par_c = 2.5609104e0_dp
1677 22 : par_delta = 78.7590539e0_dp
1678 22 : par_mu = 0.6966326e0_dp
1679 22 : par_Qo = 312.1341346e0_dp
1680 22 : par_palp = 1.4074424e0_dp
1681 22 : par_bet = 0.0070975e0_dp
1682 22 : par_alp = 3.1083847e0_dp
1683 :
1684 22 : u1 = -0.165799e0_dp
1685 22 : u2 = 32.557e0_dp
1686 22 : u3 = 0.286198e0_dp
1687 22 : u4 = 0.66e0_dp
1688 :
1689 22 : par_bg = par_a
1690 22 : par_eta = par_delta/par_Qo
1691 :
1692 22022 : DO i = 1, nat
1693 22000 : ff(1, i) = 0.0e0_dp
1694 22000 : ff(2, i) = 0.0e0_dp
1695 22022 : ff(3, i) = 0.0e0_dp
1696 : END DO
1697 :
1698 22 : coord = 0.e0_dp
1699 22 : coord2 = 0.e0_dp
1700 22 : ener = 0.e0_dp
1701 22 : ener2 = 0.e0_dp
1702 22 : istop = 0
1703 :
1704 : ! COMBINE COEFFICIENTS
1705 :
1706 22 : Qort = SQRT(par_Qo)
1707 22 : muhalf = par_mu*0.5e0_dp
1708 22 : u5 = u2*u4
1709 22 : bmc = par_b - par_c
1710 22 : cmbinv = 1.0e0_dp/(par_c - par_b)
1711 :
1712 : ! --- LEVEL 1: OUTER LOOP OVER ATOMS ---
1713 :
1714 22022 : atoms: DO i = iat1, iat2
1715 :
1716 : ! RESET COORDINATION AND NEIGHBOR NUMBERS
1717 :
1718 22000 : coord_iat = 0.e0_dp
1719 22000 : ener_iat = 0.e0_dp
1720 22000 : Z = 0.0e0_dp
1721 22000 : n2 = 1
1722 22000 : n3 = 1
1723 22000 : nz = 1
1724 :
1725 : ! --- LEVEL 2: LOOP PREPASS OVER PAIRS ---
1726 :
1727 110000 : DO n = lsta(1, i), lsta(2, i)
1728 88000 : j = lstb(n)
1729 :
1730 : ! PARTS OF TWO-BODY INTERACTION r<par_a
1731 :
1732 88000 : num2(n2) = j
1733 88000 : dx = -rel(1, n)
1734 88000 : dy = -rel(2, n)
1735 88000 : dz = -rel(3, n)
1736 88000 : r = rel(4, n)
1737 88000 : rinv = rel(5, n)
1738 88000 : rmainv = 1.e0_dp/(r - par_a)
1739 88000 : s2_t0(n2) = par_cap_A*EXP(par_sig*rmainv)
1740 88000 : s2_t1(n2) = (par_cap_B*rinv)**par_rh
1741 88000 : s2_t2(n2) = par_rh*rinv
1742 88000 : s2_t3(n2) = par_sig*rmainv*rmainv
1743 88000 : s2_dx(n2) = dx
1744 88000 : s2_dy(n2) = dy
1745 88000 : s2_dz(n2) = dz
1746 88000 : s2_r(n2) = r
1747 88000 : n2 = n2 + 1
1748 88000 : IF (n2 > max_nbrs) THEN
1749 0 : WRITE (*, *) 'WARNING enlarge max_nbrs'
1750 0 : istop = 1
1751 0 : RETURN
1752 : END IF
1753 :
1754 : ! coordination number calculated with soft cutoff between first
1755 : ! nearest neighbor and midpoint of first and second nearest neighbor
1756 88000 : IF (r <= 2.36e0_dp) THEN
1757 62860 : coord_iat = coord_iat + 1.e0_dp
1758 25140 : ELSE IF (r >= 3.12e0_dp) THEN
1759 : ELSE
1760 25140 : xarg = (r - 2.36e0_dp)*(1.e0_dp/(3.12e0_dp - 2.36e0_dp))
1761 25140 : coord_iat = coord_iat + (2*xarg + 1.e0_dp)*(xarg - 1.e0_dp)**2
1762 : END IF
1763 :
1764 : ! RADIAL PARTS OF THREE-BODY INTERACTION r<par_b
1765 :
1766 110000 : IF (r < par_bg) THEN
1767 :
1768 88000 : num3(n3) = j
1769 88000 : rmbinv = 1.e0_dp/(r - par_bg)
1770 88000 : temp1 = par_gam*rmbinv
1771 88000 : temp0 = EXP(temp1)
1772 88000 : s3_g(n3) = temp0
1773 88000 : s3_dg(n3) = -rmbinv*temp1*temp0
1774 88000 : s3_dx(n3) = dx
1775 88000 : s3_dy(n3) = dy
1776 88000 : s3_dz(n3) = dz
1777 88000 : s3_rinv(n3) = rinv
1778 88000 : s3_r(n3) = r
1779 88000 : n3 = n3 + 1
1780 88000 : IF (n3 > max_nbrs) THEN
1781 0 : WRITE (*, *) 'WARNING enlarge max_nbrs'
1782 0 : istop = 1
1783 0 : RETURN
1784 : END IF
1785 :
1786 : ! COORDINATION AND NEIGHBOR FUNCTION par_c<r<par_b
1787 :
1788 : IF (r < par_b) THEN
1789 88000 : IF (r < par_c) THEN
1790 88000 : Z = Z + 1.e0_dp
1791 : ELSE
1792 0 : xinv = bmc/(r - par_c)
1793 0 : xinv3 = xinv*xinv*xinv
1794 0 : den = 1.e0_dp/(1 - xinv3)
1795 0 : temp1 = par_alp*den
1796 0 : fZ = EXP(temp1)
1797 0 : Z = Z + fZ
1798 0 : numz(nz) = j
1799 0 : sz_df(nz) = fZ*temp1*den*3.e0_dp*xinv3*xinv*cmbinv
1800 : ! df/dr
1801 0 : sz_dx(nz) = dx
1802 0 : sz_dy(nz) = dy
1803 0 : sz_dz(nz) = dz
1804 0 : sz_r(nz) = r
1805 0 : nz = nz + 1
1806 0 : IF (nz > max_nbrs) THEN
1807 0 : WRITE (*, *) 'WARNING enlarge max_nbrs'
1808 0 : istop = 1
1809 0 : RETURN
1810 : END IF
1811 : END IF
1812 : ! r < par_C
1813 : END IF
1814 : ! r < par_b
1815 : END IF
1816 : ! r < par_bg
1817 : END DO
1818 :
1819 : ! ZERO ACCUMULATION ARRAY FOR ENVIRONMENT FORCES
1820 :
1821 22000 : DO nl = 1, nz - 1
1822 22000 : sz_sum(nl) = 0.e0_dp
1823 : END DO
1824 :
1825 : ! ENVIRONMENT-DEPENDENCE OF PAIR INTERACTION
1826 :
1827 22000 : temp0 = par_bet*Z
1828 22000 : pZ = par_palp*EXP(-temp0*Z)
1829 : ! bond order
1830 22000 : dp1 = -2.e0_dp*temp0*pZ
1831 : ! derivative of bond order
1832 :
1833 : ! --- LEVEL 2: LOOP FOR PAIR INTERACTIONS ---
1834 :
1835 110000 : DO nj = 1, n2 - 1
1836 :
1837 88000 : temp0 = s2_t1(nj) - pZ
1838 :
1839 : ! two-body energy V2(rij,Z)
1840 :
1841 88000 : ener_iat = ener_iat + temp0*s2_t0(nj)
1842 :
1843 : ! two-body forces
1844 :
1845 88000 : dV2j = -s2_t0(nj)*(s2_t1(nj)*s2_t2(nj) + temp0*s2_t3(nj))
1846 : ! dV2/dr
1847 88000 : dV2ijx = dV2j*s2_dx(nj)
1848 88000 : dV2ijy = dV2j*s2_dy(nj)
1849 88000 : dV2ijz = dV2j*s2_dz(nj)
1850 88000 : ff(1, i) = ff(1, i) + dV2ijx
1851 88000 : ff(2, i) = ff(2, i) + dV2ijy
1852 88000 : ff(3, i) = ff(3, i) + dV2ijz
1853 88000 : j = num2(nj)
1854 88000 : ff(1, j) = ff(1, j) - dV2ijx
1855 88000 : ff(2, j) = ff(2, j) - dV2ijy
1856 88000 : ff(3, j) = ff(3, j) - dV2ijz
1857 :
1858 : ! --- LEVEL 3: LOOP FOR PAIR COORDINATION FORCES ---
1859 :
1860 88000 : dV2dZ = -dp1*s2_t0(nj)
1861 110000 : DO nl = 1, nz - 1
1862 88000 : sz_sum(nl) = sz_sum(nl) + dV2dZ
1863 : END DO
1864 :
1865 : END DO
1866 :
1867 : ! COORDINATION-DEPENDENCE OF THREE-BODY INTERACTION
1868 :
1869 22000 : winv = Qort*EXP(-muhalf*Z)
1870 : ! inverse width of angular function
1871 22000 : dwinv = -muhalf*winv
1872 : ! its derivative
1873 22000 : temp0 = EXP(-u4*Z)
1874 22000 : tau = u1 + u2*temp0*(u3 - temp0)
1875 : ! -cosine of angular minimum
1876 22000 : dtau = u5*temp0*(2*temp0 - u3)
1877 : ! its derivative
1878 :
1879 : ! --- LEVEL 2: FIRST LOOP FOR THREE-BODY INTERACTIONS ---
1880 :
1881 88000 : DO nj = 1, n3 - 2
1882 :
1883 66000 : j = num3(nj)
1884 :
1885 : ! --- LEVEL 3: SECOND LOOP FOR THREE-BODY INTERACTIONS ---
1886 :
1887 220000 : DO nk = nj + 1, n3 - 1
1888 :
1889 132000 : k = num3(nk)
1890 :
1891 : ! angular function h(l,Z)
1892 :
1893 132000 : lcos = s3_dx(nj)*s3_dx(nk) + s3_dy(nj)*s3_dy(nk) + s3_dz(nj)*s3_dz(nk)
1894 132000 : x = (lcos + tau)*winv
1895 132000 : temp0 = EXP(-x*x)
1896 :
1897 132000 : H = par_lam*(1 - temp0 + par_eta*x*x)
1898 132000 : dHdx = 2*par_lam*x*(temp0 + par_eta)
1899 :
1900 132000 : dhdl = dHdx*winv
1901 :
1902 : ! three-body energy
1903 :
1904 132000 : temp1 = s3_g(nj)*s3_g(nk)
1905 132000 : ener_iat = ener_iat + temp1*H
1906 :
1907 : ! (-) radial force on atom j
1908 :
1909 132000 : dV3rij = s3_dg(nj)*s3_g(nk)*H
1910 132000 : dV3rijx = dV3rij*s3_dx(nj)
1911 132000 : dV3rijy = dV3rij*s3_dy(nj)
1912 132000 : dV3rijz = dV3rij*s3_dz(nj)
1913 132000 : fjx = dV3rijx
1914 132000 : fjy = dV3rijy
1915 132000 : fjz = dV3rijz
1916 :
1917 : ! (-) radial force on atom k
1918 :
1919 132000 : dV3rik = s3_g(nj)*s3_dg(nk)*H
1920 132000 : dV3rikx = dV3rik*s3_dx(nk)
1921 132000 : dV3riky = dV3rik*s3_dy(nk)
1922 132000 : dV3rikz = dV3rik*s3_dz(nk)
1923 132000 : fkx = dV3rikx
1924 132000 : fky = dV3riky
1925 132000 : fkz = dV3rikz
1926 :
1927 : ! (-) angular force on j
1928 :
1929 132000 : dV3l = temp1*dhdl
1930 132000 : dV3ljx = dV3l*(s3_dx(nk) - lcos*s3_dx(nj))*s3_rinv(nj)
1931 132000 : dV3ljy = dV3l*(s3_dy(nk) - lcos*s3_dy(nj))*s3_rinv(nj)
1932 132000 : dV3ljz = dV3l*(s3_dz(nk) - lcos*s3_dz(nj))*s3_rinv(nj)
1933 132000 : fjx = fjx + dV3ljx
1934 132000 : fjy = fjy + dV3ljy
1935 132000 : fjz = fjz + dV3ljz
1936 :
1937 : ! (-) angular force on k
1938 :
1939 132000 : dV3lkx = dV3l*(s3_dx(nj) - lcos*s3_dx(nk))*s3_rinv(nk)
1940 132000 : dV3lky = dV3l*(s3_dy(nj) - lcos*s3_dy(nk))*s3_rinv(nk)
1941 132000 : dV3lkz = dV3l*(s3_dz(nj) - lcos*s3_dz(nk))*s3_rinv(nk)
1942 132000 : fkx = fkx + dV3lkx
1943 132000 : fky = fky + dV3lky
1944 132000 : fkz = fkz + dV3lkz
1945 :
1946 : ! apply radial + angular forces to i, j, k
1947 :
1948 132000 : ff(1, j) = ff(1, j) - fjx
1949 132000 : ff(2, j) = ff(2, j) - fjy
1950 132000 : ff(3, j) = ff(3, j) - fjz
1951 132000 : ff(1, k) = ff(1, k) - fkx
1952 132000 : ff(2, k) = ff(2, k) - fky
1953 132000 : ff(3, k) = ff(3, k) - fkz
1954 132000 : ff(1, i) = ff(1, i) + fjx + fkx
1955 132000 : ff(2, i) = ff(2, i) + fjy + fky
1956 132000 : ff(3, i) = ff(3, i) + fjz + fkz
1957 :
1958 : ! prefactor for 4-body forces from coordination
1959 132000 : dxdZ = dwinv*(lcos + tau) + winv*dtau
1960 132000 : dV3dZ = temp1*dHdx*dxdZ
1961 :
1962 : ! --- LEVEL 4: LOOP FOR THREE-BODY COORDINATION FORCES ---
1963 :
1964 198000 : DO nl = 1, nz - 1
1965 132000 : sz_sum(nl) = sz_sum(nl) + dV3dZ
1966 : END DO
1967 : END DO
1968 : END DO
1969 :
1970 : ! --- LEVEL 2: LOOP TO APPLY COORDINATION FORCES ---
1971 :
1972 22000 : DO nl = 1, nz - 1
1973 :
1974 0 : dEdrl = sz_sum(nl)*sz_df(nl)
1975 0 : dEdrlx = dEdrl*sz_dx(nl)
1976 0 : dEdrly = dEdrl*sz_dy(nl)
1977 0 : dEdrlz = dEdrl*sz_dz(nl)
1978 0 : ff(1, i) = ff(1, i) + dEdrlx
1979 0 : ff(2, i) = ff(2, i) + dEdrly
1980 0 : ff(3, i) = ff(3, i) + dEdrlz
1981 0 : l = numz(nl)
1982 0 : ff(1, l) = ff(1, l) - dEdrlx
1983 0 : ff(2, l) = ff(2, l) - dEdrly
1984 22000 : ff(3, l) = ff(3, l) - dEdrlz
1985 :
1986 : END DO
1987 :
1988 22000 : coord = coord + coord_iat
1989 22000 : coord2 = coord2 + coord_iat**2
1990 22000 : ener = ener + ener_iat
1991 22022 : ener2 = ener2 + ener_iat**2
1992 :
1993 : END DO atoms
1994 :
1995 : RETURN
1996 : END SUBROUTINE subfeniat_b
1997 :
1998 : ! **************************************************************************************************
1999 : !> \brief ...
2000 : !> \param iat ...
2001 : !> \param nn ...
2002 : !> \param ncx ...
2003 : !> \param ll1 ...
2004 : !> \param ll2 ...
2005 : !> \param ll3 ...
2006 : !> \param l1 ...
2007 : !> \param l2 ...
2008 : !> \param l3 ...
2009 : !> \param myspace ...
2010 : !> \param rxyz ...
2011 : !> \param icell ...
2012 : !> \param lstb ...
2013 : !> \param lay ...
2014 : !> \param rel ...
2015 : !> \param cut2 ...
2016 : !> \param indlst ...
2017 : ! **************************************************************************************************
2018 22000 : SUBROUTINE sublstiat_b(iat, nn, ncx, ll1, ll2, ll3, l1, l2, l3, myspace, &
2019 22000 : rxyz, icell, lstb, lay, rel, cut2, indlst)
2020 : ! finds the neighbours of atom iat (specified by lsta and lstb) and and
2021 : ! the relative position rel of iat with respect to these neighbours
2022 : INTEGER :: iat, nn, ncx, ll1, ll2, ll3, l1, l2, l3, &
2023 : myspace
2024 : REAL(KIND=dp) :: rxyz
2025 : INTEGER :: icell, lstb, lay
2026 : REAL(KIND=dp) :: rel, cut2
2027 : INTEGER :: indlst
2028 :
2029 : DIMENSION rxyz(3, nn), lay(nn), icell(0:ncx, -1:ll1, -1:ll2, -1:ll3), &
2030 : lstb(0:myspace - 1), rel(5, 0:myspace - 1)
2031 :
2032 : INTEGER :: jat, k1, k2, k3, jj
2033 : REAL(KIND=dp) :: rr2, tt, tti, xrel, yrel, zrel
2034 :
2035 88000 : DO k3 = l3 - 1, l3 + 1
2036 286000 : DO k2 = l2 - 1, l2 + 1
2037 858000 : DO k1 = l1 - 1, l1 + 1
2038 1949124 : DO jj = 1, icell(0, k1, k2, k3)
2039 1157124 : jat = icell(jj, k1, k2, k3)
2040 1157124 : IF (jat == iat) CYCLE
2041 1135124 : xrel = rxyz(1, iat) - rxyz(1, jat)
2042 1135124 : yrel = rxyz(2, iat) - rxyz(2, jat)
2043 1135124 : zrel = rxyz(3, iat) - rxyz(3, jat)
2044 1135124 : rr2 = xrel**2 + yrel**2 + zrel**2
2045 1729124 : IF (rr2 <= cut2) THEN
2046 88000 : indlst = MIN(indlst, myspace - 1)
2047 88000 : lstb(indlst) = lay(jat)
2048 : ! write(*,*) 'iat,indlst,lay(jat)',iat,indlst,lay(jat)
2049 88000 : tt = SQRT(rr2)
2050 88000 : tti = 1.e0_dp/tt
2051 88000 : rel(1, indlst) = xrel*tti
2052 88000 : rel(2, indlst) = yrel*tti
2053 88000 : rel(3, indlst) = zrel*tti
2054 88000 : rel(4, indlst) = tt
2055 88000 : rel(5, indlst) = tti
2056 88000 : indlst = indlst + 1
2057 : END IF
2058 : END DO
2059 : END DO
2060 : END DO
2061 : END DO
2062 :
2063 22000 : RETURN
2064 : END SUBROUTINE sublstiat_b
2065 :
2066 : ! **************************************************************************************************
2067 : !> \brief Lenosky's "highly optimized empirical potential model of silicon"
2068 : !> by Stefan Goedecker
2069 : !> \param nat number of atoms
2070 : !> \param alat lattice constants of the orthorombic box containing the particles
2071 : !> \param rxyz0 atomic positions in Angstrom, may be modified on output.
2072 : !> If an atom is outside the box the program will bring it back
2073 : !> into the box by translations through alat
2074 : !> \param fxyz forces in eV/A
2075 : !> \param ener total energy in eV
2076 : !> \param coord average coordination number
2077 : !> \param ener_var variance of the energy/atom
2078 : !> \param coord_var variance of the coordination number
2079 : !> \param count count is increased by one per call, has to be initialized
2080 : !> to 0.e0_dp before first call of eip_bazant
2081 : !> \par Literature
2082 : !> T. Lenosky, et. al.: Highly optimized empirical potential model of silicon;
2083 : !> Modeling Simul. Sci. Eng., 8 (2000)
2084 : !> S. Goedecker: Optimization and parallelization of a force field for silicon
2085 : !> using OpenMP; CPC 148, 1 (2002)
2086 : !> \par History
2087 : !> 03.2006 initial create [tdk]
2088 : !> \author Thomas D. Kuehne (tkuehne@cp2k.org)
2089 : ! **************************************************************************************************
2090 22 : SUBROUTINE eip_lenosky_silicon(nat, alat, rxyz0, fxyz, ener, coord, ener_var, &
2091 : coord_var, count)
2092 :
2093 : INTEGER :: nat
2094 : REAL(KIND=dp) :: alat, rxyz0, fxyz, ener, coord, &
2095 : ener_var, coord_var, count
2096 :
2097 : DIMENSION rxyz0(3, nat), fxyz(3, nat), alat(3)
2098 22 : REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :) :: rxyz
2099 22 : INTEGER, ALLOCATABLE, DIMENSION(:, :) :: lsta
2100 22 : INTEGER, ALLOCATABLE, DIMENSION(:) :: lstb
2101 22 : INTEGER, ALLOCATABLE, DIMENSION(:) :: lay
2102 22 : INTEGER, ALLOCATABLE, DIMENSION(:, :, :, :) :: icell
2103 22 : REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :) :: rel
2104 22 : REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :) :: txyz
2105 22 : REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :) :: f2ij, f3ij, f3ik
2106 :
2107 : REAL(KIND=dp) :: coord2, cut, cut2, ener2, tcoord, &
2108 : tcoord2, tener, tener2
2109 : INTEGER :: i, iam, iat, iat1, iat2, ii, il, in, indlst, indlstx, &
2110 : istop, istopg, l1, l2, l3, ll1, ll2, ll3, lot, ncx, nn, &
2111 : nnbrx, npjkx, npjx, laymx, npr, rlc1i, rlc2i, rlc3i, &
2112 : myspace, myspaceout
2113 :
2114 : ! tmax_phi= 0.4500000e+01_dp
2115 : ! cut=tmax_phi
2116 22 : cut = 0.4500000e+01_dp
2117 :
2118 22 : IF (count == 0) OPEN (unit=10, file='lenosky.mon', status='unknown')
2119 22 : count = count + 1.e0_dp
2120 :
2121 : ! linear scaling calculation of verlet list
2122 22 : ll1 = INT(alat(1)/cut)
2123 22 : IF (ll1 < 1) CPABORT("alat(1) too small")
2124 22 : ll2 = INT(alat(2)/cut)
2125 22 : IF (ll2 < 1) CPABORT("alat(2) too small")
2126 22 : ll3 = INT(alat(3)/cut)
2127 22 : IF (ll3 < 1) CPABORT("alat(3) too small")
2128 :
2129 : ! determine number of threads
2130 22 : npr = 1
2131 22 : !$OMP PARALLEL PRIVATE(iam) SHARED (npr) DEFAULT(NONE)
2132 : !$ iam = omp_get_thread_num()
2133 : !$ if (iam .eq. 0) npr = omp_get_num_threads()
2134 : !$OMP END PARALLEL
2135 :
2136 : ! linear scaling calculation of verlet list
2137 :
2138 22 : IF (npr <= 1) THEN !serial if too few processors to gain by parallelizing
2139 :
2140 : ! set ncx for serial case, ncx for parallel case set below
2141 22 : ncx = 16
2142 132 : loop_ncx_s: DO
2143 924 : ALLOCATE (icell(0:ncx, -1:ll1, -1:ll2, -1:ll3))
2144 90090 : icell(0, -1:ll1, -1:ll2, -1:ll3) = 0
2145 154 : rlc1i = INT(ll1/alat(1))
2146 154 : rlc2i = INT(ll2/alat(2))
2147 154 : rlc3i = INT(ll3/alat(3))
2148 :
2149 44330 : loop_iat_s: DO iat = 1, nat
2150 44308 : rxyz0(1, iat) = MODULO(MODULO(rxyz0(1, iat), alat(1)), alat(1))
2151 44308 : rxyz0(2, iat) = MODULO(MODULO(rxyz0(2, iat), alat(2)), alat(2))
2152 44308 : rxyz0(3, iat) = MODULO(MODULO(rxyz0(3, iat), alat(3)), alat(3))
2153 44308 : l1 = INT(rxyz0(1, iat)*rlc1i)
2154 44308 : l2 = INT(rxyz0(2, iat)*rlc2i)
2155 44308 : l3 = INT(rxyz0(3, iat)*rlc3i)
2156 :
2157 44308 : ii = icell(0, l1, l2, l3)
2158 44308 : ii = ii + 1
2159 44308 : icell(0, l1, l2, l3) = ii
2160 44308 : IF (ii > ncx) THEN
2161 132 : WRITE (10, *) count, 'NCX too small', ncx
2162 132 : DEALLOCATE (icell)
2163 132 : ncx = ncx*2
2164 : CYCLE loop_ncx_s
2165 : END IF
2166 44198 : icell(ii, l1, l2, l3) = iat
2167 : END DO loop_iat_s
2168 : EXIT loop_ncx_s
2169 : END DO loop_ncx_s
2170 :
2171 : ELSE ! parallel case
2172 :
2173 : ! periodization of particles can be done in parallel
2174 0 : !$OMP PARALLEL DO SHARED (alat,nat,rxyz0) PRIVATE(iat) DEFAULT(NONE)
2175 : DO iat = 1, nat
2176 : rxyz0(1, iat) = MODULO(MODULO(rxyz0(1, iat), alat(1)), alat(1))
2177 : rxyz0(2, iat) = MODULO(MODULO(rxyz0(2, iat), alat(2)), alat(2))
2178 : rxyz0(3, iat) = MODULO(MODULO(rxyz0(3, iat), alat(3)), alat(3))
2179 : END DO
2180 : !$OMP END PARALLEL DO
2181 :
2182 : ! assignment to cell is done serially
2183 : ! set ncx for parallel case, ncx for serial case set above
2184 0 : ncx = 16
2185 0 : loop_ncx_p: DO
2186 0 : ALLOCATE (icell(0:ncx, -1:ll1, -1:ll2, -1:ll3))
2187 0 : icell(0, -1:ll1, -1:ll2, -1:ll3) = 0
2188 0 : rlc1i = INT(ll1/alat(1))
2189 0 : rlc2i = INT(ll2/alat(2))
2190 0 : rlc3i = INT(ll3/alat(3))
2191 :
2192 0 : loop_iat_p: DO iat = 1, nat
2193 0 : l1 = INT(rxyz0(1, iat)*rlc1i)
2194 0 : l2 = INT(rxyz0(2, iat)*rlc2i)
2195 0 : l3 = INT(rxyz0(3, iat)*rlc3i)
2196 0 : ii = icell(0, l1, l2, l3)
2197 0 : ii = ii + 1
2198 0 : icell(0, l1, l2, l3) = ii
2199 0 : IF (ii > ncx) THEN
2200 0 : WRITE (10, *) count, 'NCX too small', ncx
2201 0 : DEALLOCATE (icell)
2202 0 : ncx = ncx*2
2203 : CYCLE loop_ncx_p
2204 : END IF
2205 0 : icell(ii, l1, l2, l3) = iat
2206 : END DO loop_iat_p
2207 : EXIT loop_ncx_p
2208 : END DO loop_ncx_p
2209 :
2210 : END IF
2211 :
2212 : ! duplicate all atoms within boundary layer
2213 22 : laymx = ncx*(2*ll1*ll2 + 2*ll1*ll3 + 2*ll2*ll3 + 4*ll1 + 4*ll2 + 4*ll3 + 8)
2214 22 : nn = nat + laymx
2215 110 : ALLOCATE (rxyz(3, nn), lay(nn))
2216 22022 : DO iat = 1, nat
2217 22000 : lay(iat) = iat
2218 22000 : rxyz(1, iat) = rxyz0(1, iat)
2219 22000 : rxyz(2, iat) = rxyz0(2, iat)
2220 22022 : rxyz(3, iat) = rxyz0(3, iat)
2221 : END DO
2222 22 : il = nat
2223 : ! xy plane
2224 154 : DO l2 = 0, ll2 - 1
2225 946 : DO l1 = 0, ll1 - 1
2226 :
2227 792 : in = icell(0, l1, l2, 0)
2228 792 : icell(0, l1, l2, ll3) = in
2229 22792 : DO ii = 1, in
2230 22000 : i = icell(ii, l1, l2, 0)
2231 22000 : il = il + 1
2232 22000 : IF (il > nn) CPABORT("enlarge laymx")
2233 22000 : lay(il) = i
2234 22000 : icell(ii, l1, l2, ll3) = il
2235 22000 : rxyz(1, il) = rxyz(1, i)
2236 22000 : rxyz(2, il) = rxyz(2, i)
2237 22792 : rxyz(3, il) = rxyz(3, i) + alat(3)
2238 : END DO
2239 :
2240 792 : in = icell(0, l1, l2, ll3 - 1)
2241 792 : icell(0, l1, l2, -1) = in
2242 924 : DO ii = 1, in
2243 0 : i = icell(ii, l1, l2, ll3 - 1)
2244 0 : il = il + 1
2245 0 : IF (il > nn) CPABORT("enlarge laymx")
2246 0 : lay(il) = i
2247 0 : icell(ii, l1, l2, -1) = il
2248 0 : rxyz(1, il) = rxyz(1, i)
2249 0 : rxyz(2, il) = rxyz(2, i)
2250 792 : rxyz(3, il) = rxyz(3, i) - alat(3)
2251 : END DO
2252 :
2253 : END DO
2254 : END DO
2255 :
2256 : ! yz plane
2257 154 : DO l3 = 0, ll3 - 1
2258 946 : DO l2 = 0, ll2 - 1
2259 :
2260 792 : in = icell(0, 0, l2, l3)
2261 792 : icell(0, ll1, l2, l3) = in
2262 22792 : DO ii = 1, in
2263 22000 : i = icell(ii, 0, l2, l3)
2264 22000 : il = il + 1
2265 22000 : IF (il > nn) CPABORT("enlarge laymx")
2266 22000 : lay(il) = i
2267 22000 : icell(ii, ll1, l2, l3) = il
2268 22000 : rxyz(1, il) = rxyz(1, i) + alat(1)
2269 22000 : rxyz(2, il) = rxyz(2, i)
2270 22792 : rxyz(3, il) = rxyz(3, i)
2271 : END DO
2272 :
2273 792 : in = icell(0, ll1 - 1, l2, l3)
2274 792 : icell(0, -1, l2, l3) = in
2275 924 : DO ii = 1, in
2276 0 : i = icell(ii, ll1 - 1, l2, l3)
2277 0 : il = il + 1
2278 0 : IF (il > nn) CPABORT("enlarge laymx")
2279 0 : lay(il) = i
2280 0 : icell(ii, -1, l2, l3) = il
2281 0 : rxyz(1, il) = rxyz(1, i) - alat(1)
2282 0 : rxyz(2, il) = rxyz(2, i)
2283 792 : rxyz(3, il) = rxyz(3, i)
2284 : END DO
2285 :
2286 : END DO
2287 : END DO
2288 :
2289 : ! xz plane
2290 154 : DO l3 = 0, ll3 - 1
2291 946 : DO l1 = 0, ll1 - 1
2292 :
2293 792 : in = icell(0, l1, 0, l3)
2294 792 : icell(0, l1, ll2, l3) = in
2295 22792 : DO ii = 1, in
2296 22000 : i = icell(ii, l1, 0, l3)
2297 22000 : il = il + 1
2298 22000 : IF (il > nn) CPABORT("enlarge laymx")
2299 22000 : lay(il) = i
2300 22000 : icell(ii, l1, ll2, l3) = il
2301 22000 : rxyz(1, il) = rxyz(1, i)
2302 22000 : rxyz(2, il) = rxyz(2, i) + alat(2)
2303 22792 : rxyz(3, il) = rxyz(3, i)
2304 : END DO
2305 :
2306 792 : in = icell(0, l1, ll2 - 1, l3)
2307 792 : icell(0, l1, -1, l3) = in
2308 924 : DO ii = 1, in
2309 0 : i = icell(ii, l1, ll2 - 1, l3)
2310 0 : il = il + 1
2311 0 : IF (il > nn) CPABORT("enlarge laymx")
2312 0 : lay(il) = i
2313 0 : icell(ii, l1, -1, l3) = il
2314 0 : rxyz(1, il) = rxyz(1, i)
2315 0 : rxyz(2, il) = rxyz(2, i) - alat(2)
2316 792 : rxyz(3, il) = rxyz(3, i)
2317 : END DO
2318 :
2319 : END DO
2320 : END DO
2321 :
2322 : ! x axis
2323 154 : DO l1 = 0, ll1 - 1
2324 :
2325 132 : in = icell(0, l1, 0, 0)
2326 132 : icell(0, l1, ll2, ll3) = in
2327 22132 : DO ii = 1, in
2328 22000 : i = icell(ii, l1, 0, 0)
2329 22000 : il = il + 1
2330 22000 : IF (il > nn) CPABORT("enlarge laymx")
2331 22000 : lay(il) = i
2332 22000 : icell(ii, l1, ll2, ll3) = il
2333 22000 : rxyz(1, il) = rxyz(1, i)
2334 22000 : rxyz(2, il) = rxyz(2, i) + alat(2)
2335 22132 : rxyz(3, il) = rxyz(3, i) + alat(3)
2336 : END DO
2337 :
2338 132 : in = icell(0, l1, 0, ll3 - 1)
2339 132 : icell(0, l1, ll2, -1) = in
2340 132 : DO ii = 1, in
2341 0 : i = icell(ii, l1, 0, ll3 - 1)
2342 0 : il = il + 1
2343 0 : IF (il > nn) CPABORT("enlarge laymx")
2344 0 : lay(il) = i
2345 0 : icell(ii, l1, ll2, -1) = il
2346 0 : rxyz(1, il) = rxyz(1, i)
2347 0 : rxyz(2, il) = rxyz(2, i) + alat(2)
2348 132 : rxyz(3, il) = rxyz(3, i) - alat(3)
2349 : END DO
2350 :
2351 132 : in = icell(0, l1, ll2 - 1, 0)
2352 132 : icell(0, l1, -1, ll3) = in
2353 132 : DO ii = 1, in
2354 0 : i = icell(ii, l1, ll2 - 1, 0)
2355 0 : il = il + 1
2356 0 : IF (il > nn) CPABORT("enlarge laymx")
2357 0 : lay(il) = i
2358 0 : icell(ii, l1, -1, ll3) = il
2359 0 : rxyz(1, il) = rxyz(1, i)
2360 0 : rxyz(2, il) = rxyz(2, i) - alat(2)
2361 132 : rxyz(3, il) = rxyz(3, i) + alat(3)
2362 : END DO
2363 :
2364 132 : in = icell(0, l1, ll2 - 1, ll3 - 1)
2365 132 : icell(0, l1, -1, -1) = in
2366 154 : DO ii = 1, in
2367 0 : i = icell(ii, l1, ll2 - 1, ll3 - 1)
2368 0 : il = il + 1
2369 0 : IF (il > nn) CPABORT("enlarge laymx")
2370 0 : lay(il) = i
2371 0 : icell(ii, l1, -1, -1) = il
2372 0 : rxyz(1, il) = rxyz(1, i)
2373 0 : rxyz(2, il) = rxyz(2, i) - alat(2)
2374 132 : rxyz(3, il) = rxyz(3, i) - alat(3)
2375 : END DO
2376 :
2377 : END DO
2378 :
2379 : ! y axis
2380 154 : DO l2 = 0, ll2 - 1
2381 :
2382 132 : in = icell(0, 0, l2, 0)
2383 132 : icell(0, ll1, l2, ll3) = in
2384 22132 : DO ii = 1, in
2385 22000 : i = icell(ii, 0, l2, 0)
2386 22000 : il = il + 1
2387 22000 : IF (il > nn) CPABORT("enlarge laymx")
2388 22000 : lay(il) = i
2389 22000 : icell(ii, ll1, l2, ll3) = il
2390 22000 : rxyz(1, il) = rxyz(1, i) + alat(1)
2391 22000 : rxyz(2, il) = rxyz(2, i)
2392 22132 : rxyz(3, il) = rxyz(3, i) + alat(3)
2393 : END DO
2394 :
2395 132 : in = icell(0, 0, l2, ll3 - 1)
2396 132 : icell(0, ll1, l2, -1) = in
2397 132 : DO ii = 1, in
2398 0 : i = icell(ii, 0, l2, ll3 - 1)
2399 0 : il = il + 1
2400 0 : IF (il > nn) CPABORT("enlarge laymx")
2401 0 : lay(il) = i
2402 0 : icell(ii, ll1, l2, -1) = il
2403 0 : rxyz(1, il) = rxyz(1, i) + alat(1)
2404 0 : rxyz(2, il) = rxyz(2, i)
2405 132 : rxyz(3, il) = rxyz(3, i) - alat(3)
2406 : END DO
2407 :
2408 132 : in = icell(0, ll1 - 1, l2, 0)
2409 132 : icell(0, -1, l2, ll3) = in
2410 132 : DO ii = 1, in
2411 0 : i = icell(ii, ll1 - 1, l2, 0)
2412 0 : il = il + 1
2413 0 : IF (il > nn) CPABORT("enlarge laymx")
2414 0 : lay(il) = i
2415 0 : icell(ii, -1, l2, ll3) = il
2416 0 : rxyz(1, il) = rxyz(1, i) - alat(1)
2417 0 : rxyz(2, il) = rxyz(2, i)
2418 132 : rxyz(3, il) = rxyz(3, i) + alat(3)
2419 : END DO
2420 :
2421 132 : in = icell(0, ll1 - 1, l2, ll3 - 1)
2422 132 : icell(0, -1, l2, -1) = in
2423 154 : DO ii = 1, in
2424 0 : i = icell(ii, ll1 - 1, l2, ll3 - 1)
2425 0 : il = il + 1
2426 0 : IF (il > nn) CPABORT("enlarge laymx")
2427 0 : lay(il) = i
2428 0 : icell(ii, -1, l2, -1) = il
2429 0 : rxyz(1, il) = rxyz(1, i) - alat(1)
2430 0 : rxyz(2, il) = rxyz(2, i)
2431 132 : rxyz(3, il) = rxyz(3, i) - alat(3)
2432 : END DO
2433 :
2434 : END DO
2435 :
2436 : ! z axis
2437 154 : DO l3 = 0, ll3 - 1
2438 :
2439 132 : in = icell(0, 0, 0, l3)
2440 132 : icell(0, ll1, ll2, l3) = in
2441 22132 : DO ii = 1, in
2442 22000 : i = icell(ii, 0, 0, l3)
2443 22000 : il = il + 1
2444 22000 : IF (il > nn) CPABORT("enlarge laymx")
2445 22000 : lay(il) = i
2446 22000 : icell(ii, ll1, ll2, l3) = il
2447 22000 : rxyz(1, il) = rxyz(1, i) + alat(1)
2448 22000 : rxyz(2, il) = rxyz(2, i) + alat(2)
2449 22132 : rxyz(3, il) = rxyz(3, i)
2450 : END DO
2451 :
2452 132 : in = icell(0, ll1 - 1, 0, l3)
2453 132 : icell(0, -1, ll2, l3) = in
2454 132 : DO ii = 1, in
2455 0 : i = icell(ii, ll1 - 1, 0, l3)
2456 0 : il = il + 1
2457 0 : IF (il > nn) CPABORT("enlarge laymx")
2458 0 : lay(il) = i
2459 0 : icell(ii, -1, ll2, l3) = il
2460 0 : rxyz(1, il) = rxyz(1, i) - alat(1)
2461 0 : rxyz(2, il) = rxyz(2, i) + alat(2)
2462 132 : rxyz(3, il) = rxyz(3, i)
2463 : END DO
2464 :
2465 132 : in = icell(0, 0, ll2 - 1, l3)
2466 132 : icell(0, ll1, -1, l3) = in
2467 132 : DO ii = 1, in
2468 0 : i = icell(ii, 0, ll2 - 1, l3)
2469 0 : il = il + 1
2470 0 : IF (il > nn) CPABORT("enlarge laymx")
2471 0 : lay(il) = i
2472 0 : icell(ii, ll1, -1, l3) = il
2473 0 : rxyz(1, il) = rxyz(1, i) + alat(1)
2474 0 : rxyz(2, il) = rxyz(2, i) - alat(2)
2475 132 : rxyz(3, il) = rxyz(3, i)
2476 : END DO
2477 :
2478 132 : in = icell(0, ll1 - 1, ll2 - 1, l3)
2479 132 : icell(0, -1, -1, l3) = in
2480 154 : DO ii = 1, in
2481 0 : i = icell(ii, ll1 - 1, ll2 - 1, l3)
2482 0 : il = il + 1
2483 0 : IF (il > nn) CPABORT("enlarge laymx")
2484 0 : lay(il) = i
2485 0 : icell(ii, -1, -1, l3) = il
2486 0 : rxyz(1, il) = rxyz(1, i) - alat(1)
2487 0 : rxyz(2, il) = rxyz(2, i) - alat(2)
2488 132 : rxyz(3, il) = rxyz(3, i)
2489 : END DO
2490 :
2491 : END DO
2492 :
2493 : ! corners
2494 22 : in = icell(0, 0, 0, 0)
2495 22 : icell(0, ll1, ll2, ll3) = in
2496 22022 : DO ii = 1, in
2497 22000 : i = icell(ii, 0, 0, 0)
2498 22000 : il = il + 1
2499 22000 : IF (il > nn) CPABORT("enlarge laymx")
2500 22000 : lay(il) = i
2501 22000 : icell(ii, ll1, ll2, ll3) = il
2502 22000 : rxyz(1, il) = rxyz(1, i) + alat(1)
2503 22000 : rxyz(2, il) = rxyz(2, i) + alat(2)
2504 22022 : rxyz(3, il) = rxyz(3, i) + alat(3)
2505 : END DO
2506 :
2507 22 : in = icell(0, ll1 - 1, 0, 0)
2508 22 : icell(0, -1, ll2, ll3) = in
2509 22 : DO ii = 1, in
2510 0 : i = icell(ii, ll1 - 1, 0, 0)
2511 0 : il = il + 1
2512 0 : IF (il > nn) CPABORT("enlarge laymx")
2513 0 : lay(il) = i
2514 0 : icell(ii, -1, ll2, ll3) = il
2515 0 : rxyz(1, il) = rxyz(1, i) - alat(1)
2516 0 : rxyz(2, il) = rxyz(2, i) + alat(2)
2517 22 : rxyz(3, il) = rxyz(3, i) + alat(3)
2518 : END DO
2519 :
2520 22 : in = icell(0, 0, ll2 - 1, 0)
2521 22 : icell(0, ll1, -1, ll3) = in
2522 22 : DO ii = 1, in
2523 0 : i = icell(ii, 0, ll2 - 1, 0)
2524 0 : il = il + 1
2525 0 : IF (il > nn) CPABORT("enlarge laymx")
2526 0 : lay(il) = i
2527 0 : icell(ii, ll1, -1, ll3) = il
2528 0 : rxyz(1, il) = rxyz(1, i) + alat(1)
2529 0 : rxyz(2, il) = rxyz(2, i) - alat(2)
2530 22 : rxyz(3, il) = rxyz(3, i) + alat(3)
2531 : END DO
2532 :
2533 22 : in = icell(0, ll1 - 1, ll2 - 1, 0)
2534 22 : icell(0, -1, -1, ll3) = in
2535 22 : DO ii = 1, in
2536 0 : i = icell(ii, ll1 - 1, ll2 - 1, 0)
2537 0 : il = il + 1
2538 0 : IF (il > nn) CPABORT("enlarge laymx")
2539 0 : lay(il) = i
2540 0 : icell(ii, -1, -1, ll3) = il
2541 0 : rxyz(1, il) = rxyz(1, i) - alat(1)
2542 0 : rxyz(2, il) = rxyz(2, i) - alat(2)
2543 22 : rxyz(3, il) = rxyz(3, i) + alat(3)
2544 : END DO
2545 :
2546 22 : in = icell(0, 0, 0, ll3 - 1)
2547 22 : icell(0, ll1, ll2, -1) = in
2548 22 : DO ii = 1, in
2549 0 : i = icell(ii, 0, 0, ll3 - 1)
2550 0 : il = il + 1
2551 0 : IF (il > nn) CPABORT("enlarge laymx")
2552 0 : lay(il) = i
2553 0 : icell(ii, ll1, ll2, -1) = il
2554 0 : rxyz(1, il) = rxyz(1, i) + alat(1)
2555 0 : rxyz(2, il) = rxyz(2, i) + alat(2)
2556 22 : rxyz(3, il) = rxyz(3, i) - alat(3)
2557 : END DO
2558 :
2559 22 : in = icell(0, ll1 - 1, 0, ll3 - 1)
2560 22 : icell(0, -1, ll2, -1) = in
2561 22 : DO ii = 1, in
2562 0 : i = icell(ii, ll1 - 1, 0, ll3 - 1)
2563 0 : il = il + 1
2564 0 : IF (il > nn) CPABORT("enlarge laymx")
2565 0 : lay(il) = i
2566 0 : icell(ii, -1, ll2, -1) = il
2567 0 : rxyz(1, il) = rxyz(1, i) - alat(1)
2568 0 : rxyz(2, il) = rxyz(2, i) + alat(2)
2569 22 : rxyz(3, il) = rxyz(3, i) - alat(3)
2570 : END DO
2571 :
2572 22 : in = icell(0, 0, ll2 - 1, ll3 - 1)
2573 22 : icell(0, ll1, -1, -1) = in
2574 22 : DO ii = 1, in
2575 0 : i = icell(ii, 0, ll2 - 1, ll3 - 1)
2576 0 : il = il + 1
2577 0 : IF (il > nn) CPABORT("enlarge laymx")
2578 0 : lay(il) = i
2579 0 : icell(ii, ll1, -1, -1) = il
2580 0 : rxyz(1, il) = rxyz(1, i) + alat(1)
2581 0 : rxyz(2, il) = rxyz(2, i) - alat(2)
2582 22 : rxyz(3, il) = rxyz(3, i) - alat(3)
2583 : END DO
2584 :
2585 22 : in = icell(0, ll1 - 1, ll2 - 1, ll3 - 1)
2586 22 : icell(0, -1, -1, -1) = in
2587 22 : DO ii = 1, in
2588 0 : i = icell(ii, ll1 - 1, ll2 - 1, ll3 - 1)
2589 0 : il = il + 1
2590 0 : IF (il > nn) CPABORT("enlarge laymx")
2591 0 : lay(il) = i
2592 0 : icell(ii, -1, -1, -1) = il
2593 0 : rxyz(1, il) = rxyz(1, i) - alat(1)
2594 0 : rxyz(2, il) = rxyz(2, i) - alat(2)
2595 22 : rxyz(3, il) = rxyz(3, i) - alat(3)
2596 : END DO
2597 :
2598 66 : ALLOCATE (lsta(2, nat))
2599 22 : nnbrx = 36
2600 0 : loop_nnbrx: DO
2601 110 : ALLOCATE (lstb(nnbrx*nat), rel(5, nnbrx*nat))
2602 :
2603 22 : indlstx = 0
2604 :
2605 : !$OMP PARALLEL DEFAULT(NONE) &
2606 : !$OMP PRIVATE(iat,cut2,iam,ii,indlst,l1,l2,l3,myspace,npr) &
2607 : !$OMP SHARED (indlstx,nat,nn,nnbrx,ncx,ll1,ll2,ll3,icell,lsta,lstb,lay, &
2608 22 : !$OMP rel,rxyz,cut,myspaceout)
2609 :
2610 : npr = 1
2611 : !$ npr = omp_get_num_threads()
2612 : iam = 0
2613 : !$ iam = omp_get_thread_num()
2614 :
2615 : cut2 = cut**2
2616 : ! assign contiguous portions of the arrays lstb and rel to the threads
2617 : myspace = (nat*nnbrx)/npr
2618 : IF (iam == 0) myspaceout = myspace
2619 : ! Verlet list, relative positions
2620 : indlst = 0
2621 : loop_l3: DO l3 = 0, ll3 - 1
2622 : loop_l2: DO l2 = 0, ll2 - 1
2623 : loop_l1: DO l1 = 0, ll1 - 1
2624 : loop_ii: DO ii = 1, icell(0, l1, l2, l3)
2625 : iat = icell(ii, l1, l2, l3)
2626 : IF (((iat - 1)*npr)/nat == iam) THEN
2627 : ! write(*,*) 'sublstiat:iam,iat',iam,iat
2628 : lsta(1, iat) = iam*myspace + indlst + 1
2629 : CALL sublstiat_l(iat, nn, ncx, ll1, ll2, ll3, l1, l2, l3, myspace, &
2630 : rxyz, icell, lstb(iam*myspace + 1), lay, &
2631 : rel(1, iam*myspace + 1), cut2, indlst)
2632 : lsta(2, iat) = iam*myspace + indlst
2633 : ! write(*,'(a,4(x,i3),100(x,i2))') &
2634 : ! 'iam,iat,lsta',iam,iat,lsta(1,iat),lsta(2,iat), &
2635 : ! (lstb(j),j=lsta(1,iat),lsta(2,iat))
2636 : END IF
2637 : END DO loop_ii
2638 : END DO loop_l1
2639 : END DO loop_l2
2640 : END DO loop_l3
2641 :
2642 : !$OMP ATOMIC UPDATE
2643 : indlstx = MAX(indlstx, indlst)
2644 : !$OMP END ATOMIC
2645 : !$OMP END PARALLEL
2646 :
2647 22 : IF (indlstx >= myspaceout) THEN
2648 0 : WRITE (10, *) count, 'NNBRX too small', nnbrx
2649 0 : DEALLOCATE (lstb, rel)
2650 0 : nnbrx = 3*nnbrx/2
2651 : CYCLE loop_nnbrx
2652 : END IF
2653 : EXIT loop_nnbrx
2654 : END DO loop_nnbrx
2655 :
2656 22 : istopg = 0
2657 : !$OMP PARALLEL DEFAULT(NONE) &
2658 : !$OMP PRIVATE(iam,npr,iat,iat1,iat2,lot,istop,tcoord,tcoord2, &
2659 : !$OMP tener,tener2,txyz,f2ij,f3ij,f3ik,npjx,npjkx) &
2660 22 : !$OMP SHARED (nat,nnbrx,lsta,lstb,rel,ener,ener2,fxyz,coord,coord2,istopg)
2661 :
2662 : npr = 1
2663 : !$ npr = omp_get_num_threads()
2664 : iam = 0
2665 : !$ iam = omp_get_thread_num()
2666 :
2667 : npjx = 300; npjkx = 6000
2668 :
2669 : IF (npr /= 1) THEN
2670 : ! PARALLEL CASE
2671 : ! create temporary private scalars for reduction sum on energies and
2672 : ! temporary private array for reduction sum on forces
2673 : !$OMP CRITICAL(omp_eip_lenosky_silicon)
2674 : ALLOCATE (txyz(3, nat), f2ij(3, npjx), f3ij(3, npjkx), f3ik(3, npjkx))
2675 : !$OMP END CRITICAL(omp_eip_lenosky_silicon)
2676 : IF (iam == 0) THEN
2677 : ener = 0.e0_dp
2678 : ener2 = 0.e0_dp
2679 : coord = 0.e0_dp
2680 : coord2 = 0.e0_dp
2681 : END IF
2682 : !$OMP DO
2683 : DO iat = 1, nat
2684 : fxyz(1, iat) = 0.e0_dp
2685 : fxyz(2, iat) = 0.e0_dp
2686 : fxyz(3, iat) = 0.e0_dp
2687 : END DO
2688 : !$OMP BARRIER
2689 :
2690 : ! Each thread treats at most lot atoms
2691 : lot = INT(REAL(nat, KIND=dp)/REAL(npr, KIND=dp) + .999999999999e0_dp)
2692 : iat1 = iam*lot + 1
2693 : iat2 = MIN((iam + 1)*lot, nat)
2694 : ! write(*,*) 'subfeniat:iat1,iat2,iam',iat1,iat2,iam
2695 : CALL subfeniat_l(iat1, iat2, nat, lsta, lstb, rel, tener, tener2, &
2696 : tcoord, tcoord2, nnbrx, txyz, f2ij, npjx, f3ij, npjkx, f3ik, istop)
2697 : !$OMP CRITICAL(omp_eip_lenosky_silicon)
2698 : ener = ener + tener
2699 : ener2 = ener2 + tener2
2700 : coord = coord + tcoord
2701 : coord2 = coord2 + tcoord2
2702 : istopg = istopg + istop
2703 : DO iat = 1, nat
2704 : fxyz(1, iat) = fxyz(1, iat) + txyz(1, iat)
2705 : fxyz(2, iat) = fxyz(2, iat) + txyz(2, iat)
2706 : fxyz(3, iat) = fxyz(3, iat) + txyz(3, iat)
2707 : END DO
2708 : DEALLOCATE (txyz, f2ij, f3ij, f3ik)
2709 : !$OMP END CRITICAL(omp_eip_lenosky_silicon)
2710 :
2711 : ELSE
2712 : ! SERIAL CASE
2713 : iat1 = 1
2714 : iat2 = nat
2715 : ALLOCATE (f2ij(3, npjx), f3ij(3, npjkx), f3ik(3, npjkx))
2716 : CALL subfeniat_l(iat1, iat2, nat, lsta, lstb, rel, ener, ener2, &
2717 : coord, coord2, nnbrx, fxyz, f2ij, npjx, f3ij, npjkx, f3ik, istopg)
2718 : DEALLOCATE (f2ij, f3ij, f3ik)
2719 :
2720 : END IF
2721 : !$OMP END PARALLEL
2722 :
2723 : ! write(*,*) 'ener,norm force', &
2724 : ! ener,DNRM2(3*nat,fxyz,1)
2725 22 : IF (istopg > 0) CPABORT("DIMENSION ERROR (see WARNING above)")
2726 22 : ener_var = ener2/nat - (ener/nat)**2
2727 22 : coord = coord/nat
2728 22 : coord_var = coord2/nat - coord**2
2729 :
2730 22 : DEALLOCATE (rxyz, icell, lay, lsta, lstb, rel)
2731 :
2732 22 : END SUBROUTINE eip_lenosky_silicon
2733 :
2734 : ! **************************************************************************************************
2735 : !> \brief ...
2736 : !> \param iat1 ...
2737 : !> \param iat2 ...
2738 : !> \param nat ...
2739 : !> \param lsta ...
2740 : !> \param lstb ...
2741 : !> \param rel ...
2742 : !> \param tener ...
2743 : !> \param tener2 ...
2744 : !> \param tcoord ...
2745 : !> \param tcoord2 ...
2746 : !> \param nnbrx ...
2747 : !> \param txyz ...
2748 : !> \param f2ij ...
2749 : !> \param npjx ...
2750 : !> \param f3ij ...
2751 : !> \param npjkx ...
2752 : !> \param f3ik ...
2753 : !> \param istop ...
2754 : ! **************************************************************************************************
2755 22 : SUBROUTINE subfeniat_l(iat1, iat2, nat, lsta, lstb, rel, tener, tener2, &
2756 22 : tcoord, tcoord2, nnbrx, txyz, f2ij, npjx, f3ij, npjkx, f3ik, istop)
2757 : ! for a subset of atoms iat1 to iat2 the routine calculates the (partial) forces
2758 : ! txyz acting on these atoms as well as on the atoms (jat, kat) interacting
2759 : ! with them and their contribution to the energy (tener).
2760 : ! In addition the coordination number tcoord and the second moment of the
2761 : ! local energy tener2 and coordination number tcoord2 are returned
2762 : INTEGER :: iat1, iat2, nat, lsta, lstb
2763 : REAL(KIND=dp) :: rel, tener, tener2, tcoord, tcoord2
2764 : INTEGER :: nnbrx
2765 : REAL(KIND=dp) :: txyz, f2ij
2766 : INTEGER :: npjx
2767 : REAL(KIND=dp) :: f3ij
2768 : INTEGER :: npjkx
2769 : REAL(KIND=dp) :: f3ik
2770 : INTEGER :: istop
2771 :
2772 : DIMENSION lsta(2, nat), lstb(nnbrx*nat), rel(5, nnbrx*nat), txyz(3, nat)
2773 : DIMENSION f2ij(3, npjx), f3ij(3, npjkx), f3ik(3, npjkx)
2774 : REAL(KIND=dp), PARAMETER :: tmin_phi = 0.1500000e+01_dp
2775 : REAL(KIND=dp), PARAMETER :: tmax_phi = 0.4500000e+01_dp
2776 : REAL(KIND=dp), PARAMETER :: hi_phi = 3.00000000000e0_dp
2777 : REAL(KIND=dp), PARAMETER :: hsixth_phi = 5.55555555555556e-002_dp
2778 : REAL(KIND=dp), PARAMETER :: h2sixth_phi = 1.85185185185185e-002_dp
2779 : REAL(KIND=dp), PARAMETER, DIMENSION(0:9) :: cof_phi = &
2780 : [0.69299400000000e+01_dp, -0.43995000000000e+00_dp, &
2781 : -0.17012300000000e+01_dp, -0.16247300000000e+01_dp, &
2782 : -0.99696000000000e+00_dp, -0.27391000000000e+00_dp, &
2783 : -0.24990000000000e-01_dp, -0.17840000000000e-01_dp, &
2784 : -0.96100000000000e-02_dp, 0.00000000000000e+00_dp]
2785 : REAL(KIND=dp), PARAMETER, DIMENSION(0:9) :: dof_phi = &
2786 : [0.16533229480429e+03_dp, 0.39415410391417e+02_dp, &
2787 : 0.68710036300407e+01_dp, 0.53406950884203e+01_dp, &
2788 : 0.15347960162782e+01_dp, -0.63347591535331e+01_dp, &
2789 : -0.17987794021458e+01_dp, 0.47429676211617e+00_dp, &
2790 : -0.40087646318907e-01_dp, -0.23942617684055e+00_dp]
2791 : REAL(KIND=dp), PARAMETER :: tmin_rho = 0.1500000e+01_dp
2792 : REAL(KIND=dp), PARAMETER :: tmax_rho = 0.3500000e+01_dp
2793 : REAL(KIND=dp), PARAMETER :: hi_rho = 5.00000000000e0_dp
2794 : REAL(KIND=dp), PARAMETER :: hsixth_rho = 3.33333333333333e-002_dp
2795 : REAL(KIND=dp), PARAMETER :: h2sixth_rho = 6.66666666666667e-003_dp
2796 : REAL(KIND=dp), PARAMETER, DIMENSION(0:10) :: cof_rho = &
2797 : [0.13747000000000e+00_dp, -0.14831000000000e+00_dp, &
2798 : -0.55972000000000e+00_dp, -0.73110000000000e+00_dp, &
2799 : -0.76283000000000e+00_dp, -0.72918000000000e+00_dp, &
2800 : -0.66620000000000e+00_dp, -0.57328000000000e+00_dp, &
2801 : -0.40690000000000e+00_dp, -0.16662000000000e+00_dp, &
2802 : 0.00000000000000e+00_dp]
2803 : REAL(KIND=dp), PARAMETER, DIMENSION(0:10) :: dof_rho = &
2804 : [-0.32275496741918e+01_dp, -0.64119006516165e+01_dp, &
2805 : 0.10030652280658e+02_dp, 0.22937915289857e+01_dp, &
2806 : 0.17416816033995e+01_dp, 0.54648205741626e+00_dp, &
2807 : 0.47189016693543e+00_dp, 0.20569572748420e+01_dp, &
2808 : 0.23192807336964e+01_dp, -0.24908020962757e+00_dp, &
2809 : -0.12371959895186e+02_dp]
2810 : REAL(KIND=dp), PARAMETER :: tmin_fff = 0.1500000e+01_dp
2811 : REAL(KIND=dp), PARAMETER :: tmax_fff = 0.3500000e+01_dp
2812 : REAL(KIND=dp), PARAMETER :: hi_fff = 4.50000000000e0_dp
2813 : REAL(KIND=dp), PARAMETER :: hsixth_fff = 3.70370370370370e-002_dp
2814 : REAL(KIND=dp), PARAMETER :: h2sixth_fff = 8.23045267489712e-003_dp
2815 : REAL(KIND=dp), PARAMETER, DIMENSION(0:9) :: cof_fff = &
2816 : [0.12503100000000e+01_dp, 0.86821000000000e+00_dp, &
2817 : 0.60846000000000e+00_dp, 0.48756000000000e+00_dp, &
2818 : 0.44163000000000e+00_dp, 0.37610000000000e+00_dp, &
2819 : 0.27145000000000e+00_dp, 0.14814000000000e+00_dp, &
2820 : 0.48550000000000e-01_dp, 0.00000000000000e+00_dp]
2821 : REAL(KIND=dp), PARAMETER, DIMENSION(0:9) :: dof_fff = &
2822 : [0.27904652711432e+02_dp, -0.45230754228635e+01_dp, &
2823 : 0.50531739800222e+01_dp, 0.11806545027747e+01_dp, &
2824 : -0.66693699112098e+00_dp, -0.89430653829079e+00_dp, &
2825 : -0.50891685571587e+00_dp, 0.66278396115427e+00_dp, &
2826 : 0.73976101109878e+00_dp, 0.25795319944506e+01_dp]
2827 : REAL(KIND=dp), PARAMETER :: tmin_uuu = -0.1770930e+01_dp
2828 : REAL(KIND=dp), PARAMETER :: tmax_uuu = 0.7908520e+01_dp
2829 : REAL(KIND=dp), PARAMETER :: hi_uuu = 0.723181585730594e0_dp
2830 : REAL(KIND=dp), PARAMETER :: hsixth_uuu = 0.230463095238095e0_dp
2831 : REAL(KIND=dp), PARAMETER :: h2sixth_uuu = 0.318679429600340e0_dp
2832 : REAL(KIND=dp), PARAMETER, DIMENSION(0:7) :: cof_uuu = &
2833 : [-0.10749300000000e+01_dp, -0.20045000000000e+00_dp, &
2834 : 0.41422000000000e+00_dp, 0.87939000000000e+00_dp, &
2835 : 0.12668900000000e+01_dp, 0.16299800000000e+01_dp, &
2836 : 0.19773800000000e+01_dp, 0.23961800000000e+01_dp]
2837 : REAL(KIND=dp), PARAMETER, DIMENSION(0:7) :: dof_uuu = &
2838 : [-0.14827125747284e+00_dp, -0.14922155328475e+00_dp, &
2839 : -0.70113224223509e-01_dp, -0.39449020349230e-01_dp, &
2840 : -0.15815242579643e-01_dp, 0.26112640061855e-01_dp, &
2841 : -0.13786974745095e+00_dp, 0.74941595372657e+00_dp]
2842 : REAL(KIND=dp), PARAMETER :: tmin_ggg = -0.1000000e+01_dp
2843 : REAL(KIND=dp), PARAMETER :: tmax_ggg = 0.8001400e+00_dp
2844 : REAL(KIND=dp), PARAMETER :: hi_ggg = 3.88858644327663e0_dp
2845 : REAL(KIND=dp), PARAMETER :: hsixth_ggg = 4.28604761904762e-002_dp
2846 : REAL(KIND=dp), PARAMETER :: h2sixth_ggg = 1.10221225156463e-002_dp
2847 : REAL(KIND=dp), PARAMETER, DIMENSION(0:7) :: cof_ggg = &
2848 : [0.52541600000000e+01_dp, 0.23591500000000e+01_dp, &
2849 : 0.11959500000000e+01_dp, 0.12299500000000e+01_dp, &
2850 : 0.20356500000000e+01_dp, 0.34247400000000e+01_dp, &
2851 : 0.49485900000000e+01_dp, 0.56179900000000e+01_dp]
2852 : REAL(KIND=dp), PARAMETER, DIMENSION(0:7) :: dof_ggg = &
2853 : [0.15826876132396e+02_dp, 0.31176239377907e+02_dp, &
2854 : 0.16589446539683e+02_dp, 0.11083892500520e+02_dp, &
2855 : 0.90887216383860e+01_dp, 0.54902279653967e+01_dp, &
2856 : -0.18823313223755e+02_dp, -0.77183416481005e+01_dp]
2857 :
2858 : REAL(KIND=dp) :: a2_fff, a2_ggg, a_fff, a_ggg, b2_fff, b2_ggg, b_fff, &
2859 : b_ggg, cof1_fff, cof1_ggg, cof2_fff, cof2_ggg, cof3_fff, &
2860 : cof3_ggg, cof4_fff, cof4_ggg, cof_fff_khi, cof_fff_klo, &
2861 : cof_ggg_khi, cof_ggg_klo, coord_iat, costheta, dens, &
2862 : dens2, dens3, dof_fff_khi, dof_fff_klo, dof_ggg_khi, &
2863 : dof_ggg_klo, e_phi, e_uuu, ener_iat, ep_phi, ep_uuu, &
2864 : fij, fijp, fik, fikp, fxij, fxik, fyij, fyik, fzij, fzik, &
2865 : gjik, gjikp, rho, rhop, rij, rik, sij, sik, t1, t2, t3, t4, &
2866 : tt, tt_fff, tt_ggg, xarg, ypt1_fff, ypt1_ggg, ypt2_fff, &
2867 : ypt2_ggg, yt1_fff, yt1_ggg, yt2_fff, yt2_ggg
2868 :
2869 : INTEGER :: iat, jat, jbr, jcnt, jkcnt, kat, kbr, khi_fff, khi_ggg, &
2870 : klo_fff, klo_ggg
2871 :
2872 : ! initialize temporary private scalars for reduction sum on energies and
2873 : ! private workarray txyz for forces forces
2874 22 : tener = 0.e0_dp
2875 22 : tener2 = 0.e0_dp
2876 22 : tcoord = 0.e0_dp
2877 22 : tcoord2 = 0.e0_dp
2878 22 : istop = 0
2879 22022 : DO iat = 1, nat
2880 22000 : txyz(1, iat) = 0.e0_dp
2881 22000 : txyz(2, iat) = 0.e0_dp
2882 22022 : txyz(3, iat) = 0.e0_dp
2883 : END DO
2884 :
2885 : ! calculation of forces, energy
2886 :
2887 22022 : forces_and_energy: DO iat = iat1, iat2
2888 :
2889 22000 : dens2 = 0.e0_dp
2890 22000 : dens3 = 0.e0_dp
2891 22000 : jcnt = 0
2892 22000 : jkcnt = 0
2893 22000 : coord_iat = 0.e0_dp
2894 22000 : ener_iat = 0.e0_dp
2895 203528 : calculate: DO jbr = lsta(1, iat), lsta(2, iat)
2896 181528 : jat = lstb(jbr)
2897 181528 : jcnt = jcnt + 1
2898 181528 : IF (jcnt > npjx) THEN
2899 0 : WRITE (*, *) 'WARNING: enlarge npjx'
2900 0 : istop = 1
2901 0 : RETURN
2902 : END IF
2903 :
2904 181528 : fxij = rel(1, jbr)
2905 181528 : fyij = rel(2, jbr)
2906 181528 : fzij = rel(3, jbr)
2907 181528 : rij = rel(4, jbr)
2908 181528 : sij = rel(5, jbr)
2909 :
2910 : ! coordination number calculated with soft cutoff between first
2911 : ! nearest neighbor and midpoint of first and second nearest neighbor
2912 181528 : IF (rij <= 2.36e0_dp) THEN
2913 27688 : coord_iat = coord_iat + 1.e0_dp
2914 153840 : ELSE IF (rij >= 3.12e0_dp) THEN
2915 : ELSE
2916 10042 : xarg = (rij - 2.36e0_dp)*(1.e0_dp/(3.12e0_dp - 2.36e0_dp))
2917 10042 : coord_iat = coord_iat + (2*xarg + 1.e0_dp)*(xarg - 1.e0_dp)**2
2918 : END IF
2919 :
2920 : ! pairpotential term
2921 : CALL splint(cof_phi, dof_phi, tmin_phi, tmax_phi, &
2922 181528 : hsixth_phi, h2sixth_phi, hi_phi, 10, rij, e_phi, ep_phi)
2923 181528 : ener_iat = ener_iat + (e_phi*.5e0_dp)
2924 181528 : txyz(1, iat) = txyz(1, iat) - fxij*(ep_phi*.5e0_dp)
2925 181528 : txyz(2, iat) = txyz(2, iat) - fyij*(ep_phi*.5e0_dp)
2926 181528 : txyz(3, iat) = txyz(3, iat) - fzij*(ep_phi*.5e0_dp)
2927 181528 : txyz(1, jat) = txyz(1, jat) + fxij*(ep_phi*.5e0_dp)
2928 181528 : txyz(2, jat) = txyz(2, jat) + fyij*(ep_phi*.5e0_dp)
2929 181528 : txyz(3, jat) = txyz(3, jat) + fzij*(ep_phi*.5e0_dp)
2930 :
2931 : ! 2 body embedding term
2932 : CALL splint(cof_rho, dof_rho, tmin_rho, tmax_rho, &
2933 181528 : hsixth_rho, h2sixth_rho, hi_rho, 11, rij, rho, rhop)
2934 181528 : dens2 = dens2 + rho
2935 181528 : f2ij(1, jcnt) = fxij*rhop
2936 181528 : f2ij(2, jcnt) = fyij*rhop
2937 181528 : f2ij(3, jcnt) = fzij*rhop
2938 :
2939 : ! 3 body embedding term
2940 : CALL splint(cof_fff, dof_fff, tmin_fff, tmax_fff, &
2941 181528 : hsixth_fff, h2sixth_fff, hi_fff, 10, rij, fij, fijp)
2942 :
2943 2098776 : embed_3body: DO kbr = lsta(1, iat), lsta(2, iat)
2944 1895248 : kat = lstb(kbr)
2945 2076776 : IF (kat < jat) THEN
2946 856860 : jkcnt = jkcnt + 1
2947 856860 : IF (jkcnt > npjkx) THEN
2948 0 : WRITE (*, *) 'WARNING: enlarge npjkx', npjkx
2949 0 : istop = 1
2950 0 : RETURN
2951 : END IF
2952 :
2953 : ! begin unoptimized original version:
2954 : ! fxik=rel(1,kbr)
2955 : ! fyik=rel(2,kbr)
2956 : ! fzik=rel(3,kbr)
2957 : ! rik=rel(4,kbr)
2958 : ! sik=rel(5,kbr)
2959 : !
2960 : ! call splint(cof_fff,dof_fff,tmin_fff,tmax_fff, &
2961 : ! hsixth_fff,h2sixth_fff,hi_fff,10,rik,fik,fikp)
2962 : ! costheta=fxij*fxik+fyij*fyik+fzij*fzik
2963 : ! call splint(cof_ggg,dof_ggg,tmin_ggg,tmax_ggg, &
2964 : ! hsixth_ggg,h2sixth_ggg,hi_ggg,8,costheta,gjik,gjikp)
2965 : ! end unoptimized original version:
2966 :
2967 : ! begin optimized version
2968 856860 : rik = rel(4, kbr)
2969 856860 : IF (rik > tmax_fff) THEN
2970 : fikp = 0.e0_dp; fik = 0.e0_dp
2971 : gjik = 0.e0_dp; gjikp = 0.e0_dp; sik = 0.e0_dp
2972 : costheta = 0.e0_dp; fxik = 0.e0_dp; fyik = 0.e0_dp; fzik = 0.e0_dp
2973 141598 : ELSE IF (rik < tmin_fff) THEN
2974 0 : fxik = rel(1, kbr)
2975 0 : fyik = rel(2, kbr)
2976 0 : fzik = rel(3, kbr)
2977 0 : costheta = fxij*fxik + fyij*fyik + fzij*fzik
2978 0 : sik = rel(5, kbr)
2979 : fikp = hi_fff*(cof_fff(1) - cof_fff(0)) - &
2980 0 : (dof_fff(1) + 2.e0_dp*dof_fff(0))*hsixth_fff
2981 0 : fik = cof_fff(0) + (rik - tmin_fff)*fikp
2982 0 : tt_ggg = (costheta - tmin_ggg)*hi_ggg
2983 0 : IF (costheta > tmax_ggg) THEN
2984 : gjikp = hi_ggg*(cof_ggg(8 - 1) - cof_ggg(8 - 2)) + &
2985 0 : (2.e0_dp*dof_ggg(8 - 1) + dof_ggg(8 - 2))*hsixth_ggg
2986 0 : gjik = cof_ggg(8 - 1) + (costheta - tmax_ggg)*gjikp
2987 : ELSE
2988 0 : klo_ggg = INT(tt_ggg)
2989 0 : khi_ggg = klo_ggg + 1
2990 0 : cof_ggg_klo = cof_ggg(klo_ggg)
2991 0 : dof_ggg_klo = dof_ggg(klo_ggg)
2992 0 : b_ggg = tt_ggg - klo_ggg
2993 0 : a_ggg = 1.e0_dp - b_ggg
2994 0 : cof_ggg_khi = cof_ggg(khi_ggg)
2995 0 : dof_ggg_khi = dof_ggg(khi_ggg)
2996 0 : b2_ggg = b_ggg*b_ggg
2997 0 : gjik = a_ggg*cof_ggg_klo
2998 0 : gjikp = cof_ggg_khi - cof_ggg_klo
2999 0 : a2_ggg = a_ggg*a_ggg
3000 0 : cof1_ggg = a2_ggg - 1.e0_dp
3001 0 : cof2_ggg = b2_ggg - 1.e0_dp
3002 0 : gjik = gjik + b_ggg*cof_ggg_khi
3003 0 : gjikp = hi_ggg*gjikp
3004 0 : cof3_ggg = 3.e0_dp*b2_ggg
3005 0 : cof4_ggg = 3.e0_dp*a2_ggg
3006 0 : cof1_ggg = a_ggg*cof1_ggg
3007 0 : cof2_ggg = b_ggg*cof2_ggg
3008 0 : cof3_ggg = cof3_ggg - 1.e0_dp
3009 0 : cof4_ggg = cof4_ggg - 1.e0_dp
3010 0 : yt1_ggg = cof1_ggg*dof_ggg_klo
3011 0 : yt2_ggg = cof2_ggg*dof_ggg_khi
3012 0 : ypt1_ggg = cof3_ggg*dof_ggg_khi
3013 0 : ypt2_ggg = cof4_ggg*dof_ggg_klo
3014 0 : gjik = gjik + (yt1_ggg + yt2_ggg)*h2sixth_ggg
3015 0 : gjikp = gjikp + (ypt1_ggg - ypt2_ggg)*hsixth_ggg
3016 : END IF
3017 : ELSE
3018 141598 : fxik = rel(1, kbr)
3019 141598 : tt_fff = rik - tmin_fff
3020 141598 : costheta = fxij*fxik
3021 141598 : fyik = rel(2, kbr)
3022 141598 : tt_fff = tt_fff*hi_fff
3023 141598 : costheta = costheta + fyij*fyik
3024 141598 : fzik = rel(3, kbr)
3025 141598 : klo_fff = INT(tt_fff)
3026 141598 : costheta = costheta + fzij*fzik
3027 141598 : sik = rel(5, kbr)
3028 141598 : tt_ggg = (costheta - tmin_ggg)*hi_ggg
3029 141598 : IF (costheta > tmax_ggg) THEN
3030 : gjikp = hi_ggg*(cof_ggg(8 - 1) - cof_ggg(8 - 2)) + &
3031 23640 : (2.e0_dp*dof_ggg(8 - 1) + dof_ggg(8 - 2))*hsixth_ggg
3032 23640 : gjik = cof_ggg(8 - 1) + (costheta - tmax_ggg)*gjikp
3033 23640 : khi_fff = klo_fff + 1
3034 23640 : cof_fff_klo = cof_fff(klo_fff)
3035 23640 : dof_fff_klo = dof_fff(klo_fff)
3036 23640 : b_fff = tt_fff - klo_fff
3037 23640 : a_fff = 1.e0_dp - b_fff
3038 23640 : cof_fff_khi = cof_fff(khi_fff)
3039 23640 : dof_fff_khi = dof_fff(khi_fff)
3040 23640 : b2_fff = b_fff*b_fff
3041 23640 : fik = a_fff*cof_fff_klo
3042 23640 : fikp = cof_fff_khi - cof_fff_klo
3043 23640 : a2_fff = a_fff*a_fff
3044 23640 : cof1_fff = a2_fff - 1.e0_dp
3045 23640 : cof2_fff = b2_fff - 1.e0_dp
3046 23640 : fik = fik + b_fff*cof_fff_khi
3047 23640 : fikp = hi_fff*fikp
3048 23640 : cof3_fff = 3.e0_dp*b2_fff
3049 23640 : cof4_fff = 3.e0_dp*a2_fff
3050 23640 : cof1_fff = a_fff*cof1_fff
3051 23640 : cof2_fff = b_fff*cof2_fff
3052 23640 : cof3_fff = cof3_fff - 1.e0_dp
3053 23640 : cof4_fff = cof4_fff - 1.e0_dp
3054 23640 : yt1_fff = cof1_fff*dof_fff_klo
3055 23640 : yt2_fff = cof2_fff*dof_fff_khi
3056 23640 : ypt1_fff = cof3_fff*dof_fff_khi
3057 23640 : ypt2_fff = cof4_fff*dof_fff_klo
3058 23640 : fik = fik + (yt1_fff + yt2_fff)*h2sixth_fff
3059 23640 : fikp = fikp + (ypt1_fff - ypt2_fff)*hsixth_fff
3060 : ELSE
3061 117958 : klo_ggg = INT(tt_ggg)
3062 117958 : khi_ggg = klo_ggg + 1
3063 117958 : khi_fff = klo_fff + 1
3064 117958 : cof_ggg_klo = cof_ggg(klo_ggg)
3065 117958 : cof_fff_klo = cof_fff(klo_fff)
3066 117958 : dof_ggg_klo = dof_ggg(klo_ggg)
3067 117958 : dof_fff_klo = dof_fff(klo_fff)
3068 117958 : b_ggg = tt_ggg - klo_ggg
3069 117958 : b_fff = tt_fff - klo_fff
3070 117958 : a_ggg = 1.e0_dp - b_ggg
3071 117958 : a_fff = 1.e0_dp - b_fff
3072 117958 : cof_ggg_khi = cof_ggg(khi_ggg)
3073 117958 : cof_fff_khi = cof_fff(khi_fff)
3074 117958 : dof_ggg_khi = dof_ggg(khi_ggg)
3075 117958 : dof_fff_khi = dof_fff(khi_fff)
3076 117958 : b2_ggg = b_ggg*b_ggg
3077 117958 : b2_fff = b_fff*b_fff
3078 117958 : gjik = a_ggg*cof_ggg_klo
3079 117958 : fik = a_fff*cof_fff_klo
3080 117958 : gjikp = cof_ggg_khi - cof_ggg_klo
3081 117958 : fikp = cof_fff_khi - cof_fff_klo
3082 117958 : a2_ggg = a_ggg*a_ggg
3083 117958 : a2_fff = a_fff*a_fff
3084 117958 : cof1_ggg = a2_ggg - 1.e0_dp
3085 117958 : cof1_fff = a2_fff - 1.e0_dp
3086 117958 : cof2_ggg = b2_ggg - 1.e0_dp
3087 117958 : cof2_fff = b2_fff - 1.e0_dp
3088 117958 : gjik = gjik + b_ggg*cof_ggg_khi
3089 117958 : fik = fik + b_fff*cof_fff_khi
3090 117958 : gjikp = hi_ggg*gjikp
3091 117958 : fikp = hi_fff*fikp
3092 117958 : cof3_ggg = 3.e0_dp*b2_ggg
3093 117958 : cof3_fff = 3.e0_dp*b2_fff
3094 117958 : cof4_ggg = 3.e0_dp*a2_ggg
3095 117958 : cof4_fff = 3.e0_dp*a2_fff
3096 117958 : cof1_ggg = a_ggg*cof1_ggg
3097 117958 : cof1_fff = a_fff*cof1_fff
3098 117958 : cof2_ggg = b_ggg*cof2_ggg
3099 117958 : cof2_fff = b_fff*cof2_fff
3100 117958 : cof3_ggg = cof3_ggg - 1.e0_dp
3101 117958 : cof3_fff = cof3_fff - 1.e0_dp
3102 117958 : cof4_ggg = cof4_ggg - 1.e0_dp
3103 117958 : cof4_fff = cof4_fff - 1.e0_dp
3104 117958 : yt1_ggg = cof1_ggg*dof_ggg_klo
3105 117958 : yt1_fff = cof1_fff*dof_fff_klo
3106 117958 : yt2_ggg = cof2_ggg*dof_ggg_khi
3107 117958 : yt2_fff = cof2_fff*dof_fff_khi
3108 117958 : ypt1_ggg = cof3_ggg*dof_ggg_khi
3109 117958 : ypt1_fff = cof3_fff*dof_fff_khi
3110 117958 : ypt2_ggg = cof4_ggg*dof_ggg_klo
3111 117958 : ypt2_fff = cof4_fff*dof_fff_klo
3112 117958 : gjik = gjik + (yt1_ggg + yt2_ggg)*h2sixth_ggg
3113 117958 : fik = fik + (yt1_fff + yt2_fff)*h2sixth_fff
3114 117958 : gjikp = gjikp + (ypt1_ggg - ypt2_ggg)*hsixth_ggg
3115 117958 : fikp = fikp + (ypt1_fff - ypt2_fff)*hsixth_fff
3116 : END IF
3117 : END IF
3118 : ! end optimized version
3119 :
3120 856860 : tt = fij*fik
3121 856860 : dens3 = dens3 + tt*gjik
3122 :
3123 856860 : t1 = fijp*fik*gjik
3124 856860 : t2 = sij*(tt*gjikp)
3125 856860 : f3ij(1, jkcnt) = fxij*t1 + (fxik - fxij*costheta)*t2
3126 856860 : f3ij(2, jkcnt) = fyij*t1 + (fyik - fyij*costheta)*t2
3127 856860 : f3ij(3, jkcnt) = fzij*t1 + (fzik - fzij*costheta)*t2
3128 :
3129 856860 : t3 = fikp*fij*gjik
3130 856860 : t4 = sik*(tt*gjikp)
3131 856860 : f3ik(1, jkcnt) = fxik*t3 + (fxij - fxik*costheta)*t4
3132 856860 : f3ik(2, jkcnt) = fyik*t3 + (fyij - fyik*costheta)*t4
3133 856860 : f3ik(3, jkcnt) = fzik*t3 + (fzij - fzik*costheta)*t4
3134 : END IF
3135 :
3136 : END DO embed_3body
3137 : END DO calculate
3138 :
3139 22000 : dens = dens2 + dens3
3140 : CALL splint(cof_uuu, dof_uuu, tmin_uuu, tmax_uuu, &
3141 22000 : hsixth_uuu, h2sixth_uuu, hi_uuu, 8, dens, e_uuu, ep_uuu)
3142 22000 : ener_iat = ener_iat + e_uuu
3143 :
3144 : ! Only now ep_uu is known and the forces can be calculated, lets loop again
3145 22000 : jcnt = 0
3146 22000 : jkcnt = 0
3147 203528 : loop_again: DO jbr = lsta(1, iat), lsta(2, iat)
3148 181528 : jat = lstb(jbr)
3149 181528 : jcnt = jcnt + 1
3150 181528 : txyz(1, iat) = txyz(1, iat) - ep_uuu*f2ij(1, jcnt)
3151 181528 : txyz(2, iat) = txyz(2, iat) - ep_uuu*f2ij(2, jcnt)
3152 181528 : txyz(3, iat) = txyz(3, iat) - ep_uuu*f2ij(3, jcnt)
3153 181528 : txyz(1, jat) = txyz(1, jat) + ep_uuu*f2ij(1, jcnt)
3154 181528 : txyz(2, jat) = txyz(2, jat) + ep_uuu*f2ij(2, jcnt)
3155 181528 : txyz(3, jat) = txyz(3, jat) + ep_uuu*f2ij(3, jcnt)
3156 :
3157 : ! 3 body embedding term
3158 2098776 : DO kbr = lsta(1, iat), lsta(2, iat)
3159 1895248 : kat = lstb(kbr)
3160 2076776 : IF (kat < jat) THEN
3161 856860 : jkcnt = jkcnt + 1
3162 :
3163 856860 : txyz(1, iat) = txyz(1, iat) - ep_uuu*(f3ij(1, jkcnt) + f3ik(1, jkcnt))
3164 856860 : txyz(2, iat) = txyz(2, iat) - ep_uuu*(f3ij(2, jkcnt) + f3ik(2, jkcnt))
3165 856860 : txyz(3, iat) = txyz(3, iat) - ep_uuu*(f3ij(3, jkcnt) + f3ik(3, jkcnt))
3166 856860 : txyz(1, jat) = txyz(1, jat) + ep_uuu*f3ij(1, jkcnt)
3167 856860 : txyz(2, jat) = txyz(2, jat) + ep_uuu*f3ij(2, jkcnt)
3168 856860 : txyz(3, jat) = txyz(3, jat) + ep_uuu*f3ij(3, jkcnt)
3169 856860 : txyz(1, kat) = txyz(1, kat) + ep_uuu*f3ik(1, jkcnt)
3170 856860 : txyz(2, kat) = txyz(2, kat) + ep_uuu*f3ik(2, jkcnt)
3171 856860 : txyz(3, kat) = txyz(3, kat) + ep_uuu*f3ik(3, jkcnt)
3172 : END IF
3173 : END DO
3174 :
3175 : END DO loop_again
3176 :
3177 : ! write(*,'(a,i4,x,e19.12,x,e10.3)') 'iat,ener_iat,coord_iat', &
3178 : ! iat,ener_iat,coord_iat
3179 22000 : tener = tener + ener_iat
3180 22000 : tener2 = tener2 + ener_iat**2
3181 22000 : tcoord = tcoord + coord_iat
3182 22022 : tcoord2 = tcoord2 + coord_iat**2
3183 :
3184 : END DO forces_and_energy
3185 :
3186 : END SUBROUTINE subfeniat_l
3187 :
3188 : ! **************************************************************************************************
3189 : !> \brief ...
3190 : !> \param iat ...
3191 : !> \param nn ...
3192 : !> \param ncx ...
3193 : !> \param ll1 ...
3194 : !> \param ll2 ...
3195 : !> \param ll3 ...
3196 : !> \param l1 ...
3197 : !> \param l2 ...
3198 : !> \param l3 ...
3199 : !> \param myspace ...
3200 : !> \param rxyz ...
3201 : !> \param icell ...
3202 : !> \param lstb ...
3203 : !> \param lay ...
3204 : !> \param rel ...
3205 : !> \param cut2 ...
3206 : !> \param indlst ...
3207 : ! **************************************************************************************************
3208 22000 : SUBROUTINE sublstiat_l(iat, nn, ncx, ll1, ll2, ll3, l1, l2, l3, myspace, &
3209 22000 : rxyz, icell, lstb, lay, rel, cut2, indlst)
3210 : ! finds the neighbours of atom iat (specified by lsta and lstb) and and
3211 : ! the relative position rel of iat with respect to these neighbours
3212 : INTEGER :: iat, nn, ncx, ll1, ll2, ll3, l1, l2, l3, &
3213 : myspace
3214 : REAL(KIND=dp) :: rxyz
3215 : INTEGER :: icell, lstb, lay
3216 : REAL(KIND=dp) :: rel, cut2
3217 : INTEGER :: indlst
3218 :
3219 : DIMENSION rxyz(3, nn), lay(nn), icell(0:ncx, -1:ll1, -1:ll2, -1:ll3), &
3220 : lstb(0:myspace - 1), rel(5, 0:myspace - 1)
3221 :
3222 : INTEGER :: jat, jj, k1, k2, k3
3223 : REAL(KIND=dp) :: rr2, tt, xrel, yrel, zrel, tti
3224 :
3225 88000 : loop_k3: DO k3 = l3 - 1, l3 + 1
3226 242000 : loop_k2: DO k2 = l2 - 1, l2 + 1
3227 726000 : loop_k1: DO k1 = l1 - 1, l1 + 1
3228 11649000 : loop_jj: DO jj = 1, icell(0, k1, k2, k3)
3229 11011000 : jat = icell(jj, k1, k2, k3)
3230 11011000 : IF (jat == iat) CYCLE loop_k3
3231 10989000 : xrel = rxyz(1, iat) - rxyz(1, jat)
3232 10989000 : yrel = rxyz(2, iat) - rxyz(2, jat)
3233 10989000 : zrel = rxyz(3, iat) - rxyz(3, jat)
3234 10989000 : rr2 = xrel**2 + yrel**2 + zrel**2
3235 11473000 : IF (rr2 <= cut2) THEN
3236 181528 : indlst = MIN(indlst, myspace - 1)
3237 181528 : lstb(indlst) = lay(jat)
3238 : ! write(*,*) 'iat,indlst,lay(jat)',iat,indlst,lay(jat)
3239 181528 : tt = SQRT(rr2)
3240 181528 : tti = 1.e0_dp/tt
3241 181528 : rel(1, indlst) = xrel*tti
3242 181528 : rel(2, indlst) = yrel*tti
3243 181528 : rel(3, indlst) = zrel*tti
3244 181528 : rel(4, indlst) = tt
3245 181528 : rel(5, indlst) = tti
3246 181528 : indlst = indlst + 1
3247 : END IF
3248 : END DO loop_jj
3249 : END DO loop_k1
3250 : END DO loop_k2
3251 : END DO loop_k3
3252 :
3253 22000 : RETURN
3254 : END SUBROUTINE sublstiat_l
3255 :
3256 : ! **************************************************************************************************
3257 : !> \brief ...
3258 : !> \param ya ...
3259 : !> \param y2a ...
3260 : !> \param tmin ...
3261 : !> \param tmax ...
3262 : !> \param hsixth ...
3263 : !> \param h2sixth ...
3264 : !> \param hi ...
3265 : !> \param n ...
3266 : !> \param x ...
3267 : !> \param y ...
3268 : !> \param yp ...
3269 : ! **************************************************************************************************
3270 566584 : SUBROUTINE splint(ya, y2a, tmin, tmax, hsixth, h2sixth, hi, n, x, y, yp)
3271 : REAL(KIND=dp) :: ya, y2a, tmin, tmax, hsixth, h2sixth, hi
3272 : INTEGER :: n
3273 : REAL(KIND=dp) :: x, y, yp
3274 :
3275 : DIMENSION y2a(0:n - 1), ya(0:n - 1)
3276 : REAL(KIND=dp) :: a, a2, b, b2, cof1, cof2, cof3, cof4, tt, &
3277 : y2a_khi, ya_klo, y2a_klo, ya_khi, ypt1, ypt2, yt1, yt2
3278 : INTEGER :: klo, khi
3279 :
3280 : ! interpolate if the argument is outside the cubic spline interval [tmin,tmax]
3281 566584 : tt = (x - tmin)*hi
3282 566584 : IF (x < tmin) THEN
3283 : yp = hi*(ya(1) - ya(0)) - &
3284 0 : (y2a(1) + 2.e0_dp*y2a(0))*hsixth
3285 0 : y = ya(0) + (x - tmin)*yp
3286 566584 : ELSE IF (x > tmax) THEN
3287 : yp = hi*(ya(n - 1) - ya(n - 2)) + &
3288 287596 : (2.e0_dp*y2a(n - 1) + y2a(n - 2))*hsixth
3289 287596 : y = ya(n - 1) + (x - tmax)*yp
3290 : ! otherwise evaluate cubic spline
3291 : ELSE
3292 278988 : klo = INT(tt)
3293 278988 : khi = klo + 1
3294 278988 : ya_klo = ya(klo)
3295 278988 : y2a_klo = y2a(klo)
3296 278988 : b = tt - klo
3297 278988 : a = 1.e0_dp - b
3298 278988 : ya_khi = ya(khi)
3299 278988 : y2a_khi = y2a(khi)
3300 278988 : b2 = b*b
3301 278988 : y = a*ya_klo
3302 278988 : yp = ya_khi - ya_klo
3303 278988 : a2 = a*a
3304 278988 : cof1 = a2 - 1.e0_dp
3305 278988 : cof2 = b2 - 1.e0_dp
3306 278988 : y = y + b*ya_khi
3307 278988 : yp = hi*yp
3308 278988 : cof3 = 3.e0_dp*b2
3309 278988 : cof4 = 3.e0_dp*a2
3310 278988 : cof1 = a*cof1
3311 278988 : cof2 = b*cof2
3312 278988 : cof3 = cof3 - 1.e0_dp
3313 278988 : cof4 = cof4 - 1.e0_dp
3314 278988 : yt1 = cof1*y2a_klo
3315 278988 : yt2 = cof2*y2a_khi
3316 278988 : ypt1 = cof3*y2a_khi
3317 278988 : ypt2 = cof4*y2a_klo
3318 278988 : y = y + (yt1 + yt2)*h2sixth
3319 278988 : yp = yp + (ypt1 - ypt2)*hsixth
3320 : END IF
3321 566584 : RETURN
3322 : END SUBROUTINE splint
3323 :
3324 : ! **************************************************************************************************
3325 : ! Additional EIP kernels consolidated here to match the original Bazant/Lenosky layout.
3326 : ! **************************************************************************************************
3327 :
3328 : ! **************************************************************************************************
3329 : !> \brief ...
3330 : !> \param nat ...
3331 : !> \param alat ...
3332 : !> \param rxyz0 ...
3333 : !> \param fxyz ...
3334 : !> \param etot ...
3335 : !> \param count ...
3336 : ! **************************************************************************************************
3337 22 : SUBROUTINE eip_stillinger_weber_silicon(nat, alat, rxyz0, fxyz, etot, count)
3338 : !*****************************************************************************************
3339 : ! This subroutine evaluates the Stillinger Weber Silicon potential with linear scaling
3340 : ! COPYRIGHT
3341 : ! Copyright (C) 2009 AIST, UNIBAS
3342 : ! This file is distributed under the terms of the
3343 : ! GNU General Public License, see
3344 : ! http://www.gnu.org/copyleft/gpl.txt .
3345 : !
3346 : ! Implementation: Original version was written by Tetsuya Morishita, AIST Tsukuba (JP)
3347 : ! Improved by M. Amsler, S. Goedecker, Basel University (CH), 2009
3348 : !
3349 : ! Note:
3350 : !
3351 : ! aa is the parameter A given on page 5263 of PRB 31, 5262 (1985).
3352 : ! bb is the parameter B given on page 5263 of PRB 31, 5262 (1985).
3353 : ! ra is the parameter a given on page 5263 of PRB 31, 5262 (1985).
3354 : ! gam and ramda are the parameters gamma and lambda
3355 : ! for the 3-body term, respectively (see Eq. (2.5) in the paper).
3356 : !
3357 : ! Input:
3358 : ! nat, integer: the number of atoms
3359 : ! alat, real(8), dim(3) : the three edges of the orthoromic simulation cell, periodic boundaries are applied
3360 : ! and atoms outside the cell will be brought back into the box
3361 : ! rxyz, real(8), dim(3,nat) : the xyz cartesian components of the atomic positions in Angstroem
3362 : !
3363 : ! Output:
3364 : ! fxyz, real(8), dim(3,nat): the xyz cartesian forces in on the corresponding atomic components n eV/A
3365 : ! etot, real(8) : total potential energy, 2-body and 3-body, in eV
3366 : ! count, real(8) : increased by 1.d0 at each call of this subroutine,
3367 : ! needs to be initialized to 0.d0 before calling this routine for the first time
3368 : !
3369 : ! Other variables:
3370 : ! p: the 2-body potential energy
3371 : ! p3: the 3-body potential energy
3372 : ! fx(i) , fy(i) , fz(i) are the 2-body forces on atom i.
3373 : ! fx3(i), fy3(i), fz3(i) are the 3-body forces on atom i.
3374 : ! fxyz(3,nat) contains both 2-body and 3-body forces
3375 : !
3376 : ! All units follow the description in PRB 31, 5262 (1985).
3377 : !*****************************************************************************************
3378 :
3379 : INTEGER :: nat
3380 : REAL(8) :: alat(3), rxyz0(3, nat), fxyz(3, nat), &
3381 : etot, count
3382 :
3383 : INTEGER :: i, iam, iat, ii, il, in, indlst, &
3384 : indlstx, ipb, l1, l2, l3, laymx, ll1, &
3385 : ll2, ll3, myspace, myspaceout, ncx, &
3386 : ndat, nn, nnbrx, npjkx, npjx, npr
3387 22 : INTEGER, ALLOCATABLE, DIMENSION(:) :: lay, lstb
3388 22 : INTEGER, ALLOCATABLE, DIMENSION(:, :) :: lsta
3389 22 : INTEGER, ALLOCATABLE, DIMENSION(:, :, :, :) :: icell
3390 44 : REAL(8) :: cut, cut2, eps, esigma, fx(nat), &
3391 44 : fx3(nat), fy(nat), fy3(nat), fz(nat), &
3392 44 : fz3(nat), isigma, p, p3, pv3, ra, &
3393 : rlc1i, rlc2i, rlc3i, sigma
3394 22 : REAL(8), ALLOCATABLE, DIMENSION(:, :) :: rel, rxyz
3395 :
3396 : PARAMETER(ra=1.8d0)
3397 : PARAMETER(sigma=2.0951d0, eps=2.167239428587d0)
3398 :
3399 22 : count = count + 1.d0
3400 22 : cut = sigma*ra*2.d0
3401 22 : isigma = 1.d0/sigma
3402 22 : esigma = eps*isigma
3403 :
3404 : ! linear scaling calculation of verlet list, only serial
3405 22 : ll1 = INT(alat(1)/cut)
3406 22 : IF (ll1 < 1) CPABORT("alat(1) too small")
3407 22 : ll2 = INT(alat(2)/cut)
3408 22 : IF (ll2 < 1) CPABORT("alat(2) too small")
3409 22 : ll3 = INT(alat(3)/cut)
3410 22 : IF (ll3 < 1) CPABORT("alat(3) too small")
3411 :
3412 22 : npr = 1
3413 22 : ncx = 29
3414 : DO
3415 22 : ncx = ncx*2
3416 132 : ALLOCATE (icell(0:ncx, -1:ll1, -1:ll2, -1:ll3))
3417 3432 : icell(0, :, :, :) = 0
3418 22 : rlc1i = ll1/alat(1)
3419 22 : rlc2i = ll2/alat(2)
3420 22 : rlc3i = ll3/alat(3)
3421 :
3422 22022 : DO iat = 1, nat
3423 22000 : rxyz0(1, iat) = MODULO(MODULO(rxyz0(1, iat), alat(1)), alat(1))
3424 22000 : rxyz0(2, iat) = MODULO(MODULO(rxyz0(2, iat), alat(2)), alat(2))
3425 22000 : rxyz0(3, iat) = MODULO(MODULO(rxyz0(3, iat), alat(3)), alat(3))
3426 22000 : l1 = INT(rxyz0(1, iat)*rlc1i)
3427 22000 : l2 = INT(rxyz0(2, iat)*rlc2i)
3428 22000 : l3 = INT(rxyz0(3, iat)*rlc3i)
3429 :
3430 22000 : ii = icell(0, l1, l2, l3)
3431 22000 : ii = ii + 1
3432 22000 : icell(0, l1, l2, l3) = ii
3433 22000 : IF (ii > ncx) THEN
3434 0 : DEALLOCATE (icell)
3435 0 : EXIT
3436 : END IF
3437 22022 : icell(ii, l1, l2, l3) = iat
3438 : END DO
3439 22 : IF (ALLOCATED(icell)) EXIT
3440 : END DO
3441 :
3442 : ! duplicate all atoms within boundary layer
3443 22 : laymx = ncx*(2*ll1*ll2 + 2*ll1*ll3 + 2*ll2*ll3 + 4*ll1 + 4*ll2 + 4*ll3 + 8)
3444 22 : nn = nat + laymx
3445 110 : ALLOCATE (rxyz(3, nn), lay(nn))
3446 22022 : DO iat = 1, nat
3447 22000 : lay(iat) = iat
3448 22000 : rxyz(1, iat) = rxyz0(1, iat)
3449 22000 : rxyz(2, iat) = rxyz0(2, iat)
3450 22022 : rxyz(3, iat) = rxyz0(3, iat)
3451 : END DO
3452 22 : il = nat
3453 : ! xy plane
3454 88 : DO l2 = 0, ll2 - 1
3455 286 : DO l1 = 0, ll1 - 1
3456 :
3457 198 : in = icell(0, l1, l2, 0)
3458 198 : icell(0, l1, l2, ll3) = in
3459 7318 : DO ii = 1, in
3460 7120 : i = icell(ii, l1, l2, 0)
3461 7120 : il = il + 1
3462 7120 : IF (il > nn) CPABORT("enlarge laymx")
3463 7120 : lay(il) = i
3464 7120 : icell(ii, l1, l2, ll3) = il
3465 7120 : rxyz(1, il) = rxyz(1, i)
3466 7120 : rxyz(2, il) = rxyz(2, i)
3467 7318 : rxyz(3, il) = rxyz(3, i) + alat(3)
3468 : END DO
3469 :
3470 198 : in = icell(0, l1, l2, ll3 - 1)
3471 198 : icell(0, l1, l2, -1) = in
3472 7444 : DO ii = 1, in
3473 7180 : i = icell(ii, l1, l2, ll3 - 1)
3474 7180 : il = il + 1
3475 7180 : IF (il > nn) CPABORT("enlarge laymx")
3476 7180 : lay(il) = i
3477 7180 : icell(ii, l1, l2, -1) = il
3478 7180 : rxyz(1, il) = rxyz(1, i)
3479 7180 : rxyz(2, il) = rxyz(2, i)
3480 7378 : rxyz(3, il) = rxyz(3, i) - alat(3)
3481 : END DO
3482 :
3483 : END DO
3484 : END DO
3485 :
3486 : ! yz plane
3487 88 : DO l3 = 0, ll3 - 1
3488 286 : DO l2 = 0, ll2 - 1
3489 :
3490 198 : in = icell(0, 0, l2, l3)
3491 198 : icell(0, ll1, l2, l3) = in
3492 7386 : DO ii = 1, in
3493 7188 : i = icell(ii, 0, l2, l3)
3494 7188 : il = il + 1
3495 7188 : IF (il > nn) CPABORT("enlarge laymx")
3496 7188 : lay(il) = i
3497 7188 : icell(ii, ll1, l2, l3) = il
3498 7188 : rxyz(1, il) = rxyz(1, i) + alat(1)
3499 7188 : rxyz(2, il) = rxyz(2, i)
3500 7386 : rxyz(3, il) = rxyz(3, i)
3501 : END DO
3502 :
3503 198 : in = icell(0, ll1 - 1, l2, l3)
3504 198 : icell(0, -1, l2, l3) = in
3505 7376 : DO ii = 1, in
3506 7112 : i = icell(ii, ll1 - 1, l2, l3)
3507 7112 : il = il + 1
3508 7112 : IF (il > nn) CPABORT("enlarge laymx")
3509 7112 : lay(il) = i
3510 7112 : icell(ii, -1, l2, l3) = il
3511 7112 : rxyz(1, il) = rxyz(1, i) - alat(1)
3512 7112 : rxyz(2, il) = rxyz(2, i)
3513 7310 : rxyz(3, il) = rxyz(3, i)
3514 : END DO
3515 :
3516 : END DO
3517 : END DO
3518 :
3519 : ! xz plane
3520 88 : DO l3 = 0, ll3 - 1
3521 286 : DO l1 = 0, ll1 - 1
3522 :
3523 198 : in = icell(0, l1, 0, l3)
3524 198 : icell(0, l1, ll2, l3) = in
3525 7452 : DO ii = 1, in
3526 7254 : i = icell(ii, l1, 0, l3)
3527 7254 : il = il + 1
3528 7254 : IF (il > nn) CPABORT("enlarge laymx")
3529 7254 : lay(il) = i
3530 7254 : icell(ii, l1, ll2, l3) = il
3531 7254 : rxyz(1, il) = rxyz(1, i)
3532 7254 : rxyz(2, il) = rxyz(2, i) + alat(2)
3533 7452 : rxyz(3, il) = rxyz(3, i)
3534 : END DO
3535 :
3536 198 : in = icell(0, l1, ll2 - 1, l3)
3537 198 : icell(0, l1, -1, l3) = in
3538 7310 : DO ii = 1, in
3539 7046 : i = icell(ii, l1, ll2 - 1, l3)
3540 7046 : il = il + 1
3541 7046 : IF (il > nn) CPABORT("enlarge laymx")
3542 7046 : lay(il) = i
3543 7046 : icell(ii, l1, -1, l3) = il
3544 7046 : rxyz(1, il) = rxyz(1, i)
3545 7046 : rxyz(2, il) = rxyz(2, i) - alat(2)
3546 7244 : rxyz(3, il) = rxyz(3, i)
3547 : END DO
3548 :
3549 : END DO
3550 : END DO
3551 :
3552 : ! x axis
3553 88 : DO l1 = 0, ll1 - 1
3554 :
3555 66 : in = icell(0, l1, 0, 0)
3556 66 : icell(0, l1, ll2, ll3) = in
3557 2474 : DO ii = 1, in
3558 2408 : i = icell(ii, l1, 0, 0)
3559 2408 : il = il + 1
3560 2408 : IF (il > nn) CPABORT("enlarge laymx")
3561 2408 : lay(il) = i
3562 2408 : icell(ii, l1, ll2, ll3) = il
3563 2408 : rxyz(1, il) = rxyz(1, i)
3564 2408 : rxyz(2, il) = rxyz(2, i) + alat(2)
3565 2474 : rxyz(3, il) = rxyz(3, i) + alat(3)
3566 : END DO
3567 :
3568 66 : in = icell(0, l1, 0, ll3 - 1)
3569 66 : icell(0, l1, ll2, -1) = in
3570 2416 : DO ii = 1, in
3571 2350 : i = icell(ii, l1, 0, ll3 - 1)
3572 2350 : il = il + 1
3573 2350 : IF (il > nn) CPABORT("enlarge laymx")
3574 2350 : lay(il) = i
3575 2350 : icell(ii, l1, ll2, -1) = il
3576 2350 : rxyz(1, il) = rxyz(1, i)
3577 2350 : rxyz(2, il) = rxyz(2, i) + alat(2)
3578 2416 : rxyz(3, il) = rxyz(3, i) - alat(3)
3579 : END DO
3580 :
3581 66 : in = icell(0, l1, ll2 - 1, 0)
3582 66 : icell(0, l1, -1, ll3) = in
3583 2278 : DO ii = 1, in
3584 2212 : i = icell(ii, l1, ll2 - 1, 0)
3585 2212 : il = il + 1
3586 2212 : IF (il > nn) CPABORT("enlarge laymx")
3587 2212 : lay(il) = i
3588 2212 : icell(ii, l1, -1, ll3) = il
3589 2212 : rxyz(1, il) = rxyz(1, i)
3590 2212 : rxyz(2, il) = rxyz(2, i) - alat(2)
3591 2278 : rxyz(3, il) = rxyz(3, i) + alat(3)
3592 : END DO
3593 :
3594 66 : in = icell(0, l1, ll2 - 1, ll3 - 1)
3595 66 : icell(0, l1, -1, -1) = in
3596 2468 : DO ii = 1, in
3597 2380 : i = icell(ii, l1, ll2 - 1, ll3 - 1)
3598 2380 : il = il + 1
3599 2380 : IF (il > nn) CPABORT("enlarge laymx")
3600 2380 : lay(il) = i
3601 2380 : icell(ii, l1, -1, -1) = il
3602 2380 : rxyz(1, il) = rxyz(1, i)
3603 2380 : rxyz(2, il) = rxyz(2, i) - alat(2)
3604 2446 : rxyz(3, il) = rxyz(3, i) - alat(3)
3605 : END DO
3606 :
3607 : END DO
3608 :
3609 : ! y axis
3610 88 : DO l2 = 0, ll2 - 1
3611 :
3612 66 : in = icell(0, 0, l2, 0)
3613 66 : icell(0, ll1, l2, ll3) = in
3614 2338 : DO ii = 1, in
3615 2272 : i = icell(ii, 0, l2, 0)
3616 2272 : il = il + 1
3617 2272 : IF (il > nn) CPABORT("enlarge laymx")
3618 2272 : lay(il) = i
3619 2272 : icell(ii, ll1, l2, ll3) = il
3620 2272 : rxyz(1, il) = rxyz(1, i) + alat(1)
3621 2272 : rxyz(2, il) = rxyz(2, i)
3622 2338 : rxyz(3, il) = rxyz(3, i) + alat(3)
3623 : END DO
3624 :
3625 66 : in = icell(0, 0, l2, ll3 - 1)
3626 66 : icell(0, ll1, l2, -1) = in
3627 2454 : DO ii = 1, in
3628 2388 : i = icell(ii, 0, l2, ll3 - 1)
3629 2388 : il = il + 1
3630 2388 : IF (il > nn) CPABORT("enlarge laymx")
3631 2388 : lay(il) = i
3632 2388 : icell(ii, ll1, l2, -1) = il
3633 2388 : rxyz(1, il) = rxyz(1, i) + alat(1)
3634 2388 : rxyz(2, il) = rxyz(2, i)
3635 2454 : rxyz(3, il) = rxyz(3, i) - alat(3)
3636 : END DO
3637 :
3638 66 : in = icell(0, ll1 - 1, l2, 0)
3639 66 : icell(0, -1, l2, ll3) = in
3640 2394 : DO ii = 1, in
3641 2328 : i = icell(ii, ll1 - 1, l2, 0)
3642 2328 : il = il + 1
3643 2328 : IF (il > nn) CPABORT("enlarge laymx")
3644 2328 : lay(il) = i
3645 2328 : icell(ii, -1, l2, ll3) = il
3646 2328 : rxyz(1, il) = rxyz(1, i) - alat(1)
3647 2328 : rxyz(2, il) = rxyz(2, i)
3648 2394 : rxyz(3, il) = rxyz(3, i) + alat(3)
3649 : END DO
3650 :
3651 66 : in = icell(0, ll1 - 1, l2, ll3 - 1)
3652 66 : icell(0, -1, l2, -1) = in
3653 2450 : DO ii = 1, in
3654 2362 : i = icell(ii, ll1 - 1, l2, ll3 - 1)
3655 2362 : il = il + 1
3656 2362 : IF (il > nn) CPABORT("enlarge laymx")
3657 2362 : lay(il) = i
3658 2362 : icell(ii, -1, l2, -1) = il
3659 2362 : rxyz(1, il) = rxyz(1, i) - alat(1)
3660 2362 : rxyz(2, il) = rxyz(2, i)
3661 2428 : rxyz(3, il) = rxyz(3, i) - alat(3)
3662 : END DO
3663 :
3664 : END DO
3665 :
3666 : ! z axis
3667 88 : DO l3 = 0, ll3 - 1
3668 :
3669 66 : in = icell(0, 0, 0, l3)
3670 66 : icell(0, ll1, ll2, l3) = in
3671 2496 : DO ii = 1, in
3672 2430 : i = icell(ii, 0, 0, l3)
3673 2430 : il = il + 1
3674 2430 : IF (il > nn) CPABORT("enlarge laymx")
3675 2430 : lay(il) = i
3676 2430 : icell(ii, ll1, ll2, l3) = il
3677 2430 : rxyz(1, il) = rxyz(1, i) + alat(1)
3678 2430 : rxyz(2, il) = rxyz(2, i) + alat(2)
3679 2496 : rxyz(3, il) = rxyz(3, i)
3680 : END DO
3681 :
3682 66 : in = icell(0, ll1 - 1, 0, l3)
3683 66 : icell(0, -1, ll2, l3) = in
3684 2396 : DO ii = 1, in
3685 2330 : i = icell(ii, ll1 - 1, 0, l3)
3686 2330 : il = il + 1
3687 2330 : IF (il > nn) CPABORT("enlarge laymx")
3688 2330 : lay(il) = i
3689 2330 : icell(ii, -1, ll2, l3) = il
3690 2330 : rxyz(1, il) = rxyz(1, i) - alat(1)
3691 2330 : rxyz(2, il) = rxyz(2, i) + alat(2)
3692 2396 : rxyz(3, il) = rxyz(3, i)
3693 : END DO
3694 :
3695 66 : in = icell(0, 0, ll2 - 1, l3)
3696 66 : icell(0, ll1, -1, l3) = in
3697 2344 : DO ii = 1, in
3698 2278 : i = icell(ii, 0, ll2 - 1, l3)
3699 2278 : il = il + 1
3700 2278 : IF (il > nn) CPABORT("enlarge laymx")
3701 2278 : lay(il) = i
3702 2278 : icell(ii, ll1, -1, l3) = il
3703 2278 : rxyz(1, il) = rxyz(1, i) + alat(1)
3704 2278 : rxyz(2, il) = rxyz(2, i) - alat(2)
3705 2344 : rxyz(3, il) = rxyz(3, i)
3706 : END DO
3707 :
3708 66 : in = icell(0, ll1 - 1, ll2 - 1, l3)
3709 66 : icell(0, -1, -1, l3) = in
3710 2400 : DO ii = 1, in
3711 2312 : i = icell(ii, ll1 - 1, ll2 - 1, l3)
3712 2312 : il = il + 1
3713 2312 : IF (il > nn) CPABORT("enlarge laymx")
3714 2312 : lay(il) = i
3715 2312 : icell(ii, -1, -1, l3) = il
3716 2312 : rxyz(1, il) = rxyz(1, i) - alat(1)
3717 2312 : rxyz(2, il) = rxyz(2, i) - alat(2)
3718 2378 : rxyz(3, il) = rxyz(3, i)
3719 : END DO
3720 :
3721 : END DO
3722 :
3723 : ! corners
3724 22 : in = icell(0, 0, 0, 0)
3725 22 : icell(0, ll1, ll2, ll3) = in
3726 774 : DO ii = 1, in
3727 752 : i = icell(ii, 0, 0, 0)
3728 752 : il = il + 1
3729 752 : IF (il > nn) CPABORT("enlarge laymx")
3730 752 : lay(il) = i
3731 752 : icell(ii, ll1, ll2, ll3) = il
3732 752 : rxyz(1, il) = rxyz(1, i) + alat(1)
3733 752 : rxyz(2, il) = rxyz(2, i) + alat(2)
3734 774 : rxyz(3, il) = rxyz(3, i) + alat(3)
3735 : END DO
3736 :
3737 22 : in = icell(0, ll1 - 1, 0, 0)
3738 22 : icell(0, -1, ll2, ll3) = in
3739 794 : DO ii = 1, in
3740 772 : i = icell(ii, ll1 - 1, 0, 0)
3741 772 : il = il + 1
3742 772 : IF (il > nn) CPABORT("enlarge laymx")
3743 772 : lay(il) = i
3744 772 : icell(ii, -1, ll2, ll3) = il
3745 772 : rxyz(1, il) = rxyz(1, i) - alat(1)
3746 772 : rxyz(2, il) = rxyz(2, i) + alat(2)
3747 794 : rxyz(3, il) = rxyz(3, i) + alat(3)
3748 : END DO
3749 :
3750 22 : in = icell(0, 0, ll2 - 1, 0)
3751 22 : icell(0, ll1, -1, ll3) = in
3752 718 : DO ii = 1, in
3753 696 : i = icell(ii, 0, ll2 - 1, 0)
3754 696 : il = il + 1
3755 696 : IF (il > nn) CPABORT("enlarge laymx")
3756 696 : lay(il) = i
3757 696 : icell(ii, ll1, -1, ll3) = il
3758 696 : rxyz(1, il) = rxyz(1, i) + alat(1)
3759 696 : rxyz(2, il) = rxyz(2, i) - alat(2)
3760 718 : rxyz(3, il) = rxyz(3, i) + alat(3)
3761 : END DO
3762 :
3763 22 : in = icell(0, ll1 - 1, ll2 - 1, 0)
3764 22 : icell(0, -1, -1, ll3) = in
3765 786 : DO ii = 1, in
3766 764 : i = icell(ii, ll1 - 1, ll2 - 1, 0)
3767 764 : il = il + 1
3768 764 : IF (il > nn) CPABORT("enlarge laymx")
3769 764 : lay(il) = i
3770 764 : icell(ii, -1, -1, ll3) = il
3771 764 : rxyz(1, il) = rxyz(1, i) - alat(1)
3772 764 : rxyz(2, il) = rxyz(2, i) - alat(2)
3773 786 : rxyz(3, il) = rxyz(3, i) + alat(3)
3774 : END DO
3775 :
3776 22 : in = icell(0, 0, 0, ll3 - 1)
3777 22 : icell(0, ll1, ll2, -1) = in
3778 874 : DO ii = 1, in
3779 852 : i = icell(ii, 0, 0, ll3 - 1)
3780 852 : il = il + 1
3781 852 : IF (il > nn) CPABORT("enlarge laymx")
3782 852 : lay(il) = i
3783 852 : icell(ii, ll1, ll2, -1) = il
3784 852 : rxyz(1, il) = rxyz(1, i) + alat(1)
3785 852 : rxyz(2, il) = rxyz(2, i) + alat(2)
3786 874 : rxyz(3, il) = rxyz(3, i) - alat(3)
3787 : END DO
3788 :
3789 22 : in = icell(0, ll1 - 1, 0, ll3 - 1)
3790 22 : icell(0, -1, ll2, -1) = in
3791 768 : DO ii = 1, in
3792 746 : i = icell(ii, ll1 - 1, 0, ll3 - 1)
3793 746 : il = il + 1
3794 746 : IF (il > nn) CPABORT("enlarge laymx")
3795 746 : lay(il) = i
3796 746 : icell(ii, -1, ll2, -1) = il
3797 746 : rxyz(1, il) = rxyz(1, i) - alat(1)
3798 746 : rxyz(2, il) = rxyz(2, i) + alat(2)
3799 768 : rxyz(3, il) = rxyz(3, i) - alat(3)
3800 : END DO
3801 :
3802 22 : in = icell(0, 0, ll2 - 1, ll3 - 1)
3803 22 : icell(0, ll1, -1, -1) = in
3804 786 : DO ii = 1, in
3805 764 : i = icell(ii, 0, ll2 - 1, ll3 - 1)
3806 764 : il = il + 1
3807 764 : IF (il > nn) CPABORT("enlarge laymx")
3808 764 : lay(il) = i
3809 764 : icell(ii, ll1, -1, -1) = il
3810 764 : rxyz(1, il) = rxyz(1, i) + alat(1)
3811 764 : rxyz(2, il) = rxyz(2, i) - alat(2)
3812 786 : rxyz(3, il) = rxyz(3, i) - alat(3)
3813 : END DO
3814 :
3815 22 : in = icell(0, ll1 - 1, ll2 - 1, ll3 - 1)
3816 22 : icell(0, -1, -1, -1) = in
3817 814 : DO ii = 1, in
3818 792 : i = icell(ii, ll1 - 1, ll2 - 1, ll3 - 1)
3819 792 : il = il + 1
3820 792 : IF (il > nn) CPABORT("enlarge laymx")
3821 792 : lay(il) = i
3822 792 : icell(ii, -1, -1, -1) = il
3823 792 : rxyz(1, il) = rxyz(1, i) - alat(1)
3824 792 : rxyz(2, il) = rxyz(2, i) - alat(2)
3825 814 : rxyz(3, il) = rxyz(3, i) - alat(3)
3826 : END DO
3827 :
3828 66 : ALLOCATE (lsta(2, nat))
3829 22 : nnbrx = 300
3830 0 : DO
3831 22 : nnbrx = 3*nnbrx/2
3832 110 : ALLOCATE (lstb(nnbrx*nat), rel(5, nnbrx*nat))
3833 :
3834 22 : indlstx = 0
3835 :
3836 22 : npr = 1
3837 22 : iam = 0
3838 :
3839 22 : cut2 = cut**2
3840 : ! assign contiguous portions of the arrays lstb and rel to the threads (this version only contains one thread)
3841 22 : myspace = (nat*nnbrx)/npr
3842 : IF (iam == 0) myspaceout = myspace
3843 : ! Verlet list, relative positions
3844 22 : indlst = 0
3845 88 : DO l3 = 0, ll3 - 1
3846 286 : DO l2 = 0, ll2 - 1
3847 858 : DO l1 = 0, ll1 - 1
3848 22792 : DO ii = 1, icell(0, l1, l2, l3)
3849 22000 : iat = icell(ii, l1, l2, l3)
3850 22594 : IF (((iat - 1)*npr)/nat == iam) THEN
3851 22000 : lsta(1, iat) = iam*myspace + indlst + 1
3852 : CALL sw_sublstiat_l(iat, nn, ncx, ll1, ll2, ll3, l1, l2, l3, myspace, &
3853 22000 : rxyz, icell, lstb(iam*myspace + 1), lay, rel(1, iam*myspace + 1), cut2, indlst)
3854 22000 : lsta(2, iat) = iam*myspace + indlst
3855 22000 : ipb = lsta(1, iat)
3856 22000 : ndat = lsta(2, iat) - lsta(1, iat) + 1
3857 : END IF
3858 : END DO
3859 : END DO
3860 : END DO
3861 : END DO
3862 22 : indlstx = MAX(indlstx, indlst)
3863 :
3864 22 : IF (indlstx < myspaceout) EXIT
3865 22 : DEALLOCATE (lstb, rel)
3866 : END DO
3867 :
3868 22 : npr = 1
3869 22 : iam = 0
3870 22 : npjx = 300; npjkx = 6000
3871 : !end of creating pairlist part------------------------------------------------------------
3872 :
3873 : !start energy and force calculation-------------------------------------------------------
3874 : !set all variables to zero
3875 22 : p = 0.0d0
3876 22 : p3 = 0.0d0
3877 22 : pv3 = 0.0d0
3878 22022 : fx(:) = 0.0d0
3879 22022 : fy(:) = 0.0d0
3880 22022 : fz(:) = 0.0d0
3881 22022 : fx3(:) = 0.0d0
3882 22022 : fy3(:) = 0.0d0
3883 22022 : fz3(:) = 0.0d0
3884 : !-----------------------------------------------------------------------------------------
3885 : ! triple loop for the 2 and 3-body forces
3886 : ! do 20 i
3887 : ! do 30 j
3888 : ! do 40 k
3889 : ! the pairlists lsta and lstb are used for the perodic boundary conditions
3890 : !-----------------------------------------------------------------------------------------
3891 :
3892 22022 : DO i = 1, nat
3893 22022 : CALL sw_subfeniat_l(i, nat, nnbrx, rel, p, p3, fx, fy, fz, fx3, fy3, fz3, lstb, lsta, isigma, sigma)
3894 : END DO
3895 : !-----------------------------------------------------------------------------------------
3896 : !*****if necessary,********
3897 22022 : DO i = 1, nat
3898 22000 : fx(i) = fx(i) + fx3(i)
3899 22000 : fy(i) = fy(i) + fy3(i)
3900 22022 : fz(i) = fz(i) + fz3(i)
3901 : END DO
3902 : !-----------------------------------------------------------------------------------------
3903 :
3904 22022 : DO i = 1, nat
3905 22000 : fxyz(1, i) = fx(i)*esigma
3906 22000 : fxyz(2, i) = fy(i)*esigma
3907 22022 : fxyz(3, i) = fz(i)*esigma
3908 : END DO
3909 22 : etot = (p + p3)*eps
3910 22 : DEALLOCATE (rxyz, icell, lay, lsta, lstb, rel)
3911 22 : END SUBROUTINE eip_stillinger_weber_silicon
3912 : !End of the force calculation-------------------------------------------------------------
3913 :
3914 : ! **************************************************************************************************
3915 : !> \brief ...
3916 : !> \param c ...
3917 : !> \return ...
3918 : ! **************************************************************************************************
3919 0 : REAL(8) FUNCTION f(c)
3920 : REAL(8) :: c
3921 :
3922 : REAL(8) :: aa, bb, c4, crainv, ra
3923 :
3924 : PARAMETER(aa=7.049556277d0)
3925 : PARAMETER(ra=1.8d0, bb=0.6022245584d0)
3926 :
3927 0 : IF ((c - ra) < 0.d0) THEN
3928 0 : crainv = 1.0d0/(c - ra)
3929 0 : c4 = c*c*c*c
3930 0 : f = aa*bb*4.0d0/(c4*c)*dexp(crainv) + aa*(bb/(c4) - 1.0d0)*dexp(crainv)*crainv*crainv
3931 : ELSE
3932 : f = 0.d0
3933 : END IF
3934 :
3935 : RETURN
3936 : END FUNCTION f
3937 :
3938 : ! **************************************************************************************************
3939 : !> \brief ...
3940 : !> \param d ...
3941 : !> \return ...
3942 : ! **************************************************************************************************
3943 0 : REAL(8) FUNCTION pe(d)
3944 : REAL(8) :: d
3945 :
3946 : REAL(8), PARAMETER :: aa = 7.049556277d0, bb = 0.6022245584d0, &
3947 : ra = 1.8d0
3948 :
3949 0 : IF ((d - ra) < 0.d0) THEN
3950 0 : pe = aa*(bb/(d*d*d*d) - 1.0d0)*dexp(1.0d0/(d - ra))
3951 : ELSE
3952 : pe = 0.d0
3953 : END IF
3954 : RETURN
3955 : END FUNCTION pe
3956 :
3957 : !------------------------------------------------------------------------------------------
3958 : ! **************************************************************************************************
3959 : !> \brief ...
3960 : !> \param iat ...
3961 : !> \param nn ...
3962 : !> \param ncx ...
3963 : !> \param ll1 ...
3964 : !> \param ll2 ...
3965 : !> \param ll3 ...
3966 : !> \param l1 ...
3967 : !> \param l2 ...
3968 : !> \param l3 ...
3969 : !> \param myspace ...
3970 : !> \param rxyz ...
3971 : !> \param icell ...
3972 : !> \param lstb ...
3973 : !> \param lay ...
3974 : !> \param rel ...
3975 : !> \param cut2 ...
3976 : !> \param indlst ...
3977 : ! **************************************************************************************************
3978 22000 : SUBROUTINE sw_sublstiat_l(iat, nn, ncx, ll1, ll2, ll3, l1, l2, l3, myspace, &
3979 22000 : rxyz, icell, lstb, lay, rel, cut2, indlst)
3980 : ! finds the neighbours of atom iat (specified by lsta and lstb) and and
3981 : ! the relative position rel of iat with respect to these neighbours
3982 : INTEGER :: iat, nn, ncx, ll1, ll2, ll3, l1, l2, l3, &
3983 : myspace
3984 : REAL(8) :: rxyz(3, nn)
3985 : INTEGER :: icell(0:ncx, -1:ll1, -1:ll2, -1:ll3), lstb(0:myspace - 1), lay(nn)
3986 : REAL(8) :: rel(5, 0:myspace - 1), cut2
3987 : INTEGER :: indlst
3988 :
3989 : INTEGER :: jat, jj, k1, k2, k3
3990 : REAL(8) :: rr2, tt, tti, xrel, yrel, zrel
3991 :
3992 88000 : DO k3 = l3 - 1, l3 + 1
3993 286000 : DO k2 = l2 - 1, l2 + 1
3994 858000 : DO k1 = l1 - 1, l1 + 1
3995 22792000 : DO jj = 1, icell(0, k1, k2, k3)
3996 22000000 : jat = icell(jj, k1, k2, k3)
3997 22000000 : IF (jat == iat) CYCLE
3998 21978000 : xrel = rxyz(1, iat) - rxyz(1, jat)
3999 21978000 : yrel = rxyz(2, iat) - rxyz(2, jat)
4000 21978000 : zrel = rxyz(3, iat) - rxyz(3, jat)
4001 21978000 : rr2 = xrel**2 + yrel**2 + zrel**2
4002 22572000 : IF (rr2 <= cut2) THEN
4003 1892004 : indlst = MIN(indlst, myspace - 1)
4004 1892004 : lstb(indlst) = lay(jat)
4005 : ! write(6,*) 'iat,indlst,lay(jat)',iat,indlst,lay(jat)
4006 1892004 : tt = SQRT(rr2)
4007 1892004 : tti = 1.d0/tt
4008 1892004 : rel(1, indlst) = xrel*tti
4009 1892004 : rel(2, indlst) = yrel*tti
4010 1892004 : rel(3, indlst) = zrel*tti
4011 1892004 : rel(4, indlst) = tt
4012 1892004 : rel(5, indlst) = tti
4013 1892004 : indlst = indlst + 1
4014 : END IF
4015 : END DO
4016 : END DO
4017 : END DO
4018 : END DO
4019 :
4020 22000 : RETURN
4021 : END SUBROUTINE sw_sublstiat_l
4022 :
4023 : ! **************************************************************************************************
4024 : !> \brief ...
4025 : !> \param i ...
4026 : !> \param nat ...
4027 : !> \param nnbrx ...
4028 : !> \param rel ...
4029 : !> \param p ...
4030 : !> \param p3 ...
4031 : !> \param fx ...
4032 : !> \param fy ...
4033 : !> \param fz ...
4034 : !> \param fx3 ...
4035 : !> \param fy3 ...
4036 : !> \param fz3 ...
4037 : !> \param lstb ...
4038 : !> \param lsta ...
4039 : !> \param isigma ...
4040 : !> \param sigma ...
4041 : ! **************************************************************************************************
4042 22000 : SUBROUTINE sw_subfeniat_l(i, nat, nnbrx, rel, p, p3, fx, fy, fz, fx3, fy3, fz3, lstb, lsta, isigma, sigma)
4043 : INTEGER, INTENT(IN) :: i, nat, nnbrx
4044 : REAL(8), INTENT(IN) :: rel(5, nnbrx*nat)
4045 : REAL(8), INTENT(INOUT) :: p, p3, fx(nat), fy(nat), fz(nat), &
4046 : fx3(nat), fy3(nat), fz3(nat)
4047 : INTEGER, INTENT(IN) :: lstb(nnbrx*nat), lsta(2, nat)
4048 : REAL(8), INTENT(IN) :: isigma, sigma
4049 :
4050 : INTEGER :: Ipb, Ipe, j, k, l, m, nij
4051 : REAL(8) :: aa, bb, c4, cosijk, cosijk3, cosikj, cosikj3, cosjik, cosjik3, crainv, force, &
4052 : gam, hi, hixij, hixij0, hixij1, hixik, hixik0, hixik1, hiyij, hiyij0, hiyij1, hiyik, &
4053 : hiyik0, hiyik1, HIZIJ, HIZIJ0, HIZIJ1, HIZIK, HIZIK0, HIZIK1, hj, hjxij, hjxij0, hjxij1, &
4054 : hjxjk, hjxjk0, hjxjk1, hjyij, hjyij0, hjyij1, hjyjk, hjyjk0, hjyjk1, HJZIJ, HJZIJ0, &
4055 : HJZIJ1, HJZJK, HJZJK0, HJZJK1, hk, hkxik, hkxik0, HKXIK1, hkxkj, hkxkj0, hkxkj1, hkyik, &
4056 : hkyik0, hkyik1, hkykj, hkykj0, hkykj1, HKZIK, HKZIK0, HKZIK1, HKZKJ, HKZKJ0, HKZKJ1, &
4057 : invrij, invrija, invrik, invrika, invrjk, invrjka, ra, ramda, refi, refj
4058 : REAL(8) :: refk, rij, rija, rik, rika, rjk, rjka, xij, xik, xjk, yij, yik, yjk, zij, zik, zjk
4059 :
4060 : PARAMETER(gam=1.2d0, ramda=21.0d0, aa=7.049556277d0)
4061 : PARAMETER(ra=1.8d0, bb=0.6022245584d0)
4062 :
4063 22000 : Ipb = lsta(1, i)
4064 22000 : Ipe = lsta(2, i)
4065 :
4066 1914004 : DO l = Ipb, Ipe
4067 1892004 : j = lstb(l)
4068 1892004 : IF (j <= i) CYCLE
4069 946002 : nij = 0
4070 946002 : rij = rel(4, l)*isigma
4071 946002 : invrij = rel(5, l)*sigma
4072 946002 : xij = rel(1, l)*rij
4073 946002 : yij = rel(2, l)*rij
4074 946002 : zij = rel(3, l)*rij
4075 :
4076 946002 : IF (rij >= 2.d0*ra) CYCLE
4077 946002 : IF (rij < ra) THEN
4078 44942 : crainv = 1.0d0/(rij - ra)
4079 44942 : c4 = rij*rij*rij*rij
4080 44942 : force = aa*bb*4.0d0/(c4*rij)*dexp(crainv) + aa*(bb/(c4) - 1.0d0)*dexp(crainv)*crainv*crainv
4081 :
4082 44942 : fx(i) = force*xij*invrij + fx(i)
4083 44942 : fy(i) = force*yij*invrij + fy(i)
4084 44942 : fz(i) = force*zij*invrij + fz(i)
4085 :
4086 44942 : fx(j) = -force*xij*invrij + fx(j)
4087 44942 : fy(j) = -force*yij*invrij + fy(j)
4088 44942 : fz(j) = -force*zij*invrij + fz(j)
4089 :
4090 44942 : p = p + aa*(bb/(rij*rij*rij*rij) - 1.0d0)*dexp(1.0d0/(rij - ra))
4091 :
4092 44942 : nij = 1
4093 : END IF
4094 :
4095 82324312 : DO m = Ipb, Ipe
4096 81356310 : k = lstb(m)
4097 81356310 : IF (k <= j) CYCLE
4098 23689448 : invrik = rel(5, m)*sigma
4099 23689448 : rik = rel(4, m)*isigma
4100 23689448 : xik = rel(1, m)*rik
4101 23689448 : yik = rel(2, m)*rik
4102 23689448 : zik = rel(3, m)*rik
4103 :
4104 23689448 : IF ((rik >= ra) .AND. (nij == 0)) CYCLE
4105 :
4106 2130678 : xjk = xik - xij
4107 2130678 : yjk = yik - yij
4108 2130678 : zjk = zik - zij
4109 :
4110 2130678 : rjk = SQRT(xjk*xjk + yjk*yjk + zjk*zjk)
4111 2130678 : invrjk = 1.d0/rjk
4112 :
4113 2130678 : IF ((rjk >= ra) .AND. (nij == 0)) CYCLE
4114 1551074 : cosjik = (xij*xik + yij*yik + zij*zik)*(invrij*invrik)
4115 1551074 : cosijk = (-xij*xjk - yij*yjk - zij*zjk)*(invrij*invrjk)
4116 1551074 : cosikj = (xik*xjk + yik*yjk + zik*zjk)*(invrik*invrjk)
4117 1551074 : cosjik3 = cosjik + 1.0d0/3.0d0
4118 1551074 : cosijk3 = cosijk + 1.0d0/3.0d0
4119 1551074 : cosikj3 = cosikj + 1.0d0/3.0d0
4120 :
4121 1551074 : rija = rij - ra
4122 1551074 : rika = rik - ra
4123 1551074 : rjka = rjk - ra
4124 :
4125 1551074 : invrija = 1.d0/rija
4126 1551074 : invrika = 1.d0/rika
4127 1551074 : invrjka = 1.d0/rjka
4128 :
4129 1551074 : IF (rija >= 0.0d0) THEN
4130 37312 : refi = 0.0d0
4131 37312 : refj = 0.0d0
4132 37312 : refk = ramda*EXP(gam*invrika + gam*invrjka)
4133 1513762 : ELSE IF ((rija < 0.0d0) .AND. (rika < 0.0d0)) THEN
4134 38074 : IF (rjka < 0.0d0) THEN
4135 950 : refi = ramda*EXP(gam*invrija + gam*invrika)
4136 950 : refj = ramda*EXP(gam*invrija + gam*invrjka)
4137 950 : refk = ramda*EXP(gam*invrika + gam*invrjka)
4138 : ELSE
4139 37124 : refi = ramda*EXP(gam*invrija + gam*invrika)
4140 37124 : refj = 0.0d0
4141 37124 : refk = 0.0d0
4142 : END IF
4143 1475688 : ELSE IF ((rija < 0.0d0) .AND. (rjka < 0.0d0)) THEN
4144 62588 : refi = 0.0d0
4145 62588 : refj = ramda*EXP(gam*invrija + gam*invrjka)
4146 62588 : refk = 0.0d0
4147 : ELSE
4148 : CYCLE
4149 : END IF
4150 :
4151 137974 : hi = refi*cosjik3*cosjik3
4152 137974 : hj = refj*cosijk3*cosijk3
4153 137974 : hk = refk*cosikj3*cosikj3
4154 137974 : p3 = p3 + hi + hj + hk
4155 :
4156 137974 : hixij0 = 2.0d0*(xik*invrik - xij*cosjik*invrij)
4157 137974 : hixij1 = gam*xij*cosjik3*(invrija*invrija)
4158 137974 : hixij = refi*cosjik3*(hixij0 - hixij1)*invrij
4159 137974 : hixik0 = 2.0d0*(xij*invrij - xik*cosjik*invrik)
4160 137974 : hixik1 = gam*xik*cosjik3*(invrika*invrika)
4161 137974 : hixik = refi*cosjik3*(hixik0 - hixik1)*invrik
4162 137974 : hjxij0 = 2.0d0*(-xjk*invrjk - xij*cosijk*invrij)
4163 137974 : hjxij1 = gam*xij*cosijk3*(invrija*invrija)
4164 137974 : hjxij = refj*cosijk3*(hjxij0 - hjxij1)*invrij
4165 137974 : hkxik0 = 2.0d0*(xjk*invrjk - xik*cosikj*invrik)
4166 137974 : hkxik1 = gam*xik*cosikj3*(invrika*invrika)
4167 137974 : hkxik = refk*cosikj3*(hkxik0 - hkxik1)*invrik
4168 137974 : hjxjk0 = 2.0d0*(-xij*invrij - xjk*cosijk*invrjk)
4169 137974 : hjxjk1 = gam*xjk*cosijk3*(invrjka*invrjka)
4170 137974 : hjxjk = refj*cosijk3*(hjxjk0 - hjxjk1)*invrjk
4171 137974 : hkxkj0 = 2.0d0*(-xik*invrik + xjk*cosikj*invrjk)
4172 137974 : hkxkj1 = gam*xjk*cosikj3*(invrjka*invrjka)
4173 137974 : hkxkj = refk*cosikj3*(hkxkj0 + hkxkj1)*invrjk
4174 :
4175 137974 : hiyij0 = 2.0d0*(yik*invrik - yij*cosjik*invrij)
4176 137974 : hiyij1 = gam*yij*cosjik3*(invrija*invrija)
4177 137974 : hiyij = refi*cosjik3*(hiyij0 - hiyij1)*invrij
4178 137974 : hiyik0 = 2.0d0*(yij*invrij - yik*cosjik*invrik)
4179 137974 : hiyik1 = gam*yik*cosjik3*(invrika*invrika)
4180 137974 : hiyik = refi*cosjik3*(hiyik0 - hiyik1)*invrik
4181 137974 : hjyij0 = 2.0d0*(-yjk*invrjk - yij*cosijk*invrij)
4182 137974 : hjyij1 = gam*yij*cosijk3*(invrija*invrija)
4183 137974 : hjyij = refj*cosijk3*(hjyij0 - hjyij1)*invrij
4184 137974 : hkyik0 = 2.0d0*(yjk*invrjk - yik*cosikj*invrik)
4185 137974 : hkyik1 = gam*yik*cosikj3*(invrika*invrika)
4186 137974 : hkyik = refk*cosikj3*(hkyik0 - hkyik1)*invrik
4187 137974 : hjyjk0 = 2.0d0*(-yij*invrij - yjk*cosijk*invrjk)
4188 137974 : hjyjk1 = gam*yjk*cosijk3*(invrjka*invrjka)
4189 137974 : hjyjk = refj*cosijk3*(hjyjk0 - hjyjk1)*invrjk
4190 137974 : hkykj0 = 2.0d0*(-yik*invrik + yjk*cosikj*invrjk)
4191 137974 : hkykj1 = gam*yjk*cosikj3*(invrjka*invrjka)
4192 137974 : hkykj = refk*cosikj3*(hkykj0 + hkykj1)*invrjk
4193 :
4194 137974 : hizij0 = 2.0d0*(zik*invrik - zij*cosjik*invrij)
4195 137974 : hizij1 = gam*zij*cosjik3*(invrija*invrija)
4196 137974 : hizij = refi*cosjik3*(hizij0 - hizij1)*invrij
4197 137974 : hizik0 = 2.0d0*(zij*invrij - zik*cosjik*invrik)
4198 137974 : hizik1 = gam*zik*cosjik3*(invrika*invrika)
4199 137974 : hizik = refi*cosjik3*(hizik0 - hizik1)*invrik
4200 137974 : hjzij0 = 2.0d0*(-zjk*invrjk - zij*cosijk*invrij)
4201 137974 : hjzij1 = gam*zij*cosijk3*(invrija*invrija)
4202 137974 : hjzij = refj*cosijk3*(hjzij0 - hjzij1)*invrij
4203 137974 : hkzik0 = 2.0d0*(zjk*invrjk - zik*cosikj*invrik)
4204 137974 : hkzik1 = gam*zik*cosikj3*(invrika*invrika)
4205 137974 : hkzik = refk*cosikj3*(hkzik0 - hkzik1)*invrik
4206 137974 : hjzjk0 = 2.0d0*(-zij*invrij - zjk*cosijk*invrjk)
4207 137974 : hjzjk1 = gam*zjk*cosijk3*(invrjka*invrjka)
4208 137974 : hjzjk = refj*cosijk3*(hjzjk0 - hjzjk1)*invrjk
4209 137974 : hkzkj0 = 2.0d0*(-zik*invrik + zjk*cosikj*invrjk)
4210 137974 : hkzkj1 = gam*zjk*cosikj3*(invrjka*invrjka)
4211 137974 : hkzkj = refk*cosikj3*(hkzkj0 + hkzkj1)*invrjk
4212 :
4213 137974 : fx3(i) = fx3(i) - hixij - hixik - hjxij - hkxik
4214 137974 : fy3(i) = fy3(i) - hiyij - hiyik - hjyij - hkyik
4215 137974 : fz3(i) = fz3(i) - hizij - hizik - hjzij - hkzik
4216 :
4217 137974 : fx3(j) = fx3(j) + hixij + hjxij - hjxjk + hkxkj
4218 137974 : fy3(j) = fy3(j) + hiyij + hjyij - hjyjk + hkykj
4219 137974 : fz3(j) = fz3(j) + hizij + hjzij - hjzjk + hkzkj
4220 :
4221 137974 : fx3(k) = fx3(k) + hixik + hkxik - hkxkj + hjxjk
4222 137974 : fy3(k) = fy3(k) + hiyik + hkyik - hkykj + hjyjk
4223 83248314 : fz3(k) = fz3(k) + hizik + hkzik - hkzkj + hjzjk
4224 : END DO
4225 : END DO
4226 22000 : END SUBROUTINE sw_subfeniat_l
4227 :
4228 : ! **************************************************************************************************
4229 : !> \brief ...
4230 : !> \param nat ...
4231 : !> \param alat ...
4232 : !> \param rxyz ...
4233 : !> \param fxyz ...
4234 : !> \param etot ...
4235 : !> \param count ...
4236 : ! **************************************************************************************************
4237 22 : SUBROUTINE eip_tersoff_silicon(nat, alat, rxyz, fxyz, etot, count)
4238 : !*****************************************************************************************
4239 : ! This subroutine evaluates the Tersoff Silicon potential with linear scaling
4240 : ! COPYRIGHT
4241 : ! Copyright (C) 2009 AIST, UNIBAS
4242 : ! This file is distributed under the terms of the
4243 : ! GNU General Public License, see
4244 : ! http://www.gnu.org/copyleft/gpl.txt .
4245 : !
4246 : ! Implementation: Original version was written by Kengo Nishio, AIST Tsukuba (JP)
4247 : ! Improved by M. Amsler, S. Goedecker, Basel University (CH), 2009
4248 : !
4249 : ! Note:
4250 : ! Parameters and functional form from PRL 61, 2879 (1988) and PRB 39, 5566 (1989)
4251 : !
4252 : ! Input:
4253 : ! nat, integer: the number of atoms
4254 : ! alat, real(8), dim(3) : the three edges of the orthoromic simulation cell, periodic boundaries are applied
4255 : ! and atoms outside the cell will be brought back into the box
4256 : ! rxyz, real(8), dim(3,nat) : the xyz cartesian components of the atomic positions in Angstroem
4257 : !
4258 : ! Output:
4259 : ! fxyz, real(8), dim(3,nat): the xyz cartesian forces in on the corresponding atomic components n eV/A
4260 : ! etot, real(8) : total potential energy, 2-body and 3-body, in eV
4261 : ! count, real(8) : increased by 1.d0 at each call of this subroutine,
4262 : ! needs to be initialized to 0.d0 before calling this routine for the first time
4263 : !*****************************************************************************************
4264 : INTEGER :: nat
4265 : REAL(8) :: alat(3), rxyz(3, nat), fxyz(3, nat), &
4266 : etot, count
4267 :
4268 : INTEGER :: iat, NNmax, Npmax
4269 22 : INTEGER, ALLOCATABLE, DIMENSION(:) :: Kinds, lstb
4270 22 : INTEGER, ALLOCATABLE, DIMENSION(:, :) :: lsta
4271 : REAL(8) :: Uatot, Urtot, xbox, ybox, zbox
4272 22 : REAL(8), ALLOCATABLE, DIMENSION(:) :: dkEij, UadUrdf, XYZRrefdf
4273 : REAL(8), DIMENSION(1:2) :: bcsq, Co_bcd, dsq, h, Pmass, Pn
4274 : REAL(8), DIMENSION(1:2, 1:2) :: ala, alr, Ca, Cr, R1, R2, X
4275 :
4276 : INTEGER:: nnbrx, nnbrxt
4277 : INTEGER :: i
4278 :
4279 22 : count = count + 1.d0
4280 :
4281 22022 : DO iat = 1, nat
4282 22000 : rxyz(1, iat) = MODULO(MODULO(rxyz(1, iat), alat(1)), alat(1))
4283 22000 : rxyz(2, iat) = MODULO(MODULO(rxyz(2, iat), alat(2)), alat(2))
4284 22022 : rxyz(3, iat) = MODULO(MODULO(rxyz(3, iat), alat(3)), alat(3))
4285 : END DO
4286 :
4287 66 : ALLOCATE (Kinds(1:nat))
4288 :
4289 22 : nnbrx = 24
4290 22 : nnbrxt = 3*nnbrx/2
4291 22 : nnmax = nnbrxt*nat
4292 22 : npmax = nnbrxt*nat
4293 110 : ALLOCATE (lsta(2, nat), lstb(nnbrxt*nat))
4294 132 : ALLOCATE (XYZRrefdf(1:6*Npmax), UadUrdf(1:3*Npmax), dkEij(1:3*NNmax))
4295 :
4296 22022 : DO i = 1, nat
4297 22022 : kinds(i) = 2 !Since all atoms are Si, all of kind 2
4298 : END DO
4299 88022 : fxyz = 0.0d0
4300 22 : xbox = alat(1); ybox = alat(2); zbox = alat(3)
4301 22 : CALL tersoff_parameters(R1, R2, Cr, Ca, alr, ala, X, Pn, Co_bcd, bcsq, dsq, h, Pmass)
4302 : CALL tersoff_pairlist_energy_forces(nat, Npmax, NNmax, xbox, ybox, zbox, Kinds, rxyz, R1, R2, Cr, &
4303 : Ca, alr, ala, X, XYZRrefdf, UadUrdf, Urtot, lsta, lstb, nnbrx, &
4304 22 : Pn, Co_bcd, bcsq, dsq, h, fxyz, Uatot, dkEij)
4305 22 : etot = Urtot + Uatot
4306 22 : DEALLOCATE (Kinds, XYZRrefdf, UadUrdf, dkEij, lsta, lstb)
4307 22 : END SUBROUTINE eip_tersoff_silicon
4308 : !-----------------------------------------------------------------------------------------
4309 : ! **************************************************************************************************
4310 : !> \brief ...
4311 : !> \param R1 ...
4312 : !> \param R2 ...
4313 : !> \param Cr ...
4314 : !> \param Ca ...
4315 : !> \param alr ...
4316 : !> \param ala ...
4317 : !> \param X ...
4318 : !> \param Pn ...
4319 : !> \param Co_bcd ...
4320 : !> \param bcsq ...
4321 : !> \param dsq ...
4322 : !> \param h ...
4323 : !> \param Pmass ...
4324 : ! **************************************************************************************************
4325 22 : SUBROUTINE tersoff_parameters(R1, R2, Cr, Ca, alr, ala, X, Pn, Co_bcd, bcsq, dsq, h, Pmass)
4326 :
4327 : REAL(8), DIMENSION(1:2, 1:2), INTENT(out) :: R1, R2, Cr, Ca, alr, ala, X
4328 : REAL(8), DIMENSION(1:2), INTENT(out) :: Pn, Co_bcd, bcsq, dsq, h, Pmass
4329 :
4330 : REAL(8), PARAMETER :: C_ala = 2.2119d0, C_alr = 3.4879d0, C_b = 1.5724d-7, C_c = 3.8049d4, &
4331 : C_Ca = 3.4674d2, C_Cr = 1.3936d3, C_d = 4.3484d0, C_h = -5.7058d-1, C_mass = 12.0d0, &
4332 : C_n = 7.2751d-1, C_R1 = 1.8d0, C_R2 = 2.1d0, Si_ala = 1.7322d0, Si_alr = 2.4799d0, &
4333 : Si_b = 1.1000d-6, Si_c = 1.0039d5, Si_Ca = 4.7118d2, Si_Cr = 1.8308d3, Si_d = 1.6217d1, &
4334 : Si_h = -5.9825d-1, Si_mass = 28.0855d0, Si_n = 7.8734d-1, Si_R1 = 2.7d0, Si_R2 = 3.3d0
4335 :
4336 : !Parameter for carbon, not used in this version
4337 : !Parameter for carbon, not used in this version
4338 : !Parameter for carbon, not used in this version
4339 : !Parameter for carbon, not used in this version
4340 : !Parameter for carbon, not used in this version
4341 : !Parameter for carbon, not used in this version
4342 : !Parameter for carbon, not used in this version
4343 : !Parameter for carbon, not used in this version
4344 : !Parameter for carbon, not used in this version
4345 : !Parameter for carbon, not used in this version
4346 : !Parameter for carbon, not used in this version
4347 : !Parameter for carbon, not used in this version
4348 : !Increased Cutoff, originally 3.0d0
4349 :
4350 22 : Cr(1, 1) = C_Cr
4351 22 : Cr(2, 2) = Si_Cr
4352 22 : Cr(1, 2) = dsqrt(Cr(1, 1)*Cr(2, 2))
4353 22 : Cr(2, 1) = Cr(1, 2)
4354 :
4355 22 : Ca(1, 1) = C_Ca
4356 22 : Ca(2, 2) = Si_Ca
4357 22 : Ca(1, 2) = dsqrt(Ca(1, 1)*Ca(2, 2))
4358 22 : Ca(2, 1) = Ca(1, 2)
4359 :
4360 22 : R1(1, 1) = C_R1
4361 22 : R1(2, 2) = Si_R1
4362 22 : R1(1, 2) = dsqrt(R1(1, 1)*R1(2, 2))
4363 22 : R1(2, 1) = R1(1, 2)
4364 :
4365 22 : R2(1, 1) = C_R2
4366 22 : R2(2, 2) = Si_R2
4367 22 : R2(1, 2) = dsqrt(R2(1, 1)*R2(2, 2))
4368 22 : R2(2, 1) = R2(1, 2)
4369 :
4370 22 : X(1, 1) = 1.0d0
4371 22 : X(2, 2) = 1.0d0
4372 22 : X(1, 2) = 0.9776d0
4373 22 : X(2, 1) = 0.9776d0
4374 :
4375 22 : alr(1, 1) = C_alr
4376 22 : alr(2, 2) = Si_alr
4377 22 : alr(1, 2) = 0.5d0*(alr(1, 1) + alr(2, 2))
4378 22 : alr(2, 1) = alr(1, 2)
4379 :
4380 22 : ala(1, 1) = C_ala
4381 22 : ala(2, 2) = Si_ala
4382 22 : ala(1, 2) = 0.5d0*(ala(1, 1) + ala(2, 2))
4383 22 : ala(2, 1) = ala(1, 2)
4384 :
4385 22 : Pn(1) = C_n
4386 22 : Pn(2) = Si_n
4387 :
4388 22 : Co_bcd(1) = C_b*(1.0d0 + C_c*C_c/(C_d*C_d))
4389 22 : Co_bcd(2) = Si_b*(1.0d0 + Si_c*Si_c/(Si_d*Si_d))
4390 :
4391 22 : bcsq(1) = C_b*C_c*C_c
4392 22 : bcsq(2) = Si_b*Si_c*Si_c
4393 :
4394 22 : dsq(1) = C_d*C_d
4395 22 : dsq(2) = Si_d*Si_d
4396 :
4397 22 : h(1) = C_h
4398 22 : h(2) = Si_h
4399 :
4400 22 : Pmass(1) = C_mass
4401 22 : Pmass(2) = Si_mass
4402 :
4403 22 : RETURN
4404 : END SUBROUTINE tersoff_parameters
4405 : !-----------------------------------------------------------------------------------------
4406 : ! **************************************************************************************************
4407 : !> \brief ...
4408 : !> \param Nmol ...
4409 : !> \param Npmax ...
4410 : !> \param NNmax ...
4411 : !> \param xbox ...
4412 : !> \param ybox ...
4413 : !> \param zbox ...
4414 : !> \param Kinds ...
4415 : !> \param R ...
4416 : !> \param R1 ...
4417 : !> \param R2 ...
4418 : !> \param Cr ...
4419 : !> \param Ca ...
4420 : !> \param alr ...
4421 : !> \param ala ...
4422 : !> \param X ...
4423 : !> \param XYZRrefdf ...
4424 : !> \param UadUrdf ...
4425 : !> \param Urtot ...
4426 : !> \param lsta ...
4427 : !> \param lstb ...
4428 : !> \param nnbrx ...
4429 : !> \param Pn ...
4430 : !> \param Co_bcd ...
4431 : !> \param bcsq ...
4432 : !> \param dsq ...
4433 : !> \param h ...
4434 : !> \param F ...
4435 : !> \param Uatot ...
4436 : !> \param dkEij ...
4437 : ! **************************************************************************************************
4438 22 : SUBROUTINE tersoff_pairlist_energy_forces(Nmol, Npmax, NNmax, xbox, ybox, zbox, Kinds, R, R1, R2, Cr, Ca, alr, ala, X, &
4439 22 : XYZRrefdf, UadUrdf, Urtot, lsta, lstb, nnbrx, &
4440 22 : Pn, Co_bcd, bcsq, dsq, h, F, Uatot, dkEij)
4441 : INTEGER, INTENT(in) :: Nmol, Npmax, NNmax
4442 : REAL(8), INTENT(in) :: xbox, ybox, zbox
4443 : INTEGER, DIMENSION(1:Nmol), INTENT(in) :: Kinds
4444 : REAL(8), DIMENSION(1:3*Nmol), INTENT(in) :: R
4445 : REAL(8), DIMENSION(1:2, 1:2), INTENT(in) :: R1, R2, Cr, Ca, alr, ala, X
4446 : REAL(8), DIMENSION(1:6*Npmax), INTENT(out) :: XYZRrefdf
4447 : REAL(8), DIMENSION(1:3*Npmax), INTENT(out) :: UadUrdf
4448 : REAL(8), INTENT(out) :: Urtot
4449 : INTEGER :: lsta(2, Nmol)
4450 : INTEGER, INTENT(inout) :: nnbrx
4451 : INTEGER :: lstb(nnbrx*Nmol)
4452 : REAL(8), DIMENSION(1:2), INTENT(in) :: Pn, Co_bcd, bcsq, dsq, h
4453 : REAL(8), DIMENSION(1:3*Nmol), INTENT(out) :: F
4454 : REAL(8), INTENT(out) :: Uatot
4455 : REAL(8), DIMENSION(1:3*NNmax) :: dkEij
4456 :
4457 : INTEGER :: i, iam, iat, ii, il, in, indlst, indlstx, Ipb, istopg, jat, l1, l2, l3, laymx, &
4458 : ll1, ll2, ll3, myspace, myspaceout, nat, ncx, ndat, nn, npjkx, npjx, npr, Nptot
4459 22 : INTEGER, ALLOCATABLE, DIMENSION(:) :: lay
4460 22 : INTEGER, ALLOCATABLE, DIMENSION(:, :, :, :) :: icell
4461 : REAL(8) :: alat(3), cut, cut2, pi, rlc1i, rlc2i, &
4462 44 : rlc3i, rxyz0(3, Nmol), xhalf, yhalf, &
4463 : zhalf
4464 22 : REAL(8), ALLOCATABLE, DIMENSION(:, :) :: rel, rxyz
4465 :
4466 22 : pi = dacos(-1.0d0)
4467 :
4468 22 : xhalf = 0.5d0*xbox
4469 22 : yhalf = 0.5d0*ybox
4470 22 : zhalf = 0.5d0*zbox
4471 :
4472 22 : nat = Nmol
4473 :
4474 22 : alat(1) = xbox
4475 22 : alat(2) = ybox
4476 22 : alat(3) = zbox
4477 :
4478 22022 : DO iat = 1, nat
4479 22000 : jat = 3*(iat - 1)
4480 22000 : rxyz0(1, iat) = R(jat + 1)
4481 22000 : rxyz0(2, iat) = R(jat + 2)
4482 22022 : rxyz0(3, iat) = R(jat + 3)
4483 : END DO
4484 :
4485 22 : cut = R2(2, 2) - 1.d-9
4486 :
4487 : ! linear scaling calculation of verlet list
4488 22 : ll1 = INT(alat(1)/cut)
4489 22 : IF (ll1 < 1) CPABORT("alat(1) too small")
4490 22 : ll2 = INT(alat(2)/cut)
4491 22 : IF (ll2 < 1) CPABORT("alat(2) too small")
4492 22 : ll3 = INT(alat(3)/cut)
4493 22 : IF (ll3 < 1) CPABORT("alat(3) too small")
4494 :
4495 : ! determine number of threadsi (this version is only singlethreaded)
4496 22 : npr = 1
4497 : ! linear scaling calculation of verlet list
4498 :
4499 22 : ncx = 8
4500 : DO
4501 22 : ncx = ncx*2
4502 132 : ALLOCATE (icell(0:ncx, -1:ll1, -1:ll2, -1:ll3))
4503 24442 : icell(0, :, :, :) = 0
4504 22 : rlc1i = ll1/alat(1)
4505 22 : rlc2i = ll2/alat(2)
4506 22 : rlc3i = ll3/alat(3)
4507 :
4508 22022 : DO iat = 1, nat
4509 22000 : l1 = INT(rxyz0(1, iat)*rlc1i)
4510 22000 : l2 = INT(rxyz0(2, iat)*rlc2i)
4511 22000 : l3 = INT(rxyz0(3, iat)*rlc3i)
4512 :
4513 22000 : ii = icell(0, l1, l2, l3)
4514 22000 : ii = ii + 1
4515 22000 : icell(0, l1, l2, l3) = ii
4516 22000 : IF (ii > ncx) THEN
4517 0 : DEALLOCATE (icell)
4518 0 : EXIT
4519 : END IF
4520 22022 : icell(ii, l1, l2, l3) = iat
4521 : END DO
4522 22 : IF (ALLOCATED(icell)) EXIT
4523 : END DO
4524 :
4525 : ! duplicate all atoms within boundary layer
4526 22 : laymx = ncx*(2*ll1*ll2 + 2*ll1*ll3 + 2*ll2*ll3 + 4*ll1 + 4*ll2 + 4*ll3 + 8)
4527 22 : nn = nat + laymx
4528 110 : ALLOCATE (rxyz(3, nn), lay(nn))
4529 22022 : DO iat = 1, nat
4530 22000 : lay(iat) = iat
4531 22000 : rxyz(1, iat) = rxyz0(1, iat)
4532 22000 : rxyz(2, iat) = rxyz0(2, iat)
4533 22022 : rxyz(3, iat) = rxyz0(3, iat)
4534 : END DO
4535 22 : il = nat
4536 : ! xy plane
4537 198 : DO l2 = 0, ll2 - 1
4538 1606 : DO l1 = 0, ll1 - 1
4539 :
4540 1408 : in = icell(0, l1, l2, 0)
4541 1408 : icell(0, l1, l2, ll3) = in
4542 4128 : DO ii = 1, in
4543 2720 : i = icell(ii, l1, l2, 0)
4544 2720 : il = il + 1
4545 2720 : IF (il > nn) CPABORT("enlarge laymx")
4546 2720 : lay(il) = i
4547 2720 : icell(ii, l1, l2, ll3) = il
4548 2720 : rxyz(1, il) = rxyz(1, i)
4549 2720 : rxyz(2, il) = rxyz(2, i)
4550 4128 : rxyz(3, il) = rxyz(3, i) + alat(3)
4551 : END DO
4552 :
4553 1408 : in = icell(0, l1, l2, ll3 - 1)
4554 1408 : icell(0, l1, l2, -1) = in
4555 4364 : DO ii = 1, in
4556 2780 : i = icell(ii, l1, l2, ll3 - 1)
4557 2780 : il = il + 1
4558 2780 : IF (il > nn) CPABORT("enlarge laymx")
4559 2780 : lay(il) = i
4560 2780 : icell(ii, l1, l2, -1) = il
4561 2780 : rxyz(1, il) = rxyz(1, i)
4562 2780 : rxyz(2, il) = rxyz(2, i)
4563 4188 : rxyz(3, il) = rxyz(3, i) - alat(3)
4564 : END DO
4565 :
4566 : END DO
4567 : END DO
4568 :
4569 : ! yz plane
4570 198 : DO l3 = 0, ll3 - 1
4571 1606 : DO l2 = 0, ll2 - 1
4572 :
4573 1408 : in = icell(0, 0, l2, l3)
4574 1408 : icell(0, ll1, l2, l3) = in
4575 4194 : DO ii = 1, in
4576 2786 : i = icell(ii, 0, l2, l3)
4577 2786 : il = il + 1
4578 2786 : IF (il > nn) CPABORT("enlarge laymx")
4579 2786 : lay(il) = i
4580 2786 : icell(ii, ll1, l2, l3) = il
4581 2786 : rxyz(1, il) = rxyz(1, i) + alat(1)
4582 2786 : rxyz(2, il) = rxyz(2, i)
4583 4194 : rxyz(3, il) = rxyz(3, i)
4584 : END DO
4585 :
4586 1408 : in = icell(0, ll1 - 1, l2, l3)
4587 1408 : icell(0, -1, l2, l3) = in
4588 4298 : DO ii = 1, in
4589 2714 : i = icell(ii, ll1 - 1, l2, l3)
4590 2714 : il = il + 1
4591 2714 : IF (il > nn) CPABORT("enlarge laymx")
4592 2714 : lay(il) = i
4593 2714 : icell(ii, -1, l2, l3) = il
4594 2714 : rxyz(1, il) = rxyz(1, i) - alat(1)
4595 2714 : rxyz(2, il) = rxyz(2, i)
4596 4122 : rxyz(3, il) = rxyz(3, i)
4597 : END DO
4598 :
4599 : END DO
4600 : END DO
4601 :
4602 : ! xz plane
4603 198 : DO l3 = 0, ll3 - 1
4604 1606 : DO l1 = 0, ll1 - 1
4605 :
4606 1408 : in = icell(0, l1, 0, l3)
4607 1408 : icell(0, l1, ll2, l3) = in
4608 4264 : DO ii = 1, in
4609 2856 : i = icell(ii, l1, 0, l3)
4610 2856 : il = il + 1
4611 2856 : IF (il > nn) CPABORT("enlarge laymx")
4612 2856 : lay(il) = i
4613 2856 : icell(ii, l1, ll2, l3) = il
4614 2856 : rxyz(1, il) = rxyz(1, i)
4615 2856 : rxyz(2, il) = rxyz(2, i) + alat(2)
4616 4264 : rxyz(3, il) = rxyz(3, i)
4617 : END DO
4618 :
4619 1408 : in = icell(0, l1, ll2 - 1, l3)
4620 1408 : icell(0, l1, -1, l3) = in
4621 4228 : DO ii = 1, in
4622 2644 : i = icell(ii, l1, ll2 - 1, l3)
4623 2644 : il = il + 1
4624 2644 : IF (il > nn) CPABORT("enlarge laymx")
4625 2644 : lay(il) = i
4626 2644 : icell(ii, l1, -1, l3) = il
4627 2644 : rxyz(1, il) = rxyz(1, i)
4628 2644 : rxyz(2, il) = rxyz(2, i) - alat(2)
4629 4052 : rxyz(3, il) = rxyz(3, i)
4630 : END DO
4631 :
4632 : END DO
4633 : END DO
4634 :
4635 : ! x axis
4636 198 : DO l1 = 0, ll1 - 1
4637 :
4638 176 : in = icell(0, l1, 0, 0)
4639 176 : icell(0, l1, ll2, ll3) = in
4640 564 : DO ii = 1, in
4641 388 : i = icell(ii, l1, 0, 0)
4642 388 : il = il + 1
4643 388 : IF (il > nn) CPABORT("enlarge laymx")
4644 388 : lay(il) = i
4645 388 : icell(ii, l1, ll2, ll3) = il
4646 388 : rxyz(1, il) = rxyz(1, i)
4647 388 : rxyz(2, il) = rxyz(2, i) + alat(2)
4648 564 : rxyz(3, il) = rxyz(3, i) + alat(3)
4649 : END DO
4650 :
4651 176 : in = icell(0, l1, 0, ll3 - 1)
4652 176 : icell(0, l1, ll2, -1) = in
4653 486 : DO ii = 1, in
4654 310 : i = icell(ii, l1, 0, ll3 - 1)
4655 310 : il = il + 1
4656 310 : IF (il > nn) CPABORT("enlarge laymx")
4657 310 : lay(il) = i
4658 310 : icell(ii, l1, ll2, -1) = il
4659 310 : rxyz(1, il) = rxyz(1, i)
4660 310 : rxyz(2, il) = rxyz(2, i) + alat(2)
4661 486 : rxyz(3, il) = rxyz(3, i) - alat(3)
4662 : END DO
4663 :
4664 176 : in = icell(0, l1, ll2 - 1, 0)
4665 176 : icell(0, l1, -1, ll3) = in
4666 468 : DO ii = 1, in
4667 292 : i = icell(ii, l1, ll2 - 1, 0)
4668 292 : il = il + 1
4669 292 : IF (il > nn) CPABORT("enlarge laymx")
4670 292 : lay(il) = i
4671 292 : icell(ii, l1, -1, ll3) = il
4672 292 : rxyz(1, il) = rxyz(1, i)
4673 292 : rxyz(2, il) = rxyz(2, i) - alat(2)
4674 468 : rxyz(3, il) = rxyz(3, i) + alat(3)
4675 : END DO
4676 :
4677 176 : in = icell(0, l1, ll2 - 1, ll3 - 1)
4678 176 : icell(0, l1, -1, -1) = in
4679 638 : DO ii = 1, in
4680 440 : i = icell(ii, l1, ll2 - 1, ll3 - 1)
4681 440 : il = il + 1
4682 440 : IF (il > nn) CPABORT("enlarge laymx")
4683 440 : lay(il) = i
4684 440 : icell(ii, l1, -1, -1) = il
4685 440 : rxyz(1, il) = rxyz(1, i)
4686 440 : rxyz(2, il) = rxyz(2, i) - alat(2)
4687 616 : rxyz(3, il) = rxyz(3, i) - alat(3)
4688 : END DO
4689 :
4690 : END DO
4691 :
4692 : ! y axis
4693 198 : DO l2 = 0, ll2 - 1
4694 :
4695 176 : in = icell(0, 0, l2, 0)
4696 176 : icell(0, ll1, l2, ll3) = in
4697 546 : DO ii = 1, in
4698 370 : i = icell(ii, 0, l2, 0)
4699 370 : il = il + 1
4700 370 : IF (il > nn) CPABORT("enlarge laymx")
4701 370 : lay(il) = i
4702 370 : icell(ii, ll1, l2, ll3) = il
4703 370 : rxyz(1, il) = rxyz(1, i) + alat(1)
4704 370 : rxyz(2, il) = rxyz(2, i)
4705 546 : rxyz(3, il) = rxyz(3, i) + alat(3)
4706 : END DO
4707 :
4708 176 : in = icell(0, 0, l2, ll3 - 1)
4709 176 : icell(0, ll1, l2, -1) = in
4710 546 : DO ii = 1, in
4711 370 : i = icell(ii, 0, l2, ll3 - 1)
4712 370 : il = il + 1
4713 370 : IF (il > nn) CPABORT("enlarge laymx")
4714 370 : lay(il) = i
4715 370 : icell(ii, ll1, l2, -1) = il
4716 370 : rxyz(1, il) = rxyz(1, i) + alat(1)
4717 370 : rxyz(2, il) = rxyz(2, i)
4718 546 : rxyz(3, il) = rxyz(3, i) - alat(3)
4719 : END DO
4720 :
4721 176 : in = icell(0, ll1 - 1, l2, 0)
4722 176 : icell(0, -1, l2, ll3) = in
4723 546 : DO ii = 1, in
4724 370 : i = icell(ii, ll1 - 1, l2, 0)
4725 370 : il = il + 1
4726 370 : IF (il > nn) CPABORT("enlarge laymx")
4727 370 : lay(il) = i
4728 370 : icell(ii, -1, l2, ll3) = il
4729 370 : rxyz(1, il) = rxyz(1, i) - alat(1)
4730 370 : rxyz(2, il) = rxyz(2, i)
4731 546 : rxyz(3, il) = rxyz(3, i) + alat(3)
4732 : END DO
4733 :
4734 176 : in = icell(0, ll1 - 1, l2, ll3 - 1)
4735 176 : icell(0, -1, l2, -1) = in
4736 518 : DO ii = 1, in
4737 320 : i = icell(ii, ll1 - 1, l2, ll3 - 1)
4738 320 : il = il + 1
4739 320 : IF (il > nn) CPABORT("enlarge laymx")
4740 320 : lay(il) = i
4741 320 : icell(ii, -1, l2, -1) = il
4742 320 : rxyz(1, il) = rxyz(1, i) - alat(1)
4743 320 : rxyz(2, il) = rxyz(2, i)
4744 496 : rxyz(3, il) = rxyz(3, i) - alat(3)
4745 : END DO
4746 :
4747 : END DO
4748 :
4749 : ! z axis
4750 198 : DO l3 = 0, ll3 - 1
4751 :
4752 176 : in = icell(0, 0, 0, l3)
4753 176 : icell(0, ll1, ll2, l3) = in
4754 558 : DO ii = 1, in
4755 382 : i = icell(ii, 0, 0, l3)
4756 382 : il = il + 1
4757 382 : IF (il > nn) CPABORT("enlarge laymx")
4758 382 : lay(il) = i
4759 382 : icell(ii, ll1, ll2, l3) = il
4760 382 : rxyz(1, il) = rxyz(1, i) + alat(1)
4761 382 : rxyz(2, il) = rxyz(2, i) + alat(2)
4762 558 : rxyz(3, il) = rxyz(3, i)
4763 : END DO
4764 :
4765 176 : in = icell(0, ll1 - 1, 0, l3)
4766 176 : icell(0, -1, ll2, l3) = in
4767 546 : DO ii = 1, in
4768 370 : i = icell(ii, ll1 - 1, 0, l3)
4769 370 : il = il + 1
4770 370 : IF (il > nn) CPABORT("enlarge laymx")
4771 370 : lay(il) = i
4772 370 : icell(ii, -1, ll2, l3) = il
4773 370 : rxyz(1, il) = rxyz(1, i) - alat(1)
4774 370 : rxyz(2, il) = rxyz(2, i) + alat(2)
4775 546 : rxyz(3, il) = rxyz(3, i)
4776 : END DO
4777 :
4778 176 : in = icell(0, 0, ll2 - 1, l3)
4779 176 : icell(0, ll1, -1, l3) = in
4780 520 : DO ii = 1, in
4781 344 : i = icell(ii, 0, ll2 - 1, l3)
4782 344 : il = il + 1
4783 344 : IF (il > nn) CPABORT("enlarge laymx")
4784 344 : lay(il) = i
4785 344 : icell(ii, ll1, -1, l3) = il
4786 344 : rxyz(1, il) = rxyz(1, i) + alat(1)
4787 344 : rxyz(2, il) = rxyz(2, i) - alat(2)
4788 520 : rxyz(3, il) = rxyz(3, i)
4789 : END DO
4790 :
4791 176 : in = icell(0, ll1 - 1, ll2 - 1, l3)
4792 176 : icell(0, -1, -1, l3) = in
4793 532 : DO ii = 1, in
4794 334 : i = icell(ii, ll1 - 1, ll2 - 1, l3)
4795 334 : il = il + 1
4796 334 : IF (il > nn) CPABORT("enlarge laymx")
4797 334 : lay(il) = i
4798 334 : icell(ii, -1, -1, l3) = il
4799 334 : rxyz(1, il) = rxyz(1, i) - alat(1)
4800 334 : rxyz(2, il) = rxyz(2, i) - alat(2)
4801 510 : rxyz(3, il) = rxyz(3, i)
4802 : END DO
4803 :
4804 : END DO
4805 :
4806 : ! corners
4807 22 : in = icell(0, 0, 0, 0)
4808 22 : icell(0, ll1, ll2, ll3) = in
4809 92 : DO ii = 1, in
4810 70 : i = icell(ii, 0, 0, 0)
4811 70 : il = il + 1
4812 70 : IF (il > nn) CPABORT("enlarge laymx")
4813 70 : lay(il) = i
4814 70 : icell(ii, ll1, ll2, ll3) = il
4815 70 : rxyz(1, il) = rxyz(1, i) + alat(1)
4816 70 : rxyz(2, il) = rxyz(2, i) + alat(2)
4817 92 : rxyz(3, il) = rxyz(3, i) + alat(3)
4818 : END DO
4819 :
4820 22 : in = icell(0, ll1 - 1, 0, 0)
4821 22 : icell(0, -1, ll2, ll3) = in
4822 46 : DO ii = 1, in
4823 24 : i = icell(ii, ll1 - 1, 0, 0)
4824 24 : il = il + 1
4825 24 : IF (il > nn) CPABORT("enlarge laymx")
4826 24 : lay(il) = i
4827 24 : icell(ii, -1, ll2, ll3) = il
4828 24 : rxyz(1, il) = rxyz(1, i) - alat(1)
4829 24 : rxyz(2, il) = rxyz(2, i) + alat(2)
4830 46 : rxyz(3, il) = rxyz(3, i) + alat(3)
4831 : END DO
4832 :
4833 22 : in = icell(0, 0, ll2 - 1, 0)
4834 22 : icell(0, ll1, -1, ll3) = in
4835 66 : DO ii = 1, in
4836 44 : i = icell(ii, 0, ll2 - 1, 0)
4837 44 : il = il + 1
4838 44 : IF (il > nn) CPABORT("enlarge laymx")
4839 44 : lay(il) = i
4840 44 : icell(ii, ll1, -1, ll3) = il
4841 44 : rxyz(1, il) = rxyz(1, i) + alat(1)
4842 44 : rxyz(2, il) = rxyz(2, i) - alat(2)
4843 66 : rxyz(3, il) = rxyz(3, i) + alat(3)
4844 : END DO
4845 :
4846 22 : in = icell(0, ll1 - 1, ll2 - 1, 0)
4847 22 : icell(0, -1, -1, ll3) = in
4848 86 : DO ii = 1, in
4849 64 : i = icell(ii, ll1 - 1, ll2 - 1, 0)
4850 64 : il = il + 1
4851 64 : IF (il > nn) CPABORT("enlarge laymx")
4852 64 : lay(il) = i
4853 64 : icell(ii, -1, -1, ll3) = il
4854 64 : rxyz(1, il) = rxyz(1, i) - alat(1)
4855 64 : rxyz(2, il) = rxyz(2, i) - alat(2)
4856 86 : rxyz(3, il) = rxyz(3, i) + alat(3)
4857 : END DO
4858 :
4859 22 : in = icell(0, 0, 0, ll3 - 1)
4860 22 : icell(0, ll1, ll2, -1) = in
4861 66 : DO ii = 1, in
4862 44 : i = icell(ii, 0, 0, ll3 - 1)
4863 44 : il = il + 1
4864 44 : IF (il > nn) CPABORT("enlarge laymx")
4865 44 : lay(il) = i
4866 44 : icell(ii, ll1, ll2, -1) = il
4867 44 : rxyz(1, il) = rxyz(1, i) + alat(1)
4868 44 : rxyz(2, il) = rxyz(2, i) + alat(2)
4869 66 : rxyz(3, il) = rxyz(3, i) - alat(3)
4870 : END DO
4871 :
4872 22 : in = icell(0, ll1 - 1, 0, ll3 - 1)
4873 22 : icell(0, -1, ll2, -1) = in
4874 46 : DO ii = 1, in
4875 24 : i = icell(ii, ll1 - 1, 0, ll3 - 1)
4876 24 : il = il + 1
4877 24 : IF (il > nn) CPABORT("enlarge laymx")
4878 24 : lay(il) = i
4879 24 : icell(ii, -1, ll2, -1) = il
4880 24 : rxyz(1, il) = rxyz(1, i) - alat(1)
4881 24 : rxyz(2, il) = rxyz(2, i) + alat(2)
4882 46 : rxyz(3, il) = rxyz(3, i) - alat(3)
4883 : END DO
4884 :
4885 22 : in = icell(0, 0, ll2 - 1, ll3 - 1)
4886 22 : icell(0, ll1, -1, -1) = in
4887 86 : DO ii = 1, in
4888 64 : i = icell(ii, 0, ll2 - 1, ll3 - 1)
4889 64 : il = il + 1
4890 64 : IF (il > nn) CPABORT("enlarge laymx")
4891 64 : lay(il) = i
4892 64 : icell(ii, ll1, -1, -1) = il
4893 64 : rxyz(1, il) = rxyz(1, i) + alat(1)
4894 64 : rxyz(2, il) = rxyz(2, i) - alat(2)
4895 86 : rxyz(3, il) = rxyz(3, i) - alat(3)
4896 : END DO
4897 :
4898 22 : in = icell(0, ll1 - 1, ll2 - 1, ll3 - 1)
4899 22 : icell(0, -1, -1, -1) = in
4900 62 : DO ii = 1, in
4901 40 : i = icell(ii, ll1 - 1, ll2 - 1, ll3 - 1)
4902 40 : il = il + 1
4903 40 : IF (il > nn) CPABORT("enlarge laymx")
4904 40 : lay(il) = i
4905 40 : icell(ii, -1, -1, -1) = il
4906 40 : rxyz(1, il) = rxyz(1, i) - alat(1)
4907 40 : rxyz(2, il) = rxyz(2, i) - alat(2)
4908 62 : rxyz(3, il) = rxyz(3, i) - alat(3)
4909 : END DO
4910 :
4911 22 : nnbrx = 3*nnbrx/2
4912 66 : ALLOCATE (rel(5, nnbrx*nat))
4913 22 : indlstx = 0
4914 :
4915 22 : npr = 1
4916 22 : iam = 0
4917 :
4918 22 : cut2 = cut**2
4919 : ! assign contiguous portions of the arrays lstb and rel to the threads
4920 22 : myspace = (nat*nnbrx)/npr
4921 : IF (iam == 0) myspaceout = myspace
4922 : ! Verlet list, relative positions
4923 22 : indlst = 0
4924 198 : DO l3 = 0, ll3 - 1
4925 1606 : DO l2 = 0, ll2 - 1
4926 12848 : DO l1 = 0, ll1 - 1
4927 34672 : DO ii = 1, icell(0, l1, l2, l3)
4928 22000 : iat = icell(ii, l1, l2, l3)
4929 33264 : IF (((iat - 1)*npr)/nat == iam) THEN
4930 : ! write(6,*) 'sublstiat:iam,iat',iam,iat
4931 22000 : lsta(1, iat) = iam*myspace + indlst + 1
4932 : CALL tersoff_sublstiat_l(iat, nn, ncx, ll1, ll2, ll3, l1, l2, l3, myspace, &
4933 22000 : rxyz, icell, lstb(iam*myspace + 1), lay, rel(1, iam*myspace + 1), cut2, indlst)
4934 22000 : lsta(2, iat) = iam*myspace + indlst
4935 22000 : ipb = lsta(1, iat)
4936 22000 : ndat = lsta(2, iat) - lsta(1, iat) + 1
4937 : END IF
4938 :
4939 : END DO
4940 : END DO
4941 : END DO
4942 : END DO
4943 22 : indlstx = MAX(indlstx, indlst)
4944 :
4945 22 : IF (indlstx >= myspaceout) CPABORT("NNBRX too small")
4946 22 : npr = 1
4947 22 : iam = 0
4948 :
4949 22 : npjx = 300; npjkx = 6000
4950 22 : istopg = 0
4951 : !end of creating pairlist part------------------------------------------------------------
4952 : !Energy-----------------------------------------------------------------------------------
4953 22 : Urtot = 0.0d0
4954 22 : Nptot = 0
4955 :
4956 66022 : F = 0.0d0
4957 22 : Uatot = 0.0d0
4958 22022 : DO_I: DO i = 1, Nmol
4959 22022 : CALL tersoff_subeniat_l(i, Nmol, Npmax, Kinds, X, R1, R2, Cr, Ca, alr, ala, XYZRrefdf, UadUrdf, Urtot, lsta, lstb, nnbrx, rel, pi)
4960 : END DO DO_I
4961 :
4962 22 : Urtot = 0.5d0*Urtot
4963 : !Force------------------------------------------------------------------------------------
4964 66022 : F = 0.0d0
4965 : Uatot = 0.0d0
4966 :
4967 22022 : DO_If: DO i = 1, Nmol
4968 22022 : CALL tersoff_subfiat_l(i,Nmol,Npmax,NNmax,Kinds,Pn,Co_bcd,bcsq,dsq,h,XYZRrefdf,UadUrdf,F,Uatot,dkEij,lsta,lstb,nnbrx)
4969 : END DO DO_If
4970 :
4971 66022 : F = 0.5d0*F
4972 22 : Uatot = 0.5d0*Uatot
4973 : !-----------------------------------------------------------------------------------------
4974 22 : DEALLOCATE (rxyz, icell, lay, rel)
4975 22 : RETURN
4976 : END SUBROUTINE tersoff_pairlist_energy_forces
4977 :
4978 : !-----------------------------------------------------------------------------------------
4979 : ! **************************************************************************************************
4980 : !> \brief ...
4981 : !> \param iat ...
4982 : !> \param nn ...
4983 : !> \param ncx ...
4984 : !> \param ll1 ...
4985 : !> \param ll2 ...
4986 : !> \param ll3 ...
4987 : !> \param l1 ...
4988 : !> \param l2 ...
4989 : !> \param l3 ...
4990 : !> \param myspace ...
4991 : !> \param rxyz ...
4992 : !> \param icell ...
4993 : !> \param lstb ...
4994 : !> \param lay ...
4995 : !> \param rel ...
4996 : !> \param cut2 ...
4997 : !> \param indlst ...
4998 : ! **************************************************************************************************
4999 22000 : SUBROUTINE tersoff_sublstiat_l(iat, nn, ncx, ll1, ll2, ll3, l1, l2, l3, myspace, &
5000 22000 : rxyz, icell, lstb, lay, rel, cut2, indlst)
5001 : ! finds the neighbours of atom iat (specified by lsta and lstb) and and
5002 : ! the relative position rel of iat with respect to these neighbours
5003 : INTEGER :: iat, nn, ncx, ll1, ll2, ll3, l1, l2, l3, &
5004 : myspace
5005 : REAL(8) :: rxyz(3, nn)
5006 : INTEGER :: icell(0:ncx, -1:ll1, -1:ll2, -1:ll3), lstb(0:myspace - 1), lay(nn)
5007 : REAL(8) :: rel(5, 0:myspace - 1), cut2
5008 : INTEGER :: indlst
5009 :
5010 : INTEGER :: jat, jj, k1, k2, k3
5011 : REAL(8) :: rr2, tt, tti, xrel, yrel, zrel
5012 :
5013 88000 : DO k3 = l3 - 1, l3 + 1
5014 286000 : DO k2 = l2 - 1, l2 + 1
5015 858000 : DO k1 = l1 - 1, l1 + 1
5016 1949100 : DO jj = 1, icell(0, k1, k2, k3)
5017 1157100 : jat = icell(jj, k1, k2, k3)
5018 1157100 : IF (jat == iat) CYCLE
5019 1135100 : xrel = rxyz(1, iat) - rxyz(1, jat)
5020 1135100 : yrel = rxyz(2, iat) - rxyz(2, jat)
5021 1135100 : zrel = rxyz(3, iat) - rxyz(3, jat)
5022 1135100 : rr2 = xrel**2 + yrel**2 + zrel**2
5023 1729100 : IF (rr2 <= cut2) THEN
5024 88000 : indlst = MIN(indlst, myspace - 1)
5025 88000 : lstb(indlst) = lay(jat)
5026 : ! write(6,*) 'iat,indlst,lay(jat)',iat,indlst,lay(jat)
5027 88000 : tt = SQRT(rr2)
5028 88000 : tti = 1.d0/tt
5029 88000 : rel(1, indlst) = xrel*tti
5030 88000 : rel(2, indlst) = yrel*tti
5031 88000 : rel(3, indlst) = zrel*tti
5032 88000 : rel(4, indlst) = tt
5033 88000 : rel(5, indlst) = tti
5034 88000 : indlst = indlst + 1
5035 : END IF
5036 : END DO
5037 : END DO
5038 : END DO
5039 : END DO
5040 :
5041 22000 : RETURN
5042 : END SUBROUTINE tersoff_sublstiat_l
5043 :
5044 : ! **************************************************************************************************
5045 : !> \brief ...
5046 : !> \param i ...
5047 : !> \param Nmol ...
5048 : !> \param Npmax ...
5049 : !> \param Kinds ...
5050 : !> \param X ...
5051 : !> \param R1 ...
5052 : !> \param R2 ...
5053 : !> \param Cr ...
5054 : !> \param Ca ...
5055 : !> \param alr ...
5056 : !> \param ala ...
5057 : !> \param XYZRrefdf ...
5058 : !> \param UadUrdf ...
5059 : !> \param Urtot ...
5060 : !> \param lsta ...
5061 : !> \param lstb ...
5062 : !> \param nnbrx ...
5063 : !> \param rel ...
5064 : !> \param pi ...
5065 : ! **************************************************************************************************
5066 22000 : SUBROUTINE tersoff_subeniat_l(i,Nmol,Npmax,Kinds,X,R1,R2,Cr,Ca,alr,ala,XYZRrefdf,UadUrdf,Urtot,lsta,lstb,nnbrx,rel,pi)
5067 : INTEGER :: i
5068 : INTEGER, INTENT(in) :: Nmol, Npmax
5069 : INTEGER, DIMENSION(1:Nmol), INTENT(in) :: Kinds
5070 : REAL(8), DIMENSION(1:2, 1:2), INTENT(in) :: X, R1, R2, Cr, Ca, alr, ala
5071 : REAL(8), DIMENSION(1:6*Npmax), INTENT(inout) :: XYZRrefdf
5072 : REAL(8), DIMENSION(1:3*Npmax), INTENT(inout) :: UadUrdf
5073 : REAL(8), INTENT(inout) :: Urtot
5074 : INTEGER, INTENT(in) :: lsta(2, Nmol), nnbrx, lstb(nnbrx*Nmol)
5075 : REAL(8), INTENT(in) :: rel(5, nnbrx*Nmol)
5076 : REAL(8) :: pi
5077 :
5078 : INTEGER :: j, Ki, Kj, l, Nppt3, Nppt6, Nptot
5079 : REAL(8) :: alaij, alrij, dfij, fij, PL1, PL2, R1ij, &
5080 : R2ij, Rij, Rreij, Ua, Ur, Xij, Yij, Zij
5081 :
5082 : ! #######################################
5083 : ! # Calculate XYZRrefdf, UadUrdf, Urtot #
5084 : ! #######################################
5085 22000 : Ki = Kinds(i)
5086 :
5087 110000 : DO_J: DO l = lsta(1, i), lsta(2, i)
5088 88000 : j = lstb(l)
5089 :
5090 88000 : Kj = Kinds(j)
5091 88000 : R2ij = R2(Ki, Kj)
5092 88000 : Rij = rel(4, l)
5093 88000 : Xij = rel(1, l)
5094 88000 : Yij = rel(2, l)
5095 88000 : Zij = rel(3, l)
5096 88000 : Nptot = l
5097 :
5098 88000 : Nppt3 = 3*(Nptot - 1)
5099 88000 : Nppt6 = 6*(Nptot - 1)
5100 88000 : Rreij = rel(5, l)
5101 :
5102 88000 : XYZRrefdf(Nppt6 + 1) = Xij
5103 88000 : XYZRrefdf(Nppt6 + 2) = Yij
5104 88000 : XYZRrefdf(Nppt6 + 3) = Zij
5105 88000 : XYZRrefdf(Nppt6 + 4) = Rreij
5106 :
5107 88000 : alrij = alr(Ki, Kj)
5108 88000 : alaij = ala(Ki, Kj)
5109 :
5110 88000 : Ur = Cr(Ki, Kj)*dexp(-alrij*Rij)
5111 88000 : Ua = -Ca(Ki, Kj)*dexp(-alaij*Rij)*X(Ki, Kj)
5112 88000 : R1ij = R1(Ki, Kj)
5113 :
5114 110000 : IF (Rij <= R1ij) THEN
5115 88000 : XYZRrefdf(Nppt6 + 5) = 1.0d0
5116 88000 : XYZRrefdf(Nppt6 + 6) = 0.0d0
5117 88000 : Urtot = Urtot + Ur
5118 88000 : UadUrdf(Nppt3 + 1) = Ua
5119 88000 : UadUrdf(Nppt3 + 2) = -alrij*Ur
5120 88000 : UadUrdf(Nppt3 + 3) = -alaij*Ua
5121 : ELSE
5122 0 : PL1 = pi/(R2ij - R1ij)
5123 0 : PL2 = PL1*(Rij - R1ij)
5124 0 : fij = 0.5d0 + 0.5d0*dcos(PL2)
5125 0 : dfij = -0.5d0*PL1*dsin(PL2)
5126 0 : XYZRrefdf(Nppt6 + 5) = fij
5127 0 : XYZRrefdf(Nppt6 + 6) = dfij
5128 0 : Urtot = Urtot + fij*Ur
5129 0 : UadUrdf(Nppt3 + 1) = fij*Ua
5130 0 : UadUrdf(Nppt3 + 2) = (dfij - alrij*fij)*Ur
5131 0 : UadUrdf(Nppt3 + 3) = (dfij - alaij*fij)*Ua
5132 : END IF
5133 : END DO DO_J
5134 22000 : END SUBROUTINE tersoff_subeniat_l
5135 :
5136 : ! **************************************************************************************************
5137 : !> \brief ...
5138 : !> \param i ...
5139 : !> \param Nmol ...
5140 : !> \param Npmax ...
5141 : !> \param NNmax ...
5142 : !> \param Kinds ...
5143 : !> \param Pn ...
5144 : !> \param Co_bcd ...
5145 : !> \param bcsq ...
5146 : !> \param dsq ...
5147 : !> \param h ...
5148 : !> \param XYZRrefdf ...
5149 : !> \param UadUrdf ...
5150 : !> \param F ...
5151 : !> \param Uatot ...
5152 : !> \param dkEij ...
5153 : !> \param lsta ...
5154 : !> \param lstb ...
5155 : !> \param nnbrx ...
5156 : ! **************************************************************************************************
5157 22000 : SUBROUTINE tersoff_subfiat_l(i,Nmol,Npmax,NNmax,Kinds,Pn,Co_bcd,bcsq,dsq,h,XYZRrefdf,UadUrdf,F,Uatot,dkEij,lsta,lstb,nnbrx)
5158 : INTEGER :: i
5159 : INTEGER, INTENT(in) :: Nmol, Npmax, NNmax
5160 : INTEGER, DIMENSION(1:Nmol), INTENT(in) :: Kinds
5161 : REAL(8), DIMENSION(1:2), INTENT(in) :: Pn, Co_bcd, bcsq, dsq, h
5162 : REAL(8), DIMENSION(1:6*Npmax), INTENT(in) :: XYZRrefdf
5163 : REAL(8), DIMENSION(1:3*Npmax), INTENT(in) :: UadUrdf
5164 : REAL(8), DIMENSION(1:3*Nmol), INTENT(inout) :: F
5165 : REAL(8), INTENT(inout) :: Uatot
5166 : REAL(8), DIMENSION(1:3*NNmax) :: dkEij
5167 : INTEGER, INTENT(in) :: lsta(2, Nmol), nnbrx, lstb(nnbrx*Nmol)
5168 :
5169 : INTEGER :: ij, ijpt3, ijpt6, ik, ikpt6, Ipb, Ipe, &
5170 : Ipt3, Jpt3, Ki, Kpt3, Nkpt3
5171 : REAL(8) :: bcsqi, Bij, Co1_dkEij, Co2_dkEij, Co_cdi, Co_dhcosi, Co_hcosi, Co_mb1, Co_mb2, &
5172 : Co_pa, COSijk, dfij, dfik, dFxi, dFxj, dFxk, dFyi, dFyj, dFyk, dFzi, dFzj, dFzk, dGi, &
5173 : djEij, dsqi, dXjEij2, dYjEij2, dZjEij2, Eij, fdG, fdGcos, fij, fik, Gi, hi, Pni, Rreij, &
5174 : Rreik, Ua, XRreij, XRreik, YRreij, YRreik, ZRreij, ZRreik
5175 :
5176 22000 : Ipb = lsta(1, i)
5177 22000 : Ipe = lsta(2, i)
5178 :
5179 22000 : Ki = Kinds(i)
5180 22000 : bcsqi = bcsq(Ki)
5181 22000 : dsqi = dsq(Ki)
5182 22000 : hi = h(Ki)
5183 22000 : Pni = Pn(Ki)
5184 :
5185 22000 : Co_cdi = Co_bcd(Ki)
5186 :
5187 22000 : dFxi = 0.0d0
5188 22000 : dFyi = 0.0d0
5189 22000 : dFzi = 0.0d0
5190 :
5191 110000 : DO_J: DO ij = Ipb, Ipe, +1
5192 :
5193 88000 : IJpt3 = 3*(ij - 1)
5194 88000 : IJpt6 = 6*(ij - 1)
5195 :
5196 88000 : XRreij = XYZRrefdf(IJpt6 + 1)
5197 88000 : YRreij = XYZRrefdf(IJpt6 + 2)
5198 88000 : ZRreij = XYZRrefdf(IJpt6 + 3)
5199 88000 : Rreij = XYZRrefdf(IJpt6 + 4)
5200 88000 : fij = XYZRrefdf(IJpt6 + 5)
5201 88000 : dfij = XYZRrefdf(IJpt6 + 6)
5202 :
5203 88000 : Eij = 0.0d0
5204 88000 : djEij = 0.0d0
5205 88000 : dXjEij2 = 0.0d0
5206 88000 : dYjEij2 = 0.0d0
5207 88000 : dZjEij2 = 0.0d0
5208 :
5209 88000 : Nkpt3 = -3
5210 440000 : DO_K: DO ik = Ipb, Ipe, +1
5211 :
5212 352000 : Nkpt3 = Nkpt3 + 3
5213 :
5214 440000 : IKIJ: IF (ik /= ij) THEN
5215 :
5216 264000 : IKpt6 = 6*(ik - 1)
5217 :
5218 264000 : XRreik = XYZRrefdf(IKpt6 + 1)
5219 264000 : YRreik = XYZRrefdf(IKpt6 + 2)
5220 264000 : ZRreik = XYZRrefdf(IKpt6 + 3)
5221 264000 : Rreik = XYZRrefdf(IKpt6 + 4)
5222 264000 : fik = XYZRrefdf(IKpt6 + 5)
5223 264000 : dfik = XYZRrefdf(IKpt6 + 6)
5224 :
5225 264000 : COSijk = XRreij*XRreik + YRreij*YRreik + ZRreij*ZRreik
5226 :
5227 264000 : Co_hcosi = hi - COSijk
5228 264000 : Co_dhcosi = 1.0d0/(dsqi + Co_hcosi*Co_hcosi)
5229 264000 : Gi = -bcsqi*Co_dhcosi
5230 264000 : dGi = 2.0d0*Co_hcosi*Co_dhcosi*Gi
5231 264000 : Gi = Gi + Co_cdi
5232 :
5233 264000 : Eij = Eij + fik*Gi
5234 :
5235 264000 : fdG = fik*dGi
5236 264000 : fdGcos = fdG*COSijk
5237 :
5238 264000 : djEij = djEij + fdGcos
5239 :
5240 264000 : dXjEij2 = dXjEij2 + fdG*XRreik
5241 264000 : dYjEij2 = dYjEij2 + fdG*YRreik
5242 264000 : dZjEij2 = dZjEij2 + fdG*ZRreik
5243 :
5244 264000 : Co1_dkEij = -dfik*Gi + fdGcos*Rreik
5245 264000 : Co2_dkEij = -fdG*Rreik
5246 :
5247 264000 : dkEij(Nkpt3 + 1) = Co1_dkEij*XRreik + Co2_dkEij*XRreij
5248 264000 : dkEij(Nkpt3 + 2) = Co1_dkEij*YRreik + Co2_dkEij*YRreij
5249 264000 : dkEij(Nkpt3 + 3) = Co1_dkEij*ZRreik + Co2_dkEij*ZRreij
5250 :
5251 : ELSE
5252 88000 : dkEij(Nkpt3 + 1) = 0.0d0
5253 88000 : dkEij(Nkpt3 + 2) = 0.0d0
5254 88000 : dkEij(Nkpt3 + 3) = 0.0d0
5255 : END IF IKIJ
5256 :
5257 : END DO DO_K
5258 :
5259 88000 : Bij = 1.0d0 + Eij**Pni
5260 88000 : Ua = UadUrdf(IJpt3 + 1)*Bij**(-0.5d0/Pni)
5261 88000 : Uatot = Uatot + Ua
5262 :
5263 88000 : Co_pa = UadUrdf(IJpt3 + 2) + UadUrdf(IJpt3 + 3)*Bij**(-0.5d0/Pni)
5264 :
5265 88000 : CEij: IF (Nkpt3 > 0) THEN
5266 :
5267 88000 : Co_mb1 = Ua*0.5d0*Eij**(Pni - 1.0d0)/Bij
5268 88000 : Co_mb2 = Co_mb1*Rreij
5269 :
5270 88000 : Nkpt3 = -3
5271 440000 : DO ik = Ipb, Ipe, +1
5272 :
5273 352000 : Nkpt3 = Nkpt3 + 3
5274 352000 : dFxk = Co_mb1*dkEij(Nkpt3 + 1)
5275 352000 : dFyk = Co_mb1*dkEij(Nkpt3 + 2)
5276 352000 : dFzk = Co_mb1*dkEij(Nkpt3 + 3)
5277 :
5278 352000 : Kpt3 = 3*(lstb(ik) - 1)
5279 352000 : F(Kpt3 + 1) = F(Kpt3 + 1) + dFxk
5280 352000 : F(Kpt3 + 2) = F(Kpt3 + 2) + dFyk
5281 352000 : F(Kpt3 + 3) = F(Kpt3 + 3) + dFzk
5282 :
5283 352000 : dFxi = dFxi + dFxk
5284 352000 : dFyi = dFyi + dFyk
5285 440000 : dFzi = dFzi + dFzk
5286 :
5287 : END DO
5288 :
5289 88000 : dFxj = Co_pa*XRreij + Co_mb2*(XRreij*djEij - dXjEij2)
5290 88000 : dFyj = Co_pa*YRreij + Co_mb2*(YRreij*djEij - dYjEij2)
5291 88000 : dFzj = Co_pa*ZRreij + Co_mb2*(ZRreij*djEij - dZjEij2)
5292 :
5293 : ELSE
5294 :
5295 0 : dFxj = Co_pa*XRreij
5296 0 : dFyj = Co_pa*YRreij
5297 0 : dFzj = Co_pa*ZRreij
5298 :
5299 : END IF CEij
5300 :
5301 88000 : Jpt3 = 3*(lstb(ij) - 1)
5302 :
5303 88000 : F(Jpt3 + 1) = F(Jpt3 + 1) + dFxj
5304 88000 : F(Jpt3 + 2) = F(Jpt3 + 2) + dFyj
5305 88000 : F(Jpt3 + 3) = F(Jpt3 + 3) + dFzj
5306 :
5307 88000 : dFxi = dFxi + dFxj
5308 88000 : dFyi = dFyi + dFyj
5309 110000 : dFzi = dFzi + dFzj
5310 :
5311 : END DO DO_J
5312 :
5313 22000 : Ipt3 = 3*(i - 1)
5314 22000 : F(Ipt3 + 1) = F(Ipt3 + 1) - dFxi
5315 22000 : F(Ipt3 + 2) = F(Ipt3 + 2) - dFyi
5316 22000 : F(Ipt3 + 3) = F(Ipt3 + 3) - dFzi
5317 22000 : END SUBROUTINE tersoff_subfiat_l
5318 :
5319 : END MODULE eip_silicon
|