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, drv_prefix
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()
137 cpassert(sleeptime >= 0)
143 IF (drv_unix) i_drv_unix = 0
144 IF (output_unit > 0)
THEN
145 WRITE (output_unit, *)
"@ i-PI DRIVER BEING LOADED"
146 WRITE (output_unit, *)
"@ INPUT DATA: ", trim(drv_hostname), drv_port, drv_unix
153 c_hostname =
"/tmp/"//trim(drv_prefix)//
"_"//trim(drv_hostname)//c_null_char
155 c_hostname = trim(drv_hostname)//c_null_char
160 ALLOCATE (wait_msg(1))
174 DO iwait = 0, para_env%num_pe - 1
175 IF (iwait /= para_env%source)
THEN
176 CALL para_env%send(msg=wait_msg, dest=iwait, tag=666)
180 CALL para_env%irecv(msgout=wait_msg, source=para_env%source, &
181 tag=666, request=wait_req(2))
183 DO WHILE (.NOT. fwait)
185 CALL uwait(sleeptime)
191 CALL para_env%bcast(
header)
193 IF (output_unit > 0)
WRITE (output_unit, *)
" @ DRIVER MODE: Message from server: ", trim(
header)
194 IF (trim(
header) ==
"STATUS")
THEN
205 ELSE IF (trim(
header) ==
"POSDATA")
THEN
208 cellh = reshape(mxmat, [3, 3])
210 cellih = reshape(mxmat, [3, 3])
212 cellh = transpose(cellh)
213 cellih = transpose(cellih)
215 CALL para_env%bcast(cellh)
216 CALL para_env%bcast(cellih)
217 CALL para_env%bcast(nat)
218 IF (.NOT.
ALLOCATED(combuf))
ALLOCATE (combuf(3*nat))
219 IF (ionode)
CALL readbuffer(socket, combuf, nat*3)
220 CALL para_env%bcast(combuf)
223 IF (nat /= subsys%particles%n_els)
THEN
224 cpabort(
"@DRIVER MODE: Uh-oh! Particle number mismatch between i-PI and cp2k input!")
227 DO ip = 1, subsys%particles%n_els
230 subsys%particles%els(ip)%r(idir) = combuf(ii)
237 CALL init_cell(cpcell, hmat=cellh, periodic=perd)
242 IF (output_unit > 0)
WRITE (output_unit, *)
" @ DRIVER MODE: Received positions "
246 DO ip = 1, subsys%particles%n_els
249 combuf(ii) = subsys%particles%els(ip)%f(idir)
255 vir = transpose(virial%pv_virial)
258 IF (should_stop)
EXIT driver_loop
261 ELSE IF (trim(
header) ==
"GETFORCE")
THEN
262 IF (output_unit > 0)
WRITE (output_unit, *)
" @ DRIVER MODE: Returning v,forces,stress "
279 IF (output_unit > 0)
WRITE (output_unit, *)
" @DRIVER MODE: Socket disconnected, time to exit."
286 DEALLOCATE (wait_msg)
289 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, cell_ref, use_ref_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, cell_ref, use_ref_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