15 USE iso_c_binding,
ONLY: c_char, &
54#include "./base/base_uses.f90"
60 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'ipi_driver'
79 CHARACTER(len=*),
PARAMETER :: routinen =
'run_driver'
83 CALL timeset(routinen, handle)
84 cpabort(
"CP2K was compiled with the __NO_SOCKETS option!")
88 INTEGER,
PARAMETER :: msglen = 12
90 CHARACTER(len=default_path_length) :: c_hostname, drv_hostname
91 CHARACTER(LEN=default_string_length) ::
header
92 INTEGER :: drv_port, handle, i_drv_unix, &
93 idir, ii, inet, ip, iwait, &
94 nat, output_unit, socket
96 INTEGER(KIND=int_4),
POINTER :: wait_msg(:)
97 LOGICAL :: drv_unix, fwait, hasdata, &
99 REAL(kind=
dp) :: cellh(3, 3), cellih(3, 3), &
100 mxmat(9), pot, vir(3, 3)
101 REAL(kind=
dp),
ALLOCATABLE :: combuf(:)
107 REAL(kind=
dp) :: sleeptime
108 INTEGER,
DIMENSION(3) :: perd
111 CALL timeset(routinen, handle)
120 cpassert(
ASSOCIATED(force_env))
124 ionode = para_env%is_source()
136 cpassert(sleeptime >= 0)
142 IF (drv_unix) i_drv_unix = 0
143 IF (output_unit > 0)
THEN
144 WRITE (output_unit, *)
"@ i-PI DRIVER BEING LOADED"
145 WRITE (output_unit, *)
"@ INPUT DATA: ", trim(drv_hostname), drv_port, drv_unix
148 c_hostname = trim(drv_hostname)//c_null_char
152 ALLOCATE (wait_msg(1))
166 DO iwait = 0, para_env%num_pe - 1
167 IF (iwait /= para_env%source)
THEN
168 CALL para_env%send(msg=wait_msg, dest=iwait, tag=666)
172 CALL para_env%irecv(msgout=wait_msg, source=para_env%source, &
173 tag=666, request=wait_req(2))
175 DO WHILE (.NOT. fwait)
177 CALL uwait(sleeptime)
183 CALL para_env%bcast(
header)
185 IF (output_unit > 0)
WRITE (output_unit, *)
" @ DRIVER MODE: Message from server: ", trim(
header)
186 IF (trim(
header) ==
"STATUS")
THEN
197 ELSE IF (trim(
header) ==
"POSDATA")
THEN
200 cellh = reshape(mxmat, [3, 3])
202 cellih = reshape(mxmat, [3, 3])
204 cellh = transpose(cellh)
205 cellih = transpose(cellih)
207 CALL para_env%bcast(cellh)
208 CALL para_env%bcast(cellih)
209 CALL para_env%bcast(nat)
210 IF (.NOT.
ALLOCATED(combuf))
ALLOCATE (combuf(3*nat))
211 IF (ionode)
CALL readbuffer(socket, combuf, nat*3)
212 CALL para_env%bcast(combuf)
215 IF (nat /= subsys%particles%n_els) &
216 cpabort(
"@DRIVER MODE: Uh-oh! Particle number mismatch between i-PI and cp2k input!")
218 DO ip = 1, subsys%particles%n_els
221 subsys%particles%els(ip)%r(idir) = combuf(ii)
228 CALL init_cell(cpcell, hmat=cellh, periodic=perd)
233 IF (output_unit > 0)
WRITE (output_unit, *)
" @ DRIVER MODE: Received positions "
237 DO ip = 1, subsys%particles%n_els
240 combuf(ii) = subsys%particles%els(ip)%f(idir)
246 vir = transpose(virial%pv_virial)
249 IF (should_stop)
EXIT driver_loop
252 ELSE IF (trim(
header) ==
"GETFORCE")
THEN
253 IF (output_unit > 0)
WRITE (output_unit, *)
" @ DRIVER MODE: Returning v,forces,stress "
270 IF (output_unit > 0)
WRITE (output_unit, *)
" @DRIVER MODE: Socket disconnected, time to exit."
277 DEALLOCATE (wait_msg)
280 CALL timestop(handle)
collects all references to literature in CP2K as new algorithms / method are included from literature...
integer, save, public kapil2016
integer, save, public ceriotti2014
Handles all functions related to the CELL.
subroutine, public init_cell(cell, hmat, periodic)
Initialise/readjust a simulation cell after hmat has been changed.
subroutine, public cell_create(cell, hmat, periodic, tag)
allocates and initializes a cell
Handles all functions related to the CELL.
subroutine, public cell_release(cell)
releases the given cell (see doc/ReferenceCounting.html)
Routines to handle the external control of CP2K.
subroutine, public external_control(should_stop, flag, globenv, target_time, start_time, force_check)
External manipulations during a run : when the <PROJECT_NAME>.EXIT_$runtype command is sent the progr...
various routines to log and control the output. The idea is that decisions about where to log should ...
integer function, public cp_logger_get_default_io_unit(logger)
returns the unit nr for the ionode (-1 on all other processors) skips as well checks if the procs cal...
types that represent a subsys, i.e. a part of the system
subroutine, public cp_subsys_set(subsys, atomic_kinds, particles, local_particles, molecules, molecule_kinds, local_molecules, para_env, colvar_p, shell_particles, core_particles, gci, multipoles, results, cell)
sets various propreties of the subsys
subroutine, public cp_subsys_get(subsys, ref_count, atomic_kinds, atomic_kind_set, particles, particle_set, local_particles, molecules, molecule_set, molecule_kinds, molecule_kind_set, local_molecules, para_env, colvar_p, shell_particles, core_particles, gci, multipoles, natom, nparticle, ncore, nshell, nkind, atprop, virial, results, cell)
returns information about various attributes of the given subsys
Interface for the force calculations.
recursive subroutine, public force_env_calc_energy_force(force_env, calc_force, consistent_energies, skip_external_control, eval_energy_forces, require_consistent_energy_force, linres, calc_stress_tensor)
Interface routine for force and energy calculations.
Interface for the force calculations.
recursive subroutine, public force_env_get(force_env, in_use, fist_env, qs_env, meta_env, fp_env, subsys, para_env, potential_energy, additional_potential, kinetic_energy, harmonic_shell, kinetic_shell, cell, sub_force_env, qmmm_env, qmmmx_env, eip_env, pwdft_env, globenv, input, force_env_section, method_name_id, root_section, mixed_env, nnp_env, embed_env, ipi_env)
returns various attributes about the force environment
Define type storing the global information of a run. Keep the amount of stored data small....
Driver mode - To communicate with i-PI Python wrapper.
subroutine, public run_driver(force_env, globenv)
...
Defines the basic variable types.
integer, parameter, public dp
integer, parameter, public default_string_length
integer, parameter, public default_path_length
integer, parameter, public int_4
Interface to the message passing library MPI.
Implements UNIX and INET sockets.
Type defining parameters related to the simulation cell.
represents a system: atoms, molecules, their pos,vel,...
wrapper to abstract the force evaluation of the various methods
contains the initially parsed file and the initial parallel environment
stores all the informations relevant to an mpi environment