31 ewald_environment_type
36 neighbor_kind_pairs_type
38 fist_nonbond_env_type, &
56 #include "./base/base_uses.f90"
62 LOGICAL,
PRIVATE,
PARAMETER :: debug_this_module = .false.
63 LOGICAL,
PRIVATE,
PARAMETER :: debug_r_space = .false.
64 LOGICAL,
PRIVATE,
PARAMETER :: debug_g_space = .false.
65 LOGICAL,
PRIVATE,
PARAMETER :: debug_e_field = .false.
66 LOGICAL,
PRIVATE,
PARAMETER :: debug_e_field_en = .false.
67 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'ewalds_multipole'
117 cell, particle_set, local_particles, energy_local, energy_glob, e_neut, e_self, &
118 task, do_correction_bonded, do_forces, do_stress, &
119 do_efield, radii, charges, dipoles, &
120 quadrupoles, forces_local, forces_glob, pv_local, pv_glob, efield0, efield1, &
121 efield2, iw, do_debug, atomic_kind_set, mm_section)
122 TYPE(ewald_environment_type),
POINTER :: ewald_env
123 TYPE(ewald_pw_type),
POINTER :: ewald_pw
124 TYPE(fist_nonbond_env_type),
POINTER :: nonbond_env
125 TYPE(cell_type),
POINTER :: cell
126 TYPE(particle_type),
POINTER :: particle_set(:)
127 TYPE(distribution_1d_type),
POINTER :: local_particles
128 REAL(kind=
dp),
INTENT(INOUT) :: energy_local, energy_glob
129 REAL(kind=
dp),
INTENT(OUT) :: e_neut, e_self
130 LOGICAL,
DIMENSION(3),
INTENT(IN) :: task
131 LOGICAL,
INTENT(IN) :: do_correction_bonded, do_forces, &
133 REAL(kind=
dp),
DIMENSION(:),
OPTIONAL,
POINTER :: radii, charges
134 REAL(kind=
dp),
DIMENSION(:, :),
OPTIONAL,
POINTER :: dipoles
135 REAL(kind=
dp),
DIMENSION(:, :, :),
OPTIONAL, &
136 POINTER :: quadrupoles
137 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(INOUT), &
138 OPTIONAL :: forces_local, forces_glob, pv_local, &
140 REAL(kind=
dp),
DIMENSION(:),
INTENT(OUT),
OPTIONAL :: efield0
141 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(OUT), &
142 OPTIONAL :: efield1, efield2
143 INTEGER,
INTENT(IN) :: iw
144 LOGICAL,
INTENT(IN) :: do_debug
145 TYPE(atomic_kind_type),
DIMENSION(:),
OPTIONAL, &
146 POINTER :: atomic_kind_set
147 TYPE(section_vals_type),
OPTIONAL,
POINTER :: mm_section
149 CHARACTER(len=*),
PARAMETER :: routinen =
'ewald_multipole_evaluate'
151 INTEGER :: handle, i, j, size1, size2
152 LOGICAL :: check_debug, check_efield, check_forces, &
154 LOGICAL,
DIMENSION(3, 3) :: my_task
155 REAL(kind=
dp) :: e_bonded, e_bonded_t, e_rspace, &
156 e_rspace_t, energy_glob_t
157 REAL(kind=
dp),
DIMENSION(:),
POINTER :: efield0_lr, efield0_sr
158 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: efield1_lr, efield1_sr, efield2_lr, &
160 TYPE(mp_comm_type) :: group
164 CALL timeset(routinen, handle)
165 cpassert(
ASSOCIATED(nonbond_env))
166 check_debug = (debug_this_module .OR. debug_r_space .OR. debug_g_space .OR. debug_e_field .OR. debug_e_field_en) &
167 .EQV. debug_this_module
168 cpassert(check_debug)
169 check_forces = do_forces .EQV. (
PRESENT(forces_local) .AND.
PRESENT(forces_glob))
170 cpassert(check_forces)
171 check_efield = do_efield .EQV. (
PRESENT(efield0) .OR.
PRESENT(efield1) .OR.
PRESENT(efield2))
172 cpassert(check_efield)
174 IF (debug_this_module .AND. do_debug)
THEN
176 IF (debug_r_space)
THEN
177 CALL debug_ewald_multipoles(ewald_env, ewald_pw, nonbond_env, cell, &
178 particle_set, local_particles, iw, debug_r_space)
179 cpabort(
"Debug Multipole Requested: Real Part!")
182 IF (debug_e_field)
THEN
183 cpassert(
PRESENT(atomic_kind_set))
184 cpassert(
PRESENT(mm_section))
185 CALL debug_ewald_multipoles_fields(ewald_env, ewald_pw, nonbond_env, &
186 cell, particle_set, local_particles, radii, charges, dipoles, &
187 quadrupoles, task, iw, atomic_kind_set, mm_section)
188 cpabort(
"Debug Multipole Requested: POT+EFIELDS+GRAD!")
192 IF (debug_e_field_en)
THEN
193 CALL debug_ewald_multipoles_fields2(ewald_env, ewald_pw, nonbond_env, &
194 cell, particle_set, local_particles, radii, charges, dipoles, &
195 quadrupoles, task, iw)
196 cpabort(
"Debug Multipole Requested: POT+EFIELDS+GRAD to give the correct energy!!")
206 do_task(1) = any(charges /= 0.0_dp)
208 do_task(2) = any(dipoles /= 0.0_dp)
210 do_task(3) = any(quadrupoles /= 0.0_dp)
216 my_task(j, i) = do_task(i) .AND. do_task(j)
217 my_task(i, j) = my_task(j, i)
222 NULLIFY (efield0_sr, efield0_lr, efield1_sr, efield1_lr, efield2_sr, efield2_lr)
224 IF (
PRESENT(efield0))
THEN
225 size1 =
SIZE(efield0)
226 ALLOCATE (efield0_sr(size1))
227 ALLOCATE (efield0_lr(size1))
231 IF (
PRESENT(efield1))
THEN
232 size1 =
SIZE(efield1, 1)
233 size2 =
SIZE(efield1, 2)
234 ALLOCATE (efield1_sr(size1, size2))
235 ALLOCATE (efield1_lr(size1, size2))
239 IF (
PRESENT(efield2))
THEN
240 size1 =
SIZE(efield2, 1)
241 size2 =
SIZE(efield2, 2)
242 ALLOCATE (efield2_sr(size1, size2))
243 ALLOCATE (efield2_lr(size1, size2))
251 IF ((.NOT. debug_g_space) .AND. (nonbond_env%do_nonbonded))
THEN
255 CALL ewald_multipole_sr(nonbond_env, ewald_env, atomic_kind_set, &
256 particle_set, cell, e_rspace, my_task, &
257 do_forces, do_efield, do_stress, radii, charges, dipoles, quadrupoles, &
258 forces_glob, pv_glob, efield0_sr, efield1_sr, efield2_sr)
259 energy_glob = energy_glob + e_rspace
261 IF (do_correction_bonded)
THEN
264 CALL ewald_multipole_bonded(nonbond_env, particle_set, ewald_env, &
265 cell, e_bonded, my_task, do_forces, do_efield, do_stress, &
266 charges, dipoles, quadrupoles, forces_glob, pv_glob, &
267 efield0_sr, efield1_sr, efield2_sr)
268 energy_glob = energy_glob + e_bonded
274 energy_local = 0.0_dp
275 IF (.NOT. debug_r_space)
THEN
277 CALL ewald_multipole_lr(ewald_env, ewald_pw, cell, particle_set, &
278 local_particles, energy_local, my_task, do_forces, do_efield, do_stress, &
279 charges, dipoles, quadrupoles, forces_local, pv_local, efield0_lr, efield1_lr, &
283 CALL ewald_multipole_self(ewald_env, cell, local_particles, e_self, &
284 e_neut, my_task, do_efield, radii, charges, dipoles, quadrupoles, &
285 efield0_lr, efield1_lr, efield2_lr)
290 energy_glob_t = energy_glob
291 e_rspace_t = e_rspace
292 e_bonded_t = e_bonded
293 CALL group%sum(energy_glob_t)
294 CALL group%sum(e_rspace_t)
295 CALL group%sum(e_bonded_t)
297 CALL ewald_multipole_print(iw, energy_local, e_rspace_t, e_bonded_t, e_self, e_neut)
301 IF (
PRESENT(efield0))
THEN
302 efield0 = efield0_sr + efield0_lr
303 CALL group%sum(efield0)
304 DEALLOCATE (efield0_sr)
305 DEALLOCATE (efield0_lr)
307 IF (
PRESENT(efield1))
THEN
308 efield1 = efield1_sr + efield1_lr
309 CALL group%sum(efield1)
310 DEALLOCATE (efield1_sr)
311 DEALLOCATE (efield1_lr)
313 IF (
PRESENT(efield2))
THEN
314 efield2 = efield2_sr + efield2_lr
315 CALL group%sum(efield2)
316 DEALLOCATE (efield2_sr)
317 DEALLOCATE (efield2_lr)
320 CALL timestop(handle)
347 SUBROUTINE ewald_multipole_sr(nonbond_env, ewald_env, atomic_kind_set, &
348 particle_set, cell, energy, task, &
349 do_forces, do_efield, do_stress, radii, charges, dipoles, quadrupoles, &
350 forces, pv, efield0, efield1, efield2)
351 TYPE(fist_nonbond_env_type),
POINTER :: nonbond_env
352 TYPE(ewald_environment_type),
POINTER :: ewald_env
353 TYPE(atomic_kind_type),
DIMENSION(:),
OPTIONAL, &
354 POINTER :: atomic_kind_set
355 TYPE(particle_type),
POINTER :: particle_set(:)
356 TYPE(cell_type),
POINTER :: cell
357 REAL(kind=
dp),
INTENT(INOUT) :: energy
358 LOGICAL,
DIMENSION(3, 3),
INTENT(IN) :: task
359 LOGICAL,
INTENT(IN) :: do_forces, do_efield, do_stress
360 REAL(kind=
dp),
DIMENSION(:),
OPTIONAL,
POINTER :: radii, charges
361 REAL(kind=
dp),
DIMENSION(:, :),
OPTIONAL,
POINTER :: dipoles
362 REAL(kind=
dp),
DIMENSION(:, :, :),
OPTIONAL, &
363 POINTER :: quadrupoles
364 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(INOUT), &
365 OPTIONAL :: forces, pv
366 REAL(kind=
dp),
DIMENSION(:),
POINTER :: efield0
367 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: efield1, efield2
369 CHARACTER(len=*),
PARAMETER :: routinen =
'ewald_multipole_SR'
371 INTEGER :: a, atom_a, atom_b, b, c, d, e, handle, i, iend, igrp, ikind, ilist, ipair, &
372 istart, itype_ij, itype_ji, jkind, k, kind_a, kind_b, kk, nkdamp_ij, nkdamp_ji, nkinds, &
374 INTEGER,
DIMENSION(:, :),
POINTER ::
list
375 LOGICAL :: do_efield0, do_efield1, do_efield2, &
377 REAL(kind=
dp) :: alpha, beta, ch_i, ch_j, dampa_ij, dampa_ji, dampaexpi, dampaexpj, &
378 dampfac_ij, dampfac_ji, dampfuncdiffi, dampfuncdiffj, dampfunci, dampfuncj, dampsumfi, &
379 dampsumfj, ef0_i, ef0_j, eloc,
fac, fac_ij, factorial, ir, irab2, ptens11, ptens12, &
380 ptens13, ptens21, ptens22, ptens23, ptens31, ptens32, ptens33, r, rab2, rab2_max, radius, &
381 rcut, tij, tmp, tmp1, tmp11, tmp12, tmp13, tmp2, tmp21, tmp22, tmp23, tmp31, tmp32, &
382 tmp33, tmp_ij, tmp_ji, xf
383 REAL(kind=
dp),
DIMENSION(0:5) :: f
384 REAL(kind=
dp),
DIMENSION(3) :: cell_v, cvi, damptij_a, damptji_a, dp_i, &
385 dp_j, ef1_i, ef1_j, fr, rab, tij_a
386 REAL(kind=
dp),
DIMENSION(3, 3) :: damptij_ab, damptji_ab, ef2_i, ef2_j, &
388 REAL(kind=
dp),
DIMENSION(3, 3, 3) :: tij_abc
389 REAL(kind=
dp),
DIMENSION(3, 3, 3, 3) :: tij_abcd
390 REAL(kind=
dp),
DIMENSION(3, 3, 3, 3, 3) :: tij_abcde
391 TYPE(damping_type) :: damping_ij, damping_ji
392 TYPE(fist_neighbor_type),
POINTER :: nonbonded
393 TYPE(neighbor_kind_pairs_type),
POINTER :: neighbor_kind_pair
394 TYPE(pos_type),
DIMENSION(:),
POINTER :: r_last_update, r_last_update_pbc
396 CALL timeset(routinen, handle)
397 NULLIFY (nonbonded, r_last_update, r_last_update_pbc)
398 do_efield0 = do_efield .AND.
ASSOCIATED(efield0)
399 do_efield1 = do_efield .AND.
ASSOCIATED(efield1)
400 do_efield2 = do_efield .AND.
ASSOCIATED(efield2)
402 ptens11 = 0.0_dp; ptens12 = 0.0_dp; ptens13 = 0.0_dp
403 ptens21 = 0.0_dp; ptens22 = 0.0_dp; ptens23 = 0.0_dp
404 ptens31 = 0.0_dp; ptens32 = 0.0_dp; ptens33 = 0.0_dp
408 r_last_update=r_last_update, r_last_update_pbc=r_last_update_pbc)
411 IF (debug_r_space)
THEN
412 rab2_max = huge(0.0_dp)
415 lists:
DO ilist = 1, nonbonded%nlists
416 neighbor_kind_pair => nonbonded%neighbor_kind_pairs(ilist)
417 npairs = neighbor_kind_pair%npairs
418 IF (npairs == 0) cycle
419 list => neighbor_kind_pair%list
420 cvi = neighbor_kind_pair%cell_vector
421 cell_v = matmul(cell%hmat, cvi)
422 kind_group_loop:
DO igrp = 1, neighbor_kind_pair%ngrp_kind
423 istart = neighbor_kind_pair%grp_kind_start(igrp)
424 iend = neighbor_kind_pair%grp_kind_end(igrp)
425 ikind = neighbor_kind_pair%ij_kind(1, igrp)
426 jkind = neighbor_kind_pair%ij_kind(2, igrp)
437 IF (
PRESENT(atomic_kind_set))
THEN
438 IF (
ASSOCIATED(atomic_kind_set(jkind)%damping))
THEN
439 damping_ij = atomic_kind_set(jkind)%damping%damp(ikind)
440 itype_ij = damping_ij%itype
441 nkdamp_ij = damping_ij%order
442 dampa_ij = damping_ij%bij
443 dampfac_ij = damping_ij%cij
446 IF (
ASSOCIATED(atomic_kind_set(ikind)%damping))
THEN
447 damping_ji = atomic_kind_set(ikind)%damping%damp(jkind)
448 itype_ji = damping_ji%itype
449 nkdamp_ji = damping_ji%order
450 dampa_ji = damping_ji%bij
451 dampfac_ji = damping_ji%cij
455 pairs:
DO ipair = istart, iend
456 IF (ipair <= neighbor_kind_pair%nscale)
THEN
459 fac_ij = neighbor_kind_pair%ei_scale(ipair)
460 IF (fac_ij <= 0) cycle
464 atom_a =
list(1, ipair)
465 atom_b =
list(2, ipair)
466 kind_a = particle_set(atom_a)%atomic_kind%kind_number
467 kind_b = particle_set(atom_b)%atomic_kind%kind_number
468 IF (atom_a == atom_b) fac_ij = 0.5_dp
469 rab = r_last_update_pbc(atom_b)%r - r_last_update_pbc(atom_a)%r
471 rab2 = rab(1)**2 + rab(2)**2 + rab(3)**2
472 IF (rab2 <= rab2_max)
THEN
473 IF (
PRESENT(radii))
THEN
474 radius = sqrt(radii(atom_a)*radii(atom_a) + radii(atom_b)*radii(atom_b))
478 IF (radius > 0.0_dp)
THEN
481 IF (debug_this_module)
THEN
485 tij_ab = huge(0.0_dp)
486 tij_abc = huge(0.0_dp)
487 tij_abcd = huge(0.0_dp)
488 tij_abcde = huge(0.0_dp)
496 IF (debug_this_module .AND. debug_r_space .AND. (.NOT. debug_g_space))
THEN
501 f(0) = erf(beta*r)*ir - erf(alpha*r)*ir
508 f(i) = irab2*(f(i - 1) + tmp1*((2.0_dp*alpha**2)**i)/(
fac*alpha) - tmp2*((2.0_dp*beta**2)**i)/(
fac*beta))
513 force_eval = do_stress
516 force_eval = do_forces .OR. do_efield1
518 IF (task(2, 2)) force_eval = force_eval .OR. do_efield0
519 IF (task(1, 2) .OR. force_eval)
THEN
520 force_eval = do_stress
521 tij_a = -rab*f(1)*fac_ij
522 IF (task(1, 2)) force_eval = force_eval .OR. do_forces
524 IF (task(1, 1)) force_eval = force_eval .OR. do_efield2
525 IF (task(3, 3)) force_eval = force_eval .OR. do_efield0
526 IF (task(2, 2) .OR. task(3, 1) .OR. force_eval)
THEN
527 force_eval = do_stress
530 tmp = rab(a)*rab(b)*fac_ij
531 tij_ab(a, b) = 3.0_dp*tmp*f(2)
532 IF (a == b) tij_ab(a, b) = tij_ab(a, b) - f(1)*fac_ij
535 IF (task(2, 2) .OR. task(3, 1)) force_eval = force_eval .OR. do_forces
537 IF (task(2, 2)) force_eval = force_eval .OR. do_efield2
538 IF (task(3, 3)) force_eval = force_eval .OR. do_efield1
539 IF (task(3, 2) .OR. force_eval)
THEN
540 force_eval = do_stress
544 tmp = rab(a)*rab(b)*rab(c)*fac_ij
545 tij_abc(a, b, c) = -15.0_dp*tmp*f(3)
546 tmp = 3.0_dp*f(2)*fac_ij
547 IF (a == b) tij_abc(a, b, c) = tij_abc(a, b, c) + tmp*rab(c)
548 IF (a == c) tij_abc(a, b, c) = tij_abc(a, b, c) + tmp*rab(b)
549 IF (b == c) tij_abc(a, b, c) = tij_abc(a, b, c) + tmp*rab(a)
553 IF (task(3, 2)) force_eval = force_eval .OR. do_forces
555 IF (task(3, 3) .OR. force_eval)
THEN
556 force_eval = do_stress
561 tmp = rab(a)*rab(b)*rab(c)*rab(d)*fac_ij
562 tij_abcd(a, b, c, d) = 105.0_dp*tmp*f(4)
563 tmp1 = 15.0_dp*f(3)*fac_ij
564 tmp2 = 3.0_dp*f(2)*fac_ij
566 tij_abcd(a, b, c, d) = tij_abcd(a, b, c, d) - tmp1*rab(c)*rab(d)
567 IF (c == d) tij_abcd(a, b, c, d) = tij_abcd(a, b, c, d) + tmp2
570 tij_abcd(a, b, c, d) = tij_abcd(a, b, c, d) - tmp1*rab(b)*rab(d)
571 IF (b == d) tij_abcd(a, b, c, d) = tij_abcd(a, b, c, d) + tmp2
573 IF (a == d) tij_abcd(a, b, c, d) = tij_abcd(a, b, c, d) - tmp1*rab(b)*rab(c)
575 tij_abcd(a, b, c, d) = tij_abcd(a, b, c, d) - tmp1*rab(a)*rab(d)
576 IF (a == d) tij_abcd(a, b, c, d) = tij_abcd(a, b, c, d) + tmp2
578 IF (b == d) tij_abcd(a, b, c, d) = tij_abcd(a, b, c, d) - tmp1*rab(a)*rab(c)
579 IF (c == d) tij_abcd(a, b, c, d) = tij_abcd(a, b, c, d) - tmp1*rab(a)*rab(b)
584 IF (task(3, 3)) force_eval = force_eval .OR. do_forces
587 force_eval = do_stress
593 tmp = rab(a)*rab(b)*rab(c)*rab(d)*rab(e)*fac_ij
594 tij_abcde(a, b, c, d, e) = -945.0_dp*tmp*f(5)
595 tmp1 = 105.0_dp*f(4)*fac_ij
596 tmp2 = 15.0_dp*f(3)*fac_ij
598 tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) + tmp1*rab(c)*rab(d)*rab(e)
599 IF (c == d) tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) - tmp2*rab(e)
600 IF (c == e) tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) - tmp2*rab(d)
601 IF (d == e) tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) - tmp2*rab(c)
604 tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) + tmp1*rab(b)*rab(d)*rab(e)
605 IF (b == d) tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) - tmp2*rab(e)
606 IF (b == e) tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) - tmp2*rab(d)
607 IF (d == e) tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) - tmp2*rab(b)
610 tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) + tmp1*rab(b)*rab(c)*rab(e)
611 IF (b == c) tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) - tmp2*rab(e)
612 IF (b == e) tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) - tmp2*rab(c)
613 IF (c == e) tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) - tmp2*rab(b)
616 tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) + tmp1*rab(b)*rab(c)*rab(d)
617 IF (b == c) tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) - tmp2*rab(d)
618 IF (b == d) tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) - tmp2*rab(c)
619 IF (c == d) tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) - tmp2*rab(b)
622 tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) + tmp1*rab(a)*rab(d)*rab(e)
623 IF (d == e) tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) - tmp2*rab(a)
626 tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) + tmp1*rab(a)*rab(c)*rab(e)
627 IF (c == e) tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) - tmp2*rab(a)
630 tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) + tmp1*rab(a)*rab(c)*rab(d)
631 IF (c == d) tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) - tmp2*rab(a)
633 IF (c == d) tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) + tmp1*rab(a)*rab(b)*rab(e)
634 IF (c == e) tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) + tmp1*rab(a)*rab(b)*rab(d)
635 IF (d == e) tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) + tmp1*rab(a)*rab(b)*rab(c)
653 IF (debug_this_module)
THEN
661 IF (any(task(1, :)))
THEN
662 ch_j = charges(atom_a)
663 ch_i = charges(atom_b)
665 IF (any(task(2, :)))
THEN
666 dp_j = dipoles(:, atom_a)
667 dp_i = dipoles(:, atom_b)
669 IF (any(task(3, :)))
THEN
670 qp_j = quadrupoles(:, :, atom_a)
671 qp_i = quadrupoles(:, :, atom_b)
675 eloc = eloc + ch_i*tij*ch_j
677 IF (do_forces .OR. do_stress)
THEN
678 fr(1) = fr(1) - ch_j*tij_a(1)*ch_i
679 fr(2) = fr(2) - ch_j*tij_a(2)*ch_i
680 fr(3) = fr(3) - ch_j*tij_a(3)*ch_i
686 ef0_i = ef0_i + tij*ch_j
688 ef0_j = ef0_j + tij*ch_i
692 ef1_i(1) = ef1_i(1) - tij_a(1)*ch_j
693 ef1_i(2) = ef1_i(2) - tij_a(2)*ch_j
694 ef1_i(3) = ef1_i(3) - tij_a(3)*ch_j
696 ef1_j(1) = ef1_j(1) + tij_a(1)*ch_i
697 ef1_j(2) = ef1_j(2) + tij_a(2)*ch_i
698 ef1_j(3) = ef1_j(3) + tij_a(3)*ch_i
704 ef2_i(1, 1) = ef2_i(1, 1) - tij_ab(1, 1)*ch_j
705 ef2_i(2, 1) = ef2_i(2, 1) - tij_ab(2, 1)*ch_j
706 ef2_i(3, 1) = ef2_i(3, 1) - tij_ab(3, 1)*ch_j
707 ef2_i(1, 2) = ef2_i(1, 2) - tij_ab(1, 2)*ch_j
708 ef2_i(2, 2) = ef2_i(2, 2) - tij_ab(2, 2)*ch_j
709 ef2_i(3, 2) = ef2_i(3, 2) - tij_ab(3, 2)*ch_j
710 ef2_i(1, 3) = ef2_i(1, 3) - tij_ab(1, 3)*ch_j
711 ef2_i(2, 3) = ef2_i(2, 3) - tij_ab(2, 3)*ch_j
712 ef2_i(3, 3) = ef2_i(3, 3) - tij_ab(3, 3)*ch_j
714 ef2_j(1, 1) = ef2_j(1, 1) - tij_ab(1, 1)*ch_i
715 ef2_j(2, 1) = ef2_j(2, 1) - tij_ab(2, 1)*ch_i
716 ef2_j(3, 1) = ef2_j(3, 1) - tij_ab(3, 1)*ch_i
717 ef2_j(1, 2) = ef2_j(1, 2) - tij_ab(1, 2)*ch_i
718 ef2_j(2, 2) = ef2_j(2, 2) - tij_ab(2, 2)*ch_i
719 ef2_j(3, 2) = ef2_j(3, 2) - tij_ab(3, 2)*ch_i
720 ef2_j(1, 3) = ef2_j(1, 3) - tij_ab(1, 3)*ch_i
721 ef2_j(2, 3) = ef2_j(2, 3) - tij_ab(2, 3)*ch_i
722 ef2_j(3, 3) = ef2_j(3, 3) - tij_ab(3, 3)*ch_i
728 tmp = -(dp_i(1)*(tij_ab(1, 1)*dp_j(1) + &
729 tij_ab(2, 1)*dp_j(2) + &
730 tij_ab(3, 1)*dp_j(3)) + &
731 dp_i(2)*(tij_ab(1, 2)*dp_j(1) + &
732 tij_ab(2, 2)*dp_j(2) + &
733 tij_ab(3, 2)*dp_j(3)) + &
734 dp_i(3)*(tij_ab(1, 3)*dp_j(1) + &
735 tij_ab(2, 3)*dp_j(2) + &
736 tij_ab(3, 3)*dp_j(3)))
739 IF (do_forces .OR. do_stress)
THEN
741 fr(k) = fr(k) + dp_i(1)*(tij_abc(1, 1, k)*dp_j(1) + &
742 tij_abc(2, 1, k)*dp_j(2) + &
743 tij_abc(3, 1, k)*dp_j(3)) &
744 + dp_i(2)*(tij_abc(1, 2, k)*dp_j(1) + &
745 tij_abc(2, 2, k)*dp_j(2) + &
746 tij_abc(3, 2, k)*dp_j(3)) &
747 + dp_i(3)*(tij_abc(1, 3, k)*dp_j(1) + &
748 tij_abc(2, 3, k)*dp_j(2) + &
749 tij_abc(3, 3, k)*dp_j(3))
756 ef0_i = ef0_i - (tij_a(1)*dp_j(1) + &
760 ef0_j = ef0_j + (tij_a(1)*dp_i(1) + &
766 ef1_i(1) = ef1_i(1) + (tij_ab(1, 1)*dp_j(1) + &
767 tij_ab(2, 1)*dp_j(2) + &
768 tij_ab(3, 1)*dp_j(3))
769 ef1_i(2) = ef1_i(2) + (tij_ab(1, 2)*dp_j(1) + &
770 tij_ab(2, 2)*dp_j(2) + &
771 tij_ab(3, 2)*dp_j(3))
772 ef1_i(3) = ef1_i(3) + (tij_ab(1, 3)*dp_j(1) + &
773 tij_ab(2, 3)*dp_j(2) + &
774 tij_ab(3, 3)*dp_j(3))
776 ef1_j(1) = ef1_j(1) + (tij_ab(1, 1)*dp_i(1) + &
777 tij_ab(2, 1)*dp_i(2) + &
778 tij_ab(3, 1)*dp_i(3))
779 ef1_j(2) = ef1_j(2) + (tij_ab(1, 2)*dp_i(1) + &
780 tij_ab(2, 2)*dp_i(2) + &
781 tij_ab(3, 2)*dp_i(3))
782 ef1_j(3) = ef1_j(3) + (tij_ab(1, 3)*dp_i(1) + &
783 tij_ab(2, 3)*dp_i(2) + &
784 tij_ab(3, 3)*dp_i(3))
788 ef2_i(1, 1) = ef2_i(1, 1) + (tij_abc(1, 1, 1)*dp_j(1) + &
789 tij_abc(2, 1, 1)*dp_j(2) + &
790 tij_abc(3, 1, 1)*dp_j(3))
791 ef2_i(1, 2) = ef2_i(1, 2) + (tij_abc(1, 1, 2)*dp_j(1) + &
792 tij_abc(2, 1, 2)*dp_j(2) + &
793 tij_abc(3, 1, 2)*dp_j(3))
794 ef2_i(1, 3) = ef2_i(1, 3) + (tij_abc(1, 1, 3)*dp_j(1) + &
795 tij_abc(2, 1, 3)*dp_j(2) + &
796 tij_abc(3, 1, 3)*dp_j(3))
797 ef2_i(2, 1) = ef2_i(2, 1) + (tij_abc(1, 2, 1)*dp_j(1) + &
798 tij_abc(2, 2, 1)*dp_j(2) + &
799 tij_abc(3, 2, 1)*dp_j(3))
800 ef2_i(2, 2) = ef2_i(2, 2) + (tij_abc(1, 2, 2)*dp_j(1) + &
801 tij_abc(2, 2, 2)*dp_j(2) + &
802 tij_abc(3, 2, 2)*dp_j(3))
803 ef2_i(2, 3) = ef2_i(2, 3) + (tij_abc(1, 2, 3)*dp_j(1) + &
804 tij_abc(2, 2, 3)*dp_j(2) + &
805 tij_abc(3, 2, 3)*dp_j(3))
806 ef2_i(3, 1) = ef2_i(3, 1) + (tij_abc(1, 3, 1)*dp_j(1) + &
807 tij_abc(2, 3, 1)*dp_j(2) + &
808 tij_abc(3, 3, 1)*dp_j(3))
809 ef2_i(3, 2) = ef2_i(3, 2) + (tij_abc(1, 3, 2)*dp_j(1) + &
810 tij_abc(2, 3, 2)*dp_j(2) + &
811 tij_abc(3, 3, 2)*dp_j(3))
812 ef2_i(3, 3) = ef2_i(3, 3) + (tij_abc(1, 3, 3)*dp_j(1) + &
813 tij_abc(2, 3, 3)*dp_j(2) + &
814 tij_abc(3, 3, 3)*dp_j(3))
816 ef2_j(1, 1) = ef2_j(1, 1) - (tij_abc(1, 1, 1)*dp_i(1) + &
817 tij_abc(2, 1, 1)*dp_i(2) + &
818 tij_abc(3, 1, 1)*dp_i(3))
819 ef2_j(1, 2) = ef2_j(1, 2) - (tij_abc(1, 1, 2)*dp_i(1) + &
820 tij_abc(2, 1, 2)*dp_i(2) + &
821 tij_abc(3, 1, 2)*dp_i(3))
822 ef2_j(1, 3) = ef2_j(1, 3) - (tij_abc(1, 1, 3)*dp_i(1) + &
823 tij_abc(2, 1, 3)*dp_i(2) + &
824 tij_abc(3, 1, 3)*dp_i(3))
825 ef2_j(2, 1) = ef2_j(2, 1) - (tij_abc(1, 2, 1)*dp_i(1) + &
826 tij_abc(2, 2, 1)*dp_i(2) + &
827 tij_abc(3, 2, 1)*dp_i(3))
828 ef2_j(2, 2) = ef2_j(2, 2) - (tij_abc(1, 2, 2)*dp_i(1) + &
829 tij_abc(2, 2, 2)*dp_i(2) + &
830 tij_abc(3, 2, 2)*dp_i(3))
831 ef2_j(2, 3) = ef2_j(2, 3) - (tij_abc(1, 2, 3)*dp_i(1) + &
832 tij_abc(2, 2, 3)*dp_i(2) + &
833 tij_abc(3, 2, 3)*dp_i(3))
834 ef2_j(3, 1) = ef2_j(3, 1) - (tij_abc(1, 3, 1)*dp_i(1) + &
835 tij_abc(2, 3, 1)*dp_i(2) + &
836 tij_abc(3, 3, 1)*dp_i(3))
837 ef2_j(3, 2) = ef2_j(3, 2) - (tij_abc(1, 3, 2)*dp_i(1) + &
838 tij_abc(2, 3, 2)*dp_i(2) + &
839 tij_abc(3, 3, 2)*dp_i(3))
840 ef2_j(3, 3) = ef2_j(3, 3) - (tij_abc(1, 3, 3)*dp_i(1) + &
841 tij_abc(2, 3, 3)*dp_i(2) + &
842 tij_abc(3, 3, 3)*dp_i(3))
848 tmp = ch_j*(tij_a(1)*dp_i(1) + &
851 - ch_i*(tij_a(1)*dp_j(1) + &
856 IF (do_forces .OR. do_stress)
THEN
858 fr(k) = fr(k) - ch_j*(tij_ab(1, k)*dp_i(1) + &
859 tij_ab(2, k)*dp_i(2) + &
860 tij_ab(3, k)*dp_i(3)) &
861 + ch_i*(tij_ab(1, k)*dp_j(1) + &
862 tij_ab(2, k)*dp_j(2) + &
863 tij_ab(3, k)*dp_j(3))
870 tmp11 = qp_i(1, 1)*(tij_abcd(1, 1, 1, 1)*qp_j(1, 1) + &
871 tij_abcd(2, 1, 1, 1)*qp_j(2, 1) + &
872 tij_abcd(3, 1, 1, 1)*qp_j(3, 1) + &
873 tij_abcd(1, 2, 1, 1)*qp_j(1, 2) + &
874 tij_abcd(2, 2, 1, 1)*qp_j(2, 2) + &
875 tij_abcd(3, 2, 1, 1)*qp_j(3, 2) + &
876 tij_abcd(1, 3, 1, 1)*qp_j(1, 3) + &
877 tij_abcd(2, 3, 1, 1)*qp_j(2, 3) + &
878 tij_abcd(3, 3, 1, 1)*qp_j(3, 3))
879 tmp21 = qp_i(2, 1)*(tij_abcd(1, 1, 1, 2)*qp_j(1, 1) + &
880 tij_abcd(2, 1, 1, 2)*qp_j(2, 1) + &
881 tij_abcd(3, 1, 1, 2)*qp_j(3, 1) + &
882 tij_abcd(1, 2, 1, 2)*qp_j(1, 2) + &
883 tij_abcd(2, 2, 1, 2)*qp_j(2, 2) + &
884 tij_abcd(3, 2, 1, 2)*qp_j(3, 2) + &
885 tij_abcd(1, 3, 1, 2)*qp_j(1, 3) + &
886 tij_abcd(2, 3, 1, 2)*qp_j(2, 3) + &
887 tij_abcd(3, 3, 1, 2)*qp_j(3, 3))
888 tmp31 = qp_i(3, 1)*(tij_abcd(1, 1, 1, 3)*qp_j(1, 1) + &
889 tij_abcd(2, 1, 1, 3)*qp_j(2, 1) + &
890 tij_abcd(3, 1, 1, 3)*qp_j(3, 1) + &
891 tij_abcd(1, 2, 1, 3)*qp_j(1, 2) + &
892 tij_abcd(2, 2, 1, 3)*qp_j(2, 2) + &
893 tij_abcd(3, 2, 1, 3)*qp_j(3, 2) + &
894 tij_abcd(1, 3, 1, 3)*qp_j(1, 3) + &
895 tij_abcd(2, 3, 1, 3)*qp_j(2, 3) + &
896 tij_abcd(3, 3, 1, 3)*qp_j(3, 3))
897 tmp22 = qp_i(2, 2)*(tij_abcd(1, 1, 2, 2)*qp_j(1, 1) + &
898 tij_abcd(2, 1, 2, 2)*qp_j(2, 1) + &
899 tij_abcd(3, 1, 2, 2)*qp_j(3, 1) + &
900 tij_abcd(1, 2, 2, 2)*qp_j(1, 2) + &
901 tij_abcd(2, 2, 2, 2)*qp_j(2, 2) + &
902 tij_abcd(3, 2, 2, 2)*qp_j(3, 2) + &
903 tij_abcd(1, 3, 2, 2)*qp_j(1, 3) + &
904 tij_abcd(2, 3, 2, 2)*qp_j(2, 3) + &
905 tij_abcd(3, 3, 2, 2)*qp_j(3, 3))
906 tmp32 = qp_i(3, 2)*(tij_abcd(1, 1, 2, 3)*qp_j(1, 1) + &
907 tij_abcd(2, 1, 2, 3)*qp_j(2, 1) + &
908 tij_abcd(3, 1, 2, 3)*qp_j(3, 1) + &
909 tij_abcd(1, 2, 2, 3)*qp_j(1, 2) + &
910 tij_abcd(2, 2, 2, 3)*qp_j(2, 2) + &
911 tij_abcd(3, 2, 2, 3)*qp_j(3, 2) + &
912 tij_abcd(1, 3, 2, 3)*qp_j(1, 3) + &
913 tij_abcd(2, 3, 2, 3)*qp_j(2, 3) + &
914 tij_abcd(3, 3, 2, 3)*qp_j(3, 3))
915 tmp33 = qp_i(3, 3)*(tij_abcd(1, 1, 3, 3)*qp_j(1, 1) + &
916 tij_abcd(2, 1, 3, 3)*qp_j(2, 1) + &
917 tij_abcd(3, 1, 3, 3)*qp_j(3, 1) + &
918 tij_abcd(1, 2, 3, 3)*qp_j(1, 2) + &
919 tij_abcd(2, 2, 3, 3)*qp_j(2, 2) + &
920 tij_abcd(3, 2, 3, 3)*qp_j(3, 2) + &
921 tij_abcd(1, 3, 3, 3)*qp_j(1, 3) + &
922 tij_abcd(2, 3, 3, 3)*qp_j(2, 3) + &
923 tij_abcd(3, 3, 3, 3)*qp_j(3, 3))
927 tmp = tmp11 + tmp12 + tmp13 + &
928 tmp21 + tmp22 + tmp23 + &
929 tmp31 + tmp32 + tmp33
931 eloc = eloc +
fac*tmp
933 IF (do_forces .OR. do_stress)
THEN
935 tmp11 = qp_i(1, 1)*(tij_abcde(1, 1, 1, 1, k)*qp_j(1, 1) + &
936 tij_abcde(2, 1, 1, 1, k)*qp_j(2, 1) + &
937 tij_abcde(3, 1, 1, 1, k)*qp_j(3, 1) + &
938 tij_abcde(1, 2, 1, 1, k)*qp_j(1, 2) + &
939 tij_abcde(2, 2, 1, 1, k)*qp_j(2, 2) + &
940 tij_abcde(3, 2, 1, 1, k)*qp_j(3, 2) + &
941 tij_abcde(1, 3, 1, 1, k)*qp_j(1, 3) + &
942 tij_abcde(2, 3, 1, 1, k)*qp_j(2, 3) + &
943 tij_abcde(3, 3, 1, 1, k)*qp_j(3, 3))
944 tmp21 = qp_i(2, 1)*(tij_abcde(1, 1, 2, 1, k)*qp_j(1, 1) + &
945 tij_abcde(2, 1, 2, 1, k)*qp_j(2, 1) + &
946 tij_abcde(3, 1, 2, 1, k)*qp_j(3, 1) + &
947 tij_abcde(1, 2, 2, 1, k)*qp_j(1, 2) + &
948 tij_abcde(2, 2, 2, 1, k)*qp_j(2, 2) + &
949 tij_abcde(3, 2, 2, 1, k)*qp_j(3, 2) + &
950 tij_abcde(1, 3, 2, 1, k)*qp_j(1, 3) + &
951 tij_abcde(2, 3, 2, 1, k)*qp_j(2, 3) + &
952 tij_abcde(3, 3, 2, 1, k)*qp_j(3, 3))
953 tmp31 = qp_i(3, 1)*(tij_abcde(1, 1, 3, 1, k)*qp_j(1, 1) + &
954 tij_abcde(2, 1, 3, 1, k)*qp_j(2, 1) + &
955 tij_abcde(3, 1, 3, 1, k)*qp_j(3, 1) + &
956 tij_abcde(1, 2, 3, 1, k)*qp_j(1, 2) + &
957 tij_abcde(2, 2, 3, 1, k)*qp_j(2, 2) + &
958 tij_abcde(3, 2, 3, 1, k)*qp_j(3, 2) + &
959 tij_abcde(1, 3, 3, 1, k)*qp_j(1, 3) + &
960 tij_abcde(2, 3, 3, 1, k)*qp_j(2, 3) + &
961 tij_abcde(3, 3, 3, 1, k)*qp_j(3, 3))
962 tmp22 = qp_i(2, 2)*(tij_abcde(1, 1, 2, 2, k)*qp_j(1, 1) + &
963 tij_abcde(2, 1, 2, 2, k)*qp_j(2, 1) + &
964 tij_abcde(3, 1, 2, 2, k)*qp_j(3, 1) + &
965 tij_abcde(1, 2, 2, 2, k)*qp_j(1, 2) + &
966 tij_abcde(2, 2, 2, 2, k)*qp_j(2, 2) + &
967 tij_abcde(3, 2, 2, 2, k)*qp_j(3, 2) + &
968 tij_abcde(1, 3, 2, 2, k)*qp_j(1, 3) + &
969 tij_abcde(2, 3, 2, 2, k)*qp_j(2, 3) + &
970 tij_abcde(3, 3, 2, 2, k)*qp_j(3, 3))
971 tmp32 = qp_i(3, 2)*(tij_abcde(1, 1, 3, 2, k)*qp_j(1, 1) + &
972 tij_abcde(2, 1, 3, 2, k)*qp_j(2, 1) + &
973 tij_abcde(3, 1, 3, 2, k)*qp_j(3, 1) + &
974 tij_abcde(1, 2, 3, 2, k)*qp_j(1, 2) + &
975 tij_abcde(2, 2, 3, 2, k)*qp_j(2, 2) + &
976 tij_abcde(3, 2, 3, 2, k)*qp_j(3, 2) + &
977 tij_abcde(1, 3, 3, 2, k)*qp_j(1, 3) + &
978 tij_abcde(2, 3, 3, 2, k)*qp_j(2, 3) + &
979 tij_abcde(3, 3, 3, 2, k)*qp_j(3, 3))
980 tmp33 = qp_i(3, 3)*(tij_abcde(1, 1, 3, 3, k)*qp_j(1, 1) + &
981 tij_abcde(2, 1, 3, 3, k)*qp_j(2, 1) + &
982 tij_abcde(3, 1, 3, 3, k)*qp_j(3, 1) + &
983 tij_abcde(1, 2, 3, 3, k)*qp_j(1, 2) + &
984 tij_abcde(2, 2, 3, 3, k)*qp_j(2, 2) + &
985 tij_abcde(3, 2, 3, 3, k)*qp_j(3, 2) + &
986 tij_abcde(1, 3, 3, 3, k)*qp_j(1, 3) + &
987 tij_abcde(2, 3, 3, 3, k)*qp_j(2, 3) + &
988 tij_abcde(3, 3, 3, 3, k)*qp_j(3, 3))
992 fr(k) = fr(k) -
fac*(tmp11 + tmp12 + tmp13 + &
993 tmp21 + tmp22 + tmp23 + &
994 tmp31 + tmp32 + tmp33)
1001 IF (do_efield0)
THEN
1002 ef0_i = ef0_i +
fac*(tij_ab(1, 1)*qp_j(1, 1) + &
1003 tij_ab(2, 1)*qp_j(2, 1) + &
1004 tij_ab(3, 1)*qp_j(3, 1) + &
1005 tij_ab(1, 2)*qp_j(1, 2) + &
1006 tij_ab(2, 2)*qp_j(2, 2) + &
1007 tij_ab(3, 2)*qp_j(3, 2) + &
1008 tij_ab(1, 3)*qp_j(1, 3) + &
1009 tij_ab(2, 3)*qp_j(2, 3) + &
1010 tij_ab(3, 3)*qp_j(3, 3))
1012 ef0_j = ef0_j +
fac*(tij_ab(1, 1)*qp_i(1, 1) + &
1013 tij_ab(2, 1)*qp_i(2, 1) + &
1014 tij_ab(3, 1)*qp_i(3, 1) + &
1015 tij_ab(1, 2)*qp_i(1, 2) + &
1016 tij_ab(2, 2)*qp_i(2, 2) + &
1017 tij_ab(3, 2)*qp_i(3, 2) + &
1018 tij_ab(1, 3)*qp_i(1, 3) + &
1019 tij_ab(2, 3)*qp_i(2, 3) + &
1020 tij_ab(3, 3)*qp_i(3, 3))
1023 IF (do_efield1)
THEN
1024 ef1_i(1) = ef1_i(1) -
fac*(tij_abc(1, 1, 1)*qp_j(1, 1) + &
1025 tij_abc(2, 1, 1)*qp_j(2, 1) + &
1026 tij_abc(3, 1, 1)*qp_j(3, 1) + &
1027 tij_abc(1, 2, 1)*qp_j(1, 2) + &
1028 tij_abc(2, 2, 1)*qp_j(2, 2) + &
1029 tij_abc(3, 2, 1)*qp_j(3, 2) + &
1030 tij_abc(1, 3, 1)*qp_j(1, 3) + &
1031 tij_abc(2, 3, 1)*qp_j(2, 3) + &
1032 tij_abc(3, 3, 1)*qp_j(3, 3))
1033 ef1_i(2) = ef1_i(2) -
fac*(tij_abc(1, 1, 2)*qp_j(1, 1) + &
1034 tij_abc(2, 1, 2)*qp_j(2, 1) + &
1035 tij_abc(3, 1, 2)*qp_j(3, 1) + &
1036 tij_abc(1, 2, 2)*qp_j(1, 2) + &
1037 tij_abc(2, 2, 2)*qp_j(2, 2) + &
1038 tij_abc(3, 2, 2)*qp_j(3, 2) + &
1039 tij_abc(1, 3, 2)*qp_j(1, 3) + &
1040 tij_abc(2, 3, 2)*qp_j(2, 3) + &
1041 tij_abc(3, 3, 2)*qp_j(3, 3))
1042 ef1_i(3) = ef1_i(3) -
fac*(tij_abc(1, 1, 3)*qp_j(1, 1) + &
1043 tij_abc(2, 1, 3)*qp_j(2, 1) + &
1044 tij_abc(3, 1, 3)*qp_j(3, 1) + &
1045 tij_abc(1, 2, 3)*qp_j(1, 2) + &
1046 tij_abc(2, 2, 3)*qp_j(2, 2) + &
1047 tij_abc(3, 2, 3)*qp_j(3, 2) + &
1048 tij_abc(1, 3, 3)*qp_j(1, 3) + &
1049 tij_abc(2, 3, 3)*qp_j(2, 3) + &
1050 tij_abc(3, 3, 3)*qp_j(3, 3))
1052 ef1_j(1) = ef1_j(1) +
fac*(tij_abc(1, 1, 1)*qp_i(1, 1) + &
1053 tij_abc(2, 1, 1)*qp_i(2, 1) + &
1054 tij_abc(3, 1, 1)*qp_i(3, 1) + &
1055 tij_abc(1, 2, 1)*qp_i(1, 2) + &
1056 tij_abc(2, 2, 1)*qp_i(2, 2) + &
1057 tij_abc(3, 2, 1)*qp_i(3, 2) + &
1058 tij_abc(1, 3, 1)*qp_i(1, 3) + &
1059 tij_abc(2, 3, 1)*qp_i(2, 3) + &
1060 tij_abc(3, 3, 1)*qp_i(3, 3))
1061 ef1_j(2) = ef1_j(2) +
fac*(tij_abc(1, 1, 2)*qp_i(1, 1) + &
1062 tij_abc(2, 1, 2)*qp_i(2, 1) + &
1063 tij_abc(3, 1, 2)*qp_i(3, 1) + &
1064 tij_abc(1, 2, 2)*qp_i(1, 2) + &
1065 tij_abc(2, 2, 2)*qp_i(2, 2) + &
1066 tij_abc(3, 2, 2)*qp_i(3, 2) + &
1067 tij_abc(1, 3, 2)*qp_i(1, 3) + &
1068 tij_abc(2, 3, 2)*qp_i(2, 3) + &
1069 tij_abc(3, 3, 2)*qp_i(3, 3))
1070 ef1_j(3) = ef1_j(3) +
fac*(tij_abc(1, 1, 3)*qp_i(1, 1) + &
1071 tij_abc(2, 1, 3)*qp_i(2, 1) + &
1072 tij_abc(3, 1, 3)*qp_i(3, 1) + &
1073 tij_abc(1, 2, 3)*qp_i(1, 2) + &
1074 tij_abc(2, 2, 3)*qp_i(2, 2) + &
1075 tij_abc(3, 2, 3)*qp_i(3, 2) + &
1076 tij_abc(1, 3, 3)*qp_i(1, 3) + &
1077 tij_abc(2, 3, 3)*qp_i(2, 3) + &
1078 tij_abc(3, 3, 3)*qp_i(3, 3))
1081 IF (do_efield2)
THEN
1082 tmp11 =
fac*(tij_abcd(1, 1, 1, 1)*qp_j(1, 1) + &
1083 tij_abcd(2, 1, 1, 1)*qp_j(2, 1) + &
1084 tij_abcd(3, 1, 1, 1)*qp_j(3, 1) + &
1085 tij_abcd(1, 2, 1, 1)*qp_j(1, 2) + &
1086 tij_abcd(2, 2, 1, 1)*qp_j(2, 2) + &
1087 tij_abcd(3, 2, 1, 1)*qp_j(3, 2) + &
1088 tij_abcd(1, 3, 1, 1)*qp_j(1, 3) + &
1089 tij_abcd(2, 3, 1, 1)*qp_j(2, 3) + &
1090 tij_abcd(3, 3, 1, 1)*qp_j(3, 3))
1091 tmp12 =
fac*(tij_abcd(1, 1, 1, 2)*qp_j(1, 1) + &
1092 tij_abcd(2, 1, 1, 2)*qp_j(2, 1) + &
1093 tij_abcd(3, 1, 1, 2)*qp_j(3, 1) + &
1094 tij_abcd(1, 2, 1, 2)*qp_j(1, 2) + &
1095 tij_abcd(2, 2, 1, 2)*qp_j(2, 2) + &
1096 tij_abcd(3, 2, 1, 2)*qp_j(3, 2) + &
1097 tij_abcd(1, 3, 1, 2)*qp_j(1, 3) + &
1098 tij_abcd(2, 3, 1, 2)*qp_j(2, 3) + &
1099 tij_abcd(3, 3, 1, 2)*qp_j(3, 3))
1100 tmp13 =
fac*(tij_abcd(1, 1, 1, 3)*qp_j(1, 1) + &
1101 tij_abcd(2, 1, 1, 3)*qp_j(2, 1) + &
1102 tij_abcd(3, 1, 1, 3)*qp_j(3, 1) + &
1103 tij_abcd(1, 2, 1, 3)*qp_j(1, 2) + &
1104 tij_abcd(2, 2, 1, 3)*qp_j(2, 2) + &
1105 tij_abcd(3, 2, 1, 3)*qp_j(3, 2) + &
1106 tij_abcd(1, 3, 1, 3)*qp_j(1, 3) + &
1107 tij_abcd(2, 3, 1, 3)*qp_j(2, 3) + &
1108 tij_abcd(3, 3, 1, 3)*qp_j(3, 3))
1109 tmp22 =
fac*(tij_abcd(1, 1, 2, 2)*qp_j(1, 1) + &
1110 tij_abcd(2, 1, 2, 2)*qp_j(2, 1) + &
1111 tij_abcd(3, 1, 2, 2)*qp_j(3, 1) + &
1112 tij_abcd(1, 2, 2, 2)*qp_j(1, 2) + &
1113 tij_abcd(2, 2, 2, 2)*qp_j(2, 2) + &
1114 tij_abcd(3, 2, 2, 2)*qp_j(3, 2) + &
1115 tij_abcd(1, 3, 2, 2)*qp_j(1, 3) + &
1116 tij_abcd(2, 3, 2, 2)*qp_j(2, 3) + &
1117 tij_abcd(3, 3, 2, 2)*qp_j(3, 3))
1118 tmp23 =
fac*(tij_abcd(1, 1, 2, 3)*qp_j(1, 1) + &
1119 tij_abcd(2, 1, 2, 3)*qp_j(2, 1) + &
1120 tij_abcd(3, 1, 2, 3)*qp_j(3, 1) + &
1121 tij_abcd(1, 2, 2, 3)*qp_j(1, 2) + &
1122 tij_abcd(2, 2, 2, 3)*qp_j(2, 2) + &
1123 tij_abcd(3, 2, 2, 3)*qp_j(3, 2) + &
1124 tij_abcd(1, 3, 2, 3)*qp_j(1, 3) + &
1125 tij_abcd(2, 3, 2, 3)*qp_j(2, 3) + &
1126 tij_abcd(3, 3, 2, 3)*qp_j(3, 3))
1127 tmp33 =
fac*(tij_abcd(1, 1, 3, 3)*qp_j(1, 1) + &
1128 tij_abcd(2, 1, 3, 3)*qp_j(2, 1) + &
1129 tij_abcd(3, 1, 3, 3)*qp_j(3, 1) + &
1130 tij_abcd(1, 2, 3, 3)*qp_j(1, 2) + &
1131 tij_abcd(2, 2, 3, 3)*qp_j(2, 2) + &
1132 tij_abcd(3, 2, 3, 3)*qp_j(3, 2) + &
1133 tij_abcd(1, 3, 3, 3)*qp_j(1, 3) + &
1134 tij_abcd(2, 3, 3, 3)*qp_j(2, 3) + &
1135 tij_abcd(3, 3, 3, 3)*qp_j(3, 3))
1137 ef2_i(1, 1) = ef2_i(1, 1) - tmp11
1138 ef2_i(1, 2) = ef2_i(1, 2) - tmp12
1139 ef2_i(1, 3) = ef2_i(1, 3) - tmp13
1140 ef2_i(2, 1) = ef2_i(2, 1) - tmp12
1141 ef2_i(2, 2) = ef2_i(2, 2) - tmp22
1142 ef2_i(2, 3) = ef2_i(2, 3) - tmp23
1143 ef2_i(3, 1) = ef2_i(3, 1) - tmp13
1144 ef2_i(3, 2) = ef2_i(3, 2) - tmp23
1145 ef2_i(3, 3) = ef2_i(3, 3) - tmp33
1147 tmp11 =
fac*(tij_abcd(1, 1, 1, 1)*qp_i(1, 1) + &
1148 tij_abcd(2, 1, 1, 1)*qp_i(2, 1) + &
1149 tij_abcd(3, 1, 1, 1)*qp_i(3, 1) + &
1150 tij_abcd(1, 2, 1, 1)*qp_i(1, 2) + &
1151 tij_abcd(2, 2, 1, 1)*qp_i(2, 2) + &
1152 tij_abcd(3, 2, 1, 1)*qp_i(3, 2) + &
1153 tij_abcd(1, 3, 1, 1)*qp_i(1, 3) + &
1154 tij_abcd(2, 3, 1, 1)*qp_i(2, 3) + &
1155 tij_abcd(3, 3, 1, 1)*qp_i(3, 3))
1156 tmp12 =
fac*(tij_abcd(1, 1, 1, 2)*qp_i(1, 1) + &
1157 tij_abcd(2, 1, 1, 2)*qp_i(2, 1) + &
1158 tij_abcd(3, 1, 1, 2)*qp_i(3, 1) + &
1159 tij_abcd(1, 2, 1, 2)*qp_i(1, 2) + &
1160 tij_abcd(2, 2, 1, 2)*qp_i(2, 2) + &
1161 tij_abcd(3, 2, 1, 2)*qp_i(3, 2) + &
1162 tij_abcd(1, 3, 1, 2)*qp_i(1, 3) + &
1163 tij_abcd(2, 3, 1, 2)*qp_i(2, 3) + &
1164 tij_abcd(3, 3, 1, 2)*qp_i(3, 3))
1165 tmp13 =
fac*(tij_abcd(1, 1, 1, 3)*qp_i(1, 1) + &
1166 tij_abcd(2, 1, 1, 3)*qp_i(2, 1) + &
1167 tij_abcd(3, 1, 1, 3)*qp_i(3, 1) + &
1168 tij_abcd(1, 2, 1, 3)*qp_i(1, 2) + &
1169 tij_abcd(2, 2, 1, 3)*qp_i(2, 2) + &
1170 tij_abcd(3, 2, 1, 3)*qp_i(3, 2) + &
1171 tij_abcd(1, 3, 1, 3)*qp_i(1, 3) + &
1172 tij_abcd(2, 3, 1, 3)*qp_i(2, 3) + &
1173 tij_abcd(3, 3, 1, 3)*qp_i(3, 3))
1174 tmp22 =
fac*(tij_abcd(1, 1, 2, 2)*qp_i(1, 1) + &
1175 tij_abcd(2, 1, 2, 2)*qp_i(2, 1) + &
1176 tij_abcd(3, 1, 2, 2)*qp_i(3, 1) + &
1177 tij_abcd(1, 2, 2, 2)*qp_i(1, 2) + &
1178 tij_abcd(2, 2, 2, 2)*qp_i(2, 2) + &
1179 tij_abcd(3, 2, 2, 2)*qp_i(3, 2) + &
1180 tij_abcd(1, 3, 2, 2)*qp_i(1, 3) + &
1181 tij_abcd(2, 3, 2, 2)*qp_i(2, 3) + &
1182 tij_abcd(3, 3, 2, 2)*qp_i(3, 3))
1183 tmp23 =
fac*(tij_abcd(1, 1, 2, 3)*qp_i(1, 1) + &
1184 tij_abcd(2, 1, 2, 3)*qp_i(2, 1) + &
1185 tij_abcd(3, 1, 2, 3)*qp_i(3, 1) + &
1186 tij_abcd(1, 2, 2, 3)*qp_i(1, 2) + &
1187 tij_abcd(2, 2, 2, 3)*qp_i(2, 2) + &
1188 tij_abcd(3, 2, 2, 3)*qp_i(3, 2) + &
1189 tij_abcd(1, 3, 2, 3)*qp_i(1, 3) + &
1190 tij_abcd(2, 3, 2, 3)*qp_i(2, 3) + &
1191 tij_abcd(3, 3, 2, 3)*qp_i(3, 3))
1192 tmp33 =
fac*(tij_abcd(1, 1, 3, 3)*qp_i(1, 1) + &
1193 tij_abcd(2, 1, 3, 3)*qp_i(2, 1) + &
1194 tij_abcd(3, 1, 3, 3)*qp_i(3, 1) + &
1195 tij_abcd(1, 2, 3, 3)*qp_i(1, 2) + &
1196 tij_abcd(2, 2, 3, 3)*qp_i(2, 2) + &
1197 tij_abcd(3, 2, 3, 3)*qp_i(3, 2) + &
1198 tij_abcd(1, 3, 3, 3)*qp_i(1, 3) + &
1199 tij_abcd(2, 3, 3, 3)*qp_i(2, 3) + &
1200 tij_abcd(3, 3, 3, 3)*qp_i(3, 3))
1202 ef2_j(1, 1) = ef2_j(1, 1) - tmp11
1203 ef2_j(1, 2) = ef2_j(1, 2) - tmp12
1204 ef2_j(1, 3) = ef2_j(1, 3) - tmp13
1205 ef2_j(2, 1) = ef2_j(2, 1) - tmp12
1206 ef2_j(2, 2) = ef2_j(2, 2) - tmp22
1207 ef2_j(2, 3) = ef2_j(2, 3) - tmp23
1208 ef2_j(3, 1) = ef2_j(3, 1) - tmp13
1209 ef2_j(3, 2) = ef2_j(3, 2) - tmp23
1210 ef2_j(3, 3) = ef2_j(3, 3) - tmp33
1214 IF (task(3, 2))
THEN
1218 tmp_ij = dp_i(1)*(tij_abc(1, 1, 1)*qp_j(1, 1) + &
1219 tij_abc(2, 1, 1)*qp_j(2, 1) + &
1220 tij_abc(3, 1, 1)*qp_j(3, 1) + &
1221 tij_abc(1, 2, 1)*qp_j(1, 2) + &
1222 tij_abc(2, 2, 1)*qp_j(2, 2) + &
1223 tij_abc(3, 2, 1)*qp_j(3, 2) + &
1224 tij_abc(1, 3, 1)*qp_j(1, 3) + &
1225 tij_abc(2, 3, 1)*qp_j(2, 3) + &
1226 tij_abc(3, 3, 1)*qp_j(3, 3)) + &
1227 dp_i(2)*(tij_abc(1, 1, 2)*qp_j(1, 1) + &
1228 tij_abc(2, 1, 2)*qp_j(2, 1) + &
1229 tij_abc(3, 1, 2)*qp_j(3, 1) + &
1230 tij_abc(1, 2, 2)*qp_j(1, 2) + &
1231 tij_abc(2, 2, 2)*qp_j(2, 2) + &
1232 tij_abc(3, 2, 2)*qp_j(3, 2) + &
1233 tij_abc(1, 3, 2)*qp_j(1, 3) + &
1234 tij_abc(2, 3, 2)*qp_j(2, 3) + &
1235 tij_abc(3, 3, 2)*qp_j(3, 3)) + &
1236 dp_i(3)*(tij_abc(1, 1, 3)*qp_j(1, 1) + &
1237 tij_abc(2, 1, 3)*qp_j(2, 1) + &
1238 tij_abc(3, 1, 3)*qp_j(3, 1) + &
1239 tij_abc(1, 2, 3)*qp_j(1, 2) + &
1240 tij_abc(2, 2, 3)*qp_j(2, 2) + &
1241 tij_abc(3, 2, 3)*qp_j(3, 2) + &
1242 tij_abc(1, 3, 3)*qp_j(1, 3) + &
1243 tij_abc(2, 3, 3)*qp_j(2, 3) + &
1244 tij_abc(3, 3, 3)*qp_j(3, 3))
1247 tmp_ji = dp_j(1)*(tij_abc(1, 1, 1)*qp_i(1, 1) + &
1248 tij_abc(2, 1, 1)*qp_i(2, 1) + &
1249 tij_abc(3, 1, 1)*qp_i(3, 1) + &
1250 tij_abc(1, 2, 1)*qp_i(1, 2) + &
1251 tij_abc(2, 2, 1)*qp_i(2, 2) + &
1252 tij_abc(3, 2, 1)*qp_i(3, 2) + &
1253 tij_abc(1, 3, 1)*qp_i(1, 3) + &
1254 tij_abc(2, 3, 1)*qp_i(2, 3) + &
1255 tij_abc(3, 3, 1)*qp_i(3, 3)) + &
1256 dp_j(2)*(tij_abc(1, 1, 2)*qp_i(1, 1) + &
1257 tij_abc(2, 1, 2)*qp_i(2, 1) + &
1258 tij_abc(3, 1, 2)*qp_i(3, 1) + &
1259 tij_abc(1, 2, 2)*qp_i(1, 2) + &
1260 tij_abc(2, 2, 2)*qp_i(2, 2) + &
1261 tij_abc(3, 2, 2)*qp_i(3, 2) + &
1262 tij_abc(1, 3, 2)*qp_i(1, 3) + &
1263 tij_abc(2, 3, 2)*qp_i(2, 3) + &
1264 tij_abc(3, 3, 2)*qp_i(3, 3)) + &
1265 dp_j(3)*(tij_abc(1, 1, 3)*qp_i(1, 1) + &
1266 tij_abc(2, 1, 3)*qp_i(2, 1) + &
1267 tij_abc(3, 1, 3)*qp_i(3, 1) + &
1268 tij_abc(1, 2, 3)*qp_i(1, 2) + &
1269 tij_abc(2, 2, 3)*qp_i(2, 2) + &
1270 tij_abc(3, 2, 3)*qp_i(3, 2) + &
1271 tij_abc(1, 3, 3)*qp_i(1, 3) + &
1272 tij_abc(2, 3, 3)*qp_i(2, 3) + &
1273 tij_abc(3, 3, 3)*qp_i(3, 3))
1275 tmp =
fac*(tmp_ij - tmp_ji)
1277 IF (do_forces .OR. do_stress)
THEN
1280 tmp_ij = dp_i(1)*(tij_abcd(1, 1, 1, k)*qp_j(1, 1) + &
1281 tij_abcd(2, 1, 1, k)*qp_j(2, 1) + &
1282 tij_abcd(3, 1, 1, k)*qp_j(3, 1) + &
1283 tij_abcd(1, 2, 1, k)*qp_j(1, 2) + &
1284 tij_abcd(2, 2, 1, k)*qp_j(2, 2) + &
1285 tij_abcd(3, 2, 1, k)*qp_j(3, 2) + &
1286 tij_abcd(1, 3, 1, k)*qp_j(1, 3) + &
1287 tij_abcd(2, 3, 1, k)*qp_j(2, 3) + &
1288 tij_abcd(3, 3, 1, k)*qp_j(3, 3)) + &
1289 dp_i(2)*(tij_abcd(1, 1, 2, k)*qp_j(1, 1) + &
1290 tij_abcd(2, 1, 2, k)*qp_j(2, 1) + &
1291 tij_abcd(3, 1, 2, k)*qp_j(3, 1) + &
1292 tij_abcd(1, 2, 2, k)*qp_j(1, 2) + &
1293 tij_abcd(2, 2, 2, k)*qp_j(2, 2) + &
1294 tij_abcd(3, 2, 2, k)*qp_j(3, 2) + &
1295 tij_abcd(1, 3, 2, k)*qp_j(1, 3) + &
1296 tij_abcd(2, 3, 2, k)*qp_j(2, 3) + &
1297 tij_abcd(3, 3, 2, k)*qp_j(3, 3)) + &
1298 dp_i(3)*(tij_abcd(1, 1, 3, k)*qp_j(1, 1) + &
1299 tij_abcd(2, 1, 3, k)*qp_j(2, 1) + &
1300 tij_abcd(3, 1, 3, k)*qp_j(3, 1) + &
1301 tij_abcd(1, 2, 3, k)*qp_j(1, 2) + &
1302 tij_abcd(2, 2, 3, k)*qp_j(2, 2) + &
1303 tij_abcd(3, 2, 3, k)*qp_j(3, 2) + &
1304 tij_abcd(1, 3, 3, k)*qp_j(1, 3) + &
1305 tij_abcd(2, 3, 3, k)*qp_j(2, 3) + &
1306 tij_abcd(3, 3, 3, k)*qp_j(3, 3))
1309 tmp_ji = dp_j(1)*(tij_abcd(1, 1, 1, k)*qp_i(1, 1) + &
1310 tij_abcd(2, 1, 1, k)*qp_i(2, 1) + &
1311 tij_abcd(3, 1, 1, k)*qp_i(3, 1) + &
1312 tij_abcd(1, 2, 1, k)*qp_i(1, 2) + &
1313 tij_abcd(2, 2, 1, k)*qp_i(2, 2) + &
1314 tij_abcd(3, 2, 1, k)*qp_i(3, 2) + &
1315 tij_abcd(1, 3, 1, k)*qp_i(1, 3) + &
1316 tij_abcd(2, 3, 1, k)*qp_i(2, 3) + &
1317 tij_abcd(3, 3, 1, k)*qp_i(3, 3)) + &
1318 dp_j(2)*(tij_abcd(1, 1, 2, k)*qp_i(1, 1) + &
1319 tij_abcd(2, 1, 2, k)*qp_i(2, 1) + &
1320 tij_abcd(3, 1, 2, k)*qp_i(3, 1) + &
1321 tij_abcd(1, 2, 2, k)*qp_i(1, 2) + &
1322 tij_abcd(2, 2, 2, k)*qp_i(2, 2) + &
1323 tij_abcd(3, 2, 2, k)*qp_i(3, 2) + &
1324 tij_abcd(1, 3, 2, k)*qp_i(1, 3) + &
1325 tij_abcd(2, 3, 2, k)*qp_i(2, 3) + &
1326 tij_abcd(3, 3, 2, k)*qp_i(3, 3)) + &
1327 dp_j(3)*(tij_abcd(1, 1, 3, k)*qp_i(1, 1) + &
1328 tij_abcd(2, 1, 3, k)*qp_i(2, 1) + &
1329 tij_abcd(3, 1, 3, k)*qp_i(3, 1) + &
1330 tij_abcd(1, 2, 3, k)*qp_i(1, 2) + &
1331 tij_abcd(2, 2, 3, k)*qp_i(2, 2) + &
1332 tij_abcd(3, 2, 3, k)*qp_i(3, 2) + &
1333 tij_abcd(1, 3, 3, k)*qp_i(1, 3) + &
1334 tij_abcd(2, 3, 3, k)*qp_i(2, 3) + &
1335 tij_abcd(3, 3, 3, k)*qp_i(3, 3))
1337 fr(k) = fr(k) -
fac*(tmp_ij - tmp_ji)
1341 IF (task(3, 1))
THEN
1346 tmp_ij = ch_i*(tij_ab(1, 1)*qp_j(1, 1) + &
1347 tij_ab(2, 1)*qp_j(2, 1) + &
1348 tij_ab(3, 1)*qp_j(3, 1) + &
1349 tij_ab(1, 2)*qp_j(1, 2) + &
1350 tij_ab(2, 2)*qp_j(2, 2) + &
1351 tij_ab(3, 2)*qp_j(3, 2) + &
1352 tij_ab(1, 3)*qp_j(1, 3) + &
1353 tij_ab(2, 3)*qp_j(2, 3) + &
1354 tij_ab(3, 3)*qp_j(3, 3))
1357 tmp_ji = ch_j*(tij_ab(1, 1)*qp_i(1, 1) + &
1358 tij_ab(2, 1)*qp_i(2, 1) + &
1359 tij_ab(3, 1)*qp_i(3, 1) + &
1360 tij_ab(1, 2)*qp_i(1, 2) + &
1361 tij_ab(2, 2)*qp_i(2, 2) + &
1362 tij_ab(3, 2)*qp_i(3, 2) + &
1363 tij_ab(1, 3)*qp_i(1, 3) + &
1364 tij_ab(2, 3)*qp_i(2, 3) + &
1365 tij_ab(3, 3)*qp_i(3, 3))
1367 eloc = eloc +
fac*(tmp_ij + tmp_ji)
1368 IF (do_forces .OR. do_stress)
THEN
1371 tmp_ij = ch_i*(tij_abc(1, 1, k)*qp_j(1, 1) + &
1372 tij_abc(2, 1, k)*qp_j(2, 1) + &
1373 tij_abc(3, 1, k)*qp_j(3, 1) + &
1374 tij_abc(1, 2, k)*qp_j(1, 2) + &
1375 tij_abc(2, 2, k)*qp_j(2, 2) + &
1376 tij_abc(3, 2, k)*qp_j(3, 2) + &
1377 tij_abc(1, 3, k)*qp_j(1, 3) + &
1378 tij_abc(2, 3, k)*qp_j(2, 3) + &
1379 tij_abc(3, 3, k)*qp_j(3, 3))
1382 tmp_ji = ch_j*(tij_abc(1, 1, k)*qp_i(1, 1) + &
1383 tij_abc(2, 1, k)*qp_i(2, 1) + &
1384 tij_abc(3, 1, k)*qp_i(3, 1) + &
1385 tij_abc(1, 2, k)*qp_i(1, 2) + &
1386 tij_abc(2, 2, k)*qp_i(2, 2) + &
1387 tij_abc(3, 2, k)*qp_i(3, 2) + &
1388 tij_abc(1, 3, k)*qp_i(1, 3) + &
1389 tij_abc(2, 3, k)*qp_i(2, 3) + &
1390 tij_abc(3, 3, k)*qp_i(3, 3))
1392 fr(k) = fr(k) -
fac*(tmp_ij + tmp_ji)
1396 energy = energy + eloc
1398 forces(1, atom_a) = forces(1, atom_a) - fr(1)
1399 forces(2, atom_a) = forces(2, atom_a) - fr(2)
1400 forces(3, atom_a) = forces(3, atom_a) - fr(3)
1401 forces(1, atom_b) = forces(1, atom_b) + fr(1)
1402 forces(2, atom_b) = forces(2, atom_b) + fr(2)
1403 forces(3, atom_b) = forces(3, atom_b) + fr(3)
1408 IF (do_efield0)
THEN
1409 efield0(atom_a) = efield0(atom_a) + ef0_j
1411 efield0(atom_b) = efield0(atom_b) + ef0_i
1414 IF (do_efield1)
THEN
1415 efield1(1, atom_a) = efield1(1, atom_a) + ef1_j(1)
1416 efield1(2, atom_a) = efield1(2, atom_a) + ef1_j(2)
1417 efield1(3, atom_a) = efield1(3, atom_a) + ef1_j(3)
1419 efield1(1, atom_b) = efield1(1, atom_b) + ef1_i(1)
1420 efield1(2, atom_b) = efield1(2, atom_b) + ef1_i(2)
1421 efield1(3, atom_b) = efield1(3, atom_b) + ef1_i(3)
1424 IF (do_efield2)
THEN
1425 efield2(1, atom_a) = efield2(1, atom_a) + ef2_j(1, 1)
1426 efield2(2, atom_a) = efield2(2, atom_a) + ef2_j(1, 2)
1427 efield2(3, atom_a) = efield2(3, atom_a) + ef2_j(1, 3)
1428 efield2(4, atom_a) = efield2(4, atom_a) + ef2_j(2, 1)
1429 efield2(5, atom_a) = efield2(5, atom_a) + ef2_j(2, 2)
1430 efield2(6, atom_a) = efield2(6, atom_a) + ef2_j(2, 3)
1431 efield2(7, atom_a) = efield2(7, atom_a) + ef2_j(3, 1)
1432 efield2(8, atom_a) = efield2(8, atom_a) + ef2_j(3, 2)
1433 efield2(9, atom_a) = efield2(9, atom_a) + ef2_j(3, 3)
1435 efield2(1, atom_b) = efield2(1, atom_b) + ef2_i(1, 1)
1436 efield2(2, atom_b) = efield2(2, atom_b) + ef2_i(1, 2)
1437 efield2(3, atom_b) = efield2(3, atom_b) + ef2_i(1, 3)
1438 efield2(4, atom_b) = efield2(4, atom_b) + ef2_i(2, 1)
1439 efield2(5, atom_b) = efield2(5, atom_b) + ef2_i(2, 2)
1440 efield2(6, atom_b) = efield2(6, atom_b) + ef2_i(2, 3)
1441 efield2(7, atom_b) = efield2(7, atom_b) + ef2_i(3, 1)
1442 efield2(8, atom_b) = efield2(8, atom_b) + ef2_i(3, 2)
1443 efield2(9, atom_b) = efield2(9, atom_b) + ef2_i(3, 3)
1447 ptens11 = ptens11 + rab(1)*fr(1)
1448 ptens21 = ptens21 + rab(2)*fr(1)
1449 ptens31 = ptens31 + rab(3)*fr(1)
1450 ptens12 = ptens12 + rab(1)*fr(2)
1451 ptens22 = ptens22 + rab(2)*fr(2)
1452 ptens32 = ptens32 + rab(3)*fr(2)
1453 ptens13 = ptens13 + rab(1)*fr(3)
1454 ptens23 = ptens23 + rab(2)*fr(3)
1455 ptens33 = ptens33 + rab(3)*fr(3)
1460 IF (debug_this_module)
THEN
1463 tij_a = huge(0.0_dp)
1464 tij_ab = huge(0.0_dp)
1465 tij_abc = huge(0.0_dp)
1466 tij_abcd = huge(0.0_dp)
1467 tij_abcde = huge(0.0_dp)
1475 IF (debug_this_module .AND. debug_r_space .AND. (.NOT. debug_g_space))
THEN
1479 f(0) = erfc(alpha*r)*ir
1485 f(i) = irab2*(f(i - 1) + tmp*((2.0_dp*alpha**2)**i)/(
fac*alpha))
1490 force_eval = do_stress
1491 IF (task(1, 1))
THEN
1493 force_eval = do_forces .OR. do_efield1
1495 IF (task(2, 2)) force_eval = force_eval .OR. do_efield0
1496 IF (task(1, 2) .OR. force_eval)
THEN
1497 force_eval = do_stress
1498 tij_a = -rab*f(1)*fac_ij
1499 IF (task(1, 2)) force_eval = force_eval .OR. do_forces
1501 IF (task(1, 1)) force_eval = force_eval .OR. do_efield2
1502 IF (task(3, 3)) force_eval = force_eval .OR. do_efield0
1503 IF (task(2, 2) .OR. task(3, 1) .OR. force_eval)
THEN
1504 force_eval = do_stress
1507 tmp = rab(a)*rab(b)*fac_ij
1508 tij_ab(a, b) = 3.0_dp*tmp*f(2)
1509 IF (a == b) tij_ab(a, b) = tij_ab(a, b) - f(1)*fac_ij
1512 IF (task(2, 2) .OR. task(3, 1)) force_eval = force_eval .OR. do_forces
1514 IF (task(2, 2)) force_eval = force_eval .OR. do_efield2
1515 IF (task(3, 3)) force_eval = force_eval .OR. do_efield1
1516 IF (task(3, 2) .OR. force_eval)
THEN
1517 force_eval = do_stress
1521 tmp = rab(a)*rab(b)*rab(c)*fac_ij
1522 tij_abc(a, b, c) = -15.0_dp*tmp*f(3)
1523 tmp = 3.0_dp*f(2)*fac_ij
1524 IF (a == b) tij_abc(a, b, c) = tij_abc(a, b, c) + tmp*rab(c)
1525 IF (a == c) tij_abc(a, b, c) = tij_abc(a, b, c) + tmp*rab(b)
1526 IF (b == c) tij_abc(a, b, c) = tij_abc(a, b, c) + tmp*rab(a)
1530 IF (task(3, 2)) force_eval = force_eval .OR. do_forces
1532 IF (task(3, 3) .OR. force_eval)
THEN
1533 force_eval = do_stress
1538 tmp = rab(a)*rab(b)*rab(c)*rab(d)*fac_ij
1539 tij_abcd(a, b, c, d) = 105.0_dp*tmp*f(4)
1540 tmp1 = 15.0_dp*f(3)*fac_ij
1541 tmp2 = 3.0_dp*f(2)*fac_ij
1543 tij_abcd(a, b, c, d) = tij_abcd(a, b, c, d) - tmp1*rab(c)*rab(d)
1544 IF (c == d) tij_abcd(a, b, c, d) = tij_abcd(a, b, c, d) + tmp2
1547 tij_abcd(a, b, c, d) = tij_abcd(a, b, c, d) - tmp1*rab(b)*rab(d)
1548 IF (b == d) tij_abcd(a, b, c, d) = tij_abcd(a, b, c, d) + tmp2
1550 IF (a == d) tij_abcd(a, b, c, d) = tij_abcd(a, b, c, d) - tmp1*rab(b)*rab(c)
1552 tij_abcd(a, b, c, d) = tij_abcd(a, b, c, d) - tmp1*rab(a)*rab(d)
1553 IF (a == d) tij_abcd(a, b, c, d) = tij_abcd(a, b, c, d) + tmp2
1555 IF (b == d) tij_abcd(a, b, c, d) = tij_abcd(a, b, c, d) - tmp1*rab(a)*rab(c)
1556 IF (c == d) tij_abcd(a, b, c, d) = tij_abcd(a, b, c, d) - tmp1*rab(a)*rab(b)
1561 IF (task(3, 3)) force_eval = force_eval .OR. do_forces
1563 IF (force_eval)
THEN
1564 force_eval = do_stress
1570 tmp = rab(a)*rab(b)*rab(c)*rab(d)*rab(e)*fac_ij
1571 tij_abcde(a, b, c, d, e) = -945.0_dp*tmp*f(5)
1572 tmp1 = 105.0_dp*f(4)*fac_ij
1573 tmp2 = 15.0_dp*f(3)*fac_ij
1575 tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) + tmp1*rab(c)*rab(d)*rab(e)
1576 IF (c == d) tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) - tmp2*rab(e)
1577 IF (c == e) tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) - tmp2*rab(d)
1578 IF (d == e) tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) - tmp2*rab(c)
1581 tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) + tmp1*rab(b)*rab(d)*rab(e)
1582 IF (b == d) tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) - tmp2*rab(e)
1583 IF (b == e) tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) - tmp2*rab(d)
1584 IF (d == e) tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) - tmp2*rab(b)
1587 tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) + tmp1*rab(b)*rab(c)*rab(e)
1588 IF (b == c) tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) - tmp2*rab(e)
1589 IF (b == e) tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) - tmp2*rab(c)
1590 IF (c == e) tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) - tmp2*rab(b)
1593 tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) + tmp1*rab(b)*rab(c)*rab(d)
1594 IF (b == c) tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) - tmp2*rab(d)
1595 IF (b == d) tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) - tmp2*rab(c)
1596 IF (c == d) tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) - tmp2*rab(b)
1599 tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) + tmp1*rab(a)*rab(d)*rab(e)
1600 IF (d == e) tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) - tmp2*rab(a)
1603 tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) + tmp1*rab(a)*rab(c)*rab(e)
1604 IF (c == e) tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) - tmp2*rab(a)
1607 tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) + tmp1*rab(a)*rab(c)*rab(d)
1608 IF (c == d) tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) - tmp2*rab(a)
1610 IF (c == d) tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) + tmp1*rab(a)*rab(b)*rab(e)
1611 IF (c == e) tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) + tmp1*rab(a)*rab(b)*rab(d)
1612 IF (d == e) tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) + tmp1*rab(a)*rab(b)*rab(c)
1630 IF (kind_a == ikind)
THEN
1632 SELECT CASE (itype_ij)
1637 DO kk = 1, nkdamp_ij
1639 factorial = factorial*real(kk, kind=
dp)
1640 dampsumfi = dampsumfi + (xf/factorial)
1642 dampaexpi = dexp(-dampa_ij*r)
1643 dampfunci = dampsumfi*dampaexpi*dampfac_ij
1644 dampfuncdiffi = -dampa_ij*dampaexpi* &
1645 dampfac_ij*(((dampa_ij*r)**nkdamp_ij)/ &
1649 dampfuncdiffi = 0.0_dp
1653 SELECT CASE (itype_ji)
1658 DO kk = 1, nkdamp_ji
1660 factorial = factorial*real(kk, kind=
dp)
1661 dampsumfj = dampsumfj + (xf/factorial)
1663 dampaexpj = dexp(-dampa_ji*r)
1664 dampfuncj = dampsumfj*dampaexpj*dampfac_ji
1665 dampfuncdiffj = -dampa_ji*dampaexpj* &
1666 dampfac_ji*(((dampa_ji*r)**nkdamp_ji)/ &
1670 dampfuncdiffj = 0.0_dp
1673 SELECT CASE (itype_ij)
1678 DO kk = 1, nkdamp_ij
1680 factorial = factorial*real(kk, kind=
dp)
1681 dampsumfj = dampsumfj + (xf/factorial)
1683 dampaexpj = dexp(-dampa_ij*r)
1684 dampfuncj = dampsumfj*dampaexpj*dampfac_ij
1685 dampfuncdiffj = -dampa_ij*dampaexpj* &
1686 dampfac_ij*(((dampa_ij*r)**nkdamp_ij)/ &
1690 dampfuncdiffj = 0.0_dp
1694 SELECT CASE (itype_ji)
1699 DO kk = 1, nkdamp_ji
1701 factorial = factorial*real(kk, kind=
dp)
1702 dampsumfi = dampsumfi + (xf/factorial)
1704 dampaexpi = dexp(-dampa_ji*r)
1705 dampfunci = dampsumfi*dampaexpi*dampfac_ji
1706 dampfuncdiffi = -dampa_ji*dampaexpi* &
1707 dampfac_ji*(((dampa_ji*r)**nkdamp_ji)/ &
1711 dampfuncdiffi = 0.0_dp
1715 damptij_a = -rab*dampfunci*fac_ij*irab2*ir
1716 damptji_a = -rab*dampfuncj*fac_ij*irab2*ir
1719 tmp = rab(a)*rab(b)*fac_ij
1720 damptij_ab(a, b) = tmp*(-dampfuncdiffi*irab2*irab2 + 3.0_dp*dampfunci*irab2*irab2*ir)
1721 damptji_ab(a, b) = tmp*(-dampfuncdiffj*irab2*irab2 + 3.0_dp*dampfuncj*irab2*irab2*ir)
1722 IF (a == b) damptij_ab(a, b) = damptij_ab(a, b) - dampfunci*fac_ij*irab2*ir
1723 IF (a == b) damptji_ab(a, b) = damptji_ab(a, b) - dampfuncj*fac_ij*irab2*ir
1729 IF (debug_this_module)
THEN
1737 IF (any(task(1, :)))
THEN
1738 ch_j = charges(atom_a)
1739 ch_i = charges(atom_b)
1741 IF (any(task(2, :)))
THEN
1742 dp_j = dipoles(:, atom_a)
1743 dp_i = dipoles(:, atom_b)
1745 IF (any(task(3, :)))
THEN
1746 qp_j = quadrupoles(:, :, atom_a)
1747 qp_i = quadrupoles(:, :, atom_b)
1749 IF (task(1, 1))
THEN
1751 eloc = eloc + ch_i*tij*ch_j
1753 IF (do_forces .OR. do_stress)
THEN
1754 fr(1) = fr(1) - ch_j*tij_a(1)*ch_i
1755 fr(2) = fr(2) - ch_j*tij_a(2)*ch_i
1756 fr(3) = fr(3) - ch_j*tij_a(3)*ch_i
1761 IF (do_efield0)
THEN
1762 ef0_i = ef0_i + tij*ch_j
1764 ef0_j = ef0_j + tij*ch_i
1767 IF (do_efield1)
THEN
1768 ef1_i(1) = ef1_i(1) - tij_a(1)*ch_j
1769 ef1_i(2) = ef1_i(2) - tij_a(2)*ch_j
1770 ef1_i(3) = ef1_i(3) - tij_a(3)*ch_j
1772 ef1_j(1) = ef1_j(1) + tij_a(1)*ch_i
1773 ef1_j(2) = ef1_j(2) + tij_a(2)*ch_i
1774 ef1_j(3) = ef1_j(3) + tij_a(3)*ch_i
1776 ef1_i(1) = ef1_i(1) + damptij_a(1)*ch_j
1777 ef1_i(2) = ef1_i(2) + damptij_a(2)*ch_j
1778 ef1_i(3) = ef1_i(3) + damptij_a(3)*ch_j
1780 ef1_j(1) = ef1_j(1) - damptji_a(1)*ch_i
1781 ef1_j(2) = ef1_j(2) - damptji_a(2)*ch_i
1782 ef1_j(3) = ef1_j(3) - damptji_a(3)*ch_i
1786 IF (do_efield2)
THEN
1787 ef2_i(1, 1) = ef2_i(1, 1) - tij_ab(1, 1)*ch_j
1788 ef2_i(2, 1) = ef2_i(2, 1) - tij_ab(2, 1)*ch_j
1789 ef2_i(3, 1) = ef2_i(3, 1) - tij_ab(3, 1)*ch_j
1790 ef2_i(1, 2) = ef2_i(1, 2) - tij_ab(1, 2)*ch_j
1791 ef2_i(2, 2) = ef2_i(2, 2) - tij_ab(2, 2)*ch_j
1792 ef2_i(3, 2) = ef2_i(3, 2) - tij_ab(3, 2)*ch_j
1793 ef2_i(1, 3) = ef2_i(1, 3) - tij_ab(1, 3)*ch_j
1794 ef2_i(2, 3) = ef2_i(2, 3) - tij_ab(2, 3)*ch_j
1795 ef2_i(3, 3) = ef2_i(3, 3) - tij_ab(3, 3)*ch_j
1797 ef2_j(1, 1) = ef2_j(1, 1) - tij_ab(1, 1)*ch_i
1798 ef2_j(2, 1) = ef2_j(2, 1) - tij_ab(2, 1)*ch_i
1799 ef2_j(3, 1) = ef2_j(3, 1) - tij_ab(3, 1)*ch_i
1800 ef2_j(1, 2) = ef2_j(1, 2) - tij_ab(1, 2)*ch_i
1801 ef2_j(2, 2) = ef2_j(2, 2) - tij_ab(2, 2)*ch_i
1802 ef2_j(3, 2) = ef2_j(3, 2) - tij_ab(3, 2)*ch_i
1803 ef2_j(1, 3) = ef2_j(1, 3) - tij_ab(1, 3)*ch_i
1804 ef2_j(2, 3) = ef2_j(2, 3) - tij_ab(2, 3)*ch_i
1805 ef2_j(3, 3) = ef2_j(3, 3) - tij_ab(3, 3)*ch_i
1809 IF (task(2, 2))
THEN
1811 tmp = -(dp_i(1)*(tij_ab(1, 1)*dp_j(1) + &
1812 tij_ab(2, 1)*dp_j(2) + &
1813 tij_ab(3, 1)*dp_j(3)) + &
1814 dp_i(2)*(tij_ab(1, 2)*dp_j(1) + &
1815 tij_ab(2, 2)*dp_j(2) + &
1816 tij_ab(3, 2)*dp_j(3)) + &
1817 dp_i(3)*(tij_ab(1, 3)*dp_j(1) + &
1818 tij_ab(2, 3)*dp_j(2) + &
1819 tij_ab(3, 3)*dp_j(3)))
1822 IF (do_forces .OR. do_stress)
THEN
1824 fr(k) = fr(k) + dp_i(1)*(tij_abc(1, 1, k)*dp_j(1) + &
1825 tij_abc(2, 1, k)*dp_j(2) + &
1826 tij_abc(3, 1, k)*dp_j(3)) &
1827 + dp_i(2)*(tij_abc(1, 2, k)*dp_j(1) + &
1828 tij_abc(2, 2, k)*dp_j(2) + &
1829 tij_abc(3, 2, k)*dp_j(3)) &
1830 + dp_i(3)*(tij_abc(1, 3, k)*dp_j(1) + &
1831 tij_abc(2, 3, k)*dp_j(2) + &
1832 tij_abc(3, 3, k)*dp_j(3))
1838 IF (do_efield0)
THEN
1839 ef0_i = ef0_i - (tij_a(1)*dp_j(1) + &
1840 tij_a(2)*dp_j(2) + &
1843 ef0_j = ef0_j + (tij_a(1)*dp_i(1) + &
1844 tij_a(2)*dp_i(2) + &
1848 IF (do_efield1)
THEN
1849 ef1_i(1) = ef1_i(1) + (tij_ab(1, 1)*dp_j(1) + &
1850 tij_ab(2, 1)*dp_j(2) + &
1851 tij_ab(3, 1)*dp_j(3))
1852 ef1_i(2) = ef1_i(2) + (tij_ab(1, 2)*dp_j(1) + &
1853 tij_ab(2, 2)*dp_j(2) + &
1854 tij_ab(3, 2)*dp_j(3))
1855 ef1_i(3) = ef1_i(3) + (tij_ab(1, 3)*dp_j(1) + &
1856 tij_ab(2, 3)*dp_j(2) + &
1857 tij_ab(3, 3)*dp_j(3))
1859 ef1_j(1) = ef1_j(1) + (tij_ab(1, 1)*dp_i(1) + &
1860 tij_ab(2, 1)*dp_i(2) + &
1861 tij_ab(3, 1)*dp_i(3))
1862 ef1_j(2) = ef1_j(2) + (tij_ab(1, 2)*dp_i(1) + &
1863 tij_ab(2, 2)*dp_i(2) + &
1864 tij_ab(3, 2)*dp_i(3))
1865 ef1_j(3) = ef1_j(3) + (tij_ab(1, 3)*dp_i(1) + &
1866 tij_ab(2, 3)*dp_i(2) + &
1867 tij_ab(3, 3)*dp_i(3))
1870 IF (do_efield2)
THEN
1871 ef2_i(1, 1) = ef2_i(1, 1) + (tij_abc(1, 1, 1)*dp_j(1) + &
1872 tij_abc(2, 1, 1)*dp_j(2) + &
1873 tij_abc(3, 1, 1)*dp_j(3))
1874 ef2_i(1, 2) = ef2_i(1, 2) + (tij_abc(1, 1, 2)*dp_j(1) + &
1875 tij_abc(2, 1, 2)*dp_j(2) + &
1876 tij_abc(3, 1, 2)*dp_j(3))
1877 ef2_i(1, 3) = ef2_i(1, 3) + (tij_abc(1, 1, 3)*dp_j(1) + &
1878 tij_abc(2, 1, 3)*dp_j(2) + &
1879 tij_abc(3, 1, 3)*dp_j(3))
1880 ef2_i(2, 1) = ef2_i(2, 1) + (tij_abc(1, 2, 1)*dp_j(1) + &
1881 tij_abc(2, 2, 1)*dp_j(2) + &
1882 tij_abc(3, 2, 1)*dp_j(3))
1883 ef2_i(2, 2) = ef2_i(2, 2) + (tij_abc(1, 2, 2)*dp_j(1) + &
1884 tij_abc(2, 2, 2)*dp_j(2) + &
1885 tij_abc(3, 2, 2)*dp_j(3))
1886 ef2_i(2, 3) = ef2_i(2, 3) + (tij_abc(1, 2, 3)*dp_j(1) + &
1887 tij_abc(2, 2, 3)*dp_j(2) + &
1888 tij_abc(3, 2, 3)*dp_j(3))
1889 ef2_i(3, 1) = ef2_i(3, 1) + (tij_abc(1, 3, 1)*dp_j(1) + &
1890 tij_abc(2, 3, 1)*dp_j(2) + &
1891 tij_abc(3, 3, 1)*dp_j(3))
1892 ef2_i(3, 2) = ef2_i(3, 2) + (tij_abc(1, 3, 2)*dp_j(1) + &
1893 tij_abc(2, 3, 2)*dp_j(2) + &
1894 tij_abc(3, 3, 2)*dp_j(3))
1895 ef2_i(3, 3) = ef2_i(3, 3) + (tij_abc(1, 3, 3)*dp_j(1) + &
1896 tij_abc(2, 3, 3)*dp_j(2) + &
1897 tij_abc(3, 3, 3)*dp_j(3))
1899 ef2_j(1, 1) = ef2_j(1, 1) - (tij_abc(1, 1, 1)*dp_i(1) + &
1900 tij_abc(2, 1, 1)*dp_i(2) + &
1901 tij_abc(3, 1, 1)*dp_i(3))
1902 ef2_j(1, 2) = ef2_j(1, 2) - (tij_abc(1, 1, 2)*dp_i(1) + &
1903 tij_abc(2, 1, 2)*dp_i(2) + &
1904 tij_abc(3, 1, 2)*dp_i(3))
1905 ef2_j(1, 3) = ef2_j(1, 3) - (tij_abc(1, 1, 3)*dp_i(1) + &
1906 tij_abc(2, 1, 3)*dp_i(2) + &
1907 tij_abc(3, 1, 3)*dp_i(3))
1908 ef2_j(2, 1) = ef2_j(2, 1) - (tij_abc(1, 2, 1)*dp_i(1) + &
1909 tij_abc(2, 2, 1)*dp_i(2) + &
1910 tij_abc(3, 2, 1)*dp_i(3))
1911 ef2_j(2, 2) = ef2_j(2, 2) - (tij_abc(1, 2, 2)*dp_i(1) + &
1912 tij_abc(2, 2, 2)*dp_i(2) + &
1913 tij_abc(3, 2, 2)*dp_i(3))
1914 ef2_j(2, 3) = ef2_j(2, 3) - (tij_abc(1, 2, 3)*dp_i(1) + &
1915 tij_abc(2, 2, 3)*dp_i(2) + &
1916 tij_abc(3, 2, 3)*dp_i(3))
1917 ef2_j(3, 1) = ef2_j(3, 1) - (tij_abc(1, 3, 1)*dp_i(1) + &
1918 tij_abc(2, 3, 1)*dp_i(2) + &
1919 tij_abc(3, 3, 1)*dp_i(3))
1920 ef2_j(3, 2) = ef2_j(3, 2) - (tij_abc(1, 3, 2)*dp_i(1) + &
1921 tij_abc(2, 3, 2)*dp_i(2) + &
1922 tij_abc(3, 3, 2)*dp_i(3))
1923 ef2_j(3, 3) = ef2_j(3, 3) - (tij_abc(1, 3, 3)*dp_i(1) + &
1924 tij_abc(2, 3, 3)*dp_i(2) + &
1925 tij_abc(3, 3, 3)*dp_i(3))
1929 IF (task(2, 1))
THEN
1931 tmp = ch_j*(tij_a(1)*dp_i(1) + &
1932 tij_a(2)*dp_i(2) + &
1934 - ch_i*(tij_a(1)*dp_j(1) + &
1935 tij_a(2)*dp_j(2) + &
1937 tmp = tmp - ch_j*(damptij_a(1)*dp_i(1) + &
1938 damptij_a(2)*dp_i(2) + &
1939 damptij_a(3)*dp_i(3)) &
1940 + ch_i*(damptji_a(1)*dp_j(1) + &
1941 damptji_a(2)*dp_j(2) + &
1942 damptji_a(3)*dp_j(3))
1945 IF (do_forces .OR. do_stress)
THEN
1947 fr(k) = fr(k) - ch_j*(tij_ab(1, k)*dp_i(1) + &
1948 tij_ab(2, k)*dp_i(2) + &
1949 tij_ab(3, k)*dp_i(3)) &
1950 + ch_i*(tij_ab(1, k)*dp_j(1) + &
1951 tij_ab(2, k)*dp_j(2) + &
1952 tij_ab(3, k)*dp_j(3))
1953 fr(k) = fr(k) + ch_j*(damptij_ab(1, k)*dp_i(1) + &
1954 damptij_ab(2, k)*dp_i(2) + &
1955 damptij_ab(3, k)*dp_i(3)) &
1956 - ch_i*(damptji_ab(1, k)*dp_j(1) + &
1957 damptji_ab(2, k)*dp_j(2) + &
1958 damptji_ab(3, k)*dp_j(3))
1962 IF (task(3, 3))
THEN
1965 tmp11 = qp_i(1, 1)*(tij_abcd(1, 1, 1, 1)*qp_j(1, 1) + &
1966 tij_abcd(2, 1, 1, 1)*qp_j(2, 1) + &
1967 tij_abcd(3, 1, 1, 1)*qp_j(3, 1) + &
1968 tij_abcd(1, 2, 1, 1)*qp_j(1, 2) + &
1969 tij_abcd(2, 2, 1, 1)*qp_j(2, 2) + &
1970 tij_abcd(3, 2, 1, 1)*qp_j(3, 2) + &
1971 tij_abcd(1, 3, 1, 1)*qp_j(1, 3) + &
1972 tij_abcd(2, 3, 1, 1)*qp_j(2, 3) + &
1973 tij_abcd(3, 3, 1, 1)*qp_j(3, 3))
1974 tmp21 = qp_i(2, 1)*(tij_abcd(1, 1, 1, 2)*qp_j(1, 1) + &
1975 tij_abcd(2, 1, 1, 2)*qp_j(2, 1) + &
1976 tij_abcd(3, 1, 1, 2)*qp_j(3, 1) + &
1977 tij_abcd(1, 2, 1, 2)*qp_j(1, 2) + &
1978 tij_abcd(2, 2, 1, 2)*qp_j(2, 2) + &
1979 tij_abcd(3, 2, 1, 2)*qp_j(3, 2) + &
1980 tij_abcd(1, 3, 1, 2)*qp_j(1, 3) + &
1981 tij_abcd(2, 3, 1, 2)*qp_j(2, 3) + &
1982 tij_abcd(3, 3, 1, 2)*qp_j(3, 3))
1983 tmp31 = qp_i(3, 1)*(tij_abcd(1, 1, 1, 3)*qp_j(1, 1) + &
1984 tij_abcd(2, 1, 1, 3)*qp_j(2, 1) + &
1985 tij_abcd(3, 1, 1, 3)*qp_j(3, 1) + &
1986 tij_abcd(1, 2, 1, 3)*qp_j(1, 2) + &
1987 tij_abcd(2, 2, 1, 3)*qp_j(2, 2) + &
1988 tij_abcd(3, 2, 1, 3)*qp_j(3, 2) + &
1989 tij_abcd(1, 3, 1, 3)*qp_j(1, 3) + &
1990 tij_abcd(2, 3, 1, 3)*qp_j(2, 3) + &
1991 tij_abcd(3, 3, 1, 3)*qp_j(3, 3))
1992 tmp22 = qp_i(2, 2)*(tij_abcd(1, 1, 2, 2)*qp_j(1, 1) + &
1993 tij_abcd(2, 1, 2, 2)*qp_j(2, 1) + &
1994 tij_abcd(3, 1, 2, 2)*qp_j(3, 1) + &
1995 tij_abcd(1, 2, 2, 2)*qp_j(1, 2) + &
1996 tij_abcd(2, 2, 2, 2)*qp_j(2, 2) + &
1997 tij_abcd(3, 2, 2, 2)*qp_j(3, 2) + &
1998 tij_abcd(1, 3, 2, 2)*qp_j(1, 3) + &
1999 tij_abcd(2, 3, 2, 2)*qp_j(2, 3) + &
2000 tij_abcd(3, 3, 2, 2)*qp_j(3, 3))
2001 tmp32 = qp_i(3, 2)*(tij_abcd(1, 1, 2, 3)*qp_j(1, 1) + &
2002 tij_abcd(2, 1, 2, 3)*qp_j(2, 1) + &
2003 tij_abcd(3, 1, 2, 3)*qp_j(3, 1) + &
2004 tij_abcd(1, 2, 2, 3)*qp_j(1, 2) + &
2005 tij_abcd(2, 2, 2, 3)*qp_j(2, 2) + &
2006 tij_abcd(3, 2, 2, 3)*qp_j(3, 2) + &
2007 tij_abcd(1, 3, 2, 3)*qp_j(1, 3) + &
2008 tij_abcd(2, 3, 2, 3)*qp_j(2, 3) + &
2009 tij_abcd(3, 3, 2, 3)*qp_j(3, 3))
2010 tmp33 = qp_i(3, 3)*(tij_abcd(1, 1, 3, 3)*qp_j(1, 1) + &
2011 tij_abcd(2, 1, 3, 3)*qp_j(2, 1) + &
2012 tij_abcd(3, 1, 3, 3)*qp_j(3, 1) + &
2013 tij_abcd(1, 2, 3, 3)*qp_j(1, 2) + &
2014 tij_abcd(2, 2, 3, 3)*qp_j(2, 2) + &
2015 tij_abcd(3, 2, 3, 3)*qp_j(3, 2) + &
2016 tij_abcd(1, 3, 3, 3)*qp_j(1, 3) + &
2017 tij_abcd(2, 3, 3, 3)*qp_j(2, 3) + &
2018 tij_abcd(3, 3, 3, 3)*qp_j(3, 3))
2022 tmp = tmp11 + tmp12 + tmp13 + &
2023 tmp21 + tmp22 + tmp23 + &
2024 tmp31 + tmp32 + tmp33
2026 eloc = eloc +
fac*tmp
2028 IF (do_forces .OR. do_stress)
THEN
2030 tmp11 = qp_i(1, 1)*(tij_abcde(1, 1, 1, 1, k)*qp_j(1, 1) + &
2031 tij_abcde(2, 1, 1, 1, k)*qp_j(2, 1) + &
2032 tij_abcde(3, 1, 1, 1, k)*qp_j(3, 1) + &
2033 tij_abcde(1, 2, 1, 1, k)*qp_j(1, 2) + &
2034 tij_abcde(2, 2, 1, 1, k)*qp_j(2, 2) + &
2035 tij_abcde(3, 2, 1, 1, k)*qp_j(3, 2) + &
2036 tij_abcde(1, 3, 1, 1, k)*qp_j(1, 3) + &
2037 tij_abcde(2, 3, 1, 1, k)*qp_j(2, 3) + &
2038 tij_abcde(3, 3, 1, 1, k)*qp_j(3, 3))
2039 tmp21 = qp_i(2, 1)*(tij_abcde(1, 1, 2, 1, k)*qp_j(1, 1) + &
2040 tij_abcde(2, 1, 2, 1, k)*qp_j(2, 1) + &
2041 tij_abcde(3, 1, 2, 1, k)*qp_j(3, 1) + &
2042 tij_abcde(1, 2, 2, 1, k)*qp_j(1, 2) + &
2043 tij_abcde(2, 2, 2, 1, k)*qp_j(2, 2) + &
2044 tij_abcde(3, 2, 2, 1, k)*qp_j(3, 2) + &
2045 tij_abcde(1, 3, 2, 1, k)*qp_j(1, 3) + &
2046 tij_abcde(2, 3, 2, 1, k)*qp_j(2, 3) + &
2047 tij_abcde(3, 3, 2, 1, k)*qp_j(3, 3))
2048 tmp31 = qp_i(3, 1)*(tij_abcde(1, 1, 3, 1, k)*qp_j(1, 1) + &
2049 tij_abcde(2, 1, 3, 1, k)*qp_j(2, 1) + &
2050 tij_abcde(3, 1, 3, 1, k)*qp_j(3, 1) + &
2051 tij_abcde(1, 2, 3, 1, k)*qp_j(1, 2) + &
2052 tij_abcde(2, 2, 3, 1, k)*qp_j(2, 2) + &
2053 tij_abcde(3, 2, 3, 1, k)*qp_j(3, 2) + &
2054 tij_abcde(1, 3, 3, 1, k)*qp_j(1, 3) + &
2055 tij_abcde(2, 3, 3, 1, k)*qp_j(2, 3) + &
2056 tij_abcde(3, 3, 3, 1, k)*qp_j(3, 3))
2057 tmp22 = qp_i(2, 2)*(tij_abcde(1, 1, 2, 2, k)*qp_j(1, 1) + &
2058 tij_abcde(2, 1, 2, 2, k)*qp_j(2, 1) + &
2059 tij_abcde(3, 1, 2, 2, k)*qp_j(3, 1) + &
2060 tij_abcde(1, 2, 2, 2, k)*qp_j(1, 2) + &
2061 tij_abcde(2, 2, 2, 2, k)*qp_j(2, 2) + &
2062 tij_abcde(3, 2, 2, 2, k)*qp_j(3, 2) + &
2063 tij_abcde(1, 3, 2, 2, k)*qp_j(1, 3) + &
2064 tij_abcde(2, 3, 2, 2, k)*qp_j(2, 3) + &
2065 tij_abcde(3, 3, 2, 2, k)*qp_j(3, 3))
2066 tmp32 = qp_i(3, 2)*(tij_abcde(1, 1, 3, 2, k)*qp_j(1, 1) + &
2067 tij_abcde(2, 1, 3, 2, k)*qp_j(2, 1) + &
2068 tij_abcde(3, 1, 3, 2, k)*qp_j(3, 1) + &
2069 tij_abcde(1, 2, 3, 2, k)*qp_j(1, 2) + &
2070 tij_abcde(2, 2, 3, 2, k)*qp_j(2, 2) + &
2071 tij_abcde(3, 2, 3, 2, k)*qp_j(3, 2) + &
2072 tij_abcde(1, 3, 3, 2, k)*qp_j(1, 3) + &
2073 tij_abcde(2, 3, 3, 2, k)*qp_j(2, 3) + &
2074 tij_abcde(3, 3, 3, 2, k)*qp_j(3, 3))
2075 tmp33 = qp_i(3, 3)*(tij_abcde(1, 1, 3, 3, k)*qp_j(1, 1) + &
2076 tij_abcde(2, 1, 3, 3, k)*qp_j(2, 1) + &
2077 tij_abcde(3, 1, 3, 3, k)*qp_j(3, 1) + &
2078 tij_abcde(1, 2, 3, 3, k)*qp_j(1, 2) + &
2079 tij_abcde(2, 2, 3, 3, k)*qp_j(2, 2) + &
2080 tij_abcde(3, 2, 3, 3, k)*qp_j(3, 2) + &
2081 tij_abcde(1, 3, 3, 3, k)*qp_j(1, 3) + &
2082 tij_abcde(2, 3, 3, 3, k)*qp_j(2, 3) + &
2083 tij_abcde(3, 3, 3, 3, k)*qp_j(3, 3))
2087 fr(k) = fr(k) -
fac*(tmp11 + tmp12 + tmp13 + &
2088 tmp21 + tmp22 + tmp23 + &
2089 tmp31 + tmp32 + tmp33)
2096 IF (do_efield0)
THEN
2097 ef0_i = ef0_i +
fac*(tij_ab(1, 1)*qp_j(1, 1) + &
2098 tij_ab(2, 1)*qp_j(2, 1) + &
2099 tij_ab(3, 1)*qp_j(3, 1) + &
2100 tij_ab(1, 2)*qp_j(1, 2) + &
2101 tij_ab(2, 2)*qp_j(2, 2) + &
2102 tij_ab(3, 2)*qp_j(3, 2) + &
2103 tij_ab(1, 3)*qp_j(1, 3) + &
2104 tij_ab(2, 3)*qp_j(2, 3) + &
2105 tij_ab(3, 3)*qp_j(3, 3))
2107 ef0_j = ef0_j +
fac*(tij_ab(1, 1)*qp_i(1, 1) + &
2108 tij_ab(2, 1)*qp_i(2, 1) + &
2109 tij_ab(3, 1)*qp_i(3, 1) + &
2110 tij_ab(1, 2)*qp_i(1, 2) + &
2111 tij_ab(2, 2)*qp_i(2, 2) + &
2112 tij_ab(3, 2)*qp_i(3, 2) + &
2113 tij_ab(1, 3)*qp_i(1, 3) + &
2114 tij_ab(2, 3)*qp_i(2, 3) + &
2115 tij_ab(3, 3)*qp_i(3, 3))
2118 IF (do_efield1)
THEN
2119 ef1_i(1) = ef1_i(1) -
fac*(tij_abc(1, 1, 1)*qp_j(1, 1) + &
2120 tij_abc(2, 1, 1)*qp_j(2, 1) + &
2121 tij_abc(3, 1, 1)*qp_j(3, 1) + &
2122 tij_abc(1, 2, 1)*qp_j(1, 2) + &
2123 tij_abc(2, 2, 1)*qp_j(2, 2) + &
2124 tij_abc(3, 2, 1)*qp_j(3, 2) + &
2125 tij_abc(1, 3, 1)*qp_j(1, 3) + &
2126 tij_abc(2, 3, 1)*qp_j(2, 3) + &
2127 tij_abc(3, 3, 1)*qp_j(3, 3))
2128 ef1_i(2) = ef1_i(2) -
fac*(tij_abc(1, 1, 2)*qp_j(1, 1) + &
2129 tij_abc(2, 1, 2)*qp_j(2, 1) + &
2130 tij_abc(3, 1, 2)*qp_j(3, 1) + &
2131 tij_abc(1, 2, 2)*qp_j(1, 2) + &
2132 tij_abc(2, 2, 2)*qp_j(2, 2) + &
2133 tij_abc(3, 2, 2)*qp_j(3, 2) + &
2134 tij_abc(1, 3, 2)*qp_j(1, 3) + &
2135 tij_abc(2, 3, 2)*qp_j(2, 3) + &
2136 tij_abc(3, 3, 2)*qp_j(3, 3))
2137 ef1_i(3) = ef1_i(3) -
fac*(tij_abc(1, 1, 3)*qp_j(1, 1) + &
2138 tij_abc(2, 1, 3)*qp_j(2, 1) + &
2139 tij_abc(3, 1, 3)*qp_j(3, 1) + &
2140 tij_abc(1, 2, 3)*qp_j(1, 2) + &
2141 tij_abc(2, 2, 3)*qp_j(2, 2) + &
2142 tij_abc(3, 2, 3)*qp_j(3, 2) + &
2143 tij_abc(1, 3, 3)*qp_j(1, 3) + &
2144 tij_abc(2, 3, 3)*qp_j(2, 3) + &
2145 tij_abc(3, 3, 3)*qp_j(3, 3))
2147 ef1_j(1) = ef1_j(1) +
fac*(tij_abc(1, 1, 1)*qp_i(1, 1) + &
2148 tij_abc(2, 1, 1)*qp_i(2, 1) + &
2149 tij_abc(3, 1, 1)*qp_i(3, 1) + &
2150 tij_abc(1, 2, 1)*qp_i(1, 2) + &
2151 tij_abc(2, 2, 1)*qp_i(2, 2) + &
2152 tij_abc(3, 2, 1)*qp_i(3, 2) + &
2153 tij_abc(1, 3, 1)*qp_i(1, 3) + &
2154 tij_abc(2, 3, 1)*qp_i(2, 3) + &
2155 tij_abc(3, 3, 1)*qp_i(3, 3))
2156 ef1_j(2) = ef1_j(2) +
fac*(tij_abc(1, 1, 2)*qp_i(1, 1) + &
2157 tij_abc(2, 1, 2)*qp_i(2, 1) + &
2158 tij_abc(3, 1, 2)*qp_i(3, 1) + &
2159 tij_abc(1, 2, 2)*qp_i(1, 2) + &
2160 tij_abc(2, 2, 2)*qp_i(2, 2) + &
2161 tij_abc(3, 2, 2)*qp_i(3, 2) + &
2162 tij_abc(1, 3, 2)*qp_i(1, 3) + &
2163 tij_abc(2, 3, 2)*qp_i(2, 3) + &
2164 tij_abc(3, 3, 2)*qp_i(3, 3))
2165 ef1_j(3) = ef1_j(3) +
fac*(tij_abc(1, 1, 3)*qp_i(1, 1) + &
2166 tij_abc(2, 1, 3)*qp_i(2, 1) + &
2167 tij_abc(3, 1, 3)*qp_i(3, 1) + &
2168 tij_abc(1, 2, 3)*qp_i(1, 2) + &
2169 tij_abc(2, 2, 3)*qp_i(2, 2) + &
2170 tij_abc(3, 2, 3)*qp_i(3, 2) + &
2171 tij_abc(1, 3, 3)*qp_i(1, 3) + &
2172 tij_abc(2, 3, 3)*qp_i(2, 3) + &
2173 tij_abc(3, 3, 3)*qp_i(3, 3))
2176 IF (do_efield2)
THEN
2177 tmp11 =
fac*(tij_abcd(1, 1, 1, 1)*qp_j(1, 1) + &
2178 tij_abcd(2, 1, 1, 1)*qp_j(2, 1) + &
2179 tij_abcd(3, 1, 1, 1)*qp_j(3, 1) + &
2180 tij_abcd(1, 2, 1, 1)*qp_j(1, 2) + &
2181 tij_abcd(2, 2, 1, 1)*qp_j(2, 2) + &
2182 tij_abcd(3, 2, 1, 1)*qp_j(3, 2) + &
2183 tij_abcd(1, 3, 1, 1)*qp_j(1, 3) + &
2184 tij_abcd(2, 3, 1, 1)*qp_j(2, 3) + &
2185 tij_abcd(3, 3, 1, 1)*qp_j(3, 3))
2186 tmp12 =
fac*(tij_abcd(1, 1, 1, 2)*qp_j(1, 1) + &
2187 tij_abcd(2, 1, 1, 2)*qp_j(2, 1) + &
2188 tij_abcd(3, 1, 1, 2)*qp_j(3, 1) + &
2189 tij_abcd(1, 2, 1, 2)*qp_j(1, 2) + &
2190 tij_abcd(2, 2, 1, 2)*qp_j(2, 2) + &
2191 tij_abcd(3, 2, 1, 2)*qp_j(3, 2) + &
2192 tij_abcd(1, 3, 1, 2)*qp_j(1, 3) + &
2193 tij_abcd(2, 3, 1, 2)*qp_j(2, 3) + &
2194 tij_abcd(3, 3, 1, 2)*qp_j(3, 3))
2195 tmp13 =
fac*(tij_abcd(1, 1, 1, 3)*qp_j(1, 1) + &
2196 tij_abcd(2, 1, 1, 3)*qp_j(2, 1) + &
2197 tij_abcd(3, 1, 1, 3)*qp_j(3, 1) + &
2198 tij_abcd(1, 2, 1, 3)*qp_j(1, 2) + &
2199 tij_abcd(2, 2, 1, 3)*qp_j(2, 2) + &
2200 tij_abcd(3, 2, 1, 3)*qp_j(3, 2) + &
2201 tij_abcd(1, 3, 1, 3)*qp_j(1, 3) + &
2202 tij_abcd(2, 3, 1, 3)*qp_j(2, 3) + &
2203 tij_abcd(3, 3, 1, 3)*qp_j(3, 3))
2204 tmp22 =
fac*(tij_abcd(1, 1, 2, 2)*qp_j(1, 1) + &
2205 tij_abcd(2, 1, 2, 2)*qp_j(2, 1) + &
2206 tij_abcd(3, 1, 2, 2)*qp_j(3, 1) + &
2207 tij_abcd(1, 2, 2, 2)*qp_j(1, 2) + &
2208 tij_abcd(2, 2, 2, 2)*qp_j(2, 2) + &
2209 tij_abcd(3, 2, 2, 2)*qp_j(3, 2) + &
2210 tij_abcd(1, 3, 2, 2)*qp_j(1, 3) + &
2211 tij_abcd(2, 3, 2, 2)*qp_j(2, 3) + &
2212 tij_abcd(3, 3, 2, 2)*qp_j(3, 3))
2213 tmp23 =
fac*(tij_abcd(1, 1, 2, 3)*qp_j(1, 1) + &
2214 tij_abcd(2, 1, 2, 3)*qp_j(2, 1) + &
2215 tij_abcd(3, 1, 2, 3)*qp_j(3, 1) + &
2216 tij_abcd(1, 2, 2, 3)*qp_j(1, 2) + &
2217 tij_abcd(2, 2, 2, 3)*qp_j(2, 2) + &
2218 tij_abcd(3, 2, 2, 3)*qp_j(3, 2) + &
2219 tij_abcd(1, 3, 2, 3)*qp_j(1, 3) + &
2220 tij_abcd(2, 3, 2, 3)*qp_j(2, 3) + &
2221 tij_abcd(3, 3, 2, 3)*qp_j(3, 3))
2222 tmp33 =
fac*(tij_abcd(1, 1, 3, 3)*qp_j(1, 1) + &
2223 tij_abcd(2, 1, 3, 3)*qp_j(2, 1) + &
2224 tij_abcd(3, 1, 3, 3)*qp_j(3, 1) + &
2225 tij_abcd(1, 2, 3, 3)*qp_j(1, 2) + &
2226 tij_abcd(2, 2, 3, 3)*qp_j(2, 2) + &
2227 tij_abcd(3, 2, 3, 3)*qp_j(3, 2) + &
2228 tij_abcd(1, 3, 3, 3)*qp_j(1, 3) + &
2229 tij_abcd(2, 3, 3, 3)*qp_j(2, 3) + &
2230 tij_abcd(3, 3, 3, 3)*qp_j(3, 3))
2232 ef2_i(1, 1) = ef2_i(1, 1) - tmp11
2233 ef2_i(1, 2) = ef2_i(1, 2) - tmp12
2234 ef2_i(1, 3) = ef2_i(1, 3) - tmp13
2235 ef2_i(2, 1) = ef2_i(2, 1) - tmp12
2236 ef2_i(2, 2) = ef2_i(2, 2) - tmp22
2237 ef2_i(2, 3) = ef2_i(2, 3) - tmp23
2238 ef2_i(3, 1) = ef2_i(3, 1) - tmp13
2239 ef2_i(3, 2) = ef2_i(3, 2) - tmp23
2240 ef2_i(3, 3) = ef2_i(3, 3) - tmp33
2242 tmp11 =
fac*(tij_abcd(1, 1, 1, 1)*qp_i(1, 1) + &
2243 tij_abcd(2, 1, 1, 1)*qp_i(2, 1) + &
2244 tij_abcd(3, 1, 1, 1)*qp_i(3, 1) + &
2245 tij_abcd(1, 2, 1, 1)*qp_i(1, 2) + &
2246 tij_abcd(2, 2, 1, 1)*qp_i(2, 2) + &
2247 tij_abcd(3, 2, 1, 1)*qp_i(3, 2) + &
2248 tij_abcd(1, 3, 1, 1)*qp_i(1, 3) + &
2249 tij_abcd(2, 3, 1, 1)*qp_i(2, 3) + &
2250 tij_abcd(3, 3, 1, 1)*qp_i(3, 3))
2251 tmp12 =
fac*(tij_abcd(1, 1, 1, 2)*qp_i(1, 1) + &
2252 tij_abcd(2, 1, 1, 2)*qp_i(2, 1) + &
2253 tij_abcd(3, 1, 1, 2)*qp_i(3, 1) + &
2254 tij_abcd(1, 2, 1, 2)*qp_i(1, 2) + &
2255 tij_abcd(2, 2, 1, 2)*qp_i(2, 2) + &
2256 tij_abcd(3, 2, 1, 2)*qp_i(3, 2) + &
2257 tij_abcd(1, 3, 1, 2)*qp_i(1, 3) + &
2258 tij_abcd(2, 3, 1, 2)*qp_i(2, 3) + &
2259 tij_abcd(3, 3, 1, 2)*qp_i(3, 3))
2260 tmp13 =
fac*(tij_abcd(1, 1, 1, 3)*qp_i(1, 1) + &
2261 tij_abcd(2, 1, 1, 3)*qp_i(2, 1) + &
2262 tij_abcd(3, 1, 1, 3)*qp_i(3, 1) + &
2263 tij_abcd(1, 2, 1, 3)*qp_i(1, 2) + &
2264 tij_abcd(2, 2, 1, 3)*qp_i(2, 2) + &
2265 tij_abcd(3, 2, 1, 3)*qp_i(3, 2) + &
2266 tij_abcd(1, 3, 1, 3)*qp_i(1, 3) + &
2267 tij_abcd(2, 3, 1, 3)*qp_i(2, 3) + &
2268 tij_abcd(3, 3, 1, 3)*qp_i(3, 3))
2269 tmp22 =
fac*(tij_abcd(1, 1, 2, 2)*qp_i(1, 1) + &
2270 tij_abcd(2, 1, 2, 2)*qp_i(2, 1) + &
2271 tij_abcd(3, 1, 2, 2)*qp_i(3, 1) + &
2272 tij_abcd(1, 2, 2, 2)*qp_i(1, 2) + &
2273 tij_abcd(2, 2, 2, 2)*qp_i(2, 2) + &
2274 tij_abcd(3, 2, 2, 2)*qp_i(3, 2) + &
2275 tij_abcd(1, 3, 2, 2)*qp_i(1, 3) + &
2276 tij_abcd(2, 3, 2, 2)*qp_i(2, 3) + &
2277 tij_abcd(3, 3, 2, 2)*qp_i(3, 3))
2278 tmp23 =
fac*(tij_abcd(1, 1, 2, 3)*qp_i(1, 1) + &
2279 tij_abcd(2, 1, 2, 3)*qp_i(2, 1) + &
2280 tij_abcd(3, 1, 2, 3)*qp_i(3, 1) + &
2281 tij_abcd(1, 2, 2, 3)*qp_i(1, 2) + &
2282 tij_abcd(2, 2, 2, 3)*qp_i(2, 2) + &
2283 tij_abcd(3, 2, 2, 3)*qp_i(3, 2) + &
2284 tij_abcd(1, 3, 2, 3)*qp_i(1, 3) + &
2285 tij_abcd(2, 3, 2, 3)*qp_i(2, 3) + &
2286 tij_abcd(3, 3, 2, 3)*qp_i(3, 3))
2287 tmp33 =
fac*(tij_abcd(1, 1, 3, 3)*qp_i(1, 1) + &
2288 tij_abcd(2, 1, 3, 3)*qp_i(2, 1) + &
2289 tij_abcd(3, 1, 3, 3)*qp_i(3, 1) + &
2290 tij_abcd(1, 2, 3, 3)*qp_i(1, 2) + &
2291 tij_abcd(2, 2, 3, 3)*qp_i(2, 2) + &
2292 tij_abcd(3, 2, 3, 3)*qp_i(3, 2) + &
2293 tij_abcd(1, 3, 3, 3)*qp_i(1, 3) + &
2294 tij_abcd(2, 3, 3, 3)*qp_i(2, 3) + &
2295 tij_abcd(3, 3, 3, 3)*qp_i(3, 3))
2297 ef2_j(1, 1) = ef2_j(1, 1) - tmp11
2298 ef2_j(1, 2) = ef2_j(1, 2) - tmp12
2299 ef2_j(1, 3) = ef2_j(1, 3) - tmp13
2300 ef2_j(2, 1) = ef2_j(2, 1) - tmp12
2301 ef2_j(2, 2) = ef2_j(2, 2) - tmp22
2302 ef2_j(2, 3) = ef2_j(2, 3) - tmp23
2303 ef2_j(3, 1) = ef2_j(3, 1) - tmp13
2304 ef2_j(3, 2) = ef2_j(3, 2) - tmp23
2305 ef2_j(3, 3) = ef2_j(3, 3) - tmp33
2309 IF (task(3, 2))
THEN
2313 tmp_ij = dp_i(1)*(tij_abc(1, 1, 1)*qp_j(1, 1) + &
2314 tij_abc(2, 1, 1)*qp_j(2, 1) + &
2315 tij_abc(3, 1, 1)*qp_j(3, 1) + &
2316 tij_abc(1, 2, 1)*qp_j(1, 2) + &
2317 tij_abc(2, 2, 1)*qp_j(2, 2) + &
2318 tij_abc(3, 2, 1)*qp_j(3, 2) + &
2319 tij_abc(1, 3, 1)*qp_j(1, 3) + &
2320 tij_abc(2, 3, 1)*qp_j(2, 3) + &
2321 tij_abc(3, 3, 1)*qp_j(3, 3)) + &
2322 dp_i(2)*(tij_abc(1, 1, 2)*qp_j(1, 1) + &
2323 tij_abc(2, 1, 2)*qp_j(2, 1) + &
2324 tij_abc(3, 1, 2)*qp_j(3, 1) + &
2325 tij_abc(1, 2, 2)*qp_j(1, 2) + &
2326 tij_abc(2, 2, 2)*qp_j(2, 2) + &
2327 tij_abc(3, 2, 2)*qp_j(3, 2) + &
2328 tij_abc(1, 3, 2)*qp_j(1, 3) + &
2329 tij_abc(2, 3, 2)*qp_j(2, 3) + &
2330 tij_abc(3, 3, 2)*qp_j(3, 3)) + &
2331 dp_i(3)*(tij_abc(1, 1, 3)*qp_j(1, 1) + &
2332 tij_abc(2, 1, 3)*qp_j(2, 1) + &
2333 tij_abc(3, 1, 3)*qp_j(3, 1) + &
2334 tij_abc(1, 2, 3)*qp_j(1, 2) + &
2335 tij_abc(2, 2, 3)*qp_j(2, 2) + &
2336 tij_abc(3, 2, 3)*qp_j(3, 2) + &
2337 tij_abc(1, 3, 3)*qp_j(1, 3) + &
2338 tij_abc(2, 3, 3)*qp_j(2, 3) + &
2339 tij_abc(3, 3, 3)*qp_j(3, 3))
2342 tmp_ji = dp_j(1)*(tij_abc(1, 1, 1)*qp_i(1, 1) + &
2343 tij_abc(2, 1, 1)*qp_i(2, 1) + &
2344 tij_abc(3, 1, 1)*qp_i(3, 1) + &
2345 tij_abc(1, 2, 1)*qp_i(1, 2) + &
2346 tij_abc(2, 2, 1)*qp_i(2, 2) + &
2347 tij_abc(3, 2, 1)*qp_i(3, 2) + &
2348 tij_abc(1, 3, 1)*qp_i(1, 3) + &
2349 tij_abc(2, 3, 1)*qp_i(2, 3) + &
2350 tij_abc(3, 3, 1)*qp_i(3, 3)) + &
2351 dp_j(2)*(tij_abc(1, 1, 2)*qp_i(1, 1) + &
2352 tij_abc(2, 1, 2)*qp_i(2, 1) + &
2353 tij_abc(3, 1, 2)*qp_i(3, 1) + &
2354 tij_abc(1, 2, 2)*qp_i(1, 2) + &
2355 tij_abc(2, 2, 2)*qp_i(2, 2) + &
2356 tij_abc(3, 2, 2)*qp_i(3, 2) + &
2357 tij_abc(1, 3, 2)*qp_i(1, 3) + &
2358 tij_abc(2, 3, 2)*qp_i(2, 3) + &
2359 tij_abc(3, 3, 2)*qp_i(3, 3)) + &
2360 dp_j(3)*(tij_abc(1, 1, 3)*qp_i(1, 1) + &
2361 tij_abc(2, 1, 3)*qp_i(2, 1) + &
2362 tij_abc(3, 1, 3)*qp_i(3, 1) + &
2363 tij_abc(1, 2, 3)*qp_i(1, 2) + &
2364 tij_abc(2, 2, 3)*qp_i(2, 2) + &
2365 tij_abc(3, 2, 3)*qp_i(3, 2) + &
2366 tij_abc(1, 3, 3)*qp_i(1, 3) + &
2367 tij_abc(2, 3, 3)*qp_i(2, 3) + &
2368 tij_abc(3, 3, 3)*qp_i(3, 3))
2370 tmp =
fac*(tmp_ij - tmp_ji)
2372 IF (do_forces .OR. do_stress)
THEN
2375 tmp_ij = dp_i(1)*(tij_abcd(1, 1, 1, k)*qp_j(1, 1) + &
2376 tij_abcd(2, 1, 1, k)*qp_j(2, 1) + &
2377 tij_abcd(3, 1, 1, k)*qp_j(3, 1) + &
2378 tij_abcd(1, 2, 1, k)*qp_j(1, 2) + &
2379 tij_abcd(2, 2, 1, k)*qp_j(2, 2) + &
2380 tij_abcd(3, 2, 1, k)*qp_j(3, 2) + &
2381 tij_abcd(1, 3, 1, k)*qp_j(1, 3) + &
2382 tij_abcd(2, 3, 1, k)*qp_j(2, 3) + &
2383 tij_abcd(3, 3, 1, k)*qp_j(3, 3)) + &
2384 dp_i(2)*(tij_abcd(1, 1, 2, k)*qp_j(1, 1) + &
2385 tij_abcd(2, 1, 2, k)*qp_j(2, 1) + &
2386 tij_abcd(3, 1, 2, k)*qp_j(3, 1) + &
2387 tij_abcd(1, 2, 2, k)*qp_j(1, 2) + &
2388 tij_abcd(2, 2, 2, k)*qp_j(2, 2) + &
2389 tij_abcd(3, 2, 2, k)*qp_j(3, 2) + &
2390 tij_abcd(1, 3, 2, k)*qp_j(1, 3) + &
2391 tij_abcd(2, 3, 2, k)*qp_j(2, 3) + &
2392 tij_abcd(3, 3, 2, k)*qp_j(3, 3)) + &
2393 dp_i(3)*(tij_abcd(1, 1, 3, k)*qp_j(1, 1) + &
2394 tij_abcd(2, 1, 3, k)*qp_j(2, 1) + &
2395 tij_abcd(3, 1, 3, k)*qp_j(3, 1) + &
2396 tij_abcd(1, 2, 3, k)*qp_j(1, 2) + &
2397 tij_abcd(2, 2, 3, k)*qp_j(2, 2) + &
2398 tij_abcd(3, 2, 3, k)*qp_j(3, 2) + &
2399 tij_abcd(1, 3, 3, k)*qp_j(1, 3) + &
2400 tij_abcd(2, 3, 3, k)*qp_j(2, 3) + &
2401 tij_abcd(3, 3, 3, k)*qp_j(3, 3))
2404 tmp_ji = dp_j(1)*(tij_abcd(1, 1, 1, k)*qp_i(1, 1) + &
2405 tij_abcd(2, 1, 1, k)*qp_i(2, 1) + &
2406 tij_abcd(3, 1, 1, k)*qp_i(3, 1) + &
2407 tij_abcd(1, 2, 1, k)*qp_i(1, 2) + &
2408 tij_abcd(2, 2, 1, k)*qp_i(2, 2) + &
2409 tij_abcd(3, 2, 1, k)*qp_i(3, 2) + &
2410 tij_abcd(1, 3, 1, k)*qp_i(1, 3) + &
2411 tij_abcd(2, 3, 1, k)*qp_i(2, 3) + &
2412 tij_abcd(3, 3, 1, k)*qp_i(3, 3)) + &
2413 dp_j(2)*(tij_abcd(1, 1, 2, k)*qp_i(1, 1) + &
2414 tij_abcd(2, 1, 2, k)*qp_i(2, 1) + &
2415 tij_abcd(3, 1, 2, k)*qp_i(3, 1) + &
2416 tij_abcd(1, 2, 2, k)*qp_i(1, 2) + &
2417 tij_abcd(2, 2, 2, k)*qp_i(2, 2) + &
2418 tij_abcd(3, 2, 2, k)*qp_i(3, 2) + &
2419 tij_abcd(1, 3, 2, k)*qp_i(1, 3) + &
2420 tij_abcd(2, 3, 2, k)*qp_i(2, 3) + &
2421 tij_abcd(3, 3, 2, k)*qp_i(3, 3)) + &
2422 dp_j(3)*(tij_abcd(1, 1, 3, k)*qp_i(1, 1) + &
2423 tij_abcd(2, 1, 3, k)*qp_i(2, 1) + &
2424 tij_abcd(3, 1, 3, k)*qp_i(3, 1) + &
2425 tij_abcd(1, 2, 3, k)*qp_i(1, 2) + &
2426 tij_abcd(2, 2, 3, k)*qp_i(2, 2) + &
2427 tij_abcd(3, 2, 3, k)*qp_i(3, 2) + &
2428 tij_abcd(1, 3, 3, k)*qp_i(1, 3) + &
2429 tij_abcd(2, 3, 3, k)*qp_i(2, 3) + &
2430 tij_abcd(3, 3, 3, k)*qp_i(3, 3))
2432 fr(k) = fr(k) -
fac*(tmp_ij - tmp_ji)
2436 IF (task(3, 1))
THEN
2441 tmp_ij = ch_i*(tij_ab(1, 1)*qp_j(1, 1) + &
2442 tij_ab(2, 1)*qp_j(2, 1) + &
2443 tij_ab(3, 1)*qp_j(3, 1) + &
2444 tij_ab(1, 2)*qp_j(1, 2) + &
2445 tij_ab(2, 2)*qp_j(2, 2) + &
2446 tij_ab(3, 2)*qp_j(3, 2) + &
2447 tij_ab(1, 3)*qp_j(1, 3) + &
2448 tij_ab(2, 3)*qp_j(2, 3) + &
2449 tij_ab(3, 3)*qp_j(3, 3))
2452 tmp_ji = ch_j*(tij_ab(1, 1)*qp_i(1, 1) + &
2453 tij_ab(2, 1)*qp_i(2, 1) + &
2454 tij_ab(3, 1)*qp_i(3, 1) + &
2455 tij_ab(1, 2)*qp_i(1, 2) + &
2456 tij_ab(2, 2)*qp_i(2, 2) + &
2457 tij_ab(3, 2)*qp_i(3, 2) + &
2458 tij_ab(1, 3)*qp_i(1, 3) + &
2459 tij_ab(2, 3)*qp_i(2, 3) + &
2460 tij_ab(3, 3)*qp_i(3, 3))
2462 eloc = eloc +
fac*(tmp_ij + tmp_ji)
2463 IF (do_forces .OR. do_stress)
THEN
2466 tmp_ij = ch_i*(tij_abc(1, 1, k)*qp_j(1, 1) + &
2467 tij_abc(2, 1, k)*qp_j(2, 1) + &
2468 tij_abc(3, 1, k)*qp_j(3, 1) + &
2469 tij_abc(1, 2, k)*qp_j(1, 2) + &
2470 tij_abc(2, 2, k)*qp_j(2, 2) + &
2471 tij_abc(3, 2, k)*qp_j(3, 2) + &
2472 tij_abc(1, 3, k)*qp_j(1, 3) + &
2473 tij_abc(2, 3, k)*qp_j(2, 3) + &
2474 tij_abc(3, 3, k)*qp_j(3, 3))
2477 tmp_ji = ch_j*(tij_abc(1, 1, k)*qp_i(1, 1) + &
2478 tij_abc(2, 1, k)*qp_i(2, 1) + &
2479 tij_abc(3, 1, k)*qp_i(3, 1) + &
2480 tij_abc(1, 2, k)*qp_i(1, 2) + &
2481 tij_abc(2, 2, k)*qp_i(2, 2) + &
2482 tij_abc(3, 2, k)*qp_i(3, 2) + &
2483 tij_abc(1, 3, k)*qp_i(1, 3) + &
2484 tij_abc(2, 3, k)*qp_i(2, 3) + &
2485 tij_abc(3, 3, k)*qp_i(3, 3))
2487 fr(k) = fr(k) -
fac*(tmp_ij + tmp_ji)
2491 energy = energy + eloc
2493 forces(1, atom_a) = forces(1, atom_a) - fr(1)
2494 forces(2, atom_a) = forces(2, atom_a) - fr(2)
2495 forces(3, atom_a) = forces(3, atom_a) - fr(3)
2496 forces(1, atom_b) = forces(1, atom_b) + fr(1)
2497 forces(2, atom_b) = forces(2, atom_b) + fr(2)
2498 forces(3, atom_b) = forces(3, atom_b) + fr(3)
2503 IF (do_efield0)
THEN
2504 efield0(atom_a) = efield0(atom_a) + ef0_j
2506 efield0(atom_b) = efield0(atom_b) + ef0_i
2509 IF (do_efield1)
THEN
2510 efield1(1, atom_a) = efield1(1, atom_a) + ef1_j(1)
2511 efield1(2, atom_a) = efield1(2, atom_a) + ef1_j(2)
2512 efield1(3, atom_a) = efield1(3, atom_a) + ef1_j(3)
2514 efield1(1, atom_b) = efield1(1, atom_b) + ef1_i(1)
2515 efield1(2, atom_b) = efield1(2, atom_b) + ef1_i(2)
2516 efield1(3, atom_b) = efield1(3, atom_b) + ef1_i(3)
2519 IF (do_efield2)
THEN
2520 efield2(1, atom_a) = efield2(1, atom_a) + ef2_j(1, 1)
2521 efield2(2, atom_a) = efield2(2, atom_a) + ef2_j(1, 2)
2522 efield2(3, atom_a) = efield2(3, atom_a) + ef2_j(1, 3)
2523 efield2(4, atom_a) = efield2(4, atom_a) + ef2_j(2, 1)
2524 efield2(5, atom_a) = efield2(5, atom_a) + ef2_j(2, 2)
2525 efield2(6, atom_a) = efield2(6, atom_a) + ef2_j(2, 3)
2526 efield2(7, atom_a) = efield2(7, atom_a) + ef2_j(3, 1)
2527 efield2(8, atom_a) = efield2(8, atom_a) + ef2_j(3, 2)
2528 efield2(9, atom_a) = efield2(9, atom_a) + ef2_j(3, 3)
2530 efield2(1, atom_b) = efield2(1, atom_b) + ef2_i(1, 1)
2531 efield2(2, atom_b) = efield2(2, atom_b) + ef2_i(1, 2)
2532 efield2(3, atom_b) = efield2(3, atom_b) + ef2_i(1, 3)
2533 efield2(4, atom_b) = efield2(4, atom_b) + ef2_i(2, 1)
2534 efield2(5, atom_b) = efield2(5, atom_b) + ef2_i(2, 2)
2535 efield2(6, atom_b) = efield2(6, atom_b) + ef2_i(2, 3)
2536 efield2(7, atom_b) = efield2(7, atom_b) + ef2_i(3, 1)
2537 efield2(8, atom_b) = efield2(8, atom_b) + ef2_i(3, 2)
2538 efield2(9, atom_b) = efield2(9, atom_b) + ef2_i(3, 3)
2542 ptens11 = ptens11 + rab(1)*fr(1)
2543 ptens21 = ptens21 + rab(2)*fr(1)
2544 ptens31 = ptens31 + rab(3)*fr(1)
2545 ptens12 = ptens12 + rab(1)*fr(2)
2546 ptens22 = ptens22 + rab(2)*fr(2)
2547 ptens32 = ptens32 + rab(3)*fr(2)
2548 ptens13 = ptens13 + rab(1)*fr(3)
2549 ptens23 = ptens23 + rab(2)*fr(3)
2550 ptens33 = ptens33 + rab(3)*fr(3)
2556 END DO kind_group_loop
2559 pv(1, 1) = pv(1, 1) + ptens11
2560 pv(1, 2) = pv(1, 2) + (ptens12 + ptens21)*0.5_dp
2561 pv(1, 3) = pv(1, 3) + (ptens13 + ptens31)*0.5_dp
2563 pv(2, 2) = pv(2, 2) + ptens22
2564 pv(2, 3) = pv(2, 3) + (ptens23 + ptens32)*0.5_dp
2567 pv(3, 3) = pv(3, 3) + ptens33
2570 CALL timestop(handle)
2571 END SUBROUTINE ewald_multipole_sr
2595 SUBROUTINE ewald_multipole_bonded(nonbond_env, particle_set, ewald_env, &
2596 cell, energy, task, do_forces, do_efield, do_stress, charges, &
2597 dipoles, quadrupoles, forces, pv, efield0, efield1, efield2)
2599 TYPE(fist_nonbond_env_type),
POINTER :: nonbond_env
2600 TYPE(particle_type),
POINTER :: particle_set(:)
2601 TYPE(ewald_environment_type),
POINTER :: ewald_env
2602 TYPE(cell_type),
POINTER :: cell
2603 REAL(kind=
dp),
INTENT(INOUT) :: energy
2604 LOGICAL,
DIMENSION(3, 3),
INTENT(IN) :: task
2605 LOGICAL,
INTENT(IN) :: do_forces, do_efield, do_stress
2606 REAL(kind=
dp),
DIMENSION(:),
OPTIONAL,
POINTER :: charges
2607 REAL(kind=
dp),
DIMENSION(:, :),
OPTIONAL,
POINTER :: dipoles
2608 REAL(kind=
dp),
DIMENSION(:, :, :),
OPTIONAL, &
2609 POINTER :: quadrupoles
2610 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(INOUT), &
2611 OPTIONAL :: forces, pv
2612 REAL(kind=
dp),
DIMENSION(:),
POINTER :: efield0
2613 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: efield1, efield2
2615 CHARACTER(len=*),
PARAMETER :: routinen =
'ewald_multipole_bonded'
2617 INTEGER :: a, atom_a, atom_b, b, c, d, e, handle, &
2618 i, iend, igrp, ilist, ipair, istart, &
2620 INTEGER,
DIMENSION(:, :),
POINTER ::
list
2621 LOGICAL :: do_efield0, do_efield1, do_efield2, &
2623 REAL(kind=
dp) :: alpha, ch_i, ch_j, ef0_i, ef0_j, eloc,
fac, fac_ij, ir, irab2, ptens11, &
2624 ptens12, ptens13, ptens21, ptens22, ptens23, ptens31, ptens32, ptens33, r, rab2, tij, &
2625 tmp, tmp1, tmp11, tmp12, tmp13, tmp2, tmp21, tmp22, tmp23, tmp31, tmp32, tmp33, tmp_ij, &
2627 REAL(kind=
dp),
DIMENSION(0:5) :: f
2628 REAL(kind=
dp),
DIMENSION(3) :: dp_i, dp_j, ef1_i, ef1_j, fr, rab, tij_a
2629 REAL(kind=
dp),
DIMENSION(3, 3) :: ef2_i, ef2_j, qp_i, qp_j, tij_ab
2630 REAL(kind=
dp),
DIMENSION(3, 3, 3) :: tij_abc
2631 REAL(kind=
dp),
DIMENSION(3, 3, 3, 3) :: tij_abcd
2632 REAL(kind=
dp),
DIMENSION(3, 3, 3, 3, 3) :: tij_abcde
2633 TYPE(fist_neighbor_type),
POINTER :: nonbonded
2634 TYPE(neighbor_kind_pairs_type),
POINTER :: neighbor_kind_pair
2636 CALL timeset(routinen, handle)
2637 do_efield0 = do_efield .AND.
ASSOCIATED(efield0)
2638 do_efield1 = do_efield .AND.
ASSOCIATED(efield1)
2639 do_efield2 = do_efield .AND.
ASSOCIATED(efield2)
2641 ptens11 = 0.0_dp; ptens12 = 0.0_dp; ptens13 = 0.0_dp
2642 ptens21 = 0.0_dp; ptens22 = 0.0_dp; ptens23 = 0.0_dp
2643 ptens31 = 0.0_dp; ptens32 = 0.0_dp; ptens33 = 0.0_dp
2649 lists:
DO ilist = 1, nonbonded%nlists
2650 neighbor_kind_pair => nonbonded%neighbor_kind_pairs(ilist)
2651 nscale = neighbor_kind_pair%nscale
2652 IF (nscale == 0) cycle
2653 list => neighbor_kind_pair%list
2654 kind_group_loop:
DO igrp = 1, neighbor_kind_pair%ngrp_kind
2655 istart = neighbor_kind_pair%grp_kind_start(igrp)
2656 IF (istart > nscale) cycle
2657 iend = min(neighbor_kind_pair%grp_kind_end(igrp), nscale)
2658 pairs:
DO ipair = istart, iend
2660 fac_ij = -1.0_dp + neighbor_kind_pair%ei_scale(ipair)
2661 IF (fac_ij >= 0) cycle
2663 atom_a =
list(1, ipair)
2664 atom_b =
list(2, ipair)
2666 rab = particle_set(atom_b)%r - particle_set(atom_a)%r
2667 rab =
pbc(rab, cell)
2668 rab2 = rab(1)**2 + rab(2)**2 + rab(3)**2
2670 IF (debug_this_module)
THEN
2673 tij_a = huge(0.0_dp)
2674 tij_ab = huge(0.0_dp)
2675 tij_abc = huge(0.0_dp)
2676 tij_abcd = huge(0.0_dp)
2677 tij_abcde = huge(0.0_dp)
2684 IF (debug_this_module .AND. debug_r_space .AND. (.NOT. debug_g_space))
THEN
2688 f(0) = erf(alpha*r)*ir
2694 f(i) = irab2*(f(i - 1) - tmp*((2.0_dp*alpha**2)**i)/(
fac*alpha))
2699 force_eval = do_stress
2700 IF (task(1, 1))
THEN
2702 force_eval = do_forces .OR. do_efield1
2704 IF (task(2, 2)) force_eval = force_eval .OR. do_efield0
2705 IF (task(1, 2) .OR. force_eval)
THEN
2706 force_eval = do_stress
2707 tij_a = -rab*f(1)*fac_ij
2708 IF (task(1, 2)) force_eval = force_eval .OR. do_forces
2710 IF (task(1, 1)) force_eval = force_eval .OR. do_efield2
2711 IF (task(3, 3)) force_eval = force_eval .OR. do_efield0
2712 IF (task(2, 2) .OR. task(3, 1) .OR. force_eval)
THEN
2713 force_eval = do_stress
2716 tmp = rab(a)*rab(b)*fac_ij
2717 tij_ab(a, b) = 3.0_dp*tmp*f(2)
2718 IF (a == b) tij_ab(a, b) = tij_ab(a, b) - f(1)*fac_ij
2721 IF (task(2, 2) .OR. task(3, 1)) force_eval = force_eval .OR. do_forces
2723 IF (task(2, 2)) force_eval = force_eval .OR. do_efield2
2724 IF (task(3, 3)) force_eval = force_eval .OR. do_efield1
2725 IF (task(3, 2) .OR. force_eval)
THEN
2726 force_eval = do_stress
2730 tmp = rab(a)*rab(b)*rab(c)*fac_ij
2731 tij_abc(a, b, c) = -15.0_dp*tmp*f(3)
2732 tmp = 3.0_dp*f(2)*fac_ij
2733 IF (a == b) tij_abc(a, b, c) = tij_abc(a, b, c) + tmp*rab(c)
2734 IF (a == c) tij_abc(a, b, c) = tij_abc(a, b, c) + tmp*rab(b)
2735 IF (b == c) tij_abc(a, b, c) = tij_abc(a, b, c) + tmp*rab(a)
2739 IF (task(3, 2)) force_eval = force_eval .OR. do_forces
2741 IF (task(3, 3) .OR. force_eval)
THEN
2742 force_eval = do_stress
2747 tmp = rab(a)*rab(b)*rab(c)*rab(d)*fac_ij
2748 tij_abcd(a, b, c, d) = 105.0_dp*tmp*f(4)
2749 tmp1 = 15.0_dp*f(3)*fac_ij
2750 tmp2 = 3.0_dp*f(2)*fac_ij
2752 tij_abcd(a, b, c, d) = tij_abcd(a, b, c, d) - tmp1*rab(c)*rab(d)
2753 IF (c == d) tij_abcd(a, b, c, d) = tij_abcd(a, b, c, d) + tmp2
2756 tij_abcd(a, b, c, d) = tij_abcd(a, b, c, d) - tmp1*rab(b)*rab(d)
2757 IF (b == d) tij_abcd(a, b, c, d) = tij_abcd(a, b, c, d) + tmp2
2759 IF (a == d) tij_abcd(a, b, c, d) = tij_abcd(a, b, c, d) - tmp1*rab(b)*rab(c)
2761 tij_abcd(a, b, c, d) = tij_abcd(a, b, c, d) - tmp1*rab(a)*rab(d)
2762 IF (a == d) tij_abcd(a, b, c, d) = tij_abcd(a, b, c, d) + tmp2
2764 IF (b == d) tij_abcd(a, b, c, d) = tij_abcd(a, b, c, d) - tmp1*rab(a)*rab(c)
2765 IF (c == d) tij_abcd(a, b, c, d) = tij_abcd(a, b, c, d) - tmp1*rab(a)*rab(b)
2770 IF (task(3, 3)) force_eval = force_eval .OR. do_forces
2772 IF (force_eval)
THEN
2773 force_eval = do_stress
2779 tmp = rab(a)*rab(b)*rab(c)*rab(d)*rab(e)*fac_ij
2780 tij_abcde(a, b, c, d, e) = -945.0_dp*tmp*f(5)
2781 tmp1 = 105.0_dp*f(4)*fac_ij
2782 tmp2 = 15.0_dp*f(3)*fac_ij
2784 tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) + tmp1*rab(c)*rab(d)*rab(e)
2785 IF (c == d) tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) - tmp2*rab(e)
2786 IF (c == e) tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) - tmp2*rab(d)
2787 IF (d == e) tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) - tmp2*rab(c)
2790 tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) + tmp1*rab(b)*rab(d)*rab(e)
2791 IF (b == d) tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) - tmp2*rab(e)
2792 IF (b == e) tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) - tmp2*rab(d)
2793 IF (d == e) tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) - tmp2*rab(b)
2796 tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) + tmp1*rab(b)*rab(c)*rab(e)
2797 IF (b == c) tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) - tmp2*rab(e)
2798 IF (b == e) tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) - tmp2*rab(c)
2799 IF (c == e) tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) - tmp2*rab(b)
2802 tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) + tmp1*rab(b)*rab(c)*rab(d)
2803 IF (b == c) tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) - tmp2*rab(d)
2804 IF (b == d) tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) - tmp2*rab(c)
2805 IF (c == d) tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) - tmp2*rab(b)
2808 tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) + tmp1*rab(a)*rab(d)*rab(e)
2809 IF (d == e) tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) - tmp2*rab(a)
2812 tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) + tmp1*rab(a)*rab(c)*rab(e)
2813 IF (c == e) tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) - tmp2*rab(a)
2816 tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) + tmp1*rab(a)*rab(c)*rab(d)
2817 IF (c == d) tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) - tmp2*rab(a)
2819 IF (c == d) tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) + tmp1*rab(a)*rab(b)*rab(e)
2820 IF (c == e) tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) + tmp1*rab(a)*rab(b)*rab(d)
2821 IF (d == e) tij_abcde(a, b, c, d, e) = tij_abcde(a, b, c, d, e) + tmp1*rab(a)*rab(b)*rab(c)
2839 IF (debug_this_module)
THEN
2847 IF (any(task(1, :)))
THEN
2848 ch_j = charges(atom_a)
2849 ch_i = charges(atom_b)
2851 IF (any(task(2, :)))
THEN
2852 dp_j = dipoles(:, atom_a)
2853 dp_i = dipoles(:, atom_b)
2855 IF (any(task(3, :)))
THEN
2856 qp_j = quadrupoles(:, :, atom_a)
2857 qp_i = quadrupoles(:, :, atom_b)
2859 IF (task(1, 1))
THEN
2861 eloc = eloc + ch_i*tij*ch_j
2863 IF (do_forces .OR. do_stress)
THEN
2864 fr(1) = fr(1) - ch_j*tij_a(1)*ch_i
2865 fr(2) = fr(2) - ch_j*tij_a(2)*ch_i
2866 fr(3) = fr(3) - ch_j*tij_a(3)*ch_i
2871 IF (do_efield0)
THEN
2872 ef0_i = ef0_i + tij*ch_j
2874 ef0_j = ef0_j + tij*ch_i
2877 IF (do_efield1)
THEN
2878 ef1_i(1) = ef1_i(1) - tij_a(1)*ch_j
2879 ef1_i(2) = ef1_i(2) - tij_a(2)*ch_j
2880 ef1_i(3) = ef1_i(3) - tij_a(3)*ch_j
2882 ef1_j(1) = ef1_j(1) + tij_a(1)*ch_i
2883 ef1_j(2) = ef1_j(2) + tij_a(2)*ch_i
2884 ef1_j(3) = ef1_j(3) + tij_a(3)*ch_i
2889 IF (do_efield2)
THEN
2890 ef2_i(1, 1) = ef2_i(1, 1) - tij_ab(1, 1)*ch_j
2891 ef2_i(2, 1) = ef2_i(2, 1) - tij_ab(2, 1)*ch_j
2892 ef2_i(3, 1) = ef2_i(3, 1) - tij_ab(3, 1)*ch_j
2893 ef2_i(1, 2) = ef2_i(1, 2) - tij_ab(1, 2)*ch_j
2894 ef2_i(2, 2) = ef2_i(2, 2) - tij_ab(2, 2)*ch_j
2895 ef2_i(3, 2) = ef2_i(3, 2) - tij_ab(3, 2)*ch_j
2896 ef2_i(1, 3) = ef2_i(1, 3) - tij_ab(1, 3)*ch_j
2897 ef2_i(2, 3) = ef2_i(2, 3) - tij_ab(2, 3)*ch_j
2898 ef2_i(3, 3) = ef2_i(3, 3) - tij_ab(3, 3)*ch_j
2900 ef2_j(1, 1) = ef2_j(1, 1) - tij_ab(1, 1)*ch_i
2901 ef2_j(2, 1) = ef2_j(2, 1) - tij_ab(2, 1)*ch_i
2902 ef2_j(3, 1) = ef2_j(3, 1) - tij_ab(3, 1)*ch_i
2903 ef2_j(1, 2) = ef2_j(1, 2) - tij_ab(1, 2)*ch_i
2904 ef2_j(2, 2) = ef2_j(2, 2) - tij_ab(2, 2)*ch_i
2905 ef2_j(3, 2) = ef2_j(3, 2) - tij_ab(3, 2)*ch_i
2906 ef2_j(1, 3) = ef2_j(1, 3) - tij_ab(1, 3)*ch_i
2907 ef2_j(2, 3) = ef2_j(2, 3) - tij_ab(2, 3)*ch_i
2908 ef2_j(3, 3) = ef2_j(3, 3) - tij_ab(3, 3)*ch_i
2912 IF (task(2, 2))
THEN
2914 tmp = -(dp_i(1)*(tij_ab(1, 1)*dp_j(1) + &
2915 tij_ab(2, 1)*dp_j(2) + &
2916 tij_ab(3, 1)*dp_j(3)) + &
2917 dp_i(2)*(tij_ab(1, 2)*dp_j(1) + &
2918 tij_ab(2, 2)*dp_j(2) + &
2919 tij_ab(3, 2)*dp_j(3)) + &
2920 dp_i(3)*(tij_ab(1, 3)*dp_j(1) + &
2921 tij_ab(2, 3)*dp_j(2) + &
2922 tij_ab(3, 3)*dp_j(3)))
2925 IF (do_forces .OR. do_stress)
THEN
2927 fr(k) = fr(k) + dp_i(1)*(tij_abc(1, 1, k)*dp_j(1) + &
2928 tij_abc(2, 1, k)*dp_j(2) + &
2929 tij_abc(3, 1, k)*dp_j(3)) &
2930 + dp_i(2)*(tij_abc(1, 2, k)*dp_j(1) + &
2931 tij_abc(2, 2, k)*dp_j(2) + &
2932 tij_abc(3, 2, k)*dp_j(3)) &
2933 + dp_i(3)*(tij_abc(1, 3, k)*dp_j(1) + &
2934 tij_abc(2, 3, k)*dp_j(2) + &
2935 tij_abc(3, 3, k)*dp_j(3))
2941 IF (do_efield0)
THEN
2942 ef0_i = ef0_i - (tij_a(1)*dp_j(1) + &
2943 tij_a(2)*dp_j(2) + &
2946 ef0_j = ef0_j + (tij_a(1)*dp_i(1) + &
2947 tij_a(2)*dp_i(2) + &
2951 IF (do_efield1)
THEN
2952 ef1_i(1) = ef1_i(1) + (tij_ab(1, 1)*dp_j(1) + &
2953 tij_ab(2, 1)*dp_j(2) + &
2954 tij_ab(3, 1)*dp_j(3))
2955 ef1_i(2) = ef1_i(2) + (tij_ab(1, 2)*dp_j(1) + &
2956 tij_ab(2, 2)*dp_j(2) + &
2957 tij_ab(3, 2)*dp_j(3))
2958 ef1_i(3) = ef1_i(3) + (tij_ab(1, 3)*dp_j(1) + &
2959 tij_ab(2, 3)*dp_j(2) + &
2960 tij_ab(3, 3)*dp_j(3))
2962 ef1_j(1) = ef1_j(1) + (tij_ab(1, 1)*dp_i(1) + &
2963 tij_ab(2, 1)*dp_i(2) + &
2964 tij_ab(3, 1)*dp_i(3))
2965 ef1_j(2) = ef1_j(2) + (tij_ab(1, 2)*dp_i(1) + &
2966 tij_ab(2, 2)*dp_i(2) + &
2967 tij_ab(3, 2)*dp_i(3))
2968 ef1_j(3) = ef1_j(3) + (tij_ab(1, 3)*dp_i(1) + &
2969 tij_ab(2, 3)*dp_i(2) + &
2970 tij_ab(3, 3)*dp_i(3))
2973 IF (do_efield2)
THEN
2974 ef2_i(1, 1) = ef2_i(1, 1) + (tij_abc(1, 1, 1)*dp_j(1) + &
2975 tij_abc(2, 1, 1)*dp_j(2) + &
2976 tij_abc(3, 1, 1)*dp_j(3))
2977 ef2_i(1, 2) = ef2_i(1, 2) + (tij_abc(1, 1, 2)*dp_j(1) + &
2978 tij_abc(2, 1, 2)*dp_j(2) + &
2979 tij_abc(3, 1, 2)*dp_j(3))
2980 ef2_i(1, 3) = ef2_i(1, 3) + (tij_abc(1, 1, 3)*dp_j(1) + &
2981 tij_abc(2, 1, 3)*dp_j(2) + &
2982 tij_abc(3, 1, 3)*dp_j(3))
2983 ef2_i(2, 1) = ef2_i(2, 1) + (tij_abc(1, 2, 1)*dp_j(1) + &
2984 tij_abc(2, 2, 1)*dp_j(2) + &
2985 tij_abc(3, 2, 1)*dp_j(3))
2986 ef2_i(2, 2) = ef2_i(2, 2) + (tij_abc(1, 2, 2)*dp_j(1) + &
2987 tij_abc(2, 2, 2)*dp_j(2) + &
2988 tij_abc(3, 2, 2)*dp_j(3))
2989 ef2_i(2, 3) = ef2_i(2, 3) + (tij_abc(1, 2, 3)*dp_j(1) + &
2990 tij_abc(2, 2, 3)*dp_j(2) + &
2991 tij_abc(3, 2, 3)*dp_j(3))
2992 ef2_i(3, 1) = ef2_i(3, 1) + (tij_abc(1, 3, 1)*dp_j(1) + &
2993 tij_abc(2, 3, 1)*dp_j(2) + &
2994 tij_abc(3, 3, 1)*dp_j(3))
2995 ef2_i(3, 2) = ef2_i(3, 2) + (tij_abc(1, 3, 2)*dp_j(1) + &
2996 tij_abc(2, 3, 2)*dp_j(2) + &
2997 tij_abc(3, 3, 2)*dp_j(3))
2998 ef2_i(3, 3) = ef2_i(3, 3) + (tij_abc(1, 3, 3)*dp_j(1) + &
2999 tij_abc(2, 3, 3)*dp_j(2) + &
3000 tij_abc(3, 3, 3)*dp_j(3))
3002 ef2_j(1, 1) = ef2_j(1, 1) - (tij_abc(1, 1, 1)*dp_i(1) + &
3003 tij_abc(2, 1, 1)*dp_i(2) + &
3004 tij_abc(3, 1, 1)*dp_i(3))
3005 ef2_j(1, 2) = ef2_j(1, 2) - (tij_abc(1, 1, 2)*dp_i(1) + &
3006 tij_abc(2, 1, 2)*dp_i(2) + &
3007 tij_abc(3, 1, 2)*dp_i(3))
3008 ef2_j(1, 3) = ef2_j(1, 3) - (tij_abc(1, 1, 3)*dp_i(1) + &
3009 tij_abc(2, 1, 3)*dp_i(2) + &
3010 tij_abc(3, 1, 3)*dp_i(3))
3011 ef2_j(2, 1) = ef2_j(2, 1) - (tij_abc(1, 2, 1)*dp_i(1) + &
3012 tij_abc(2, 2, 1)*dp_i(2) + &
3013 tij_abc(3, 2, 1)*dp_i(3))
3014 ef2_j(2, 2) = ef2_j(2, 2) - (tij_abc(1, 2, 2)*dp_i(1) + &
3015 tij_abc(2, 2, 2)*dp_i(2) + &
3016 tij_abc(3, 2, 2)*dp_i(3))
3017 ef2_j(2, 3) = ef2_j(2, 3) - (tij_abc(1, 2, 3)*dp_i(1) + &
3018 tij_abc(2, 2, 3)*dp_i(2) + &
3019 tij_abc(3, 2, 3)*dp_i(3))
3020 ef2_j(3, 1) = ef2_j(3, 1) - (tij_abc(1, 3, 1)*dp_i(1) + &
3021 tij_abc(2, 3, 1)*dp_i(2) + &
3022 tij_abc(3, 3, 1)*dp_i(3))
3023 ef2_j(3, 2) = ef2_j(3, 2) - (tij_abc(1, 3, 2)*dp_i(1) + &
3024 tij_abc(2, 3, 2)*dp_i(2) + &
3025 tij_abc(3, 3, 2)*dp_i(3))
3026 ef2_j(3, 3) = ef2_j(3, 3) - (tij_abc(1, 3, 3)*dp_i(1) + &
3027 tij_abc(2, 3, 3)*dp_i(2) + &
3028 tij_abc(3, 3, 3)*dp_i(3))
3032 IF (task(2, 1))
THEN
3034 tmp = ch_j*(tij_a(1)*dp_i(1) + &
3035 tij_a(2)*dp_i(2) + &
3037 - ch_i*(tij_a(1)*dp_j(1) + &
3038 tij_a(2)*dp_j(2) + &
3042 IF (do_forces .OR. do_stress)
THEN
3044 fr(k) = fr(k) - ch_j*(tij_ab(1, k)*dp_i(1) + &
3045 tij_ab(2, k)*dp_i(2) + &
3046 tij_ab(3, k)*dp_i(3)) &
3047 + ch_i*(tij_ab(1, k)*dp_j(1) + &
3048 tij_ab(2, k)*dp_j(2) + &
3049 tij_ab(3, k)*dp_j(3))
3053 IF (task(3, 3))
THEN
3056 tmp11 = qp_i(1, 1)*(tij_abcd(1, 1, 1, 1)*qp_j(1, 1) + &
3057 tij_abcd(2, 1, 1, 1)*qp_j(2, 1) + &
3058 tij_abcd(3, 1, 1, 1)*qp_j(3, 1) + &
3059 tij_abcd(1, 2, 1, 1)*qp_j(1, 2) + &
3060 tij_abcd(2, 2, 1, 1)*qp_j(2, 2) + &
3061 tij_abcd(3, 2, 1, 1)*qp_j(3, 2) + &
3062 tij_abcd(1, 3, 1, 1)*qp_j(1, 3) + &
3063 tij_abcd(2, 3, 1, 1)*qp_j(2, 3) + &
3064 tij_abcd(3, 3, 1, 1)*qp_j(3, 3))
3065 tmp21 = qp_i(2, 1)*(tij_abcd(1, 1, 1, 2)*qp_j(1, 1) + &
3066 tij_abcd(2, 1, 1, 2)*qp_j(2, 1) + &
3067 tij_abcd(3, 1, 1, 2)*qp_j(3, 1) + &
3068 tij_abcd(1, 2, 1, 2)*qp_j(1, 2) + &
3069 tij_abcd(2, 2, 1, 2)*qp_j(2, 2) + &
3070 tij_abcd(3, 2, 1, 2)*qp_j(3, 2) + &
3071 tij_abcd(1, 3, 1, 2)*qp_j(1, 3) + &
3072 tij_abcd(2, 3, 1, 2)*qp_j(2, 3) + &
3073 tij_abcd(3, 3, 1, 2)*qp_j(3, 3))
3074 tmp31 = qp_i(3, 1)*(tij_abcd(1, 1, 1, 3)*qp_j(1, 1) + &
3075 tij_abcd(2, 1, 1, 3)*qp_j(2, 1) + &
3076 tij_abcd(3, 1, 1, 3)*qp_j(3, 1) + &
3077 tij_abcd(1, 2, 1, 3)*qp_j(1, 2) + &
3078 tij_abcd(2, 2, 1, 3)*qp_j(2, 2) + &
3079 tij_abcd(3, 2, 1, 3)*qp_j(3, 2) + &
3080 tij_abcd(1, 3, 1, 3)*qp_j(1, 3) + &
3081 tij_abcd(2, 3, 1, 3)*qp_j(2, 3) + &
3082 tij_abcd(3, 3, 1, 3)*qp_j(3, 3))
3083 tmp22 = qp_i(2, 2)*(tij_abcd(1, 1, 2, 2)*qp_j(1, 1) + &
3084 tij_abcd(2, 1, 2, 2)*qp_j(2, 1) + &
3085 tij_abcd(3, 1, 2, 2)*qp_j(3, 1) + &
3086 tij_abcd(1, 2, 2, 2)*qp_j(1, 2) + &
3087 tij_abcd(2, 2, 2, 2)*qp_j(2, 2) + &
3088 tij_abcd(3, 2, 2, 2)*qp_j(3, 2) + &
3089 tij_abcd(1, 3, 2, 2)*qp_j(1, 3) + &
3090 tij_abcd(2, 3, 2, 2)*qp_j(2, 3) + &
3091 tij_abcd(3, 3, 2, 2)*qp_j(3, 3))
3092 tmp32 = qp_i(3, 2)*(tij_abcd(1, 1, 2, 3)*qp_j(1, 1) + &
3093 tij_abcd(2, 1, 2, 3)*qp_j(2, 1) + &
3094 tij_abcd(3, 1, 2, 3)*qp_j(3, 1) + &
3095 tij_abcd(1, 2, 2, 3)*qp_j(1, 2) + &
3096 tij_abcd(2, 2, 2, 3)*qp_j(2, 2) + &
3097 tij_abcd(3, 2, 2, 3)*qp_j(3, 2) + &
3098 tij_abcd(1, 3, 2, 3)*qp_j(1, 3) + &
3099 tij_abcd(2, 3, 2, 3)*qp_j(2, 3) + &
3100 tij_abcd(3, 3, 2, 3)*qp_j(3, 3))
3101 tmp33 = qp_i(3, 3)*(tij_abcd(1, 1, 3, 3)*qp_j(1, 1) + &
3102 tij_abcd(2, 1, 3, 3)*qp_j(2, 1) + &
3103 tij_abcd(3, 1, 3, 3)*qp_j(3, 1) + &
3104 tij_abcd(1, 2, 3, 3)*qp_j(1, 2) + &
3105 tij_abcd(2, 2, 3, 3)*qp_j(2, 2) + &
3106 tij_abcd(3, 2, 3, 3)*qp_j(3, 2) + &
3107 tij_abcd(1, 3, 3, 3)*qp_j(1, 3) + &
3108 tij_abcd(2, 3, 3, 3)*qp_j(2, 3) + &
3109 tij_abcd(3, 3, 3, 3)*qp_j(3, 3))
3113 tmp = tmp11 + tmp12 + tmp13 + &
3114 tmp21 + tmp22 + tmp23 + &
3115 tmp31 + tmp32 + tmp33
3117 eloc = eloc +
fac*tmp
3119 IF (do_forces .OR. do_stress)
THEN
3121 tmp11 = qp_i(1, 1)*(tij_abcde(1, 1, 1, 1, k)*qp_j(1, 1) + &
3122 tij_abcde(2, 1, 1, 1, k)*qp_j(2, 1) + &
3123 tij_abcde(3, 1, 1, 1, k)*qp_j(3, 1) + &
3124 tij_abcde(1, 2, 1, 1, k)*qp_j(1, 2) + &
3125 tij_abcde(2, 2, 1, 1, k)*qp_j(2, 2) + &
3126 tij_abcde(3, 2, 1, 1, k)*qp_j(3, 2) + &
3127 tij_abcde(1, 3, 1, 1, k)*qp_j(1, 3) + &
3128 tij_abcde(2, 3, 1, 1, k)*qp_j(2, 3) + &
3129 tij_abcde(3, 3, 1, 1, k)*qp_j(3, 3))
3130 tmp21 = qp_i(2, 1)*(tij_abcde(1, 1, 2, 1, k)*qp_j(1, 1) + &
3131 tij_abcde(2, 1, 2, 1, k)*qp_j(2, 1) + &
3132 tij_abcde(3, 1, 2, 1, k)*qp_j(3, 1) + &
3133 tij_abcde(1, 2, 2, 1, k)*qp_j(1, 2) + &
3134 tij_abcde(2, 2, 2, 1, k)*qp_j(2, 2) + &
3135 tij_abcde(3, 2, 2, 1, k)*qp_j(3, 2) + &
3136 tij_abcde(1, 3, 2, 1, k)*qp_j(1, 3) + &
3137 tij_abcde(2, 3, 2, 1, k)*qp_j(2, 3) + &
3138 tij_abcde(3, 3, 2, 1, k)*qp_j(3, 3))
3139 tmp31 = qp_i(3, 1)*(tij_abcde(1, 1, 3, 1, k)*qp_j(1, 1) + &
3140 tij_abcde(2, 1, 3, 1, k)*qp_j(2, 1) + &
3141 tij_abcde(3, 1, 3, 1, k)*qp_j(3, 1) + &
3142 tij_abcde(1, 2, 3, 1, k)*qp_j(1, 2) + &
3143 tij_abcde(2, 2, 3, 1, k)*qp_j(2, 2) + &
3144 tij_abcde(3, 2, 3, 1, k)*qp_j(3, 2) + &
3145 tij_abcde(1, 3, 3, 1, k)*qp_j(1, 3) + &
3146 tij_abcde(2, 3, 3, 1, k)*qp_j(2, 3) + &
3147 tij_abcde(3, 3, 3, 1, k)*qp_j(3, 3))
3148 tmp22 = qp_i(2, 2)*(tij_abcde(1, 1, 2, 2, k)*qp_j(1, 1) + &
3149 tij_abcde(2, 1, 2, 2, k)*qp_j(2, 1) + &
3150 tij_abcde(3, 1, 2, 2, k)*qp_j(3, 1) + &
3151 tij_abcde(1, 2, 2, 2, k)*qp_j(1, 2) + &
3152 tij_abcde(2, 2, 2, 2, k)*qp_j(2, 2) + &
3153 tij_abcde(3, 2, 2, 2, k)*qp_j(3, 2) + &
3154 tij_abcde(1, 3, 2, 2, k)*qp_j(1, 3) + &
3155 tij_abcde(2, 3, 2, 2, k)*qp_j(2, 3) + &
3156 tij_abcde(3, 3, 2, 2, k)*qp_j(3, 3))
3157 tmp32 = qp_i(3, 2)*(tij_abcde(1, 1, 3, 2, k)*qp_j(1, 1) + &
3158 tij_abcde(2, 1, 3, 2, k)*qp_j(2, 1) + &
3159 tij_abcde(3, 1, 3, 2, k)*qp_j(3, 1) + &
3160 tij_abcde(1, 2, 3, 2, k)*qp_j(1, 2) + &
3161 tij_abcde(2, 2, 3, 2, k)*qp_j(2, 2) + &
3162 tij_abcde(3, 2, 3, 2, k)*qp_j(3, 2) + &
3163 tij_abcde(1, 3, 3, 2, k)*qp_j(1, 3) + &
3164 tij_abcde(2, 3, 3, 2, k)*qp_j(2, 3) + &
3165 tij_abcde(3, 3, 3, 2, k)*qp_j(3, 3))
3166 tmp33 = qp_i(3, 3)*(tij_abcde(1, 1, 3, 3, k)*qp_j(1, 1) + &
3167 tij_abcde(2, 1, 3, 3, k)*qp_j(2, 1) + &
3168 tij_abcde(3, 1, 3, 3, k)*qp_j(3, 1) + &
3169 tij_abcde(1, 2, 3, 3, k)*qp_j(1, 2) + &
3170 tij_abcde(2, 2, 3, 3, k)*qp_j(2, 2) + &
3171 tij_abcde(3, 2, 3, 3, k)*qp_j(3, 2) + &
3172 tij_abcde(1, 3, 3, 3, k)*qp_j(1, 3) + &
3173 tij_abcde(2, 3, 3, 3, k)*qp_j(2, 3) + &
3174 tij_abcde(3, 3, 3, 3, k)*qp_j(3, 3))
3178 fr(k) = fr(k) -
fac*(tmp11 + tmp12 + tmp13 + &
3179 tmp21 + tmp22 + tmp23 + &
3180 tmp31 + tmp32 + tmp33)
3187 IF (do_efield0)
THEN
3188 ef0_i = ef0_i +
fac*(tij_ab(1, 1)*qp_j(1, 1) + &
3189 tij_ab(2, 1)*qp_j(2, 1) + &
3190 tij_ab(3, 1)*qp_j(3, 1) + &
3191 tij_ab(1, 2)*qp_j(1, 2) + &
3192 tij_ab(2, 2)*qp_j(2, 2) + &
3193 tij_ab(3, 2)*qp_j(3, 2) + &
3194 tij_ab(1, 3)*qp_j(1, 3) + &
3195 tij_ab(2, 3)*qp_j(2, 3) + &
3196 tij_ab(3, 3)*qp_j(3, 3))
3198 ef0_j = ef0_j +
fac*(tij_ab(1, 1)*qp_i(1, 1) + &
3199 tij_ab(2, 1)*qp_i(2, 1) + &
3200 tij_ab(3, 1)*qp_i(3, 1) + &
3201 tij_ab(1, 2)*qp_i(1, 2) + &
3202 tij_ab(2, 2)*qp_i(2, 2) + &
3203 tij_ab(3, 2)*qp_i(3, 2) + &
3204 tij_ab(1, 3)*qp_i(1, 3) + &
3205 tij_ab(2, 3)*qp_i(2, 3) + &
3206 tij_ab(3, 3)*qp_i(3, 3))
3209 IF (do_efield1)
THEN
3210 ef1_i(1) = ef1_i(1) -
fac*(tij_abc(1, 1, 1)*qp_j(1, 1) + &
3211 tij_abc(2, 1, 1)*qp_j(2, 1) + &
3212 tij_abc(3, 1, 1)*qp_j(3, 1) + &
3213 tij_abc(1, 2, 1)*qp_j(1, 2) + &
3214 tij_abc(2, 2, 1)*qp_j(2, 2) + &
3215 tij_abc(3, 2, 1)*qp_j(3, 2) + &
3216 tij_abc(1, 3, 1)*qp_j(1, 3) + &
3217 tij_abc(2, 3, 1)*qp_j(2, 3) + &
3218 tij_abc(3, 3, 1)*qp_j(3, 3))
3219 ef1_i(2) = ef1_i(2) -
fac*(tij_abc(1, 1, 2)*qp_j(1, 1) + &
3220 tij_abc(2, 1, 2)*qp_j(2, 1) + &
3221 tij_abc(3, 1, 2)*qp_j(3, 1) + &
3222 tij_abc(1, 2, 2)*qp_j(1, 2) + &
3223 tij_abc(2, 2, 2)*qp_j(2, 2) + &
3224 tij_abc(3, 2, 2)*qp_j(3, 2) + &
3225 tij_abc(1, 3, 2)*qp_j(1, 3) + &
3226 tij_abc(2, 3, 2)*qp_j(2, 3) + &
3227 tij_abc(3, 3, 2)*qp_j(3, 3))
3228 ef1_i(3) = ef1_i(3) -
fac*(tij_abc(1, 1, 3)*qp_j(1, 1) + &
3229 tij_abc(2, 1, 3)*qp_j(2, 1) + &
3230 tij_abc(3, 1, 3)*qp_j(3, 1) + &
3231 tij_abc(1, 2, 3)*qp_j(1, 2) + &
3232 tij_abc(2, 2, 3)*qp_j(2, 2) + &
3233 tij_abc(3, 2, 3)*qp_j(3, 2) + &
3234 tij_abc(1, 3, 3)*qp_j(1, 3) + &
3235 tij_abc(2, 3, 3)*qp_j(2, 3) + &
3236 tij_abc(3, 3, 3)*qp_j(3, 3))
3238 ef1_j(1) = ef1_j(1) +
fac*(tij_abc(1, 1, 1)*qp_i(1, 1) + &
3239 tij_abc(2, 1, 1)*qp_i(2, 1) + &
3240 tij_abc(3, 1, 1)*qp_i(3, 1) + &
3241 tij_abc(1, 2, 1)*qp_i(1, 2) + &
3242 tij_abc(2, 2, 1)*qp_i(2, 2) + &
3243 tij_abc(3, 2, 1)*qp_i(3, 2) + &
3244 tij_abc(1, 3, 1)*qp_i(1, 3) + &
3245 tij_abc(2, 3, 1)*qp_i(2, 3) + &
3246 tij_abc(3, 3, 1)*qp_i(3, 3))
3247 ef1_j(2) = ef1_j(2) +
fac*(tij_abc(1, 1, 2)*qp_i(1, 1) + &
3248 tij_abc(2, 1, 2)*qp_i(2, 1) + &
3249 tij_abc(3, 1, 2)*qp_i(3, 1) + &
3250 tij_abc(1, 2, 2)*qp_i(1, 2) + &
3251 tij_abc(2, 2, 2)*qp_i(2, 2) + &
3252 tij_abc(3, 2, 2)*qp_i(3, 2) + &
3253 tij_abc(1, 3, 2)*qp_i(1, 3) + &
3254 tij_abc(2, 3, 2)*qp_i(2, 3) + &
3255 tij_abc(3, 3, 2)*qp_i(3, 3))
3256 ef1_j(3) = ef1_j(3) +
fac*(tij_abc(1, 1, 3)*qp_i(1, 1) + &
3257 tij_abc(2, 1, 3)*qp_i(2, 1) + &
3258 tij_abc(3, 1, 3)*qp_i(3, 1) + &
3259 tij_abc(1, 2, 3)*qp_i(1, 2) + &
3260 tij_abc(2, 2, 3)*qp_i(2, 2) + &
3261 tij_abc(3, 2, 3)*qp_i(3, 2) + &
3262 tij_abc(1, 3, 3)*qp_i(1, 3) + &
3263 tij_abc(2, 3, 3)*qp_i(2, 3) + &
3264 tij_abc(3, 3, 3)*qp_i(3, 3))
3267 IF (do_efield2)
THEN
3268 tmp11 =
fac*(tij_abcd(1, 1, 1, 1)*qp_j(1, 1) + &
3269 tij_abcd(2, 1, 1, 1)*qp_j(2, 1) + &
3270 tij_abcd(3, 1, 1, 1)*qp_j(3, 1) + &
3271 tij_abcd(1, 2, 1, 1)*qp_j(1, 2) + &
3272 tij_abcd(2, 2, 1, 1)*qp_j(2, 2) + &
3273 tij_abcd(3, 2, 1, 1)*qp_j(3, 2) + &
3274 tij_abcd(1, 3, 1, 1)*qp_j(1, 3) + &
3275 tij_abcd(2, 3, 1, 1)*qp_j(2, 3) + &
3276 tij_abcd(3, 3, 1, 1)*qp_j(3, 3))
3277 tmp12 =
fac*(tij_abcd(1, 1, 1, 2)*qp_j(1, 1) + &
3278 tij_abcd(2, 1, 1, 2)*qp_j(2, 1) + &
3279 tij_abcd(3, 1, 1, 2)*qp_j(3, 1) + &
3280 tij_abcd(1, 2, 1, 2)*qp_j(1, 2) + &
3281 tij_abcd(2, 2, 1, 2)*qp_j(2, 2) + &
3282 tij_abcd(3, 2, 1, 2)*qp_j(3, 2) + &
3283 tij_abcd(1, 3, 1, 2)*qp_j(1, 3) + &
3284 tij_abcd(2, 3, 1, 2)*qp_j(2, 3) + &
3285 tij_abcd(3, 3, 1, 2)*qp_j(3, 3))
3286 tmp13 =
fac*(tij_abcd(1, 1, 1, 3)*qp_j(1, 1) + &
3287 tij_abcd(2, 1, 1, 3)*qp_j(2, 1) + &
3288 tij_abcd(3, 1, 1, 3)*qp_j(3, 1) + &
3289 tij_abcd(1, 2, 1, 3)*qp_j(1, 2) + &
3290 tij_abcd(2, 2, 1, 3)*qp_j(2, 2) + &
3291 tij_abcd(3, 2, 1, 3)*qp_j(3, 2) + &
3292 tij_abcd(1, 3, 1, 3)*qp_j(1, 3) + &
3293 tij_abcd(2, 3, 1, 3)*qp_j(2, 3) + &
3294 tij_abcd(3, 3, 1, 3)*qp_j(3, 3))
3295 tmp22 =
fac*(tij_abcd(1, 1, 2, 2)*qp_j(1, 1) + &
3296 tij_abcd(2, 1, 2, 2)*qp_j(2, 1) + &
3297 tij_abcd(3, 1, 2, 2)*qp_j(3, 1) + &
3298 tij_abcd(1, 2, 2, 2)*qp_j(1, 2) + &
3299 tij_abcd(2, 2, 2, 2)*qp_j(2, 2) + &
3300 tij_abcd(3, 2, 2, 2)*qp_j(3, 2) + &
3301 tij_abcd(1, 3, 2, 2)*qp_j(1, 3) + &
3302 tij_abcd(2, 3, 2, 2)*qp_j(2, 3) + &
3303 tij_abcd(3, 3, 2, 2)*qp_j(3, 3))
3304 tmp23 =
fac*(tij_abcd(1, 1, 2, 3)*qp_j(1, 1) + &
3305 tij_abcd(2, 1, 2, 3)*qp_j(2, 1) + &
3306 tij_abcd(3, 1, 2, 3)*qp_j(3, 1) + &
3307 tij_abcd(1, 2, 2, 3)*qp_j(1, 2) + &
3308 tij_abcd(2, 2, 2, 3)*qp_j(2, 2) + &
3309 tij_abcd(3, 2, 2, 3)*qp_j(3, 2) + &
3310 tij_abcd(1, 3, 2, 3)*qp_j(1, 3) + &
3311 tij_abcd(2, 3, 2, 3)*qp_j(2, 3) + &
3312 tij_abcd(3, 3, 2, 3)*qp_j(3, 3))
3313 tmp33 =
fac*(tij_abcd(1, 1, 3, 3)*qp_j(1, 1) + &
3314 tij_abcd(2, 1, 3, 3)*qp_j(2, 1) + &
3315 tij_abcd(3, 1, 3, 3)*qp_j(3, 1) + &
3316 tij_abcd(1, 2, 3, 3)*qp_j(1, 2) + &
3317 tij_abcd(2, 2, 3, 3)*qp_j(2, 2) + &
3318 tij_abcd(3, 2, 3, 3)*qp_j(3, 2) + &
3319 tij_abcd(1, 3, 3, 3)*qp_j(1, 3) + &
3320 tij_abcd(2, 3, 3, 3)*qp_j(2, 3) + &
3321 tij_abcd(3, 3, 3, 3)*qp_j(3, 3))
3323 ef2_i(1, 1) = ef2_i(1, 1) - tmp11
3324 ef2_i(1, 2) = ef2_i(1, 2) - tmp12
3325 ef2_i(1, 3) = ef2_i(1, 3) - tmp13
3326 ef2_i(2, 1) = ef2_i(2, 1) - tmp12
3327 ef2_i(2, 2) = ef2_i(2, 2) - tmp22
3328 ef2_i(2, 3) = ef2_i(2, 3) - tmp23
3329 ef2_i(3, 1) = ef2_i(3, 1) - tmp13
3330 ef2_i(3, 2) = ef2_i(3, 2) - tmp23
3331 ef2_i(3, 3) = ef2_i(3, 3) - tmp33
3333 tmp11 =
fac*(tij_abcd(1, 1, 1, 1)*qp_i(1, 1) + &
3334 tij_abcd(2, 1, 1, 1)*qp_i(2, 1) + &
3335 tij_abcd(3, 1, 1, 1)*qp_i(3, 1) + &
3336 tij_abcd(1, 2, 1, 1)*qp_i(1, 2) + &
3337 tij_abcd(2, 2, 1, 1)*qp_i(2, 2) + &
3338 tij_abcd(3, 2, 1, 1)*qp_i(3, 2) + &
3339 tij_abcd(1, 3, 1, 1)*qp_i(1, 3) + &
3340 tij_abcd(2, 3, 1, 1)*qp_i(2, 3) + &
3341 tij_abcd(3, 3, 1, 1)*qp_i(3, 3))
3342 tmp12 =
fac*(tij_abcd(1, 1, 1, 2)*qp_i(1, 1) + &
3343 tij_abcd(2, 1, 1, 2)*qp_i(2, 1) + &
3344 tij_abcd(3, 1, 1, 2)*qp_i(3, 1) + &
3345 tij_abcd(1, 2, 1, 2)*qp_i(1, 2) + &
3346 tij_abcd(2, 2, 1, 2)*qp_i(2, 2) + &
3347 tij_abcd(3, 2, 1, 2)*qp_i(3, 2) + &
3348 tij_abcd(1, 3, 1, 2)*qp_i(1, 3) + &
3349 tij_abcd(2, 3, 1, 2)*qp_i(2, 3) + &
3350 tij_abcd(3, 3, 1, 2)*qp_i(3, 3))
3351 tmp13 =
fac*(tij_abcd(1, 1, 1, 3)*qp_i(1, 1) + &
3352 tij_abcd(2, 1, 1, 3)*qp_i(2, 1) + &
3353 tij_abcd(3, 1, 1, 3)*qp_i(3, 1) + &
3354 tij_abcd(1, 2, 1, 3)*qp_i(1, 2) + &
3355 tij_abcd(2, 2, 1, 3)*qp_i(2, 2) + &
3356 tij_abcd(3, 2, 1, 3)*qp_i(3, 2) + &
3357 tij_abcd(1, 3, 1, 3)*qp_i(1, 3) + &
3358 tij_abcd(2, 3, 1, 3)*qp_i(2, 3) + &
3359 tij_abcd(3, 3, 1, 3)*qp_i(3, 3))
3360 tmp22 =
fac*(tij_abcd(1, 1, 2, 2)*qp_i(1, 1) + &
3361 tij_abcd(2, 1, 2, 2)*qp_i(2, 1) + &
3362 tij_abcd(3, 1, 2, 2)*qp_i(3, 1) + &
3363 tij_abcd(1, 2, 2, 2)*qp_i(1, 2) + &
3364 tij_abcd(2, 2, 2, 2)*qp_i(2, 2) + &
3365 tij_abcd(3, 2, 2, 2)*qp_i(3, 2) + &
3366 tij_abcd(1, 3, 2, 2)*qp_i(1, 3) + &
3367 tij_abcd(2, 3, 2, 2)*qp_i(2, 3) + &
3368 tij_abcd(3, 3, 2, 2)*qp_i(3, 3))
3369 tmp23 =
fac*(tij_abcd(1, 1, 2, 3)*qp_i(1, 1) + &
3370 tij_abcd(2, 1, 2, 3)*qp_i(2, 1) + &
3371 tij_abcd(3, 1, 2, 3)*qp_i(3, 1) + &
3372 tij_abcd(1, 2, 2, 3)*qp_i(1, 2) + &
3373 tij_abcd(2, 2, 2, 3)*qp_i(2, 2) + &
3374 tij_abcd(3, 2, 2, 3)*qp_i(3, 2) + &
3375 tij_abcd(1, 3, 2, 3)*qp_i(1, 3) + &
3376 tij_abcd(2, 3, 2, 3)*qp_i(2, 3) + &
3377 tij_abcd(3, 3, 2, 3)*qp_i(3, 3))
3378 tmp33 =
fac*(tij_abcd(1, 1, 3, 3)*qp_i(1, 1) + &
3379 tij_abcd(2, 1, 3, 3)*qp_i(2, 1) + &
3380 tij_abcd(3, 1, 3, 3)*qp_i(3, 1) + &
3381 tij_abcd(1, 2, 3, 3)*qp_i(1, 2) + &
3382 tij_abcd(2, 2, 3, 3)*qp_i(2, 2) + &
3383 tij_abcd(3, 2, 3, 3)*qp_i(3, 2) + &
3384 tij_abcd(1, 3, 3, 3)*qp_i(1, 3) + &
3385 tij_abcd(2, 3, 3, 3)*qp_i(2, 3) + &
3386 tij_abcd(3, 3, 3, 3)*qp_i(3, 3))
3388 ef2_j(1, 1) = ef2_j(1, 1) - tmp11
3389 ef2_j(1, 2) = ef2_j(1, 2) - tmp12
3390 ef2_j(1, 3) = ef2_j(1, 3) - tmp13
3391 ef2_j(2, 1) = ef2_j(2, 1) - tmp12
3392 ef2_j(2, 2) = ef2_j(2, 2) - tmp22
3393 ef2_j(2, 3) = ef2_j(2, 3) - tmp23
3394 ef2_j(3, 1) = ef2_j(3, 1) - tmp13
3395 ef2_j(3, 2) = ef2_j(3, 2) - tmp23
3396 ef2_j(3, 3) = ef2_j(3, 3) - tmp33
3400 IF (task(3, 2))
THEN
3404 tmp_ij = dp_i(1)*(tij_abc(1, 1, 1)*qp_j(1, 1) + &
3405 tij_abc(2, 1, 1)*qp_j(2, 1) + &
3406 tij_abc(3, 1, 1)*qp_j(3, 1) + &
3407 tij_abc(1, 2, 1)*qp_j(1, 2) + &
3408 tij_abc(2, 2, 1)*qp_j(2, 2) + &
3409 tij_abc(3, 2, 1)*qp_j(3, 2) + &
3410 tij_abc(1, 3, 1)*qp_j(1, 3) + &
3411 tij_abc(2, 3, 1)*qp_j(2, 3) + &
3412 tij_abc(3, 3, 1)*qp_j(3, 3)) + &
3413 dp_i(2)*(tij_abc(1, 1, 2)*qp_j(1, 1) + &
3414 tij_abc(2, 1, 2)*qp_j(2, 1) + &
3415 tij_abc(3, 1, 2)*qp_j(3, 1) + &
3416 tij_abc(1, 2, 2)*qp_j(1, 2) + &
3417 tij_abc(2, 2, 2)*qp_j(2, 2) + &
3418 tij_abc(3, 2, 2)*qp_j(3, 2) + &
3419 tij_abc(1, 3, 2)*qp_j(1, 3) + &
3420 tij_abc(2, 3, 2)*qp_j(2, 3) + &
3421 tij_abc(3, 3, 2)*qp_j(3, 3)) + &
3422 dp_i(3)*(tij_abc(1, 1, 3)*qp_j(1, 1) + &
3423 tij_abc(2, 1, 3)*qp_j(2, 1) + &
3424 tij_abc(3, 1, 3)*qp_j(3, 1) + &
3425 tij_abc(1, 2, 3)*qp_j(1, 2) + &
3426 tij_abc(2, 2, 3)*qp_j(2, 2) + &
3427 tij_abc(3, 2, 3)*qp_j(3, 2) + &
3428 tij_abc(1, 3, 3)*qp_j(1, 3) + &
3429 tij_abc(2, 3, 3)*qp_j(2, 3) + &
3430 tij_abc(3, 3, 3)*qp_j(3, 3))
3433 tmp_ji = dp_j(1)*(tij_abc(1, 1, 1)*qp_i(1, 1) + &
3434 tij_abc(2, 1, 1)*qp_i(2, 1) + &
3435 tij_abc(3, 1, 1)*qp_i(3, 1) + &
3436 tij_abc(1, 2, 1)*qp_i(1, 2) + &
3437 tij_abc(2, 2, 1)*qp_i(2, 2) + &
3438 tij_abc(3, 2, 1)*qp_i(3, 2) + &
3439 tij_abc(1, 3, 1)*qp_i(1, 3) + &
3440 tij_abc(2, 3, 1)*qp_i(2, 3) + &
3441 tij_abc(3, 3, 1)*qp_i(3, 3)) + &
3442 dp_j(2)*(tij_abc(1, 1, 2)*qp_i(1, 1) + &
3443 tij_abc(2, 1, 2)*qp_i(2, 1) + &
3444 tij_abc(3, 1, 2)*qp_i(3, 1) + &
3445 tij_abc(1, 2, 2)*qp_i(1, 2) + &
3446 tij_abc(2, 2, 2)*qp_i(2, 2) + &
3447 tij_abc(3, 2, 2)*qp_i(3, 2) + &
3448 tij_abc(1, 3, 2)*qp_i(1, 3) + &
3449 tij_abc(2, 3, 2)*qp_i(2, 3) + &
3450 tij_abc(3, 3, 2)*qp_i(3, 3)) + &
3451 dp_j(3)*(tij_abc(1, 1, 3)*qp_i(1, 1) + &
3452 tij_abc(2, 1, 3)*qp_i(2, 1) + &
3453 tij_abc(3, 1, 3)*qp_i(3, 1) + &
3454 tij_abc(1, 2, 3)*qp_i(1, 2) + &
3455 tij_abc(2, 2, 3)*qp_i(2, 2) + &
3456 tij_abc(3, 2, 3)*qp_i(3, 2) + &
3457 tij_abc(1, 3, 3)*qp_i(1, 3) + &
3458 tij_abc(2, 3, 3)*qp_i(2, 3) + &
3459 tij_abc(3, 3, 3)*qp_i(3, 3))
3461 tmp =
fac*(tmp_ij - tmp_ji)
3463 IF (do_forces .OR. do_stress)
THEN
3466 tmp_ij = dp_i(1)*(tij_abcd(1, 1, 1, k)*qp_j(1, 1) + &
3467 tij_abcd(2, 1, 1, k)*qp_j(2, 1) + &
3468 tij_abcd(3, 1, 1, k)*qp_j(3, 1) + &
3469 tij_abcd(1, 2, 1, k)*qp_j(1, 2) + &
3470 tij_abcd(2, 2, 1, k)*qp_j(2, 2) + &
3471 tij_abcd(3, 2, 1, k)*qp_j(3, 2) + &
3472 tij_abcd(1, 3, 1, k)*qp_j(1, 3) + &
3473 tij_abcd(2, 3, 1, k)*qp_j(2, 3) + &
3474 tij_abcd(3, 3, 1, k)*qp_j(3, 3)) + &
3475 dp_i(2)*(tij_abcd(1, 1, 2, k)*qp_j(1, 1) + &
3476 tij_abcd(2, 1, 2, k)*qp_j(2, 1) + &
3477 tij_abcd(3, 1, 2, k)*qp_j(3, 1) + &
3478 tij_abcd(1, 2, 2, k)*qp_j(1, 2) + &
3479 tij_abcd(2, 2, 2, k)*qp_j(2, 2) + &
3480 tij_abcd(3, 2, 2, k)*qp_j(3, 2) + &
3481 tij_abcd(1, 3, 2, k)*qp_j(1, 3) + &
3482 tij_abcd(2, 3, 2, k)*qp_j(2, 3) + &
3483 tij_abcd(3, 3, 2, k)*qp_j(3, 3)) + &
3484 dp_i(3)*(tij_abcd(1, 1, 3, k)*qp_j(1, 1) + &
3485 tij_abcd(2, 1, 3, k)*qp_j(2, 1) + &
3486 tij_abcd(3, 1, 3, k)*qp_j(3, 1) + &
3487 tij_abcd(1, 2, 3, k)*qp_j(1, 2) + &
3488 tij_abcd(2, 2, 3, k)*qp_j(2, 2) + &
3489 tij_abcd(3, 2, 3, k)*qp_j(3, 2) + &
3490 tij_abcd(1, 3, 3, k)*qp_j(1, 3) + &
3491 tij_abcd(2, 3, 3, k)*qp_j(2, 3) + &
3492 tij_abcd(3, 3, 3, k)*qp_j(3, 3))
3495 tmp_ji = dp_j(1)*(tij_abcd(1, 1, 1, k)*qp_i(1, 1) + &
3496 tij_abcd(2, 1, 1, k)*qp_i(2, 1) + &
3497 tij_abcd(3, 1, 1, k)*qp_i(3, 1) + &
3498 tij_abcd(1, 2, 1, k)*qp_i(1, 2) + &
3499 tij_abcd(2, 2, 1, k)*qp_i(2, 2) + &
3500 tij_abcd(3, 2, 1, k)*qp_i(3, 2) + &
3501 tij_abcd(1, 3, 1, k)*qp_i(1, 3) + &
3502 tij_abcd(2, 3, 1, k)*qp_i(2, 3) + &
3503 tij_abcd(3, 3, 1, k)*qp_i(3, 3)) + &
3504 dp_j(2)*(tij_abcd(1, 1, 2, k)*qp_i(1, 1) + &
3505 tij_abcd(2, 1, 2, k)*qp_i(2, 1) + &
3506 tij_abcd(3, 1, 2, k)*qp_i(3, 1) + &
3507 tij_abcd(1, 2, 2, k)*qp_i(1, 2) + &
3508 tij_abcd(2, 2, 2, k)*qp_i(2, 2) + &
3509 tij_abcd(3, 2, 2, k)*qp_i(3, 2) + &
3510 tij_abcd(1, 3, 2, k)*qp_i(1, 3) + &
3511 tij_abcd(2, 3, 2, k)*qp_i(2, 3) + &
3512 tij_abcd(3, 3, 2, k)*qp_i(3, 3)) + &
3513 dp_j(3)*(tij_abcd(1, 1, 3, k)*qp_i(1, 1) + &
3514 tij_abcd(2, 1, 3, k)*qp_i(2, 1) + &
3515 tij_abcd(3, 1, 3, k)*qp_i(3, 1) + &
3516 tij_abcd(1, 2, 3, k)*qp_i(1, 2) + &
3517 tij_abcd(2, 2, 3, k)*qp_i(2, 2) + &
3518 tij_abcd(3, 2, 3, k)*qp_i(3, 2) + &
3519 tij_abcd(1, 3, 3, k)*qp_i(1, 3) + &
3520 tij_abcd(2, 3, 3, k)*qp_i(2, 3) + &
3521 tij_abcd(3, 3, 3, k)*qp_i(3, 3))
3523 fr(k) = fr(k) -
fac*(tmp_ij - tmp_ji)
3527 IF (task(3, 1))
THEN
3532 tmp_ij = ch_i*(tij_ab(1, 1)*qp_j(1, 1) + &
3533 tij_ab(2, 1)*qp_j(2, 1) + &
3534 tij_ab(3, 1)*qp_j(3, 1) + &
3535 tij_ab(1, 2)*qp_j(1, 2) + &
3536 tij_ab(2, 2)*qp_j(2, 2) + &
3537 tij_ab(3, 2)*qp_j(3, 2) + &
3538 tij_ab(1, 3)*qp_j(1, 3) + &
3539 tij_ab(2, 3)*qp_j(2, 3) + &
3540 tij_ab(3, 3)*qp_j(3, 3))
3543 tmp_ji = ch_j*(tij_ab(1, 1)*qp_i(1, 1) + &
3544 tij_ab(2, 1)*qp_i(2, 1) + &
3545 tij_ab(3, 1)*qp_i(3, 1) + &
3546 tij_ab(1, 2)*qp_i(1, 2) + &
3547 tij_ab(2, 2)*qp_i(2, 2) + &
3548 tij_ab(3, 2)*qp_i(3, 2) + &
3549 tij_ab(1, 3)*qp_i(1, 3) + &
3550 tij_ab(2, 3)*qp_i(2, 3) + &
3551 tij_ab(3, 3)*qp_i(3, 3))
3553 eloc = eloc +
fac*(tmp_ij + tmp_ji)
3554 IF (do_forces .OR. do_stress)
THEN
3557 tmp_ij = ch_i*(tij_abc(1, 1, k)*qp_j(1, 1) + &
3558 tij_abc(2, 1, k)*qp_j(2, 1) + &
3559 tij_abc(3, 1, k)*qp_j(3, 1) + &
3560 tij_abc(1, 2, k)*qp_j(1, 2) + &
3561 tij_abc(2, 2, k)*qp_j(2, 2) + &
3562 tij_abc(3, 2, k)*qp_j(3, 2) + &
3563 tij_abc(1, 3, k)*qp_j(1, 3) + &
3564 tij_abc(2, 3, k)*qp_j(2, 3) + &
3565 tij_abc(3, 3, k)*qp_j(3, 3))
3568 tmp_ji = ch_j*(tij_abc(1, 1, k)*qp_i(1, 1) + &
3569 tij_abc(2, 1, k)*qp_i(2, 1) + &
3570 tij_abc(3, 1, k)*qp_i(3, 1) + &
3571 tij_abc(1, 2, k)*qp_i(1, 2) + &
3572 tij_abc(2, 2, k)*qp_i(2, 2) + &
3573 tij_abc(3, 2, k)*qp_i(3, 2) + &
3574 tij_abc(1, 3, k)*qp_i(1, 3) + &
3575 tij_abc(2, 3, k)*qp_i(2, 3) + &
3576 tij_abc(3, 3, k)*qp_i(3, 3))
3578 fr(k) = fr(k) -
fac*(tmp_ij + tmp_ji)
3582 energy = energy + eloc
3584 forces(1, atom_a) = forces(1, atom_a) - fr(1)
3585 forces(2, atom_a) = forces(2, atom_a) - fr(2)
3586 forces(3, atom_a) = forces(3, atom_a) - fr(3)
3587 forces(1, atom_b) = forces(1, atom_b) + fr(1)
3588 forces(2, atom_b) = forces(2, atom_b) + fr(2)
3589 forces(3, atom_b) = forces(3, atom_b) + fr(3)
3594 IF (do_efield0)
THEN
3595 efield0(atom_a) = efield0(atom_a) + ef0_j
3597 efield0(atom_b) = efield0(atom_b) + ef0_i
3600 IF (do_efield1)
THEN
3601 efield1(1, atom_a) = efield1(1, atom_a) + ef1_j(1)
3602 efield1(2, atom_a) = efield1(2, atom_a) + ef1_j(2)
3603 efield1(3, atom_a) = efield1(3, atom_a) + ef1_j(3)
3605 efield1(1, atom_b) = efield1(1, atom_b) + ef1_i(1)
3606 efield1(2, atom_b) = efield1(2, atom_b) + ef1_i(2)
3607 efield1(3, atom_b) = efield1(3, atom_b) + ef1_i(3)
3610 IF (do_efield2)
THEN
3611 efield2(1, atom_a) = efield2(1, atom_a) + ef2_j(1, 1)
3612 efield2(2, atom_a) = efield2(2, atom_a) + ef2_j(1, 2)
3613 efield2(3, atom_a) = efield2(3, atom_a) + ef2_j(1, 3)
3614 efield2(4, atom_a) = efield2(4, atom_a) + ef2_j(2, 1)
3615 efield2(5, atom_a) = efield2(5, atom_a) + ef2_j(2, 2)
3616 efield2(6, atom_a) = efield2(6, atom_a) + ef2_j(2, 3)
3617 efield2(7, atom_a) = efield2(7, atom_a) + ef2_j(3, 1)
3618 efield2(8, atom_a) = efield2(8, atom_a) + ef2_j(3, 2)
3619 efield2(9, atom_a) = efield2(9, atom_a) + ef2_j(3, 3)
3621 efield2(1, atom_b) = efield2(1, atom_b) + ef2_i(1, 1)
3622 efield2(2, atom_b) = efield2(2, atom_b) + ef2_i(1, 2)
3623 efield2(3, atom_b) = efield2(3, atom_b) + ef2_i(1, 3)
3624 efield2(4, atom_b) = efield2(4, atom_b) + ef2_i(2, 1)
3625 efield2(5, atom_b) = efield2(5, atom_b) + ef2_i(2, 2)
3626 efield2(6, atom_b) = efield2(6, atom_b) + ef2_i(2, 3)
3627 efield2(7, atom_b) = efield2(7, atom_b) + ef2_i(3, 1)
3628 efield2(8, atom_b) = efield2(8, atom_b) + ef2_i(3, 2)
3629 efield2(9, atom_b) = efield2(9, atom_b) + ef2_i(3, 3)
3633 ptens11 = ptens11 + rab(1)*fr(1)
3634 ptens21 = ptens21 + rab(2)*fr(1)
3635 ptens31 = ptens31 + rab(3)*fr(1)
3636 ptens12 = ptens12 + rab(1)*fr(2)
3637 ptens22 = ptens22 + rab(2)*fr(2)
3638 ptens32 = ptens32 + rab(3)*fr(2)
3639 ptens13 = ptens13 + rab(1)*fr(3)
3640 ptens23 = ptens23 + rab(2)*fr(3)
3641 ptens33 = ptens33 + rab(3)*fr(3)
3645 END DO kind_group_loop
3648 pv(1, 1) = pv(1, 1) + ptens11
3649 pv(1, 2) = pv(1, 2) + (ptens12 + ptens21)*0.5_dp
3650 pv(1, 3) = pv(1, 3) + (ptens13 + ptens31)*0.5_dp
3652 pv(2, 2) = pv(2, 2) + ptens22
3653 pv(2, 3) = pv(2, 3) + (ptens23 + ptens32)*0.5_dp
3656 pv(3, 3) = pv(3, 3) + ptens33
3659 CALL timestop(handle)
3660 END SUBROUTINE ewald_multipole_bonded
3685 SUBROUTINE ewald_multipole_lr(ewald_env, ewald_pw, cell, particle_set, &
3686 local_particles, energy, task, do_forces, do_efield, do_stress, &
3687 charges, dipoles, quadrupoles, forces, pv, efield0, efield1, efield2)
3688 TYPE(ewald_environment_type),
POINTER :: ewald_env
3689 TYPE(ewald_pw_type),
POINTER :: ewald_pw
3690 TYPE(cell_type),
POINTER :: cell
3691 TYPE(particle_type),
POINTER :: particle_set(:)
3692 TYPE(distribution_1d_type),
POINTER :: local_particles
3693 REAL(kind=
dp),
INTENT(INOUT) :: energy
3694 LOGICAL,
DIMENSION(3, 3),
INTENT(IN) :: task
3695 LOGICAL,
INTENT(IN) :: do_forces, do_efield, do_stress
3696 REAL(kind=
dp),
DIMENSION(:),
OPTIONAL,
POINTER :: charges
3697 REAL(kind=
dp),
DIMENSION(:, :),
OPTIONAL,
POINTER :: dipoles
3698 REAL(kind=
dp),
DIMENSION(:, :, :),
OPTIONAL, &
3699 POINTER :: quadrupoles
3700 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(INOUT), &
3701 OPTIONAL :: forces, pv
3702 REAL(kind=
dp),
DIMENSION(:),
POINTER :: efield0
3703 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: efield1, efield2
3705 CHARACTER(len=*),
PARAMETER :: routinen =
'ewald_multipole_LR'
3707 COMPLEX(KIND=dp) :: atm_factor, atm_factor_st(3), cnjg_fac, &
3709 COMPLEX(KIND=dp),
ALLOCATABLE,
DIMENSION(:) :: summe_ef
3710 COMPLEX(KIND=dp),
ALLOCATABLE,
DIMENSION(:, :) :: summe_st
3711 INTEGER :: gpt, handle, iparticle, iparticle_kind, iparticle_local, lp, mp, nnodes, &
3712 node, np, nparticle_kind, nparticle_local
3713 INTEGER,
DIMENSION(:, :),
POINTER :: bds
3714 LOGICAL :: do_efield0, do_efield1, do_efield2
3715 REAL(kind=
dp) :: alpha, denom, dipole_t(3), f0, factor, &
3716 four_alpha_sq, gauss, pref, q_t, tmp, &
3718 REAL(kind=
dp),
DIMENSION(3) :: tmp_v, vec
3719 REAL(kind=
dp),
DIMENSION(3, 3) :: pv_tmp
3720 REAL(kind=
dp),
DIMENSION(:, :, :),
POINTER :: rho0
3721 TYPE(dg_rho0_type),
POINTER :: dg_rho0
3723 TYPE(pw_grid_type),
POINTER :: pw_grid
3724 TYPE(pw_pool_type),
POINTER :: pw_pool
3725 TYPE(structure_factor_type) :: exp_igr
3726 TYPE(mp_comm_type) :: group
3728 CALL timeset(routinen, handle)
3729 do_efield0 = do_efield .AND.
ASSOCIATED(efield0)
3730 do_efield1 = do_efield .AND.
ASSOCIATED(efield1)
3731 do_efield2 = do_efield .AND.
ASSOCIATED(efield2)
3735 CALL ewald_pw_get(ewald_pw, pw_big_pool=pw_pool, dg=dg)
3736 CALL dg_get(dg, dg_rho0=dg_rho0)
3737 rho0 => dg_rho0%density%array
3738 pw_grid => pw_pool%pw_grid
3739 bds => pw_grid%bounds
3742 nparticle_kind =
SIZE(local_particles%n_el)
3744 DO iparticle_kind = 1, nparticle_kind
3745 nnodes = nnodes + local_particles%n_el(iparticle_kind)
3749 ALLOCATE (summe_ef(1:pw_grid%ngpts_cut))
3750 summe_ef = cmplx(0.0_dp, 0.0_dp, kind=
dp)
3754 ALLOCATE (summe_st(3, 1:pw_grid%ngpts_cut))
3755 summe_st = cmplx(0.0_dp, 0.0_dp, kind=
dp)
3759 four_alpha_sq = 4.0_dp*alpha**2
3765 DO iparticle_kind = 1, nparticle_kind
3766 nparticle_local = local_particles%n_el(iparticle_kind)
3767 DO iparticle_local = 1, nparticle_local
3769 iparticle = local_particles%list(iparticle_kind)%array(iparticle_local)
3770 vec = matmul(cell%h_inv, particle_set(iparticle)%r)
3772 exp_igr%ex(:, node), exp_igr%ey(:, node), exp_igr%ez(:, node))
3775 IF (any(task(1, :)))
THEN
3776 q_t = q_t + charges(iparticle)
3778 IF (any(task(2, :)))
THEN
3779 dipole_t = dipole_t + dipoles(:, iparticle)
3781 IF (any(task(3, :)))
THEN
3782 trq_t = trq_t + quadrupoles(1, 1, iparticle) + &
3783 quadrupoles(2, 2, iparticle) + &
3784 quadrupoles(3, 3, iparticle)
3790 DO gpt = 1, pw_grid%ngpts_cut_local
3791 lp = pw_grid%mapl%pos(pw_grid%g_hat(1, gpt))
3792 mp = pw_grid%mapm%pos(pw_grid%g_hat(2, gpt))
3793 np = pw_grid%mapn%pos(pw_grid%g_hat(3, gpt))
3801 DO iparticle_kind = 1, nparticle_kind
3802 nparticle_local = local_particles%n_el(iparticle_kind)
3803 DO iparticle_local = 1, nparticle_local
3805 iparticle = local_particles%list(iparticle_kind)%array(iparticle_local)
3807 CALL get_atom_factor(atm_factor, pw_grid, gpt, iparticle, task, charges, &
3808 dipoles, quadrupoles)
3809 summe_tmp = exp_igr%ex(lp, node)*exp_igr%ey(mp, node)*exp_igr%ez(np, node)
3810 summe_ef(gpt) = summe_ef(gpt) + atm_factor*summe_tmp
3814 CALL get_atom_factor_stress(atm_factor_st, pw_grid, gpt, iparticle, task, &
3815 dipoles, quadrupoles)
3816 summe_st(1:3, gpt) = summe_st(1:3, gpt) + atm_factor_st(1:3)*summe_tmp
3822 CALL group%sum(dipole_t)
3823 CALL group%sum(trq_t)
3824 CALL group%sum(summe_ef)
3825 IF (do_stress)
CALL group%sum(summe_st)
3828 DO gpt = 1, pw_grid%ngpts_cut_local
3830 lp = pw_grid%mapl%pos(pw_grid%g_hat(1, gpt))
3831 mp = pw_grid%mapm%pos(pw_grid%g_hat(2, gpt))
3832 np = pw_grid%mapn%pos(pw_grid%g_hat(3, gpt))
3838 IF (pw_grid%gsq(gpt) == 0.0_dp)
THEN
3840 energy = energy + (1.0_dp/6.0_dp)*dot_product(dipole_t, dipole_t) &
3841 - (1.0_dp/9.0_dp)*q_t*trq_t
3844 pv_tmp(1, 1) = pv_tmp(1, 1) + (1.0_dp/6.0_dp)*dot_product(dipole_t, dipole_t)
3845 pv_tmp(2, 2) = pv_tmp(2, 2) + (1.0_dp/6.0_dp)*dot_product(dipole_t, dipole_t)
3846 pv_tmp(3, 3) = pv_tmp(3, 3) + (1.0_dp/6.0_dp)*dot_product(dipole_t, dipole_t)
3849 IF (do_efield .AND. (debug_e_field_en .OR. (.NOT. debug_this_module)))
THEN
3854 DO iparticle_kind = 1, nparticle_kind
3855 nparticle_local = local_particles%n_el(iparticle_kind)
3856 DO iparticle_local = 1, nparticle_local
3858 iparticle = local_particles%list(iparticle_kind)%array(iparticle_local)
3861 IF (do_efield0)
THEN
3862 efield0(iparticle) = efield0(iparticle)
3865 IF (do_efield1)
THEN
3866 efield1(1:3, iparticle) = efield1(1:3, iparticle) - (1.0_dp/6.0_dp)*dipole_t(1:3)
3869 IF (do_efield2)
THEN
3870 efield2(1, iparticle) = efield2(1, iparticle) - (1.0_dp/(18.0_dp))*q_t
3871 efield2(5, iparticle) = efield2(5, iparticle) - (1.0_dp/(18.0_dp))*q_t
3872 efield2(9, iparticle) = efield2(9, iparticle) - (1.0_dp/(18.0_dp))*q_t
3879 gauss = (rho0(lp, mp, np)*pw_grid%vol)**2/pw_grid%gsq(gpt)
3880 factor = gauss*real(summe_ef(gpt)*conjg(summe_ef(gpt)), kind=
dp)
3881 energy = energy + factor
3883 IF (do_forces .OR. do_efield)
THEN
3885 DO iparticle_kind = 1, nparticle_kind
3886 nparticle_local = local_particles%n_el(iparticle_kind)
3887 DO iparticle_local = 1, nparticle_local
3889 iparticle = local_particles%list(iparticle_kind)%array(iparticle_local)
3890 fac = exp_igr%ex(lp, node)*exp_igr%ey(mp, node)*exp_igr%ez(np, node)
3891 cnjg_fac = conjg(
fac)
3895 CALL get_atom_factor(atm_factor, pw_grid, gpt, iparticle, task, charges, &
3896 dipoles, quadrupoles)
3898 tmp = gauss*aimag(summe_ef(gpt)*(cnjg_fac*conjg(atm_factor)))
3899 forces(1, node) = forces(1, node) + tmp*pw_grid%g(1, gpt)
3900 forces(2, node) = forces(2, node) + tmp*pw_grid%g(2, gpt)
3901 forces(3, node) = forces(3, node) + tmp*pw_grid%g(3, gpt)
3907 IF (do_efield0)
THEN
3908 efield0(iparticle) = efield0(iparticle) + gauss*real(
fac*conjg(summe_ef(gpt)), kind=
dp)
3911 IF (do_efield1)
THEN
3912 tmp = aimag(
fac*conjg(summe_ef(gpt)))*gauss
3913 efield1(1, iparticle) = efield1(1, iparticle) - tmp*pw_grid%g(1, gpt)
3914 efield1(2, iparticle) = efield1(2, iparticle) - tmp*pw_grid%g(2, gpt)
3915 efield1(3, iparticle) = efield1(3, iparticle) - tmp*pw_grid%g(3, gpt)
3918 IF (do_efield2)
THEN
3919 tmp_v(1) = real(
fac*conjg(summe_ef(gpt)), kind=
dp)*pw_grid%g(1, gpt)*gauss
3920 tmp_v(2) = real(
fac*conjg(summe_ef(gpt)), kind=
dp)*pw_grid%g(2, gpt)*gauss
3921 tmp_v(3) = real(
fac*conjg(summe_ef(gpt)), kind=
dp)*pw_grid%g(3, gpt)*gauss
3923 efield2(1, iparticle) = efield2(1, iparticle) + tmp_v(1)*pw_grid%g(1, gpt)
3924 efield2(2, iparticle) = efield2(2, iparticle) + tmp_v(1)*pw_grid%g(2, gpt)
3925 efield2(3, iparticle) = efield2(3, iparticle) + tmp_v(1)*pw_grid%g(3, gpt)
3926 efield2(4, iparticle) = efield2(4, iparticle) + tmp_v(2)*pw_grid%g(1, gpt)
3927 efield2(5, iparticle) = efield2(5, iparticle) + tmp_v(2)*pw_grid%g(2, gpt)
3928 efield2(6, iparticle) = efield2(6, iparticle) + tmp_v(2)*pw_grid%g(3, gpt)
3929 efield2(7, iparticle) = efield2(7, iparticle) + tmp_v(3)*pw_grid%g(1, gpt)
3930 efield2(8, iparticle) = efield2(8, iparticle) + tmp_v(3)*pw_grid%g(2, gpt)
3931 efield2(9, iparticle) = efield2(9, iparticle) + tmp_v(3)*pw_grid%g(3, gpt)
3942 denom = 1.0_dp/four_alpha_sq + 1.0_dp/pw_grid%gsq(gpt)
3943 pv_tmp(1, 1) = pv_tmp(1, 1) + factor*(1.0_dp - 2.0_dp*pw_grid%g(1, gpt)*pw_grid%g(1, gpt)*denom)
3944 pv_tmp(1, 2) = pv_tmp(1, 2) - factor*(2.0_dp*pw_grid%g(1, gpt)*pw_grid%g(2, gpt)*denom)
3945 pv_tmp(1, 3) = pv_tmp(1, 3) - factor*(2.0_dp*pw_grid%g(1, gpt)*pw_grid%g(3, gpt)*denom)
3946 pv_tmp(2, 1) = pv_tmp(2, 1) - factor*(2.0_dp*pw_grid%g(2, gpt)*pw_grid%g(1, gpt)*denom)
3947 pv_tmp(2, 2) = pv_tmp(2, 2) + factor*(1.0_dp - 2.0_dp*pw_grid%g(2, gpt)*pw_grid%g(2, gpt)*denom)
3948 pv_tmp(2, 3) = pv_tmp(2, 3) - factor*(2.0_dp*pw_grid%g(2, gpt)*pw_grid%g(3, gpt)*denom)
3949 pv_tmp(3, 1) = pv_tmp(3, 1) - factor*(2.0_dp*pw_grid%g(3, gpt)*pw_grid%g(1, gpt)*denom)
3950 pv_tmp(3, 2) = pv_tmp(3, 2) - factor*(2.0_dp*pw_grid%g(3, gpt)*pw_grid%g(2, gpt)*denom)
3951 pv_tmp(3, 3) = pv_tmp(3, 3) + factor*(1.0_dp - 2.0_dp*pw_grid%g(3, gpt)*pw_grid%g(3, gpt)*denom)
3954 pv_tmp(1, 1) = pv_tmp(1, 1) + f0*pw_grid%g(1, gpt)*real(summe_st(1, gpt)*conjg(summe_ef(gpt)), kind=
dp)
3955 pv_tmp(1, 2) = pv_tmp(1, 2) + f0*pw_grid%g(1, gpt)*real(summe_st(2, gpt)*conjg(summe_ef(gpt)), kind=
dp)
3956 pv_tmp(1, 3) = pv_tmp(1, 3) + f0*pw_grid%g(1, gpt)*real(summe_st(3, gpt)*conjg(summe_ef(gpt)), kind=
dp)
3957 pv_tmp(2, 1) = pv_tmp(2, 1) + f0*pw_grid%g(2, gpt)*real(summe_st(1, gpt)*conjg(summe_ef(gpt)), kind=
dp)
3958 pv_tmp(2, 2) = pv_tmp(2, 2) + f0*pw_grid%g(2, gpt)*real(summe_st(2, gpt)*conjg(summe_ef(gpt)), kind=
dp)
3959 pv_tmp(2, 3) = pv_tmp(2, 3) + f0*pw_grid%g(2, gpt)*real(summe_st(3, gpt)*conjg(summe_ef(gpt)), kind=
dp)
3960 pv_tmp(3, 1) = pv_tmp(3, 1) + f0*pw_grid%g(3, gpt)*real(summe_st(1, gpt)*conjg(summe_ef(gpt)), kind=
dp)
3961 pv_tmp(3, 2) = pv_tmp(3, 2) + f0*pw_grid%g(3, gpt)*real(summe_st(2, gpt)*conjg(summe_ef(gpt)), kind=
dp)
3962 pv_tmp(3, 3) = pv_tmp(3, 3) + f0*pw_grid%g(3, gpt)*real(summe_st(3, gpt)*conjg(summe_ef(gpt)), kind=
dp)
3965 pref =
fourpi/pw_grid%vol
3966 energy = energy*pref
3969 DEALLOCATE (summe_ef)
3971 pv_tmp = pv_tmp*pref
3973 pv(1, 1) = pv(1, 1) + pv_tmp(1, 1)
3974 pv(1, 2) = pv(1, 2) + (pv_tmp(1, 2) + pv_tmp(2, 1))*0.5_dp
3975 pv(1, 3) = pv(1, 3) + (pv_tmp(1, 3) + pv_tmp(3, 1))*0.5_dp
3977 pv(2, 2) = pv(2, 2) + pv_tmp(2, 2)
3978 pv(2, 3) = pv(2, 3) + (pv_tmp(2, 3) + pv_tmp(3, 2))*0.5_dp
3981 pv(3, 3) = pv(3, 3) + pv_tmp(3, 3)
3982 DEALLOCATE (summe_st)
3985 forces = 2.0_dp*forces*pref
3987 IF (do_efield0)
THEN
3988 efield0 = 2.0_dp*efield0*pref
3990 IF (do_efield1)
THEN
3991 efield1 = 2.0_dp*efield1*pref
3993 IF (do_efield2)
THEN
3994 efield2 = 2.0_dp*efield2*pref
3996 CALL timestop(handle)
3998 END SUBROUTINE ewald_multipole_lr
4014 SUBROUTINE get_atom_factor(atm_factor, pw_grid, gpt, iparticle, task, charges, &
4015 dipoles, quadrupoles)
4016 COMPLEX(KIND=dp),
INTENT(OUT) :: atm_factor
4017 TYPE(pw_grid_type),
POINTER :: pw_grid
4018 INTEGER,
INTENT(IN) :: gpt
4019 INTEGER :: iparticle
4020 LOGICAL,
DIMENSION(3, 3),
INTENT(IN) :: task
4021 REAL(kind=
dp),
DIMENSION(:),
OPTIONAL,
POINTER :: charges
4022 REAL(kind=
dp),
DIMENSION(:, :),
OPTIONAL,
POINTER :: dipoles
4023 REAL(kind=
dp),
DIMENSION(:, :, :),
OPTIONAL, &
4024 POINTER :: quadrupoles
4026 COMPLEX(KIND=dp) :: tmp
4029 atm_factor = cmplx(0.0_dp, 0.0_dp, kind=
dp)
4030 IF (task(1, 1))
THEN
4032 atm_factor = atm_factor + charges(iparticle)
4034 IF (task(2, 2))
THEN
4036 tmp = cmplx(0.0_dp, 0.0_dp, kind=
dp)
4038 tmp = tmp + dipoles(i, iparticle)*pw_grid%g(i, gpt)
4040 atm_factor = atm_factor + tmp*cmplx(0.0_dp, -1.0_dp, kind=
dp)
4042 IF (task(3, 3))
THEN
4044 tmp = cmplx(0.0_dp, 0.0_dp, kind=
dp)
4047 tmp = tmp + quadrupoles(j, i, iparticle)*pw_grid%g(j, gpt)*pw_grid%g(i, gpt)
4050 atm_factor = atm_factor - 1.0_dp/3.0_dp*tmp
4053 END SUBROUTINE get_atom_factor
4068 SUBROUTINE get_atom_factor_stress(atm_factor, pw_grid, gpt, iparticle, task, &
4069 dipoles, quadrupoles)
4070 COMPLEX(KIND=dp),
INTENT(OUT) :: atm_factor(3)
4071 TYPE(pw_grid_type),
POINTER :: pw_grid
4072 INTEGER,
INTENT(IN) :: gpt
4073 INTEGER :: iparticle
4074 LOGICAL,
DIMENSION(3, 3),
INTENT(IN) :: task
4075 REAL(kind=
dp),
DIMENSION(:, :),
OPTIONAL,
POINTER :: dipoles
4076 REAL(kind=
dp),
DIMENSION(:, :, :),
OPTIONAL, &
4077 POINTER :: quadrupoles
4081 atm_factor = cmplx(0.0_dp, 0.0_dp, kind=
dp)
4082 IF (any(task(2, :)))
THEN
4084 atm_factor = dipoles(:, iparticle)*cmplx(0.0_dp, -1.0_dp, kind=
dp)
4086 IF (any(task(3, :)))
THEN
4089 atm_factor(1) = atm_factor(1) - 1.0_dp/3.0_dp* &
4090 (quadrupoles(1, i, iparticle)*pw_grid%g(i, gpt) + &
4091 quadrupoles(i, 1, iparticle)*pw_grid%g(i, gpt))
4092 atm_factor(2) = atm_factor(2) - 1.0_dp/3.0_dp* &
4093 (quadrupoles(2, i, iparticle)*pw_grid%g(i, gpt) + &
4094 quadrupoles(i, 2, iparticle)*pw_grid%g(i, gpt))
4095 atm_factor(3) = atm_factor(3) - 1.0_dp/3.0_dp* &
4096 (quadrupoles(3, i, iparticle)*pw_grid%g(i, gpt) + &
4097 quadrupoles(i, 3, iparticle)*pw_grid%g(i, gpt))
4101 END SUBROUTINE get_atom_factor_stress
4122 SUBROUTINE ewald_multipole_self(ewald_env, cell, local_particles, e_self, &
4123 e_neut, task, do_efield, radii, charges, dipoles, quadrupoles, efield0, &
4125 TYPE(ewald_environment_type),
POINTER :: ewald_env
4126 TYPE(cell_type),
POINTER :: cell
4127 TYPE(distribution_1d_type),
POINTER :: local_particles
4128 REAL(kind=
dp),
INTENT(OUT) :: e_self, e_neut
4129 LOGICAL,
DIMENSION(3, 3),
INTENT(IN) :: task
4130 LOGICAL,
INTENT(IN) :: do_efield
4131 REAL(kind=
dp),
DIMENSION(:),
OPTIONAL,
POINTER :: radii, charges
4132 REAL(kind=
dp),
DIMENSION(:, :),
OPTIONAL,
POINTER :: dipoles
4133 REAL(kind=
dp),
DIMENSION(:, :, :),
OPTIONAL, &
4134 POINTER :: quadrupoles
4135 REAL(kind=
dp),
DIMENSION(:),
POINTER :: efield0
4136 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: efield1, efield2
4138 REAL(kind=
dp),
PARAMETER :: f23 = 2.0_dp/3.0_dp, &
4139 f415 = 4.0_dp/15.0_dp
4141 INTEGER :: ewald_type, i, iparticle, &
4142 iparticle_kind, iparticle_local, j, &
4144 LOGICAL :: do_efield0, do_efield1, do_efield2, &
4146 REAL(kind=
dp) :: alpha, ch_qu_self, ch_qu_self_tmp, &
4147 dipole_self, fac1, fac2, fac3, fac4, &
4148 q, q_neutg, q_self, q_sum, qu_qu_self, &
4150 TYPE(mp_comm_type) :: group
4152 CALL ewald_env_get(ewald_env, ewald_type=ewald_type, alpha=alpha, &
4155 do_efield0 = do_efield .AND.
ASSOCIATED(efield0)
4156 do_efield1 = do_efield .AND.
ASSOCIATED(efield1)
4157 do_efield2 = do_efield .AND.
ASSOCIATED(efield2)
4160 dipole_self = 0.0_dp
4164 fac2 = 6.0_dp*(f23**2)*(alpha**3)*
oorootpi
4165 fac3 = (2.0_dp*
oorootpi)*f23*alpha**3
4166 fac4 = (4.0_dp*
oorootpi)*f415*alpha**5
4167 lradii =
PRESENT(radii)
4170 DO iparticle_kind = 1,
SIZE(local_particles%n_el)
4171 nparticle_local = local_particles%n_el(iparticle_kind)
4172 DO iparticle_local = 1, nparticle_local
4173 iparticle = local_particles%list(iparticle_kind)%array(iparticle_local)
4174 IF (any(task(1, :)))
THEN
4176 q = charges(iparticle)
4177 IF (lradii) radius = radii(iparticle)
4178 IF (radius > 0)
THEN
4179 q_neutg = q_neutg + 2.0_dp*q*radius**2
4181 q_self = q_self + q*q
4184 IF (do_efield0)
THEN
4185 efield0(iparticle) = efield0(iparticle) - q*fac1
4188 IF (task(1, 3))
THEN
4190 ch_qu_self_tmp = 0.0_dp
4192 ch_qu_self_tmp = ch_qu_self_tmp + quadrupoles(i, i, iparticle)*q
4194 ch_qu_self = ch_qu_self + ch_qu_self_tmp
4196 IF (do_efield2)
THEN
4197 efield2(1, iparticle) = efield2(1, iparticle) + fac2*q
4198 efield2(5, iparticle) = efield2(5, iparticle) + fac2*q
4199 efield2(9, iparticle) = efield2(9, iparticle) + fac2*q
4203 IF (any(task(2, :)))
THEN
4206 dipole_self = dipole_self + dipoles(i, iparticle)**2
4209 IF (do_efield1)
THEN
4210 efield1(1, iparticle) = efield1(1, iparticle) + fac3*dipoles(1, iparticle)
4211 efield1(2, iparticle) = efield1(2, iparticle) + fac3*dipoles(2, iparticle)
4212 efield1(3, iparticle) = efield1(3, iparticle) + fac3*dipoles(3, iparticle)
4215 IF (any(task(3, :)))
THEN
4219 qu_qu_self = qu_qu_self + quadrupoles(j, i, iparticle)**2
4223 IF (do_efield2)
THEN
4224 efield2(1, iparticle) = efield2(1, iparticle) + fac4*quadrupoles(1, 1, iparticle)
4225 efield2(2, iparticle) = efield2(2, iparticle) + fac4*quadrupoles(2, 1, iparticle)
4226 efield2(3, iparticle) = efield2(3, iparticle) + fac4*quadrupoles(3, 1, iparticle)
4227 efield2(4, iparticle) = efield2(4, iparticle) + fac4*quadrupoles(1, 2, iparticle)
4228 efield2(5, iparticle) = efield2(5, iparticle) + fac4*quadrupoles(2, 2, iparticle)
4229 efield2(6, iparticle) = efield2(6, iparticle) + fac4*quadrupoles(3, 2, iparticle)
4230 efield2(7, iparticle) = efield2(7, iparticle) + fac4*quadrupoles(1, 3, iparticle)
4231 efield2(8, iparticle) = efield2(8, iparticle) + fac4*quadrupoles(2, 3, iparticle)
4232 efield2(9, iparticle) = efield2(9, iparticle) + fac4*quadrupoles(3, 3, iparticle)
4238 CALL group%sum(q_neutg)
4239 CALL group%sum(q_self)
4240 CALL group%sum(q_sum)
4241 CALL group%sum(dipole_self)
4242 CALL group%sum(ch_qu_self)
4243 CALL group%sum(qu_qu_self)
4245 e_self = -(q_self + f23*(dipole_self - f23*ch_qu_self + f415*qu_qu_self*alpha**2)*alpha**2)*alpha*
oorootpi
4246 fac1 =
pi/(2.0_dp*cell%deth)
4247 e_neut = -q_sum*fac1*(q_sum/alpha**2 - q_neutg)
4250 DO iparticle_kind = 1,
SIZE(local_particles%n_el)
4251 nparticle_local = local_particles%n_el(iparticle_kind)
4252 DO iparticle_local = 1, nparticle_local
4253 iparticle = local_particles%list(iparticle_kind)%array(iparticle_local)
4254 IF (any(task(1, :)))
THEN
4256 IF (do_efield0)
THEN
4257 efield0(iparticle) = efield0(iparticle) - q_sum*2.0_dp*fac1/alpha**2
4258 IF (lradii) radius = radii(iparticle)
4259 IF (radius > 0)
THEN
4260 q = charges(iparticle)
4261 efield0(iparticle) = efield0(iparticle) + fac1*radius**2*(q_sum + q)
4268 END SUBROUTINE ewald_multipole_self
4280 SUBROUTINE ewald_multipole_print(iw, e_gspace, e_rspace, e_bonded, e_self, e_neut)
4282 INTEGER,
INTENT(IN) :: iw
4283 REAL(kind=
dp),
INTENT(IN) :: e_gspace, e_rspace, e_bonded, e_self, &
4287 WRITE (iw,
'( A, A )')
' *********************************', &
4288 '**********************************************'
4289 WRITE (iw,
'( A, A, T35, A, T56, E25.15 )')
' INITIAL GSPACE ENERGY', &
4290 '[hartree]',
'= ', e_gspace
4291 WRITE (iw,
'( A, A, T35, A, T56, E25.15 )')
' INITIAL RSPACE ENERGY', &
4292 '[hartree]',
'= ', e_rspace
4293 WRITE (iw,
'( A, A, T35, A, T56, E25.15 )')
' BONDED CORRECTION', &
4294 '[hartree]',
'= ', e_bonded
4295 WRITE (iw,
'( A, A, T35, A, T56, E25.15 )')
' SELF ENERGY CORRECTION', &
4296 '[hartree]',
'= ', e_self
4297 WRITE (iw,
'( A, A, T35, A, T56, E25.15 )')
' NEUTRALIZ. BCKGR. ENERGY', &
4298 '[hartree]',
'= ', e_neut
4299 WRITE (iw,
'( A, A, T35, A, T56, E25.15 )')
' TOTAL ELECTROSTATIC EN.', &
4300 '[hartree]',
'= ', e_rspace + e_bonded + e_gspace + e_self + e_neut
4301 WRITE (iw,
'( A, A )')
' *********************************', &
4302 '**********************************************'
4304 END SUBROUTINE ewald_multipole_print
4319 SUBROUTINE debug_ewald_multipoles(ewald_env, ewald_pw, nonbond_env, cell, &
4320 particle_set, local_particles, iw, debug_r_space)
4321 TYPE charge_mono_type
4322 REAL(kind=
dp),
DIMENSION(:), &
4324 REAL(kind=
dp),
DIMENSION(:, :), &
4326 END TYPE charge_mono_type
4327 TYPE multi_charge_type
4328 TYPE(charge_mono_type),
DIMENSION(:), &
4329 POINTER :: charge_typ
4330 END TYPE multi_charge_type
4331 TYPE(ewald_environment_type),
POINTER :: ewald_env
4332 TYPE(ewald_pw_type),
POINTER :: ewald_pw
4333 TYPE(fist_nonbond_env_type),
POINTER :: nonbond_env
4334 TYPE(cell_type),
POINTER :: cell
4335 TYPE(particle_type),
DIMENSION(:), &
4336 POINTER :: particle_set
4337 TYPE(distribution_1d_type),
POINTER :: local_particles
4338 INTEGER,
INTENT(IN) :: iw
4339 LOGICAL,
INTENT(IN) :: debug_r_space
4341 INTEGER :: nparticles
4342 LOGICAL,
DIMENSION(3) :: task
4343 REAL(kind=
dp) :: e_neut, e_self, g_energy, &
4344 r_energy, debug_energy
4345 REAL(kind=
dp),
POINTER,
DIMENSION(:) :: charges
4346 REAL(kind=
dp),
POINTER, &
4347 DIMENSION(:, :) :: dipoles, g_forces, g_pv, &
4348 r_forces, r_pv, e_field1, &
4350 REAL(kind=
dp),
POINTER, &
4351 DIMENSION(:, :, :) :: quadrupoles
4352 TYPE(rng_stream_type) :: random_stream
4353 TYPE(multi_charge_type),
DIMENSION(:), &
4354 POINTER :: multipoles
4356 NULLIFY (multipoles, charges, dipoles, g_forces, g_pv, &
4357 r_forces, r_pv, e_field1, e_field2)
4358 random_stream = rng_stream_type(name=
"DEBUG_EWALD_MULTIPOLE", &
4362 nparticles =
SIZE(particle_set)
4365 ALLOCATE (charges(nparticles))
4366 ALLOCATE (dipoles(3, nparticles))
4367 ALLOCATE (quadrupoles(3, 3, nparticles))
4370 ALLOCATE (r_forces(3, nparticles))
4371 ALLOCATE (g_forces(3, nparticles))
4372 ALLOCATE (e_field1(3, nparticles))
4373 ALLOCATE (e_field2(3, nparticles))
4374 ALLOCATE (g_pv(3, 3))
4375 ALLOCATE (r_pv(3, 3))
4381 quadrupoles = 0.0_dp
4393 CALL create_multi_type(multipoles, nparticles, 1, nparticles/2,
"CHARGE", echarge=-1.0_dp, &
4394 random_stream=random_stream, charges=charges)
4395 CALL create_multi_type(multipoles, nparticles, nparticles/2 + 1, nparticles,
"CHARGE", echarge=1.0_dp, &
4396 random_stream=random_stream, charges=charges)
4397 CALL debug_ewald_multipole_low(particle_set, cell, nonbond_env, multipoles, debug_energy, &
4400 WRITE (iw, *)
"DEBUG ENERGY (CHARGE-CHARGE): ", debug_energy
4402 particle_set, local_particles, g_energy, r_energy, e_neut, e_self, &
4403 task, do_correction_bonded=.false., do_forces=.true., do_stress=.true., do_efield=.false., &
4404 charges=charges, dipoles=dipoles, quadrupoles=quadrupoles, forces_local=g_forces, &
4405 forces_glob=r_forces, pv_local=g_pv, pv_glob=r_pv, iw=iw, do_debug=.false.)
4406 CALL release_multi_type(multipoles)
4413 quadrupoles = 0.0_dp
4425 CALL create_multi_type(multipoles, nparticles, 1, nparticles/2,
"CHARGE", echarge=-1.0_dp, &
4426 random_stream=random_stream, charges=charges)
4427 CALL create_multi_type(multipoles, nparticles, nparticles/2 + 1, nparticles,
"DIPOLE", echarge=0.5_dp, &
4428 random_stream=random_stream, dipoles=dipoles)
4429 WRITE (iw,
'("CHARGES",F15.9)') charges
4430 WRITE (iw,
'("DIPOLES",3F15.9)') dipoles
4431 CALL debug_ewald_multipole_low(particle_set, cell, nonbond_env, multipoles, debug_energy, &
4434 WRITE (iw, *)
"DEBUG ENERGY (CHARGE-DIPOLE): ", debug_energy
4436 particle_set, local_particles, g_energy, r_energy, e_neut, e_self, &
4437 task, do_correction_bonded=.false., do_forces=.true., do_stress=.true., do_efield=.false., &
4438 charges=charges, dipoles=dipoles, quadrupoles=quadrupoles, forces_local=g_forces, &
4439 forces_glob=r_forces, pv_local=g_pv, pv_glob=r_pv, iw=iw, do_debug=.false.)
4440 CALL release_multi_type(multipoles)
4446 quadrupoles = 0.0_dp
4458 CALL create_multi_type(multipoles, nparticles, 1, nparticles/2,
"DIPOLE", echarge=10000.0_dp, &
4459 random_stream=random_stream, dipoles=dipoles)
4460 CALL create_multi_type(multipoles, nparticles, nparticles/2 + 1, nparticles,
"DIPOLE", echarge=20000._dp, &
4461 random_stream=random_stream, dipoles=dipoles)
4462 WRITE (iw,
'("DIPOLES",3F15.9)') dipoles
4463 CALL debug_ewald_multipole_low(particle_set, cell, nonbond_env, multipoles, debug_energy, &
4466 WRITE (iw, *)
"DEBUG ENERGY (DIPOLE-DIPOLE): ", debug_energy
4468 particle_set, local_particles, g_energy, r_energy, e_neut, e_self, &
4469 task, do_correction_bonded=.false., do_forces=.true., do_stress=.true., do_efield=.false., &
4470 charges=charges, dipoles=dipoles, quadrupoles=quadrupoles, forces_local=g_forces, &
4471 forces_glob=r_forces, pv_local=g_pv, pv_glob=r_pv, iw=iw, do_debug=.false.)
4472 CALL release_multi_type(multipoles)
4479 quadrupoles = 0.0_dp
4491 CALL create_multi_type(multipoles, nparticles, 1, nparticles/2,
"CHARGE", echarge=-1.0_dp, &
4492 random_stream=random_stream, charges=charges)
4493 CALL create_multi_type(multipoles, nparticles, nparticles/2 + 1, nparticles,
"QUADRUPOLE", echarge=10.0_dp, &
4494 random_stream=random_stream, quadrupoles=quadrupoles)
4495 WRITE (iw,
'("CHARGES",F15.9)') charges
4496 WRITE (iw,
'("QUADRUPOLES",9F15.9)') quadrupoles
4497 CALL debug_ewald_multipole_low(particle_set, cell, nonbond_env, multipoles, debug_energy, &
4500 WRITE (iw, *)
"DEBUG ENERGY (CHARGE-QUADRUPOLE): ", debug_energy
4502 particle_set, local_particles, g_energy, r_energy, e_neut, e_self, &
4503 task, do_correction_bonded=.false., do_forces=.true., do_stress=.true., do_efield=.false., &
4504 charges=charges, dipoles=dipoles, quadrupoles=quadrupoles, forces_local=g_forces, &
4505 forces_glob=r_forces, pv_local=g_pv, pv_glob=r_pv, iw=iw, do_debug=.false.)
4506 CALL release_multi_type(multipoles)
4513 quadrupoles = 0.0_dp
4525 CALL create_multi_type(multipoles, nparticles, 1, nparticles/2,
"DIPOLE", echarge=10000.0_dp, &
4526 random_stream=random_stream, dipoles=dipoles)
4527 CALL create_multi_type(multipoles, nparticles, nparticles/2 + 1, nparticles,
"QUADRUPOLE", echarge=10000.0_dp, &
4528 random_stream=random_stream, quadrupoles=quadrupoles)
4529 WRITE (iw,
'("DIPOLES",3F15.9)') dipoles
4530 WRITE (iw,
'("QUADRUPOLES",9F15.9)') quadrupoles
4531 CALL debug_ewald_multipole_low(particle_set, cell, nonbond_env, multipoles, debug_energy, &
4534 WRITE (iw, *)
"DEBUG ENERGY (DIPOLE-QUADRUPOLE): ", debug_energy
4536 particle_set, local_particles, g_energy, r_energy, e_neut, e_self, &
4537 task, do_correction_bonded=.false., do_forces=.true., do_stress=.true., do_efield=.false., &
4538 charges=charges, dipoles=dipoles, quadrupoles=quadrupoles, forces_local=g_forces, &
4539 forces_glob=r_forces, pv_local=g_pv, pv_glob=r_pv, iw=iw, do_debug=.false.)
4540 CALL release_multi_type(multipoles)
4546 quadrupoles = 0.0_dp
4558 CALL create_multi_type(multipoles, nparticles, 1, nparticles/2,
"QUADRUPOLE", echarge=-20000.0_dp, &
4559 random_stream=random_stream, quadrupoles=quadrupoles)
4560 CALL create_multi_type(multipoles, nparticles, nparticles/2 + 1, nparticles,
"QUADRUPOLE", echarge=10000.0_dp, &
4561 random_stream=random_stream, quadrupoles=quadrupoles)
4562 WRITE (iw,
'("QUADRUPOLES",9F15.9)') quadrupoles
4563 CALL debug_ewald_multipole_low(particle_set, cell, nonbond_env, multipoles, debug_energy, &
4566 WRITE (iw, *)
"DEBUG ENERGY (QUADRUPOLE-QUADRUPOLE): ", debug_energy
4568 particle_set, local_particles, g_energy, r_energy, e_neut, e_self, &
4569 task, do_correction_bonded=.false., do_forces=.true., do_stress=.true., do_efield=.false., &
4570 charges=charges, dipoles=dipoles, quadrupoles=quadrupoles, forces_local=g_forces, &
4571 forces_glob=r_forces, pv_local=g_pv, pv_glob=r_pv, iw=iw, do_debug=.false.)
4572 CALL release_multi_type(multipoles)
4574 DEALLOCATE (charges)
4575 DEALLOCATE (dipoles)
4576 DEALLOCATE (quadrupoles)
4577 DEALLOCATE (r_forces)
4578 DEALLOCATE (g_forces)
4579 DEALLOCATE (e_field1)
4580 DEALLOCATE (e_field2)
4596 SUBROUTINE debug_ewald_multipole_low(particle_set, cell, nonbond_env, multipoles, &
4597 energy, debug_r_space)
4598 TYPE(particle_type),
DIMENSION(:),
POINTER :: particle_set
4599 TYPE(cell_type),
POINTER :: cell
4600 TYPE(fist_nonbond_env_type),
POINTER :: nonbond_env
4601 TYPE(multi_charge_type),
DIMENSION(:),
POINTER :: multipoles
4602 REAL(kind=
dp),
INTENT(OUT) :: energy
4603 LOGICAL,
INTENT(IN) :: debug_r_space
4605 INTEGER :: atom_a, atom_b, icell, iend, igrp, &
4606 ikind, ilist, ipair, istart, jcell, &
4607 jkind, k, k1, kcell, l, l1, ncells, &
4609 INTEGER,
DIMENSION(:, :),
POINTER ::
list
4610 REAL(kind=
dp) :: fac_ij, q, r, rab2, rab2_max
4611 REAL(kind=
dp),
DIMENSION(3) :: cell_v, cvi, rab, rab0, rm
4612 TYPE(fist_neighbor_type),
POINTER :: nonbonded
4613 TYPE(neighbor_kind_pairs_type),
POINTER :: neighbor_kind_pair
4614 TYPE(pos_type),
DIMENSION(:),
POINTER :: r_last_update, r_last_update_pbc
4618 r_last_update=r_last_update, r_last_update_pbc=r_last_update_pbc)
4619 rab2_max = huge(0.0_dp)
4620 IF (debug_r_space)
THEN
4623 lists:
DO ilist = 1, nonbonded%nlists
4624 neighbor_kind_pair => nonbonded%neighbor_kind_pairs(ilist)
4625 npairs = neighbor_kind_pair%npairs
4626 IF (npairs == 0) cycle
4627 list => neighbor_kind_pair%list
4628 cvi = neighbor_kind_pair%cell_vector
4629 cell_v = matmul(cell%hmat, cvi)
4630 kind_group_loop:
DO igrp = 1, neighbor_kind_pair%ngrp_kind
4631 istart = neighbor_kind_pair%grp_kind_start(igrp)
4632 iend = neighbor_kind_pair%grp_kind_end(igrp)
4633 ikind = neighbor_kind_pair%ij_kind(1, igrp)
4634 jkind = neighbor_kind_pair%ij_kind(2, igrp)
4635 pairs:
DO ipair = istart, iend
4637 atom_a =
list(1, ipair)
4638 atom_b =
list(2, ipair)
4639 IF (atom_a == atom_b) fac_ij = 0.5_dp
4640 rab = r_last_update_pbc(atom_b)%r - r_last_update_pbc(atom_a)%r
4642 rab2 = rab(1)**2 + rab(2)**2 + rab(3)**2
4643 IF (rab2 <= rab2_max)
THEN
4645 DO k = 1,
SIZE(multipoles(atom_a)%charge_typ)
4646 DO k1 = 1,
SIZE(multipoles(atom_a)%charge_typ(k)%charge)
4648 DO l = 1,
SIZE(multipoles(atom_b)%charge_typ)
4649 DO l1 = 1,
SIZE(multipoles(atom_b)%charge_typ(l)%charge)
4651 rm = rab + multipoles(atom_b)%charge_typ(l)%pos(:, l1) - multipoles(atom_a)%charge_typ(k)%pos(:, k1)
4652 r = sqrt(dot_product(rm, rm))
4653 q = multipoles(atom_b)%charge_typ(l)%charge(l1)*multipoles(atom_a)%charge_typ(k)%charge(k1)
4654 energy = energy + q/r*fac_ij
4663 END DO kind_group_loop
4669 DO atom_a = 1,
SIZE(particle_set)
4670 DO atom_b = atom_a,
SIZE(particle_set)
4672 IF (atom_a == atom_b) fac_ij = 0.5_dp
4673 rab0 = r_last_update_pbc(atom_b)%r - r_last_update_pbc(atom_a)%r
4675 DO icell = -ncells, ncells
4676 DO jcell = -ncells, ncells
4677 DO kcell = -ncells, ncells
4678 cell_v = matmul(cell%hmat, real((/icell, jcell, kcell/), kind=
dp))
4679 IF (all(cell_v == 0.0_dp) .AND. (atom_a == atom_b)) cycle
4681 rab2 = rab(1)**2 + rab(2)**2 + rab(3)**2
4682 IF (rab2 <= rab2_max)
THEN
4684 DO k = 1,
SIZE(multipoles(atom_a)%charge_typ)
4685 DO k1 = 1,
SIZE(multipoles(atom_a)%charge_typ(k)%charge)
4687 DO l = 1,
SIZE(multipoles(atom_b)%charge_typ)
4688 DO l1 = 1,
SIZE(multipoles(atom_b)%charge_typ(l)%charge)
4690 rm = rab + multipoles(atom_b)%charge_typ(l)%pos(:, l1) - multipoles(atom_a)%charge_typ(k)%pos(:, k1)
4691 r = sqrt(dot_product(rm, rm))
4692 q = multipoles(atom_b)%charge_typ(l)%charge(l1)*multipoles(atom_a)%charge_typ(k)%charge(k1)
4693 energy = energy + q/r*fac_ij
4707 END SUBROUTINE debug_ewald_multipole_low
4724 SUBROUTINE create_multi_type(multipoles, idim, istart, iend, label, echarge, &
4725 random_stream, charges, dipoles, quadrupoles)
4726 TYPE(multi_charge_type),
DIMENSION(:),
POINTER :: multipoles
4727 INTEGER,
INTENT(IN) :: idim, istart, iend
4728 CHARACTER(LEN=*),
INTENT(IN) :: label
4729 REAL(kind=
dp),
INTENT(IN) :: echarge
4730 TYPE(rng_stream_type),
INTENT(INOUT) :: random_stream
4731 REAL(kind=
dp),
DIMENSION(:),
OPTIONAL,
POINTER :: charges
4732 REAL(kind=
dp),
DIMENSION(:, :),
OPTIONAL,
POINTER :: dipoles
4733 REAL(kind=
dp),
DIMENSION(:, :, :),
OPTIONAL, &
4734 POINTER :: quadrupoles
4736 INTEGER :: i, isize, k, l, m
4737 REAL(kind=
dp) :: dx, r2, rvec(3), rvec1(3), rvec2(3)
4739 IF (
ASSOCIATED(multipoles))
THEN
4740 cpassert(
SIZE(multipoles) == idim)
4742 ALLOCATE (multipoles(idim))
4744 NULLIFY (multipoles(i)%charge_typ)
4748 IF (
ASSOCIATED(multipoles(i)%charge_typ))
THEN
4750 isize =
SIZE(multipoles(i)%charge_typ) + 1
4754 CALL reallocate_charge_type(multipoles(i)%charge_typ, 1, isize)
4757 cpassert(
PRESENT(charges))
4758 cpassert(
ASSOCIATED(charges))
4759 ALLOCATE (multipoles(i)%charge_typ(isize)%charge(1))
4760 ALLOCATE (multipoles(i)%charge_typ(isize)%pos(3, 1))
4762 multipoles(i)%charge_typ(isize)%charge(1) = echarge
4763 multipoles(i)%charge_typ(isize)%pos(1:3, 1) = 0.0_dp
4764 charges(i) = charges(i) + echarge
4767 cpassert(
PRESENT(dipoles))
4768 cpassert(
ASSOCIATED(dipoles))
4769 ALLOCATE (multipoles(i)%charge_typ(isize)%charge(2))
4770 ALLOCATE (multipoles(i)%charge_typ(isize)%pos(3, 2))
4771 CALL random_stream%fill(rvec)
4772 rvec = rvec/(2.0_dp*sqrt(dot_product(rvec, rvec)))*dx
4773 multipoles(i)%charge_typ(isize)%charge(1) = echarge
4774 multipoles(i)%charge_typ(isize)%pos(1:3, 1) = rvec
4775 multipoles(i)%charge_typ(isize)%charge(2) = -echarge
4776 multipoles(i)%charge_typ(isize)%pos(1:3, 2) = -rvec
4778 dipoles(:, i) = dipoles(:, i) + 2.0_dp*echarge*rvec
4781 cpassert(
PRESENT(quadrupoles))
4782 cpassert(
ASSOCIATED(quadrupoles))
4783 ALLOCATE (multipoles(i)%charge_typ(isize)%charge(4))
4784 ALLOCATE (multipoles(i)%charge_typ(isize)%pos(3, 4))
4785 CALL random_stream%fill(rvec1)
4786 CALL random_stream%fill(rvec2)
4787 rvec1 = rvec1/sqrt(dot_product(rvec1, rvec1))
4788 rvec2 = rvec2 - dot_product(rvec2, rvec1)*rvec1
4789 rvec2 = rvec2/sqrt(dot_product(rvec2, rvec2))
4791 rvec1 = rvec1/2.0_dp*dx
4792 rvec2 = rvec2/2.0_dp*dx
4800 multipoles(i)%charge_typ(isize)%charge(1) = -echarge
4801 multipoles(i)%charge_typ(isize)%pos(1:3, 1) = rvec1 + rvec2
4802 multipoles(i)%charge_typ(isize)%charge(2) = echarge
4803 multipoles(i)%charge_typ(isize)%pos(1:3, 2) = rvec1 - rvec2
4804 multipoles(i)%charge_typ(isize)%charge(3) = -echarge
4805 multipoles(i)%charge_typ(isize)%pos(1:3, 3) = -rvec1 - rvec2
4806 multipoles(i)%charge_typ(isize)%charge(4) = echarge
4807 multipoles(i)%charge_typ(isize)%pos(1:3, 4) = -rvec1 + rvec2
4810 r2 = dot_product(multipoles(i)%charge_typ(isize)%pos(:, k), multipoles(i)%charge_typ(isize)%pos(:, k))
4813 quadrupoles(m, l, i) = quadrupoles(m, l, i) + 3.0_dp*0.5_dp*multipoles(i)%charge_typ(isize)%charge(k)* &
4814 multipoles(i)%charge_typ(isize)%pos(l, k)* &
4815 multipoles(i)%charge_typ(isize)%pos(m, k)
4816 IF (m == l) quadrupoles(m, l, i) = quadrupoles(m, l, i) - 0.5_dp*multipoles(i)%charge_typ(isize)%charge(k)*r2
4823 END SUBROUTINE create_multi_type
4831 SUBROUTINE release_multi_type(multipoles)
4832 TYPE(multi_charge_type),
DIMENSION(:),
POINTER :: multipoles
4836 IF (
ASSOCIATED(multipoles))
THEN
4837 DO i = 1,
SIZE(multipoles)
4838 DO j = 1,
SIZE(multipoles(i)%charge_typ)
4839 DEALLOCATE (multipoles(i)%charge_typ(j)%charge)
4840 DEALLOCATE (multipoles(i)%charge_typ(j)%pos)
4842 DEALLOCATE (multipoles(i)%charge_typ)
4845 END SUBROUTINE release_multi_type
4855 SUBROUTINE reallocate_charge_type(charge_typ, istart, iend)
4856 TYPE(charge_mono_type),
DIMENSION(:),
POINTER :: charge_typ
4857 INTEGER,
INTENT(IN) :: istart, iend
4859 INTEGER :: i, isize, j, jsize, jsize1, jsize2
4860 TYPE(charge_mono_type),
DIMENSION(:),
POINTER :: charge_typ_bk
4862 IF (
ASSOCIATED(charge_typ))
THEN
4863 isize =
SIZE(charge_typ)
4864 ALLOCATE (charge_typ_bk(1:isize))
4866 jsize =
SIZE(charge_typ(j)%charge)
4867 ALLOCATE (charge_typ_bk(j)%charge(jsize))
4868 jsize1 =
SIZE(charge_typ(j)%pos, 1)
4869 jsize2 =
SIZE(charge_typ(j)%pos, 2)
4870 ALLOCATE (charge_typ_bk(j)%pos(jsize1, jsize2))
4871 charge_typ_bk(j)%pos = charge_typ(j)%pos
4872 charge_typ_bk(j)%charge = charge_typ(j)%charge
4874 DO j = 1,
SIZE(charge_typ)
4875 DEALLOCATE (charge_typ(j)%charge)
4876 DEALLOCATE (charge_typ(j)%pos)
4878 DEALLOCATE (charge_typ)
4880 ALLOCATE (charge_typ_bk(istart:iend))
4881 DO i = istart, isize
4882 jsize =
SIZE(charge_typ_bk(j)%charge)
4883 ALLOCATE (charge_typ(j)%charge(jsize))
4884 jsize1 =
SIZE(charge_typ_bk(j)%pos, 1)
4885 jsize2 =
SIZE(charge_typ_bk(j)%pos, 2)
4886 ALLOCATE (charge_typ(j)%pos(jsize1, jsize2))
4887 charge_typ(j)%pos = charge_typ_bk(j)%pos
4888 charge_typ(j)%charge = charge_typ_bk(j)%charge
4890 DO j = 1,
SIZE(charge_typ_bk)
4891 DEALLOCATE (charge_typ_bk(j)%charge)
4892 DEALLOCATE (charge_typ_bk(j)%pos)
4894 DEALLOCATE (charge_typ_bk)
4896 ALLOCATE (charge_typ(istart:iend))
4899 END SUBROUTINE reallocate_charge_type
4901 END SUBROUTINE debug_ewald_multipoles
4922 SUBROUTINE debug_ewald_multipoles_fields(ewald_env, ewald_pw, nonbond_env, cell, &
4923 particle_set, local_particles, radii, charges, dipoles, quadrupoles, task, iw, &
4924 atomic_kind_set, mm_section)
4925 TYPE(ewald_environment_type),
POINTER :: ewald_env
4926 TYPE(ewald_pw_type),
POINTER :: ewald_pw
4927 TYPE(fist_nonbond_env_type),
POINTER :: nonbond_env
4928 TYPE(cell_type),
POINTER :: cell
4929 TYPE(particle_type),
POINTER :: particle_set(:)
4930 TYPE(distribution_1d_type),
POINTER :: local_particles
4931 REAL(kind=
dp),
DIMENSION(:),
OPTIONAL,
POINTER :: radii, charges
4932 REAL(kind=
dp),
DIMENSION(:, :),
OPTIONAL,
POINTER :: dipoles
4933 REAL(kind=
dp),
DIMENSION(:, :, :),
OPTIONAL, &
4934 POINTER :: quadrupoles
4935 LOGICAL,
DIMENSION(3),
INTENT(IN) :: task
4936 INTEGER,
INTENT(IN) :: iw
4937 TYPE(atomic_kind_type),
POINTER :: atomic_kind_set(:)
4938 TYPE(section_vals_type),
POINTER :: mm_section
4940 INTEGER :: i, iparticle_kind, j, k, &
4941 nparticle_local, nparticles
4942 REAL(kind=
dp) :: coord(3), dq, e_neut, e_self, efield1n(3), efield2n(3, 3), ene(2), &
4943 energy_glob, energy_local, enev(3, 2), o_tot_ene, pot, pv_glob(3, 3), pv_local(3, 3), &
4945 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: efield1, efield2, forces_glob, &
4947 REAL(kind=
dp),
DIMENSION(:),
POINTER :: efield0, lcharges
4948 TYPE(cp_logger_type),
POINTER :: logger
4949 TYPE(particle_type),
DIMENSION(:),
POINTER :: core_particle_set, shell_particle_set
4951 NULLIFY (lcharges, shell_particle_set, core_particle_set)
4955 nparticles =
SIZE(particle_set)
4957 DO iparticle_kind = 1,
SIZE(local_particles%n_el)
4958 nparticle_local = nparticle_local + local_particles%n_el(iparticle_kind)
4960 ALLOCATE (lcharges(nparticles))
4961 ALLOCATE (forces_glob(3, nparticles))
4962 ALLOCATE (forces_local(3, nparticle_local))
4963 ALLOCATE (efield0(nparticles))
4964 ALLOCATE (efield1(3, nparticles))
4965 ALLOCATE (efield2(9, nparticles))
4966 forces_glob = 0.0_dp
4967 forces_local = 0.0_dp
4973 energy_glob = 0.0_dp
4974 energy_local = 0.0_dp
4978 local_particles, energy_local, energy_glob, e_neut, e_self, task, .false., .true., .true., &
4979 .true., radii, charges, dipoles, quadrupoles, forces_local, forces_glob, pv_local, pv_glob, &
4980 efield0, efield1, efield2, iw, do_debug=.false.)
4981 o_tot_ene = energy_local + energy_glob + e_neut + e_self
4982 WRITE (iw, *)
"TOTAL ENERGY :: ========>", o_tot_ene
4986 DO i = 1, nparticles
4989 lcharges(i) = charges(i) + (-1.0_dp)**k*dq
4990 forces_glob = 0.0_dp
4991 forces_local = 0.0_dp
4994 energy_glob = 0.0_dp
4995 energy_local = 0.0_dp
4999 local_particles, energy_local, energy_glob, e_neut, e_self, &
5000 task, .false., .false., .false., .false., radii, &
5001 lcharges, dipoles, quadrupoles, iw=iw, do_debug=.false.)
5002 ene(k) = energy_local + energy_glob + e_neut + e_self
5004 pot = (ene(2) - ene(1))/(2.0_dp*dq)
5005 WRITE (iw,
'(A,I8,3(A,F15.9))')
"POTENTIAL FOR ATOM: ", i,
" NUMERICAL: ", pot,
" ANALYTICAL: ", efield0(i), &
5006 " ERROR: ", pot - efield0(i)
5007 tot_ene = tot_ene + 0.5_dp*efield0(i)*charges(i)
5009 WRITE (iw, *)
"ENERGIES: ", o_tot_ene, tot_ene, o_tot_ene - tot_ene
5010 WRITE (iw,
'(/,/,/)')
5013 DO i = 1, nparticles
5014 coord = particle_set(i)%r
5017 particle_set(i)%r(j) = coord(j) + (-1.0_dp)**k*dq
5020 CALL list_control(atomic_kind_set, particle_set, local_particles, &
5021 cell, nonbond_env, logger%para_env, mm_section, &
5022 shell_particle_set, core_particle_set)
5024 forces_glob = 0.0_dp
5025 forces_local = 0.0_dp
5028 energy_glob = 0.0_dp
5029 energy_local = 0.0_dp
5034 local_particles, energy_local, energy_glob, e_neut, e_self, &
5035 task, .false., .true., .true., .true., radii, &
5036 charges, dipoles, quadrupoles, forces_local, forces_glob, &
5037 pv_local, pv_glob, efield0, iw=iw, do_debug=.false.)
5039 particle_set(i)%r(j) = coord(j)
5041 efield1n(j) = -(ene(2) - ene(1))/(2.0_dp*dq)
5043 WRITE (iw,
'(/,A,I8)')
"FIELD FOR ATOM: ", i
5044 WRITE (iw,
'(A,3F15.9)')
" NUMERICAL: ", efield1n,
" ANALYTICAL: ", efield1(:, i), &
5045 " ERROR: ", efield1n - efield1(:, i)
5047 tot_ene = tot_ene - 0.5_dp*dot_product(efield1(:, i), dipoles(:, i))
5050 WRITE (iw, *)
"ENERGIES: ", o_tot_ene, tot_ene, o_tot_ene - tot_ene
5054 DO i = 1, nparticles
5055 coord = particle_set(i)%r
5058 particle_set(i)%r(j) = coord(j) + (-1.0_dp)**k*dq
5061 CALL list_control(atomic_kind_set, particle_set, local_particles, &
5062 cell, nonbond_env, logger%para_env, mm_section, &
5063 shell_particle_set, core_particle_set)
5065 forces_glob = 0.0_dp
5066 forces_local = 0.0_dp
5069 energy_glob = 0.0_dp
5070 energy_local = 0.0_dp
5075 local_particles, energy_local, energy_glob, e_neut, e_self, &
5076 task, .false., .true., .true., .true., radii, &
5077 charges, dipoles, quadrupoles, forces_local, forces_glob, &
5078 pv_local, pv_glob, efield1=efield1, iw=iw, do_debug=.false.)
5079 enev(:, k) = efield1(:, i)
5080 particle_set(i)%r(j) = coord(j)
5082 efield2n(:, j) = (enev(:, 2) - enev(:, 1))/(2.0_dp*dq)
5084 WRITE (iw,
'(/,A,I8)')
"FIELD GRADIENT FOR ATOM: ", i
5085 WRITE (iw,
'(A,9F15.9)')
" NUMERICAL: ", efield2n, &
5086 " ANALYTICAL: ", efield2(:, i), &
5087 " ERROR: ", reshape(efield2n, (/9/)) - efield2(:, i)
5089 END SUBROUTINE debug_ewald_multipoles_fields
5108 SUBROUTINE debug_ewald_multipoles_fields2(ewald_env, ewald_pw, nonbond_env, cell, &
5109 particle_set, local_particles, radii, charges, dipoles, quadrupoles, task, iw)
5110 TYPE(ewald_environment_type),
POINTER :: ewald_env
5111 TYPE(ewald_pw_type),
POINTER :: ewald_pw
5112 TYPE(fist_nonbond_env_type),
POINTER :: nonbond_env
5113 TYPE(cell_type),
POINTER :: cell
5114 TYPE(particle_type),
POINTER :: particle_set(:)
5115 TYPE(distribution_1d_type),
POINTER :: local_particles
5116 REAL(kind=
dp),
DIMENSION(:),
OPTIONAL,
POINTER :: radii, charges
5117 REAL(kind=
dp),
DIMENSION(:, :),
OPTIONAL,
POINTER :: dipoles
5118 REAL(kind=
dp),
DIMENSION(:, :, :),
OPTIONAL, &
5119 POINTER :: quadrupoles
5120 LOGICAL,
DIMENSION(3),
INTENT(IN) :: task
5121 INTEGER,
INTENT(IN) :: iw
5123 INTEGER :: i, ind, iparticle_kind, j, k, &
5124 nparticle_local, nparticles
5125 REAL(kind=
dp) :: e_neut, e_self, energy_glob, &
5126 energy_local, o_tot_ene, prod, &
5127 pv_glob(3, 3), pv_local(3, 3), tot_ene
5128 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: efield1, efield2, forces_glob, &
5130 REAL(kind=
dp),
DIMENSION(:),
POINTER :: efield0
5131 TYPE(cp_logger_type),
POINTER :: logger
5136 nparticles =
SIZE(particle_set)
5138 DO iparticle_kind = 1,
SIZE(local_particles%n_el)
5139 nparticle_local = nparticle_local + local_particles%n_el(iparticle_kind)
5141 ALLOCATE (forces_glob(3, nparticles))
5142 ALLOCATE (forces_local(3, nparticle_local))
5143 ALLOCATE (efield0(nparticles))
5144 ALLOCATE (efield1(3, nparticles))
5145 ALLOCATE (efield2(9, nparticles))
5146 forces_glob = 0.0_dp
5147 forces_local = 0.0_dp
5153 energy_glob = 0.0_dp
5154 energy_local = 0.0_dp
5158 local_particles, energy_local, energy_glob, e_neut, e_self, task, .false., .true., .true., &
5159 .true., radii, charges, dipoles, quadrupoles, forces_local, forces_glob, pv_local, pv_glob, &
5160 efield0, efield1, efield2, iw, do_debug=.false.)
5161 o_tot_ene = energy_local + energy_glob + e_neut + e_self
5162 WRITE (iw, *)
"TOTAL ENERGY :: ========>", o_tot_ene
5167 DO i = 1, nparticles
5168 tot_ene = tot_ene + 0.5_dp*efield0(i)*charges(i)
5170 WRITE (iw, *)
"ENERGIES: ", o_tot_ene, tot_ene, o_tot_ene - tot_ene
5171 WRITE (iw,
'(/,/,/)')
5176 DO i = 1, nparticles
5177 tot_ene = tot_ene - 0.5_dp*dot_product(efield1(:, i), dipoles(:, i))
5179 WRITE (iw, *)
"ENERGIES: ", o_tot_ene, tot_ene, o_tot_ene - tot_ene
5180 WRITE (iw,
'(/,/,/)')
5185 DO i = 1, nparticles
5191 prod = prod + efield2(ind, i)*quadrupoles(j, k, i)
5194 tot_ene = tot_ene - 0.5_dp*(1.0_dp/3.0_dp)*prod
5196 WRITE (iw, *)
"ENERGIES: ", o_tot_ene, tot_ene, o_tot_ene - tot_ene
5197 WRITE (iw,
'(/,/,/)')
5200 END SUBROUTINE debug_ewald_multipoles_fields2
subroutine pbc(r, r_pbc, s, s_pbc, a, b, c, alpha, beta, gamma, debug, info, pbc0, h, hinv)
...
static GRID_HOST_DEVICE double fac(const int i)
Factorial function, e.g. fac(5) = 5! = 120.
Define the atomic kind types and their sub types.
collects all references to literature in CP2K as new algorithms / method are included from literature...
integer, save, public aguado2003
integer, save, public laino2008
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 ...
type(cp_logger_type) function, pointer, public cp_get_default_logger()
returns the default logger
integer, parameter, public tang_toennies
integer, parameter, public no_damping
subroutine, public dg_get(dg, dg_rho0)
Get the dg_type.
stores a lists of integer that are local to a processor. The idea is that these integers represent ob...
subroutine, public ewald_env_get(ewald_env, ewald_type, alpha, eps_pol, epsilon, gmax, ns_max, o_spline, group, para_env, poisson_section, precs, rcut, do_multipoles, max_multipole, do_ipol, max_ipol_iter, interaction_cutoffs, cell_hmat)
Purpose: Get the EWALD environment.
subroutine, public ewald_pw_get(ewald_pw, pw_big_pool, pw_small_pool, rs_desc, poisson_env, dg)
get the ewald_pw environment to the correct program.
Treats the electrostatic for multipoles (up to quadrupoles)
recursive subroutine, public ewald_multipole_evaluate(ewald_env, ewald_pw, nonbond_env, cell, particle_set, local_particles, energy_local, energy_glob, e_neut, e_self, task, do_correction_bonded, do_forces, do_stress, do_efield, radii, charges, dipoles, quadrupoles, forces_local, forces_glob, pv_local, pv_glob, efield0, efield1, efield2, iw, do_debug, atomic_kind_set, mm_section)
Computes the potential and the force for a lattice sum of multipoles (up to quadrupole)
subroutine, public list_control(atomic_kind_set, particle_set, local_particles, cell, fist_nonbond_env, para_env, mm_section, shell_particle_set, core_particle_set, force_update, exclusions)
...
Define the neighbor list data types and the corresponding functionality.
subroutine, public fist_nonbond_env_get(fist_nonbond_env, potparm14, potparm, nonbonded, rlist_cut, rlist_lowsq, aup, lup, ei_scale14, vdw_scale14, shift_cutoff, do_electrostatics, r_last_update, r_last_update_pbc, rshell_last_update_pbc, rcore_last_update_pbc, cell_last_update, num_update, last_update, counter, natom_types, long_range_correction, ij_kind_full_fac, eam_data, quip_data, nequip_data, allegro_data, deepmd_data, charges)
sets a fist_nonbond_env
Defines the basic variable types.
integer, parameter, public dp
An array-based list which grows on demand. When the internal array is full, a new array of twice the ...
Definition of mathematical constants and functions.
real(kind=dp), parameter, public oorootpi
real(kind=dp), parameter, public pi
real(kind=dp), parameter, public sqrthalf
real(kind=dp), parameter, public fourpi
Interface to the message passing library MPI.
Parallel (pseudo)random number generator (RNG) for multiple streams and substreams of random numbers.
integer, parameter, public uniform
Define the data structure for the particle information.
Manages a pool of grids (to be used for example as tmp objects), but can also be used to instantiate ...
subroutine, public structure_factor_deallocate(exp_igr)
...
subroutine, public structure_factor_allocate(bds, nparts, exp_igr, allocate_centre, allocate_shell_e, allocate_shell_centre, nshell)
...
subroutine, public structure_factor_evaluate(delta, lb, ex, ey, ez)
...