61 REAL(kind=
dp) :: pot_quip
66 CHARACTER(len=2),
ALLOCATABLE :: elem_symbol(:)
67 INTEGER :: i, iat, iat_use, ikind, &
68 jkind, n_atoms, n_atoms_use, &
70 LOGICAL :: do_parallel
71 LOGICAL,
ALLOCATABLE :: use_atom(:)
72 REAL(kind=
dp) :: lattice(3, 3), virial(3, 3)
73 REAL(kind=
dp),
ALLOCATABLE :: force(:, :), pos(:, :)
81 mark_used(particle_set)
83 mark_used(atomic_kind_set)
85 mark_used(fist_nonbond_env)
88 CALL cp_abort(__location__,
"In order to use QUIP you need to download "// &
89 "and install the libAtoms/QUIP library (check CP2K manual for details)")
91 n_atoms =
SIZE(particle_set)
92 ALLOCATE (use_atom(n_atoms))
97 DO ikind = 1,
SIZE(atomic_kind_set)
98 DO jkind = 1,
SIZE(atomic_kind_set)
99 pot => potparm%pot(ikind, jkind)%pot
100 DO i = 1,
SIZE(pot%type)
102 IF (.NOT.
ASSOCIATED(quip)) quip => pot%set(i)%quip
104 IF (particle_set(iat)%atomic_kind%kind_number == ikind .OR. &
105 particle_set(iat)%atomic_kind%kind_number == jkind) use_atom(iat) = .true.
110 n_atoms_use = count(use_atom)
111 ALLOCATE (pos(3, n_atoms_use), force(3, n_atoms_use), elem_symbol(n_atoms_use))
115 IF (.NOT. use_atom(iat)) cycle
116 iat_use = iat_use + 1
117 pos(1:3, iat_use) = particle_set(iat)%r*
angstrom
118 elem_symbol(iat_use) = particle_set(iat)%atomic_kind%element_symbol
120 IF (iat_use > 0)
CALL cite_reference(
quip_ref)
123 do_parallel = .false.
124 IF (
PRESENT(para_env))
THEN
125 do_parallel = para_env%num_pe > 1
127 IF (do_parallel)
THEN
128 CALL quip_unified_wrapper( &
129 n=n_atoms_use, pos=pos, lattice=lattice, symbol=elem_symbol, &
130 quip_param_file=trim(quip%quip_file_name), &
131 quip_param_file_len=len_trim(quip%quip_file_name), &
132 init_args_str=trim(quip%init_args), &
133 init_args_str_len=len_trim(quip%init_args), &
134 calc_args_str=trim(quip%calc_args), &
135 calc_args_str_len=len_trim(quip%calc_args), &
136 energy=pot_quip, force=force, virial=virial, &
137 output_unit=output_unit, mpi_communicator=para_env%get_handle())
139 CALL quip_unified_wrapper( &
140 n=n_atoms_use, pos=pos, lattice=lattice, symbol=elem_symbol, &
141 quip_param_file=trim(quip%quip_file_name), &
142 quip_param_file_len=len_trim(quip%quip_file_name), &
143 init_args_str=trim(quip%init_args), &
144 init_args_str_len=len_trim(quip%init_args), &
145 calc_args_str=trim(quip%calc_args), &
146 calc_args_str_len=len_trim(quip%calc_args), &
147 energy=pot_quip, force=force, virial=virial, output_unit=output_unit)
150 pot_quip = pot_quip/
evolt
152 virial = virial/
evolt
154 IF (
PRESENT(para_env)) pot_quip = pot_quip/real(para_env%num_pe,
dp)
155 IF (
PRESENT(para_env)) force = force/real(para_env%num_pe,
dp)
156 IF (
PRESENT(para_env)) virial = virial/real(para_env%num_pe,
dp)
159 IF (.NOT.
ASSOCIATED(quip_data))
THEN
162 NULLIFY (quip_data%use_indices, quip_data%force)
164 IF (
ASSOCIATED(quip_data%force))
THEN
165 IF (
SIZE(quip_data%force, 2) /= n_atoms_use)
THEN
166 DEALLOCATE (quip_data%force, quip_data%use_indices)
169 IF (.NOT.
ASSOCIATED(quip_data%force))
THEN
170 ALLOCATE (quip_data%force(3, n_atoms_use))
171 ALLOCATE (quip_data%use_indices(n_atoms_use))
176 IF (use_atom(iat))
THEN
177 iat_use = iat_use + 1
178 quip_data%use_indices(iat_use) = iat
181 quip_data%force = force
182 quip_data%virial = virial
184 DEALLOCATE (use_atom, pos, force, elem_symbol)
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
subroutine, public fist_nonbond_env_set(fist_nonbond_env, potparm14, potparm, rlist_cut, rlist_lowsq, nonbonded, 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, eam_data, quip_data, nequip_data, allegro_data, deepmd_data, charges)
sets a fist_nonbond_env
subroutine, public quip_add_force_virial(fist_nonbond_env, force, virial)
...
subroutine, public quip_energy_store_force_virial(particle_set, cell, atomic_kind_set, potparm, fist_nonbond_env, pot_quip, para_env)
...
Define the data structure for the particle information.