32 #include "./base/base_uses.f90"
38 LOGICAL,
PRIVATE,
PARAMETER :: debug_this_module = .true.
39 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'nnp_acsf'
60 TYPE(nnp_type),
INTENT(INOUT),
POINTER :: nnp
61 INTEGER,
INTENT(IN) :: i
62 REAL(kind=
dp),
DIMENSION(:, :, :),
INTENT(INOUT), &
63 OPTIONAL :: dsymdxyz, stress
65 CHARACTER(len=*),
PARAMETER :: routinen =
'nnp_calc_acsf'
67 INTEGER :: handle, handle_sf, ind, j, jj, k, kk, l, &
69 REAL(kind=
dp) :: r1, r2, r3
70 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: symtmp
71 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: forcetmp
72 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: force3tmp
73 REAL(kind=
dp),
DIMENSION(3) :: rvect1, rvect2, rvect3
74 TYPE(nnp_neighbor_type) :: neighbor
76 CALL timeset(routinen, handle)
82 CALL nnp_neighbor_create(nnp, ind, nnp%num_atoms, neighbor)
83 CALL nnp_compute_neighbors(nnp, neighbor, i)
86 nnp%rad(ind)%y = 0.0_dp
87 nnp%ang(ind)%y = 0.0_dp
90 IF (
PRESENT(dsymdxyz))
THEN
92 CALL timeset(
'nnp_acsf_radial', handle_sf)
93 DO s = 1, nnp%rad(ind)%n_symfgrp
94 ALLOCATE (symtmp(nnp%rad(ind)%symfgrp(s)%n_symf))
95 ALLOCATE (forcetmp(3, nnp%rad(ind)%symfgrp(s)%n_symf))
97 DO j = 1, neighbor%n_rad(s)
98 rvect1 = neighbor%dist_rad(1:3, j, s)
99 r1 = neighbor%dist_rad(4, j, s)
100 CALL nnp_calc_rad(nnp, ind, s, rvect1, r1, symtmp, forcetmp)
101 jj = neighbor%ind_rad(j, s)
102 DO sf = 1, nnp%rad(ind)%symfgrp(s)%n_symf
103 m = nnp%rad(ind)%symfgrp(s)%symf(sf)
106 dsymdxyz(l, m, i) = dsymdxyz(l, m, i) + forcetmp(l, sf)
107 dsymdxyz(l, m, jj) = dsymdxyz(l, m, jj) - forcetmp(l, sf)
109 IF (
PRESENT(stress))
THEN
111 stress(:, l, m) = stress(:, l, m) + rvect1(:)*forcetmp(l, sf)
114 nnp%rad(ind)%y(m) = nnp%rad(ind)%y(m) + symtmp(sf)
118 DEALLOCATE (forcetmp)
120 CALL timestop(handle_sf)
122 CALL timeset(
'nnp_acsf_angular', handle_sf)
124 DO s = 1, nnp%ang(ind)%n_symfgrp
125 ALLOCATE (symtmp(nnp%ang(ind)%symfgrp(s)%n_symf))
126 ALLOCATE (force3tmp(3, 3, nnp%ang(ind)%symfgrp(s)%n_symf))
128 IF (nnp%ang(ind)%symfgrp(s)%ele(1) == nnp%ang(ind)%symfgrp(s)%ele(2))
THEN
129 DO j = 1, neighbor%n_ang1(s)
130 rvect1 = neighbor%dist_ang1(1:3, j, s)
131 r1 = neighbor%dist_ang1(4, j, s)
132 DO k = j + 1, neighbor%n_ang1(s)
133 rvect2 = neighbor%dist_ang1(1:3, k, s)
134 r2 = neighbor%dist_ang1(4, k, s)
135 rvect3 = rvect2 - rvect1
136 r3 = norm2(rvect3(:))
137 IF (r3 < nnp%ang(ind)%symfgrp(s)%cutoff)
THEN
138 jj = neighbor%ind_ang1(j, s)
139 kk = neighbor%ind_ang1(k, s)
140 CALL nnp_calc_ang(nnp, ind, s, rvect1, rvect2, rvect3, &
141 r1, r2, r3, symtmp, force3tmp)
142 DO sf = 1, nnp%ang(ind)%symfgrp(s)%n_symf
143 m = off + nnp%ang(ind)%symfgrp(s)%symf(sf)
146 dsymdxyz(l, m, i) = dsymdxyz(l, m, i) &
147 + force3tmp(l, 1, sf)
148 dsymdxyz(l, m, jj) = dsymdxyz(l, m, jj) &
149 + force3tmp(l, 2, sf)
150 dsymdxyz(l, m, kk) = dsymdxyz(l, m, kk) &
151 + force3tmp(l, 3, sf)
153 IF (
PRESENT(stress))
THEN
155 stress(:, l, m) = stress(:, l, m) - rvect1(:)*force3tmp(l, 2, sf)
156 stress(:, l, m) = stress(:, l, m) - rvect2(:)*force3tmp(l, 3, sf)
159 nnp%ang(ind)%y(m - off) = nnp%ang(ind)%y(m - off) + symtmp(sf)
165 DO j = 1, neighbor%n_ang1(s)
166 rvect1 = neighbor%dist_ang1(1:3, j, s)
167 r1 = neighbor%dist_ang1(4, j, s)
168 DO k = 1, neighbor%n_ang2(s)
169 rvect2 = neighbor%dist_ang2(1:3, k, s)
170 r2 = neighbor%dist_ang2(4, k, s)
171 rvect3 = rvect2 - rvect1
172 r3 = norm2(rvect3(:))
173 IF (r3 < nnp%ang(ind)%symfgrp(s)%cutoff)
THEN
174 jj = neighbor%ind_ang1(j, s)
175 kk = neighbor%ind_ang1(k, s)
176 CALL nnp_calc_ang(nnp, ind, s, rvect1, rvect2, rvect3, &
177 r1, r2, r3, symtmp, force3tmp)
179 DO sf = 1, nnp%ang(ind)%symfgrp(s)%n_symf
180 m = off + nnp%ang(ind)%symfgrp(s)%symf(sf)
181 jj = neighbor%ind_ang1(j, s)
182 kk = neighbor%ind_ang2(k, s)
185 dsymdxyz(l, m, i) = dsymdxyz(l, m, i) &
186 + force3tmp(l, 1, sf)
187 dsymdxyz(l, m, jj) = dsymdxyz(l, m, jj) &
188 + force3tmp(l, 2, sf)
189 dsymdxyz(l, m, kk) = dsymdxyz(l, m, kk) &
190 + force3tmp(l, 3, sf)
192 IF (
PRESENT(stress))
THEN
194 stress(:, l, m) = stress(:, l, m) - rvect1(:)*force3tmp(l, 2, sf)
195 stress(:, l, m) = stress(:, l, m) - rvect2(:)*force3tmp(l, 3, sf)
198 nnp%ang(ind)%y(m - off) = nnp%ang(ind)%y(m - off) + symtmp(sf)
205 DEALLOCATE (force3tmp)
207 CALL timestop(handle_sf)
211 CALL timeset(
'nnp_acsf_radial', handle_sf)
212 DO s = 1, nnp%rad(ind)%n_symfgrp
213 ALLOCATE (symtmp(nnp%rad(ind)%symfgrp(s)%n_symf))
215 DO j = 1, neighbor%n_rad(s)
216 rvect1 = neighbor%dist_rad(1:3, j, s)
217 r1 = neighbor%dist_rad(4, j, s)
218 CALL nnp_calc_rad(nnp, ind, s, rvect1, r1, symtmp)
219 DO sf = 1, nnp%rad(ind)%symfgrp(s)%n_symf
220 m = nnp%rad(ind)%symfgrp(s)%symf(sf)
221 nnp%rad(ind)%y(m) = nnp%rad(ind)%y(m) + symtmp(sf)
226 CALL timestop(handle_sf)
228 CALL timeset(
'nnp_acsf_angular', handle_sf)
230 DO s = 1, nnp%ang(ind)%n_symfgrp
231 ALLOCATE (symtmp(nnp%ang(ind)%symfgrp(s)%n_symf))
233 IF (nnp%ang(ind)%symfgrp(s)%ele(1) == nnp%ang(ind)%symfgrp(s)%ele(2))
THEN
234 DO j = 1, neighbor%n_ang1(s)
235 rvect1 = neighbor%dist_ang1(1:3, j, s)
236 r1 = neighbor%dist_ang1(4, j, s)
237 DO k = j + 1, neighbor%n_ang1(s)
238 rvect2 = neighbor%dist_ang1(1:3, k, s)
239 r2 = neighbor%dist_ang1(4, k, s)
240 rvect3 = rvect2 - rvect1
241 r3 = norm2(rvect3(:))
242 IF (r3 < nnp%ang(ind)%symfgrp(s)%cutoff)
THEN
243 CALL nnp_calc_ang(nnp, ind, s, rvect1, rvect2, rvect3, r1, r2, r3, symtmp)
244 DO sf = 1, nnp%ang(ind)%symfgrp(s)%n_symf
245 m = off + nnp%ang(ind)%symfgrp(s)%symf(sf)
246 nnp%ang(ind)%y(m - off) = nnp%ang(ind)%y(m - off) + symtmp(sf)
252 DO j = 1, neighbor%n_ang1(s)
253 rvect1 = neighbor%dist_ang1(1:3, j, s)
254 r1 = neighbor%dist_ang1(4, j, s)
255 DO k = 1, neighbor%n_ang2(s)
256 rvect2 = neighbor%dist_ang2(1:3, k, s)
257 r2 = neighbor%dist_ang2(4, k, s)
258 rvect3 = rvect2 - rvect1
259 r3 = norm2(rvect3(:))
260 IF (r3 < nnp%ang(ind)%symfgrp(s)%cutoff)
THEN
261 CALL nnp_calc_ang(nnp, ind, s, rvect1, rvect2, rvect3, r1, r2, r3, symtmp)
263 DO sf = 1, nnp%ang(ind)%symfgrp(s)%n_symf
264 m = off + nnp%ang(ind)%symfgrp(s)%symf(sf)
265 nnp%ang(ind)%y(m - off) = nnp%ang(ind)%y(m - off) + symtmp(sf)
273 CALL timestop(handle_sf)
277 CALL nnp_check_extrapolation(nnp, ind)
279 IF (
PRESENT(dsymdxyz))
THEN
280 IF (
PRESENT(stress))
THEN
281 CALL nnp_scale_acsf(nnp, ind, dsymdxyz, stress)
283 CALL nnp_scale_acsf(nnp, ind, dsymdxyz)
286 CALL nnp_scale_acsf(nnp, ind)
289 CALL nnp_neighbor_release(neighbor)
290 CALL timestop(handle)
301 SUBROUTINE nnp_check_extrapolation(nnp, ind)
303 TYPE(nnp_type),
INTENT(INOUT) :: nnp
304 INTEGER,
INTENT(IN) :: ind
306 REAL(kind=
dp),
PARAMETER :: threshold = 0.0001_dp
309 LOGICAL :: extrapolate
311 extrapolate = nnp%output_expol
313 DO j = 1, nnp%n_rad(ind)
314 IF (nnp%rad(ind)%y(j) - &
315 nnp%rad(ind)%loc_max(j) > threshold)
THEN
317 ELSE IF (-nnp%rad(ind)%y(j) + &
318 nnp%rad(ind)%loc_min(j) > threshold)
THEN
322 DO j = 1, nnp%n_ang(ind)
323 IF (nnp%ang(ind)%y(j) - &
324 nnp%ang(ind)%loc_max(j) > threshold)
THEN
326 ELSE IF (-nnp%ang(ind)%y(j) + &
327 nnp%ang(ind)%loc_min(j) > threshold)
THEN
332 nnp%output_expol = extrapolate
334 END SUBROUTINE nnp_check_extrapolation
345 SUBROUTINE nnp_scale_acsf(nnp, ind, dsymdxyz, stress)
347 TYPE(nnp_type),
INTENT(INOUT) :: nnp
348 INTEGER,
INTENT(IN) :: ind
349 REAL(kind=
dp),
DIMENSION(:, :, :),
INTENT(OUT), &
350 OPTIONAL :: dsymdxyz, stress
354 IF (nnp%center_acsf)
THEN
355 DO j = 1, nnp%n_rad(ind)
356 nnp%arc(ind)%layer(1)%node(j) = &
357 (nnp%rad(ind)%y(j) - nnp%rad(ind)%loc_av(j))
360 DO j = 1, nnp%n_ang(ind)
361 nnp%arc(ind)%layer(1)%node(j + off) = &
362 (nnp%ang(ind)%y(j) - nnp%ang(ind)%loc_av(j))
365 IF (nnp%scale_acsf)
THEN
366 DO j = 1, nnp%n_rad(ind)
367 nnp%arc(ind)%layer(1)%node(j) = &
368 nnp%arc(ind)%layer(1)%node(j)/ &
369 (nnp%rad(ind)%loc_max(j) - nnp%rad(ind)%loc_min(j))* &
370 (nnp%scmax - nnp%scmin) + nnp%scmin
373 DO j = 1, nnp%n_ang(ind)
374 nnp%arc(ind)%layer(1)%node(j + off) = &
375 nnp%arc(ind)%layer(1)%node(j + off)/ &
376 (nnp%ang(ind)%loc_max(j) - nnp%ang(ind)%loc_min(j))* &
377 (nnp%scmax - nnp%scmin) + nnp%scmin
380 ELSE IF (nnp%scale_acsf)
THEN
381 DO j = 1, nnp%n_rad(ind)
382 nnp%arc(ind)%layer(1)%node(j) = &
383 (nnp%rad(ind)%y(j) - nnp%rad(ind)%loc_min(j))/ &
384 (nnp%rad(ind)%loc_max(j) - nnp%rad(ind)%loc_min(j))* &
385 (nnp%scmax - nnp%scmin) + nnp%scmin
388 DO j = 1, nnp%n_ang(ind)
389 nnp%arc(ind)%layer(1)%node(j + off) = &
390 (nnp%ang(ind)%y(j) - nnp%ang(ind)%loc_min(j))/ &
391 (nnp%ang(ind)%loc_max(j) - nnp%ang(ind)%loc_min(j))* &
392 (nnp%scmax - nnp%scmin) + nnp%scmin
394 ELSE IF (nnp%scale_sigma_acsf)
THEN
395 DO j = 1, nnp%n_rad(ind)
396 nnp%arc(ind)%layer(1)%node(j) = &
397 (nnp%rad(ind)%y(j) - nnp%rad(ind)%loc_av(j))/ &
398 nnp%rad(ind)%sigma(j)* &
399 (nnp%scmax - nnp%scmin) + nnp%scmin
402 DO j = 1, nnp%n_ang(ind)
403 nnp%arc(ind)%layer(1)%node(j + off) = &
404 (nnp%ang(ind)%y(j) - nnp%ang(ind)%loc_av(j))/ &
405 nnp%ang(ind)%sigma(j)* &
406 (nnp%scmax - nnp%scmin) + nnp%scmin
409 DO j = 1, nnp%n_rad(ind)
410 nnp%arc(ind)%layer(1)%node(j) = nnp%rad(ind)%y(j)
413 DO j = 1, nnp%n_ang(ind)
414 nnp%arc(ind)%layer(1)%node(j + off) = nnp%ang(ind)%y(j)
418 IF (
PRESENT(dsymdxyz))
THEN
419 IF (nnp%scale_acsf)
THEN
420 DO k = 1, nnp%num_atoms
421 DO j = 1, nnp%n_rad(ind)
422 dsymdxyz(:, j, k) = dsymdxyz(:, j, k)/ &
423 (nnp%rad(ind)%loc_max(j) - &
424 nnp%rad(ind)%loc_min(j))* &
425 (nnp%scmax - nnp%scmin)
429 DO k = 1, nnp%num_atoms
430 DO j = 1, nnp%n_ang(ind)
431 dsymdxyz(:, j + off, k) = dsymdxyz(:, j + off, k)/ &
432 (nnp%ang(ind)%loc_max(j) - &
433 nnp%ang(ind)%loc_min(j))* &
434 (nnp%scmax - nnp%scmin)
437 ELSE IF (nnp%scale_sigma_acsf)
THEN
438 DO k = 1, nnp%num_atoms
439 DO j = 1, nnp%n_rad(ind)
440 dsymdxyz(:, j, k) = dsymdxyz(:, j, k)/ &
441 nnp%rad(ind)%sigma(j)* &
442 (nnp%scmax - nnp%scmin)
446 DO k = 1, nnp%num_atoms
447 DO j = 1, nnp%n_ang(ind)
448 dsymdxyz(:, j + off, k) = dsymdxyz(:, j + off, k)/ &
449 nnp%ang(ind)%sigma(j)* &
450 (nnp%scmax - nnp%scmin)
456 IF (
PRESENT(stress))
THEN
457 IF (nnp%scale_acsf)
THEN
458 DO j = 1, nnp%n_rad(ind)
459 stress(:, :, j) = stress(:, :, j)/ &
460 (nnp%rad(ind)%loc_max(j) - &
461 nnp%rad(ind)%loc_min(j))* &
462 (nnp%scmax - nnp%scmin)
465 DO j = 1, nnp%n_ang(ind)
466 stress(:, :, j + off) = stress(:, :, j + off)/ &
467 (nnp%ang(ind)%loc_max(j) - &
468 nnp%ang(ind)%loc_min(j))* &
469 (nnp%scmax - nnp%scmin)
471 ELSE IF (nnp%scale_sigma_acsf)
THEN
472 DO j = 1, nnp%n_rad(ind)
473 stress(:, :, j) = stress(:, :, j)/ &
474 nnp%rad(ind)%sigma(j)* &
475 (nnp%scmax - nnp%scmin)
478 DO j = 1, nnp%n_ang(ind)
479 stress(:, :, j + off) = stress(:, :, j + off)/ &
480 nnp%ang(ind)%sigma(j)* &
481 (nnp%scmax - nnp%scmin)
486 END SUBROUTINE nnp_scale_acsf
501 SUBROUTINE nnp_calc_rad(nnp, ind, s, rvect, r, sym, force)
503 TYPE(nnp_type),
INTENT(IN) :: nnp
504 INTEGER,
INTENT(IN) :: ind, s
505 REAL(kind=
dp),
DIMENSION(3),
INTENT(IN) :: rvect
506 REAL(kind=
dp),
INTENT(IN) :: r
507 REAL(kind=
dp),
DIMENSION(:),
INTENT(OUT) :: sym
508 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(OUT), &
512 REAL(kind=
dp) :: dfcutdr, dsymdr, eta, fcut, funccut, rs, &
514 REAL(kind=
dp),
DIMENSION(3) :: drdx
522 funccut = nnp%rad(ind)%symfgrp(s)%cutoff
523 SELECT CASE (nnp%cut_type)
526 fcut = 0.5_dp*(cos(tmp) + 1.0_dp)
527 IF (
PRESENT(force))
THEN
528 dfcutdr = 0.5_dp*(-sin(tmp))*(
pi/funccut)
531 tmp = tanh(1.0_dp - r/funccut)
533 IF (
PRESENT(force))
THEN
534 dfcutdr = (-3.0_dp/funccut)*(tmp**2 - tmp**4)
537 cpabort(
"NNP| Cutoff function unknown")
540 IF (
PRESENT(force)) drdx(:) = rvect(:)/r
543 DO sf = 1, nnp%rad(ind)%symfgrp(s)%n_symf
544 k = nnp%rad(ind)%symfgrp(s)%symf(sf)
545 eta = nnp%rad(ind)%eta(k)
546 rs = nnp%rad(ind)%rs(k)
549 sym(sf) = exp(-eta*(r - rs)**2)
553 IF (
PRESENT(force))
THEN
554 dsymdr = sym(sf)*(-2.0_dp*eta*(r - rs))
555 force(:, sf) = fcut*dsymdr*drdx(:) + sym(sf)*dfcutdr*drdx(:)
559 sym(sf) = sym(sf)*fcut
562 END SUBROUTINE nnp_calc_rad
581 SUBROUTINE nnp_calc_ang(nnp, ind, s, rvect1, rvect2, rvect3, r1, r2, r3, sym, force)
583 TYPE(nnp_type),
INTENT(IN) :: nnp
584 INTEGER,
INTENT(IN) :: ind, s
585 REAL(kind=
dp),
DIMENSION(3),
INTENT(IN) :: rvect1, rvect2, rvect3
586 REAL(kind=
dp),
INTENT(IN) :: r1, r2, r3
587 REAL(kind=
dp),
DIMENSION(:),
INTENT(OUT) :: sym
588 REAL(kind=
dp),
DIMENSION(:, :, :),
INTENT(OUT), &
592 REAL(kind=
dp) :: angular, costheta, dfcutdr1, dfcutdr2, dfcutdr3, dsymdr1, dsymdr2, dsymdr3, &
593 eta, f, fcut, fcut1, fcut2, fcut3, ftot, g, lam, pref, prefzeta, rsqr1, rsqr2, rsqr3, &
594 symtmp, tmp, tmp1, tmp2, tmp3, tmpzeta, zeta
595 REAL(kind=
dp),
DIMENSION(3) :: dangulardx1, dangulardx2, dangulardx3, dcosthetadx1, &
596 dcosthetadx2, dcosthetadx3, dfdx1, dfdx2, dfdx3, dgdx1, dgdx2, dgdx3, dr1dx, dr2dx, dr3dx
618 f = (rsqr3 - rsqr1 - rsqr2)
623 fcut = nnp%ang(ind)%symfgrp(s)%cutoff
624 SELECT CASE (nnp%cut_type)
629 fcut1 = 0.5_dp*(cos(tmp1) + 1.0_dp)
630 fcut2 = 0.5_dp*(cos(tmp2) + 1.0_dp)
631 fcut3 = 0.5_dp*(cos(tmp3) + 1.0_dp)
632 ftot = fcut1*fcut2*fcut3
633 IF (
PRESENT(force))
THEN
634 pref = 0.5_dp*(
pi/fcut)
635 dfcutdr1 = pref*(-sin(tmp1))*fcut2*fcut3
636 dfcutdr2 = pref*(-sin(tmp2))*fcut1*fcut3
637 dfcutdr3 = pref*(-sin(tmp3))*fcut1*fcut2
640 tmp1 = tanh(1.0_dp - r1/fcut)
641 tmp2 = tanh(1.0_dp - r2/fcut)
642 tmp3 = tanh(1.0_dp - r3/fcut)
646 ftot = fcut1*fcut2*fcut3
647 IF (
PRESENT(force))
THEN
649 dfcutdr1 = pref*(tmp1**2 - tmp1**4)*fcut2*fcut3
650 dfcutdr2 = pref*(tmp2**2 - tmp2**4)*fcut1*fcut3
651 dfcutdr3 = pref*(tmp3**2 - tmp3**4)*fcut1*fcut2
654 cpabort(
"NNP| Cutoff function unknown")
657 IF (
PRESENT(force))
THEN
658 dr1dx(:) = rvect1(:)/r1
659 dr2dx(:) = rvect2(:)/r2
660 dr3dx(:) = rvect3(:)/r3
664 DO sf = 1, nnp%ang(ind)%symfgrp(s)%n_symf
665 m = nnp%ang(ind)%symfgrp(s)%symf(sf)
666 lam = nnp%ang(ind)%lam(m)
667 zeta = nnp%ang(ind)%zeta(m)
668 prefzeta = nnp%ang(ind)%prefzeta(m)
669 eta = nnp%ang(ind)%eta(m)
671 tmp = (1.0_dp + lam*costheta)
673 IF (tmp <= 0.0_dp)
THEN
675 IF (
PRESENT(force)) force(:, :, sf) = 0.0_dp
683 IF (1.0_dp*i == zeta)
THEN
684 tmpzeta = tmp**(i - 1)
686 tmpzeta = tmp**(zeta - 1.0_dp)
688 angular = tmpzeta*tmp
691 symtmp = exp(-eta*(rsqr1 + rsqr2 + rsqr3))
694 IF (
PRESENT(force))
THEN
695 pref = zeta*(tmpzeta)/g**2
697 dfdx1(i) = -2.0_dp*lam*(rvect1(i) + rvect2(i))
698 dfdx2(i) = 2.0_dp*lam*(rvect3(i) + rvect1(i))
699 dfdx3(i) = 2.0_dp*lam*(rvect2(i) - rvect3(i))
701 tmp1 = 2.0_dp*r2*dr1dx(i)
702 tmp2 = 2.0_dp*r1*dr2dx(i)
703 dgdx1(i) = -(tmp1 + tmp2)
707 dcosthetadx1(i) = dfdx1(i)*g - lam*f*dgdx1(i)
708 dcosthetadx2(i) = dfdx2(i)*g - lam*f*dgdx2(i)
709 dcosthetadx3(i) = dfdx3(i)*g - lam*f*dgdx3(i)
711 dangulardx1(i) = pref*dcosthetadx1(i)
712 dangulardx2(i) = pref*dcosthetadx2(i)
713 dangulardx3(i) = pref*dcosthetadx3(i)
719 tmp = -2.0_dp*symtmp*eta
729 tmp = pref*symtmp*ftot
730 tmp1 = pref*angular*(ftot*dsymdr1 + dfcutdr1*symtmp)
731 tmp2 = pref*angular*(ftot*dsymdr2 + dfcutdr2*symtmp)
732 tmp3 = pref*angular*(ftot*dsymdr3 + dfcutdr3*symtmp)
734 force(i, 1, sf) = tmp*dangulardx1(i) + tmp1*dr1dx(i) + tmp2*dr2dx(i)
735 force(i, 2, sf) = tmp*dangulardx2(i) - tmp1*dr1dx(i) + tmp3*dr3dx(i)
736 force(i, 3, sf) = tmp*dangulardx3(i) - tmp2*dr2dx(i) - tmp3*dr3dx(i)
743 sym(sf) = pref*angular*symtmp*ftot
746 END SUBROUTINE nnp_calc_ang
756 CHARACTER(len=2),
DIMENSION(:),
INTENT(INOUT) :: ele
757 INTEGER,
DIMENSION(:),
INTENT(INOUT) :: nuc_ele
759 CHARACTER(len=2) :: tmp_ele
760 INTEGER :: i, j, loc, minimum, tmp_nuc_ele
768 DO i = 1,
SIZE(ele) - 1
771 DO j = i + 1,
SIZE(ele)
772 IF (nuc_ele(j) .LT. minimum)
THEN
777 tmp_nuc_ele = nuc_ele(i)
778 nuc_ele(i) = nuc_ele(loc)
779 nuc_ele(loc) = tmp_nuc_ele
796 TYPE(nnp_type),
INTENT(INOUT) :: nnp
798 INTEGER :: i, j, k, loc
806 DO j = 1, nnp%n_rad(i) - 1
808 DO k = j + 1, nnp%n_rad(i)
809 IF (nnp%rad(i)%funccut(loc) .GT. nnp%rad(i)%funccut(k))
THEN
814 CALL nnp_swaprad(nnp%rad(i), j, loc)
819 DO j = 1, nnp%n_rad(i) - 1
821 DO k = j + 1, nnp%n_rad(i)
822 IF (nnp%rad(i)%funccut(loc) .EQ. nnp%rad(i)%funccut(k) .AND. &
823 nnp%rad(i)%eta(loc) .GT. nnp%rad(i)%eta(k))
THEN
828 CALL nnp_swaprad(nnp%rad(i), j, loc)
833 DO j = 1, nnp%n_rad(i) - 1
835 DO k = j + 1, nnp%n_rad(i)
836 IF (nnp%rad(i)%funccut(loc) .EQ. nnp%rad(i)%funccut(k) .AND. &
837 nnp%rad(i)%eta(loc) .EQ. nnp%rad(i)%eta(k) .AND. &
838 nnp%rad(i)%rs(loc) .GT. nnp%rad(i)%rs(k))
THEN
843 CALL nnp_swaprad(nnp%rad(i), j, loc)
848 DO j = 1, nnp%n_rad(i) - 1
850 DO k = j + 1, nnp%n_rad(i)
851 IF (nnp%rad(i)%funccut(loc) .EQ. nnp%rad(i)%funccut(k) .AND. &
852 nnp%rad(i)%eta(loc) .EQ. nnp%rad(i)%eta(k) .AND. &
853 nnp%rad(i)%rs(loc) .EQ. nnp%rad(i)%rs(k) .AND. &
854 nnp%rad(i)%nuc_ele(loc) .GT. nnp%rad(i)%nuc_ele(k))
THEN
859 CALL nnp_swaprad(nnp%rad(i), j, loc)
864 DO j = 1, nnp%n_ang(i) - 1
866 DO k = j + 1, nnp%n_ang(i)
867 IF (nnp%ang(i)%funccut(loc) .GT. nnp%ang(i)%funccut(k))
THEN
872 CALL nnp_swapang(nnp%ang(i), j, loc)
877 DO j = 1, nnp%n_ang(i) - 1
879 DO k = j + 1, nnp%n_ang(i)
880 IF (nnp%ang(i)%funccut(loc) .EQ. nnp%ang(i)%funccut(k) .AND. &
881 nnp%ang(i)%eta(loc) .GT. nnp%ang(i)%eta(k))
THEN
886 CALL nnp_swapang(nnp%ang(i), j, loc)
891 DO j = 1, nnp%n_ang(i) - 1
893 DO k = j + 1, nnp%n_ang(i)
894 IF (nnp%ang(i)%funccut(loc) .EQ. nnp%ang(i)%funccut(k) .AND. &
895 nnp%ang(i)%eta(loc) .EQ. nnp%ang(i)%eta(k) .AND. &
896 nnp%ang(i)%zeta(loc) .GT. nnp%ang(i)%zeta(k))
THEN
901 CALL nnp_swapang(nnp%ang(i), j, loc)
906 DO j = 1, nnp%n_ang(i) - 1
908 DO k = j + 1, nnp%n_ang(i)
909 IF (nnp%ang(i)%funccut(loc) .EQ. nnp%ang(i)%funccut(k) .AND. &
910 nnp%ang(i)%eta(loc) .EQ. nnp%ang(i)%eta(k) .AND. &
911 nnp%ang(i)%zeta(loc) .EQ. nnp%ang(i)%zeta(k) .AND. &
912 nnp%ang(i)%lam(loc) .GT. nnp%ang(i)%lam(k))
THEN
917 CALL nnp_swapang(nnp%ang(i), j, loc)
922 DO j = 1, nnp%n_ang(i) - 1
924 DO k = j + 1, nnp%n_ang(i)
925 IF (nnp%ang(i)%funccut(loc) .EQ. nnp%ang(i)%funccut(k) .AND. &
926 nnp%ang(i)%eta(loc) .EQ. nnp%ang(i)%eta(k) .AND. &
927 nnp%ang(i)%zeta(loc) .EQ. nnp%ang(i)%zeta(k) .AND. &
928 nnp%ang(i)%lam(loc) .EQ. nnp%ang(i)%lam(k) .AND. &
929 nnp%ang(i)%nuc_ele1(loc) .GT. nnp%ang(i)%nuc_ele1(k))
THEN
934 CALL nnp_swapang(nnp%ang(i), j, loc)
937 DO j = 1, nnp%n_ang(i) - 1
939 DO k = j + 1, nnp%n_ang(i)
940 IF (nnp%ang(i)%funccut(loc) .EQ. nnp%ang(i)%funccut(k) .AND. &
941 nnp%ang(i)%eta(loc) .EQ. nnp%ang(i)%eta(k) .AND. &
942 nnp%ang(i)%zeta(loc) .EQ. nnp%ang(i)%zeta(k) .AND. &
943 nnp%ang(i)%lam(loc) .EQ. nnp%ang(i)%lam(k) .AND. &
944 nnp%ang(i)%nuc_ele1(loc) .EQ. nnp%ang(i)%nuc_ele1(k) .AND. &
945 nnp%ang(i)%nuc_ele2(loc) .GT. nnp%ang(i)%nuc_ele2(k))
THEN
950 CALL nnp_swapang(nnp%ang(i), j, loc)
964 SUBROUTINE nnp_swaprad(rad, i, j)
965 TYPE(nnp_acsf_rad_type),
INTENT(INOUT) :: rad
966 INTEGER,
INTENT(IN) :: i, j
968 CHARACTER(len=2) :: tmpc
970 REAL(kind=
dp) :: tmpr
972 tmpr = rad%funccut(i)
973 rad%funccut(i) = rad%funccut(j)
974 rad%funccut(j) = tmpr
977 rad%eta(i) = rad%eta(j)
981 rad%rs(i) = rad%rs(j)
985 rad%ele(i) = rad%ele(j)
988 tmpi = rad%nuc_ele(i)
989 rad%nuc_ele(i) = rad%nuc_ele(j)
990 rad%nuc_ele(j) = tmpi
992 END SUBROUTINE nnp_swaprad
1002 SUBROUTINE nnp_swapang(ang, i, j)
1003 TYPE(nnp_acsf_ang_type),
INTENT(INOUT) :: ang
1004 INTEGER,
INTENT(IN) :: i, j
1006 CHARACTER(len=2) :: tmpc
1008 REAL(kind=
dp) :: tmpr
1010 tmpr = ang%funccut(i)
1011 ang%funccut(i) = ang%funccut(j)
1012 ang%funccut(j) = tmpr
1015 ang%eta(i) = ang%eta(j)
1019 ang%zeta(i) = ang%zeta(j)
1022 tmpr = ang%prefzeta(i)
1023 ang%prefzeta(i) = ang%prefzeta(j)
1024 ang%prefzeta(j) = tmpr
1027 ang%lam(i) = ang%lam(j)
1031 ang%ele1(i) = ang%ele1(j)
1034 tmpi = ang%nuc_ele1(i)
1035 ang%nuc_ele1(i) = ang%nuc_ele1(j)
1036 ang%nuc_ele1(j) = tmpi
1039 ang%ele2(i) = ang%ele2(j)
1042 tmpi = ang%nuc_ele2(i)
1043 ang%nuc_ele2(i) = ang%nuc_ele2(j)
1044 ang%nuc_ele2(j) = tmpi
1046 END SUBROUTINE nnp_swapang
1056 TYPE(nnp_type),
INTENT(INOUT) :: nnp
1058 INTEGER :: ang, i, j, k, rad, s
1059 REAL(kind=
dp) :: funccut
1063 nnp%rad(i)%n_symfgrp = 0
1064 nnp%ang(i)%n_symfgrp = 0
1068 DO s = 1, nnp%n_rad(i)
1069 IF (nnp%rad(i)%ele(s) == nnp%ele(j))
THEN
1070 IF (abs(nnp%rad(i)%funccut(s) - funccut) > 1.0e-5_dp)
THEN
1071 nnp%rad(i)%n_symfgrp = nnp%rad(i)%n_symfgrp + 1
1072 funccut = nnp%rad(i)%funccut(s)
1081 DO s = 1, nnp%n_ang(i)
1082 IF ((nnp%ang(i)%ele1(s) == nnp%ele(j) .AND. &
1083 nnp%ang(i)%ele2(s) == nnp%ele(k)) .OR. &
1084 (nnp%ang(i)%ele1(s) == nnp%ele(k) .AND. &
1085 nnp%ang(i)%ele2(s) == nnp%ele(j)))
THEN
1086 IF (abs(nnp%ang(i)%funccut(s) - funccut) > 1.0e-5_dp)
THEN
1087 nnp%ang(i)%n_symfgrp = nnp%ang(i)%n_symfgrp + 1
1088 funccut = nnp%ang(i)%funccut(s)
1098 ALLOCATE (nnp%rad(i)%symfgrp(nnp%rad(i)%n_symfgrp))
1099 ALLOCATE (nnp%ang(i)%symfgrp(nnp%ang(i)%n_symfgrp))
1100 DO j = 1, nnp%rad(i)%n_symfgrp
1101 nnp%rad(i)%symfgrp(j)%n_symf = 0
1103 DO j = 1, nnp%ang(i)%n_symfgrp
1104 nnp%ang(i)%symfgrp(j)%n_symf = 0
1114 DO s = 1, nnp%n_rad(i)
1115 IF (nnp%rad(i)%ele(s) == nnp%ele(j))
THEN
1116 IF (abs(nnp%rad(i)%funccut(s) - funccut) > 1.0e-5_dp)
THEN
1118 funccut = nnp%rad(i)%funccut(s)
1119 nnp%rad(i)%symfgrp(rad)%cutoff = funccut
1120 ALLOCATE (nnp%rad(i)%symfgrp(rad)%ele(1))
1121 ALLOCATE (nnp%rad(i)%symfgrp(rad)%ele_ind(1))
1122 nnp%rad(i)%symfgrp(rad)%ele(1) = nnp%ele(j)
1123 nnp%rad(i)%symfgrp(rad)%ele_ind(1) = j
1125 nnp%rad(i)%symfgrp(rad)%n_symf = nnp%rad(i)%symfgrp(rad)%n_symf + 1
1132 DO s = 1, nnp%n_ang(i)
1133 IF ((nnp%ang(i)%ele1(s) == nnp%ele(j) .AND. &
1134 nnp%ang(i)%ele2(s) == nnp%ele(k)) .OR. &
1135 (nnp%ang(i)%ele1(s) == nnp%ele(k) .AND. &
1136 nnp%ang(i)%ele2(s) == nnp%ele(j)))
THEN
1137 IF (abs(nnp%ang(i)%funccut(s) - funccut) > 1.0e-5_dp)
THEN
1139 funccut = nnp%ang(i)%funccut(s)
1140 nnp%ang(i)%symfgrp(ang)%cutoff = funccut
1141 ALLOCATE (nnp%ang(i)%symfgrp(ang)%ele(2))
1142 ALLOCATE (nnp%ang(i)%symfgrp(ang)%ele_ind(2))
1143 nnp%ang(i)%symfgrp(ang)%ele(1) = nnp%ele(j)
1144 nnp%ang(i)%symfgrp(ang)%ele(2) = nnp%ele(k)
1145 nnp%ang(i)%symfgrp(ang)%ele_ind(1) = j
1146 nnp%ang(i)%symfgrp(ang)%ele_ind(2) = k
1148 nnp%ang(i)%symfgrp(ang)%n_symf = nnp%ang(i)%symfgrp(ang)%n_symf + 1
1157 DO j = 1, nnp%rad(i)%n_symfgrp
1158 ALLOCATE (nnp%rad(i)%symfgrp(j)%symf(nnp%rad(i)%symfgrp(j)%n_symf))
1160 DO s = 1, nnp%n_rad(i)
1161 IF (nnp%rad(i)%ele(s) == nnp%rad(i)%symfgrp(j)%ele(1))
THEN
1162 IF (abs(nnp%rad(i)%funccut(s) - nnp%rad(i)%symfgrp(j)%cutoff) <= 1.0e-5_dp)
THEN
1164 nnp%rad(i)%symfgrp(j)%symf(rad) = s
1169 DO j = 1, nnp%ang(i)%n_symfgrp
1170 ALLOCATE (nnp%ang(i)%symfgrp(j)%symf(nnp%ang(i)%symfgrp(j)%n_symf))
1172 DO s = 1, nnp%n_ang(i)
1173 IF ((nnp%ang(i)%ele1(s) == nnp%ang(i)%symfgrp(j)%ele(1) .AND. &
1174 nnp%ang(i)%ele2(s) == nnp%ang(i)%symfgrp(j)%ele(2)) .OR. &
1175 (nnp%ang(i)%ele1(s) == nnp%ang(i)%symfgrp(j)%ele(2) .AND. &
1176 nnp%ang(i)%ele2(s) == nnp%ang(i)%symfgrp(j)%ele(1)))
THEN
1177 IF (abs(nnp%ang(i)%funccut(s) - nnp%ang(i)%symfgrp(j)%cutoff) <= 1.0e-5_dp)
THEN
1179 nnp%ang(i)%symfgrp(j)%symf(ang) = s
1197 TYPE(nnp_type),
INTENT(INOUT) :: nnp
1198 TYPE(mp_para_env_type),
POINTER :: para_env
1199 CHARACTER(LEN=*),
INTENT(IN) :: printtag
1201 CHARACTER(len=default_string_length) :: my_label
1202 INTEGER :: i, j, unit_nr
1203 TYPE(cp_logger_type),
POINTER :: logger
1208 my_label = trim(printtag)//
"| "
1209 IF (para_env%is_source())
THEN
1211 WRITE (unit_nr,
'(1X,A,1X,10(I2,1X))') trim(my_label)//
" Activation functions:", nnp%actfnct(:)
1213 WRITE (unit_nr, *) trim(my_label)//
" short range atomic symmetry functions element "// &
1215 DO j = 1, nnp%n_rad(i)
1216 WRITE (unit_nr,
'(1X,A,1X,I3,1X,A2,1X,I2,1X,A2,11X,3(F6.3,1X))') trim(my_label), j, nnp%ele(i), 2, &
1217 nnp%rad(i)%ele(j), nnp%rad(i)%eta(j), &
1218 nnp%rad(i)%rs(j), nnp%rad(i)%funccut(j)
1220 DO j = 1, nnp%n_ang(i)
1221 WRITE (unit_nr,
'(1X,A,1X,I3,1X,A2,1X,I2,2(1X,A2),1X,4(F6.3,1X))') &
1222 trim(my_label), j, nnp%ele(i), 3, &
1223 nnp%ang(i)%ele1(j), nnp%ang(i)%ele2(j), &
1224 nnp%ang(i)%eta(j), nnp%ang(i)%lam(j), &
1225 nnp%ang(i)%zeta(j), nnp%ang(i)%funccut(j)
1243 SUBROUTINE nnp_neighbor_create(nnp, ind, nat, neighbor)
1245 TYPE(nnp_type),
INTENT(INOUT),
POINTER :: nnp
1246 INTEGER,
INTENT(IN) :: ind, nat
1247 TYPE(nnp_neighbor_type),
INTENT(INOUT) :: neighbor
1250 TYPE(cell_type),
POINTER :: cell
1255 CALL nnp_compute_pbc_copies(neighbor%pbc_copies, cell, nnp%max_cut)
1256 n = (sum(neighbor%pbc_copies) + 1)*nat
1257 ALLOCATE (neighbor%dist_rad(4, n, nnp%rad(ind)%n_symfgrp))
1258 ALLOCATE (neighbor%dist_ang1(4, n, nnp%ang(ind)%n_symfgrp))
1259 ALLOCATE (neighbor%dist_ang2(4, n, nnp%ang(ind)%n_symfgrp))
1260 ALLOCATE (neighbor%ind_rad(n, nnp%rad(ind)%n_symfgrp))
1261 ALLOCATE (neighbor%ind_ang1(n, nnp%ang(ind)%n_symfgrp))
1262 ALLOCATE (neighbor%ind_ang2(n, nnp%ang(ind)%n_symfgrp))
1263 ALLOCATE (neighbor%n_rad(nnp%rad(ind)%n_symfgrp))
1264 ALLOCATE (neighbor%n_ang1(nnp%ang(ind)%n_symfgrp))
1265 ALLOCATE (neighbor%n_ang2(nnp%ang(ind)%n_symfgrp))
1266 neighbor%n_rad(:) = 0
1267 neighbor%n_ang1(:) = 0
1268 neighbor%n_ang2(:) = 0
1270 END SUBROUTINE nnp_neighbor_create
1278 SUBROUTINE nnp_neighbor_release(neighbor)
1280 TYPE(nnp_neighbor_type),
INTENT(INOUT) :: neighbor
1282 DEALLOCATE (neighbor%dist_rad)
1283 DEALLOCATE (neighbor%dist_ang1)
1284 DEALLOCATE (neighbor%dist_ang2)
1285 DEALLOCATE (neighbor%ind_rad)
1286 DEALLOCATE (neighbor%ind_ang1)
1287 DEALLOCATE (neighbor%ind_ang2)
1288 DEALLOCATE (neighbor%n_rad)
1289 DEALLOCATE (neighbor%n_ang1)
1290 DEALLOCATE (neighbor%n_ang2)
1292 END SUBROUTINE nnp_neighbor_release
1302 SUBROUTINE nnp_compute_neighbors(nnp, neighbor, i)
1304 TYPE(nnp_type),
INTENT(INOUT),
POINTER :: nnp
1305 TYPE(nnp_neighbor_type),
INTENT(INOUT) :: neighbor
1306 INTEGER,
INTENT(IN) :: i
1308 INTEGER :: c1, c2, c3, ind, j, s
1309 INTEGER,
DIMENSION(3) :: nl
1310 REAL(kind=
dp) :: norm
1311 REAL(kind=
dp),
DIMENSION(3) :: dr
1312 TYPE(cell_type),
POINTER :: cell
1317 ind = nnp%ele_ind(i)
1319 DO j = 1, nnp%num_atoms
1320 DO c1 = 1, 2*neighbor%pbc_copies(1) + 1
1321 nl(1) = -neighbor%pbc_copies(1) + c1 - 1
1322 DO c2 = 1, 2*neighbor%pbc_copies(2) + 1
1323 nl(2) = -neighbor%pbc_copies(2) + c2 - 1
1324 DO c3 = 1, 2*neighbor%pbc_copies(3) + 1
1325 nl(3) = -neighbor%pbc_copies(3) + c3 - 1
1326 IF (j == i .AND. nl(1) == 0 .AND. nl(2) == 0 .AND. nl(3) == 0) cycle
1327 dr(:) = nnp%coord(:, i) - nnp%coord(:, j)
1329 dr =
pbc(dr, cell, nl)
1331 DO s = 1, nnp%rad(ind)%n_symfgrp
1332 IF (nnp%ele_ind(j) == nnp%rad(ind)%symfgrp(s)%ele_ind(1))
THEN
1333 IF (norm < nnp%rad(ind)%symfgrp(s)%cutoff)
THEN
1334 neighbor%n_rad(s) = neighbor%n_rad(s) + 1
1335 neighbor%ind_rad(neighbor%n_rad(s), s) = j
1336 neighbor%dist_rad(1:3, neighbor%n_rad(s), s) = dr(:)
1337 neighbor%dist_rad(4, neighbor%n_rad(s), s) = norm
1341 DO s = 1, nnp%ang(ind)%n_symfgrp
1342 IF (norm < nnp%ang(ind)%symfgrp(s)%cutoff)
THEN
1343 IF (nnp%ele_ind(j) == nnp%ang(ind)%symfgrp(s)%ele_ind(1))
THEN
1344 neighbor%n_ang1(s) = neighbor%n_ang1(s) + 1
1345 neighbor%ind_ang1(neighbor%n_ang1(s), s) = j
1346 neighbor%dist_ang1(1:3, neighbor%n_ang1(s), s) = dr(:)
1347 neighbor%dist_ang1(4, neighbor%n_ang1(s), s) = norm
1349 IF (nnp%ele_ind(j) == nnp%ang(ind)%symfgrp(s)%ele_ind(2))
THEN
1350 neighbor%n_ang2(s) = neighbor%n_ang2(s) + 1
1351 neighbor%ind_ang2(neighbor%n_ang2(s), s) = j
1352 neighbor%dist_ang2(1:3, neighbor%n_ang2(s), s) = dr(:)
1353 neighbor%dist_ang2(4, neighbor%n_ang2(s), s) = norm
1362 END SUBROUTINE nnp_compute_neighbors
1372 SUBROUTINE nnp_compute_pbc_copies(pbc_copies, cell, cutoff)
1373 INTEGER,
DIMENSION(3),
INTENT(INOUT) :: pbc_copies
1374 TYPE(cell_type),
INTENT(IN),
POINTER :: cell
1375 REAL(kind=
dp),
INTENT(IN) :: cutoff
1377 REAL(kind=
dp) :: proja, projb, projc
1378 REAL(kind=
dp),
DIMENSION(3) :: axb, axc, bxc
1380 axb(1) = cell%hmat(2, 1)*cell%hmat(3, 2) - cell%hmat(3, 1)*cell%hmat(2, 2)
1381 axb(2) = cell%hmat(3, 1)*cell%hmat(1, 2) - cell%hmat(1, 1)*cell%hmat(3, 2)
1382 axb(3) = cell%hmat(1, 1)*cell%hmat(2, 2) - cell%hmat(2, 1)*cell%hmat(1, 2)
1383 axb(:) = axb(:)/norm2(axb(:))
1385 axc(1) = cell%hmat(2, 1)*cell%hmat(3, 3) - cell%hmat(3, 1)*cell%hmat(2, 3)
1386 axc(2) = cell%hmat(3, 1)*cell%hmat(1, 3) - cell%hmat(1, 1)*cell%hmat(3, 3)
1387 axc(3) = cell%hmat(1, 1)*cell%hmat(2, 3) - cell%hmat(2, 1)*cell%hmat(1, 3)
1388 axc(:) = axc(:)/norm2(axc(:))
1390 bxc(1) = cell%hmat(2, 2)*cell%hmat(3, 3) - cell%hmat(3, 2)*cell%hmat(2, 3)
1391 bxc(2) = cell%hmat(3, 2)*cell%hmat(1, 3) - cell%hmat(1, 2)*cell%hmat(3, 3)
1392 bxc(3) = cell%hmat(1, 2)*cell%hmat(2, 3) - cell%hmat(2, 2)*cell%hmat(1, 3)
1393 bxc(:) = bxc(:)/norm2(bxc(:))
1395 proja = abs(sum(cell%hmat(:, 1)*bxc(:)))*0.5_dp
1396 projb = abs(sum(cell%hmat(:, 2)*axc(:)))*0.5_dp
1397 projc = abs(sum(cell%hmat(:, 3)*axb(:)))*0.5_dp
1400 DO WHILE ((pbc_copies(1) + 1)*proja <= cutoff)
1401 pbc_copies(1) = pbc_copies(1) + 1
1403 DO WHILE ((pbc_copies(2) + 1)*projb <= cutoff)
1404 pbc_copies(2) = pbc_copies(2) + 1
1406 DO WHILE ((pbc_copies(3) + 1)*projc <= cutoff)
1407 pbc_copies(3) = pbc_copies(3) + 1
1410 pbc_copies(:) = pbc_copies(:)*cell%perd(:)
1412 END SUBROUTINE nnp_compute_pbc_copies
subroutine pbc(r, r_pbc, s, s_pbc, a, b, c, alpha, beta, gamma, debug, info, pbc0, h, hinv)
...
Handles all functions related to the CELL.
various routines to log and control the output. The idea is that decisions about where to log should ...
recursive integer function, public cp_logger_get_default_unit_nr(logger, local, skip_not_ionode)
asks the default unit number of the given logger. try to use cp_logger_get_unit_nr
type(cp_logger_type) function, pointer, public cp_get_default_logger()
returns the default logger
Defines the basic variable types.
integer, parameter, public dp
integer, parameter, public default_string_length
Definition of mathematical constants and functions.
real(kind=dp), parameter, public pi
Interface to the message passing library MPI.
Functionality for atom centered symmetry functions for neural network potentials.
subroutine, public nnp_calc_acsf(nnp, i, dsymdxyz, stress)
Calculate atom centered symmetry functions for given atom i.
subroutine, public nnp_write_acsf(nnp, para_env, printtag)
Write symmetry function information.
subroutine, public nnp_init_acsf_groups(nnp)
Initialize symmetry function groups.
subroutine, public nnp_sort_acsf(nnp)
Sort symmetry functions according to different criteria.
subroutine, public nnp_sort_ele(ele, nuc_ele)
Sort element array according to atomic number.
Data types for neural network potentials.
integer, parameter, public nnp_cut_tanh
integer, parameter, public nnp_cut_cos
derived data types
subroutine, public nnp_env_get(nnp_env, nnp_forces, subsys, atomic_kind_set, particle_set, local_particles, molecule_kind_set, molecule_set, local_molecules, nnp_input, force_env_input, cell, cell_ref, use_ref_cell, nnp_potential_energy, virial)
Returns various attributes of the nnp environment.
Periodic Table related data definitions.
subroutine, public get_ptable_info(symbol, number, amass, ielement, covalent_radius, metallic_radius, vdw_radius, found)
Pass information about the kind given the element symbol.