22 #include "../base/base_uses.f90"
27 PUBLIC :: multipole_type, &
45 LOGICAL,
DIMENSION(3) :: task = .false.
46 REAL(kind=
dp),
DIMENSION(:),
POINTER :: charges => null()
47 REAL(kind=
dp),
DIMENSION(:),
POINTER :: radii => null()
48 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: dipoles => null()
49 REAL(kind=
dp),
DIMENSION(:, :, :),
POINTER :: quadrupoles => null()
50 END TYPE multipole_type
52 CHARACTER(len=*),
PARAMETER,
PRIVATE :: modulen =
'multipole_types'
67 TYPE(multipole_type),
INTENT(OUT) :: multipoles
68 TYPE(particle_type),
DIMENSION(:),
INTENT(IN) :: particle_set
69 TYPE(section_vals_type),
POINTER :: subsys_section
70 INTEGER,
INTENT(IN) :: max_multipole
72 INTEGER :: i, ind2, iparticle, j, n_rep, nparticles
74 REAL(kind=
dp),
DIMENSION(:),
POINTER :: work
75 TYPE(fist_potential_type),
POINTER :: fist_potential
76 TYPE(section_vals_type),
POINTER :: work_section
78 SELECT CASE (max_multipole)
82 multipoles%task(1:1) = .true.
84 multipoles%task(1:2) = .true.
86 multipoles%task(1:3) = .true.
90 nparticles =
SIZE(particle_set)
91 IF (multipoles%task(1))
THEN
92 ALLOCATE (multipoles%charges(nparticles))
93 ALLOCATE (multipoles%radii(nparticles))
95 DO iparticle = 1, nparticles
98 fist_potential=fist_potential)
99 CALL get_potential(fist_potential, qeff=multipoles%charges(iparticle), &
100 mm_radius=multipoles%radii(iparticle))
103 IF (multipoles%task(2))
THEN
104 ALLOCATE (multipoles%dipoles(3, nparticles))
110 cpassert(n_rep == nparticles)
111 DO iparticle = 1, n_rep
113 multipoles%dipoles(1:3, iparticle) = work
116 multipoles%dipoles = 0.0_dp
119 IF (multipoles%task(3))
THEN
120 ALLOCATE (multipoles%quadrupoles(3, 3, nparticles))
126 cpassert(n_rep == nparticles)
127 DO iparticle = 1, n_rep
131 ind2 = 3*(min(i, j) - 1) - (min(i, j)*(min(i, j) - 1))/2 + max(i, j)
132 multipoles%quadrupoles(i, j, iparticle) = work(ind2)
137 multipoles%quadrupoles = 0.0_dp
150 TYPE(multipole_type),
INTENT(INOUT) :: multipoles
152 IF (
ASSOCIATED(multipoles%charges))
THEN
153 DEALLOCATE (multipoles%charges)
155 IF (
ASSOCIATED(multipoles%radii))
THEN
156 DEALLOCATE (multipoles%radii)
158 IF (
ASSOCIATED(multipoles%dipoles))
THEN
159 DEALLOCATE (multipoles%dipoles)
161 IF (
ASSOCIATED(multipoles%quadrupoles))
THEN
162 DEALLOCATE (multipoles%quadrupoles)
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.
Definition of the atomic potential types.
Defines the basic variable types.
integer, parameter, public dp
Multipole structure: for multipole (fixed and induced) in FF based MD.
integer, parameter, public do_multipole_quadrupole
subroutine, public release_multipole_type(multipoles)
...
integer, parameter, public do_multipole_dipole
subroutine, public create_multipole_type(multipoles, particle_set, subsys_section, max_multipole)
Create a multipole type.
integer, parameter, public do_multipole_charge
integer, parameter, public do_multipole_none
Define the data structure for the particle information.