26 ewald_environment_type
40 #include "./base/base_uses.f90"
44 LOGICAL,
PRIVATE :: debug_this_module = .false.
45 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'fist_pol_scf'
74 ewald_pw, fist_nonbond_env, cell, particle_set, local_particles, &
75 thermo, vg_coulomb, pot_nonbond, f_nonbond, fg_coulomb, use_virial, &
76 pv_g, pv_nonbond, mm_section, do_ipol)
78 TYPE(atomic_kind_type),
DIMENSION(:),
POINTER :: atomic_kind_set
79 TYPE(multipole_type),
POINTER :: multipoles
80 TYPE(ewald_environment_type),
POINTER :: ewald_env
81 TYPE(ewald_pw_type),
POINTER :: ewald_pw
82 TYPE(fist_nonbond_env_type),
POINTER :: fist_nonbond_env
83 TYPE(cell_type),
POINTER :: cell
84 TYPE(particle_type),
DIMENSION(:),
POINTER :: particle_set
85 TYPE(distribution_1d_type),
POINTER :: local_particles
86 TYPE(fist_energy_type),
POINTER :: thermo
87 REAL(kind=
dp) :: vg_coulomb, pot_nonbond
88 REAL(kind=
dp),
DIMENSION(:, :) :: f_nonbond, fg_coulomb
89 LOGICAL,
INTENT(IN) :: use_virial
90 REAL(kind=
dp),
DIMENSION(3, 3) :: pv_g, pv_nonbond
91 TYPE(section_vals_type),
POINTER :: mm_section
96 CALL fist_pol_evaluate_sc(atomic_kind_set, multipoles, ewald_env, &
97 ewald_pw, fist_nonbond_env, cell, particle_set, local_particles, &
98 thermo, vg_coulomb, pot_nonbond, f_nonbond, fg_coulomb, use_virial, &
99 pv_g, pv_nonbond, mm_section)
101 CALL fist_pol_evaluate_cg(atomic_kind_set, multipoles, ewald_env, &
102 ewald_pw, fist_nonbond_env, cell, particle_set, local_particles, &
103 thermo, vg_coulomb, pot_nonbond, f_nonbond, fg_coulomb, use_virial, &
104 pv_g, pv_nonbond, mm_section)
137 SUBROUTINE fist_pol_evaluate_sc(atomic_kind_set, multipoles, ewald_env, ewald_pw, &
138 fist_nonbond_env, cell, particle_set, local_particles, thermo, vg_coulomb, &
139 pot_nonbond, f_nonbond, fg_coulomb, use_virial, pv_g, pv_nonbond, mm_section)
141 TYPE(atomic_kind_type),
DIMENSION(:),
POINTER :: atomic_kind_set
142 TYPE(multipole_type),
POINTER :: multipoles
143 TYPE(ewald_environment_type),
POINTER :: ewald_env
144 TYPE(ewald_pw_type),
POINTER :: ewald_pw
145 TYPE(fist_nonbond_env_type),
POINTER :: fist_nonbond_env
146 TYPE(cell_type),
POINTER :: cell
147 TYPE(particle_type),
DIMENSION(:),
POINTER :: particle_set
148 TYPE(distribution_1d_type),
POINTER :: local_particles
149 TYPE(fist_energy_type),
POINTER :: thermo
150 REAL(kind=
dp) :: vg_coulomb, pot_nonbond
151 REAL(kind=
dp),
DIMENSION(:, :) :: f_nonbond, fg_coulomb
152 LOGICAL,
INTENT(IN) :: use_virial
153 REAL(kind=
dp),
DIMENSION(3, 3) :: pv_g, pv_nonbond
154 TYPE(section_vals_type),
POINTER :: mm_section
156 CHARACTER(len=*),
PARAMETER :: routinen =
'fist_pol_evaluate_sc'
158 INTEGER :: ewald_type, handle, i, iatom, ii, ikind, &
159 iter, iw, iw2, j, max_ipol_iter, &
160 natom_of_kind, natoms, nkind, ntot
161 INTEGER,
DIMENSION(:),
POINTER :: atom_list
163 REAL(kind=
dp) :: apol, cpol, eps_pol, pot_nonbond_local, &
165 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: efield1, efield2
166 TYPE(atomic_kind_type),
POINTER :: atomic_kind
167 TYPE(cp_logger_type),
POINTER :: logger
169 CALL timeset(routinen, handle)
170 NULLIFY (logger, atomic_kind)
178 CALL ewald_env_get(ewald_env, max_ipol_iter=max_ipol_iter, eps_pol=eps_pol, &
179 ewald_type=ewald_type)
181 natoms =
SIZE(particle_set)
182 ALLOCATE (efield1(3, natoms))
183 ALLOCATE (efield2(9, natoms))
185 nkind =
SIZE(atomic_kind_set)
187 WRITE (iw, fmt=
'(/,T2,"POL_SCF|" ,"Method: self-consistent")')
188 WRITE (iw, fmt=
'(T2,"POL_SCF| "," Iteration",7X,"Conv.",T49,"Electrostatic & Induction Energy")')
190 pol_scf:
DO iter = 1, max_ipol_iter
192 CALL eval_pol_ewald(ewald_type, ewald_env, ewald_pw, fist_nonbond_env, cell, &
193 particle_set, local_particles, vg_coulomb, pot_nonbond_local, thermo, &
194 multipoles, do_correction_bonded=.true., do_forces=.false., &
195 do_stress=.false., do_efield=.true., iw2=iw2, do_debug=.false., &
196 atomic_kind_set=atomic_kind_set, mm_section=mm_section, &
197 efield1=efield1, efield2=efield2)
198 CALL logger%para_env%sum(pot_nonbond_local)
203 thermo%e_induction = 0.0_dp
205 atomic_kind => atomic_kind_set(ikind)
206 CALL get_atomic_kind(atomic_kind, apol=apol, cpol=cpol, natom=natom_of_kind, atom_list=atom_list)
208 IF (apol == 0 .AND. cpol == 0) cycle
210 IF (apol /= 0) ntot = ntot + natom_of_kind
211 IF (cpol /= 0) ntot = ntot + natom_of_kind
213 DO iatom = 1, natom_of_kind
214 ii = atom_list(iatom)
219 rmsd =
rmsd + (multipoles%dipoles(i, ii)/apol - efield1(i, ii))**2
223 rmsd =
rmsd + (multipoles%quadrupoles(1, 1, ii)/cpol - efield2(1, ii))**2
224 rmsd =
rmsd + (multipoles%quadrupoles(2, 1, ii)/cpol - efield2(2, ii))**2
225 rmsd =
rmsd + (multipoles%quadrupoles(3, 1, ii)/cpol - efield2(3, ii))**2
226 rmsd =
rmsd + (multipoles%quadrupoles(1, 2, ii)/cpol - efield2(4, ii))**2
227 rmsd =
rmsd + (multipoles%quadrupoles(2, 2, ii)/cpol - efield2(5, ii))**2
228 rmsd =
rmsd + (multipoles%quadrupoles(3, 2, ii)/cpol - efield2(6, ii))**2
229 rmsd =
rmsd + (multipoles%quadrupoles(1, 3, ii)/cpol - efield2(7, ii))**2
230 rmsd =
rmsd + (multipoles%quadrupoles(2, 3, ii)/cpol - efield2(8, ii))**2
231 rmsd =
rmsd + (multipoles%quadrupoles(3, 3, ii)/cpol - efield2(9, ii))**2
234 multipoles%dipoles(:, ii) = apol*efield1(:, ii)
237 multipoles%quadrupoles(1, 1, ii) = cpol*efield2(1, ii)
238 multipoles%quadrupoles(2, 1, ii) = cpol*efield2(2, ii)
239 multipoles%quadrupoles(3, 1, ii) = cpol*efield2(3, ii)
240 multipoles%quadrupoles(1, 2, ii) = cpol*efield2(4, ii)
241 multipoles%quadrupoles(2, 2, ii) = cpol*efield2(5, ii)
242 multipoles%quadrupoles(3, 2, ii) = cpol*efield2(6, ii)
243 multipoles%quadrupoles(1, 3, ii) = cpol*efield2(7, ii)
244 multipoles%quadrupoles(2, 3, ii) = cpol*efield2(8, ii)
245 multipoles%quadrupoles(3, 3, ii) = cpol*efield2(9, ii)
249 thermo%e_induction = thermo%e_induction + &
250 dot_product(multipoles%dipoles(:, ii), &
251 multipoles%dipoles(:, ii))/apol/2.0_dp
257 tmp_trace = tmp_trace + &
258 multipoles%quadrupoles(i, j, ii)*multipoles%quadrupoles(i, j, ii)
261 thermo%e_induction = thermo%e_induction + tmp_trace/cpol/6.0_dp
268 WRITE (iw, fmt=
'(T5,"POL_SCF|",5X,I5,5X,E12.6,T61,F20.10)') iter, &
269 rmsd, vg_coulomb + pot_nonbond_local + thermo%e_induction
271 IF (
rmsd <= eps_pol)
THEN
272 IF (iw > 0)
WRITE (iw, fmt=
'(T5,"POL_SCF|",1X,"Self-consistent Polarization achieved.")')
276 iwarn = ((
rmsd > eps_pol) .AND. (iter == max_ipol_iter))
277 IF (iwarn .AND. iw > 0)
WRITE (iw, fmt=
'(T5,"POL_SCF|",1X,"Self-consistent Polarization not converged!")')
279 cpwarn(
"Self-consistent Polarization not converged! ")
283 CALL eval_pol_ewald(ewald_type, ewald_env, ewald_pw, fist_nonbond_env, cell, &
284 particle_set, local_particles, vg_coulomb, pot_nonbond_local, thermo, &
285 multipoles, do_correction_bonded=.true., do_forces=.true., &
286 do_stress=use_virial, do_efield=.false., iw2=iw2, do_debug=.false., &
287 atomic_kind_set=atomic_kind_set, mm_section=mm_section, &
288 forces_local=fg_coulomb, forces_glob=f_nonbond, &
289 pv_local=pv_g, pv_glob=pv_nonbond)
290 pot_nonbond = pot_nonbond + pot_nonbond_local
291 CALL logger%para_env%sum(pot_nonbond_local)
295 WRITE (iw, fmt=
'(T5,"POL_SCF|",5X,"Final",T61,F20.10,/)') &
296 vg_coulomb + pot_nonbond_local + thermo%e_induction
307 CALL timestop(handle)
308 END SUBROUTINE fist_pol_evaluate_sc
351 SUBROUTINE fist_pol_evaluate_cg(atomic_kind_set, multipoles, ewald_env, ewald_pw, &
352 fist_nonbond_env, cell, particle_set, local_particles, thermo, vg_coulomb, &
353 pot_nonbond, f_nonbond, fg_coulomb, use_virial, pv_g, pv_nonbond, mm_section)
355 TYPE(atomic_kind_type),
DIMENSION(:),
POINTER :: atomic_kind_set
356 TYPE(multipole_type),
POINTER :: multipoles
357 TYPE(ewald_environment_type),
POINTER :: ewald_env
358 TYPE(ewald_pw_type),
POINTER :: ewald_pw
359 TYPE(fist_nonbond_env_type),
POINTER :: fist_nonbond_env
360 TYPE(cell_type),
POINTER :: cell
361 TYPE(particle_type),
DIMENSION(:),
POINTER :: particle_set
362 TYPE(distribution_1d_type),
POINTER :: local_particles
363 TYPE(fist_energy_type),
POINTER :: thermo
364 REAL(kind=
dp) :: vg_coulomb, pot_nonbond
365 REAL(kind=
dp),
DIMENSION(:, :) :: f_nonbond, fg_coulomb
366 LOGICAL,
INTENT(IN) :: use_virial
367 REAL(kind=
dp),
DIMENSION(3, 3) :: pv_g, pv_nonbond
368 TYPE(section_vals_type),
POINTER :: mm_section
370 CHARACTER(len=*),
PARAMETER :: routinen =
'fist_pol_evaluate_cg'
372 INTEGER :: ewald_type, handle, i, iatom, ii, ikind, &
373 iter, iw, iw2, max_ipol_iter, &
374 natom_of_kind, natoms, nkind, ntot
375 INTEGER,
DIMENSION(:),
POINTER :: atom_list
377 REAL(kind=
dp) :: alpha, apol, beta, denom, eps_pol, &
378 pot_nonbond_local,
rmsd
379 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: conjugate, conjugate_applied, efield1, &
380 efield1_ext, residual, tmp_dipoles
381 TYPE(atomic_kind_type),
POINTER :: atomic_kind
382 TYPE(cp_logger_type),
POINTER :: logger
384 CALL timeset(routinen, handle)
385 NULLIFY (logger, atomic_kind)
393 CALL ewald_env_get(ewald_env, max_ipol_iter=max_ipol_iter, eps_pol=eps_pol, &
394 ewald_type=ewald_type)
397 natoms =
SIZE(particle_set)
398 ALLOCATE (efield1(3, natoms))
399 ALLOCATE (tmp_dipoles(3, natoms))
400 ALLOCATE (residual(3, natoms))
401 ALLOCATE (conjugate(3, natoms))
402 ALLOCATE (conjugate_applied(3, natoms))
403 ALLOCATE (efield1_ext(3, natoms))
408 tmp_dipoles(:, :) = multipoles%dipoles
409 multipoles%dipoles = 0.0_dp
410 CALL eval_pol_ewald(ewald_type, ewald_env, ewald_pw, fist_nonbond_env, cell, &
411 particle_set, local_particles, vg_coulomb, pot_nonbond_local, thermo, &
412 multipoles, do_correction_bonded=.true., do_forces=.false., &
413 do_stress=.false., do_efield=.true., iw2=iw2, do_debug=.false., &
414 atomic_kind_set=atomic_kind_set, mm_section=mm_section, &
416 multipoles%dipoles = tmp_dipoles
419 CALL eval_pol_ewald(ewald_type, ewald_env, ewald_pw, fist_nonbond_env, cell, &
420 particle_set, local_particles, vg_coulomb, pot_nonbond_local, thermo, &
421 multipoles, do_correction_bonded=.true., do_forces=.false., &
422 do_stress=.false., do_efield=.true., iw2=iw2, do_debug=.false., &
423 atomic_kind_set=atomic_kind_set, mm_section=mm_section, &
427 nkind =
SIZE(atomic_kind_set)
431 atomic_kind => atomic_kind_set(ikind)
432 CALL get_atomic_kind(atomic_kind, apol=apol, natom=natom_of_kind, atom_list=atom_list)
435 ntot = ntot + natom_of_kind
436 DO iatom = 1, natom_of_kind
437 ii = atom_list(iatom)
440 residual(i, ii) = efield1(i, ii) - multipoles%dipoles(i, ii)/apol
445 conjugate(:, :) = residual
448 WRITE (iw, fmt=
"(/,T2,A,T63,A)")
"POL_SCF| Method",
"conjugate gradient"
449 WRITE (iw, fmt=
"(T2,A,T26,A,T49,A)")
"POL_SCF| Iteration", &
450 "Convergence",
"Electrostatic & Induction Energy"
452 pol_scf:
DO iter = 1, max_ipol_iter
453 IF (debug_this_module)
THEN
458 CALL eval_pol_ewald(ewald_type, ewald_env, ewald_pw, fist_nonbond_env, cell, &
459 particle_set, local_particles, vg_coulomb, pot_nonbond_local, thermo, &
460 multipoles, do_correction_bonded=.true., do_forces=.false., &
461 do_stress=.false., do_efield=.true., iw2=iw2, do_debug=.false., &
462 atomic_kind_set=atomic_kind_set, mm_section=mm_section, &
470 atomic_kind => atomic_kind_set(ikind)
471 CALL get_atomic_kind(atomic_kind, apol=apol, natom=natom_of_kind, atom_list=atom_list)
474 DO iatom = 1, natom_of_kind
475 ii = atom_list(iatom)
479 IF (debug_this_module)
THEN
480 denom = denom + (residual(i, ii) - (efield1(i, ii) - &
481 multipoles%dipoles(i, ii)/apol))**2
488 WRITE (iw, fmt=
"(T2,A,T11,I9,T22,E15.6,T67,A)")
"POL_SCF|", iter,
rmsd,
"(not computed)"
489 IF (debug_this_module)
THEN
490 denom = sqrt(denom/ntot)
491 WRITE (iw, fmt=
"(T2,A,T66,E15.6)")
"POL_SCF| Error on implicit residual", denom
497 tmp_dipoles(:, :) = multipoles%dipoles
498 multipoles%dipoles = conjugate
499 CALL eval_pol_ewald(ewald_type, ewald_env, ewald_pw, fist_nonbond_env, cell, &
500 particle_set, local_particles, vg_coulomb, pot_nonbond_local, thermo, &
501 multipoles, do_correction_bonded=.true., do_forces=.false., &
502 do_stress=.false., do_efield=.true., iw2=iw2, do_debug=.false., &
503 atomic_kind_set=atomic_kind_set, mm_section=mm_section, &
504 efield1=conjugate_applied)
505 multipoles%dipoles = tmp_dipoles
506 conjugate_applied(:, :) = efield1_ext - conjugate_applied
512 atomic_kind => atomic_kind_set(ikind)
513 CALL get_atomic_kind(atomic_kind, apol=apol, natom=natom_of_kind, atom_list=atom_list)
516 DO iatom = 1, natom_of_kind
517 ii = atom_list(iatom)
519 conjugate_applied(i, ii) = conjugate_applied(i, ii) + conjugate(i, ii)/apol
521 alpha = alpha + dot_product(residual(:, ii), residual(:, ii))
522 denom = denom + dot_product(conjugate(:, ii), conjugate_applied(:, ii))
531 atomic_kind => atomic_kind_set(ikind)
532 CALL get_atomic_kind(atomic_kind, apol=apol, natom=natom_of_kind, atom_list=atom_list)
534 DO iatom = 1, natom_of_kind
535 ii = atom_list(iatom)
536 denom = denom + dot_product(residual(:, ii), residual(:, ii))
538 residual(i, ii) = residual(i, ii) - alpha*conjugate_applied(i, ii)
540 beta = beta + dot_product(residual(:, ii), residual(:, ii))
547 thermo%e_induction = 0.0_dp
549 atomic_kind => atomic_kind_set(ikind)
550 CALL get_atomic_kind(atomic_kind, apol=apol, natom=natom_of_kind, atom_list=atom_list)
553 DO iatom = 1, natom_of_kind
554 ii = atom_list(iatom)
556 multipoles%dipoles(i, ii) = multipoles%dipoles(i, ii) + alpha*conjugate(i, ii)
557 conjugate(i, ii) = residual(i, ii) + beta*conjugate(i, ii)
558 thermo%e_induction = thermo%e_induction + multipoles%dipoles(i, ii)**2/apol/2.0_dp
564 IF (
rmsd <= eps_pol)
THEN
565 IF (iw > 0)
WRITE (iw, fmt=
"(T2,A)")
"POL_SCF| Self-consistent polarization converged"
570 iwarn = ((
rmsd > eps_pol) .AND. (iter >= max_ipol_iter))
573 WRITE (iw, fmt=
"(T2,A,I0,A,ES9.3)") &
574 "POL_SCF| Self-consistent polarization not converged in ", max_ipol_iter, &
575 " steps to ", eps_pol
577 cpwarn(
"Self-consistent Polarization not converged!")
581 IF (debug_this_module)
THEN
583 CALL eval_pol_ewald(ewald_type, ewald_env, ewald_pw, fist_nonbond_env, cell, &
584 particle_set, local_particles, vg_coulomb, pot_nonbond_local, thermo, &
585 multipoles, do_correction_bonded=.true., do_forces=.true., &
586 do_stress=use_virial, do_efield=.true., iw2=iw2, do_debug=.false., &
587 atomic_kind_set=atomic_kind_set, mm_section=mm_section, &
588 forces_local=fg_coulomb, forces_glob=f_nonbond, &
589 pv_local=pv_g, pv_glob=pv_nonbond, efield1=efield1)
594 atomic_kind => atomic_kind_set(ikind)
595 CALL get_atomic_kind(atomic_kind, apol=apol, natom=natom_of_kind, atom_list=atom_list)
598 DO iatom = 1, natom_of_kind
599 ii = atom_list(iatom)
602 rmsd =
rmsd + (efield1(i, ii) - multipoles%dipoles(i, ii)/apol)**2
607 IF (iw > 0)
WRITE (iw, fmt=
"(T2,A,T66,E15.6)")
"POL_SCF| Final RMSD of residual",
rmsd
609 IF (
rmsd > eps_pol)
THEN
610 cpabort(
"Error in the conjugate gradient method for self-consistent polarization!")
614 CALL eval_pol_ewald(ewald_type, ewald_env, ewald_pw, fist_nonbond_env, cell, &
615 particle_set, local_particles, vg_coulomb, pot_nonbond_local, thermo, &
616 multipoles, do_correction_bonded=.true., do_forces=.true., &
617 do_stress=use_virial, do_efield=.false., iw2=iw2, do_debug=.false., &
618 atomic_kind_set=atomic_kind_set, mm_section=mm_section, &
619 forces_local=fg_coulomb, forces_glob=f_nonbond, &
620 pv_local=pv_g, pv_glob=pv_nonbond)
622 pot_nonbond = pot_nonbond + pot_nonbond_local
623 CALL logger%para_env%sum(pot_nonbond_local)
625 IF (iw > 0)
WRITE (iw, fmt=
"(T2,A,T61,F20.10)")
"POL_SCF| Final", &
626 vg_coulomb + pot_nonbond_local + thermo%e_induction
630 DEALLOCATE (tmp_dipoles)
631 DEALLOCATE (residual)
632 DEALLOCATE (conjugate)
633 DEALLOCATE (conjugate_applied)
634 DEALLOCATE (efield1_ext)
640 CALL timestop(handle)
642 END SUBROUTINE fist_pol_evaluate_cg
675 SUBROUTINE eval_pol_ewald(ewald_type, ewald_env, ewald_pw, fist_nonbond_env, &
676 cell, particle_set, local_particles, vg_coulomb, pot_nonbond, thermo, &
677 multipoles, do_correction_bonded, do_forces, do_stress, do_efield, iw2, &
678 do_debug, atomic_kind_set, mm_section, efield0, efield1, efield2, forces_local, &
679 forces_glob, pv_local, pv_glob)
681 INTEGER,
INTENT(IN) :: ewald_type
682 TYPE(ewald_environment_type),
POINTER :: ewald_env
683 TYPE(ewald_pw_type),
POINTER :: ewald_pw
684 TYPE(fist_nonbond_env_type),
POINTER :: fist_nonbond_env
685 TYPE(cell_type),
POINTER :: cell
686 TYPE(particle_type),
DIMENSION(:),
POINTER :: particle_set
687 TYPE(distribution_1d_type),
POINTER :: local_particles
688 REAL(kind=
dp),
INTENT(OUT) :: vg_coulomb, pot_nonbond
689 TYPE(fist_energy_type),
POINTER :: thermo
690 TYPE(multipole_type),
POINTER :: multipoles
691 LOGICAL,
INTENT(IN) :: do_correction_bonded, do_forces, &
693 INTEGER,
INTENT(IN) :: iw2
694 LOGICAL,
INTENT(IN) :: do_debug
695 TYPE(atomic_kind_type),
DIMENSION(:),
POINTER :: atomic_kind_set
696 TYPE(section_vals_type),
POINTER :: mm_section
697 REAL(kind=
dp),
DIMENSION(:),
OPTIONAL :: efield0
698 REAL(kind=
dp),
DIMENSION(:, :),
OPTIONAL :: efield1, efield2
699 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(INOUT), &
700 OPTIONAL :: forces_local, forces_glob, pv_local, &
703 CHARACTER(len=*),
PARAMETER :: routinen =
'eval_pol_ewald'
707 CALL timeset(routinen, handle)
711 SELECT CASE (ewald_type)
714 particle_set, local_particles, vg_coulomb, pot_nonbond, thermo%e_neut, &
715 thermo%e_self, multipoles%task, do_correction_bonded=do_correction_bonded, &
716 do_forces=do_forces, do_stress=do_stress, do_efield=do_efield, &
717 radii=multipoles%radii, charges=multipoles%charges, &
718 dipoles=multipoles%dipoles, quadrupoles=multipoles%quadrupoles, &
719 forces_local=forces_local, forces_glob=forces_glob, pv_local=pv_local, &
720 pv_glob=pv_glob, iw=iw2, do_debug=do_debug, atomic_kind_set=atomic_kind_set, &
721 mm_section=mm_section, efield0=efield0, efield1=efield1, efield2=efield2)
723 cpabort(
"Multipole Ewald not yet implemented within a PME scheme!")
725 cpabort(
"Multipole Ewald not yet implemented within a SPME scheme!")
727 CALL timestop(handle)
728 END SUBROUTINE eval_pol_ewald
Define the atomic kind types and their sub types.
subroutine, public get_atomic_kind(atomic_kind, fist_potential, element_symbol, name, mass, kind_number, natom, atom_list, rcov, rvdw, z, qeff, apol, cpol, mm_radius, shell, shell_active, damping)
Get attributes of an atomic kind.
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
routines to handle the output, The idea is to remove the decision of wheter to output and what to out...
integer function, public cp_print_key_unit_nr(logger, basis_section, print_key_path, extension, middle_name, local, log_filename, ignore_should_output, file_form, file_position, file_action, file_status, do_backup, on_file, is_new_file, mpi_io, fout)
...
subroutine, public cp_print_key_finished_output(unit_nr, logger, basis_section, print_key_path, local, ignore_should_output, on_file, mpi_io)
should be called after you finish working with a unit obtained with cp_print_key_unit_nr,...
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.
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 fist_pol_evaluate(atomic_kind_set, multipoles, ewald_env, ewald_pw, fist_nonbond_env, cell, particle_set, local_particles, thermo, vg_coulomb, pot_nonbond, f_nonbond, fg_coulomb, use_virial, pv_g, pv_nonbond, mm_section, do_ipol)
Main driver for evaluating energy/forces in a polarizable forcefield.
Defines the basic variable types.
integer, parameter, public dp
Multipole structure: for multipole (fixed and induced) in FF based MD.
Define the data structure for the particle information.
functions related to the poisson solver on regular grids
integer, parameter, public do_ewald_pme
integer, parameter, public do_ewald_ewald
integer, parameter, public do_ewald_spme
Defines functions to perform rmsd in 3D.