Line data Source code
1 : !--------------------------------------------------------------------------------------------------!
2 : ! CP2K: A general program to perform molecular dynamics simulations !
3 : ! Copyright 2000-2026 CP2K developers group <https://cp2k.org> !
4 : ! !
5 : ! SPDX-License-Identifier: GPL-2.0-or-later !
6 : !--------------------------------------------------------------------------------------------------!
7 :
8 : ! **************************************************************************************************
9 : !> \brief Module containing the main loop for simulations with the MiMiC framework
10 : !> \par History
11 : !> 05.2025 Created [AA]
12 : !> \author Andrej Antalik
13 : ! **************************************************************************************************
14 :
15 : MODULE mimic_loop
16 :
17 : USE force_env_methods, ONLY: force_env_calc_energy_force
18 : USE force_env_types, ONLY: force_env_type
19 : USE mcl_requests, ONLY: &
20 : MCL_COMPUTE_FORCES, MCL_EXIT, MCL_RECV_PARTICLE_POSITIONS, &
21 : MCL_RECV_POTENTIAL_ON_GRIDPOINTS, MCL_SEND_BOX_GRIDPOINT_COORDS, &
22 : MCL_SEND_BOX_NUM_GRIDPOINTS, MCL_SEND_BOX_ORIGIN, MCL_SEND_BOX_VECTORS, &
23 : MCL_SEND_CLIENT_APIVER, MCL_SEND_CLIENT_ID, MCL_SEND_CLIENT_NAME, MCL_SEND_CLIENT_RUNTYPE, &
24 : MCL_SEND_DENSITY, MCL_SEND_ENERGY, MCL_SEND_NUCLEAR_CHARGES, MCL_SEND_NUM_CONSTR_ANGLES, &
25 : MCL_SEND_NUM_CONSTR_BONDS, MCL_SEND_NUM_FRAGMENTS, MCL_SEND_NUM_PARTICLES, &
26 : MCL_SEND_NUM_PARTICLES_IN_FRAGMENTS, MCL_SEND_NUM_PARTICLE_SPECIES, &
27 : MCL_SEND_PARTICLE_FORCES, MCL_SEND_PARTICLE_IDS_IN_FRAGMENTS, MCL_SEND_PARTICLE_POSITIONS, &
28 : MCL_SEND_PARTICLE_SPECIES_IDS, MCL_SEND_REFERENCE_CHARGES, MCL_SEND_SPECIES_ELEMENTS, &
29 : MCL_SEND_SPECIES_LABELS, MCL_SEND_SPECIES_MASSES
30 : USE mimic_communicator, ONLY: mimic_communicator_type
31 : #include "../base/base_uses.f90"
32 :
33 : IMPLICIT NONE
34 :
35 : PRIVATE
36 :
37 : PUBLIC :: do_mimic_loop
38 :
39 : CONTAINS
40 :
41 : ! **************************************************************************************************
42 : !> \brief The main loop for a MiMiC run
43 : !> \param force_env ...
44 : !> \par History
45 : !> 5.2025 created [AA]
46 : ! **************************************************************************************************
47 0 : SUBROUTINE do_mimic_loop(force_env)
48 : TYPE(force_env_type), POINTER :: force_env
49 :
50 : CHARACTER(LEN=*), PARAMETER :: routineN = 'do_mimic_loop'
51 :
52 : CHARACTER(LEN=32) :: request_str
53 : INTEGER :: handle, request
54 : LOGICAL :: is_last_step
55 0 : TYPE(mimic_communicator_type) :: mimic_comm
56 :
57 0 : CALL timeset(routineN, handle)
58 :
59 0 : CPASSERT(ASSOCIATED(force_env))
60 :
61 0 : CALL mimic_comm%initialize(force_env)
62 :
63 0 : is_last_step = .FALSE.
64 : DO WHILE (.NOT. is_last_step)
65 0 : request = mimic_comm%receive_request()
66 :
67 0 : SELECT CASE (request)
68 : CASE (MCL_SEND_CLIENT_ID)
69 0 : CALL mimic_comm%send_client_info("id")
70 : CASE (MCL_SEND_CLIENT_NAME)
71 0 : CALL mimic_comm%send_client_info("name")
72 : CASE (MCL_SEND_CLIENT_RUNTYPE)
73 0 : CALL mimic_comm%send_client_info("run_type")
74 : CASE (MCL_SEND_CLIENT_APIVER)
75 0 : CALL mimic_comm%send_client_info("api_version")
76 : CASE (MCL_SEND_NUM_PARTICLES)
77 0 : CALL mimic_comm%send_value("num_atoms")
78 : CASE (MCL_SEND_NUM_PARTICLE_SPECIES)
79 0 : CALL mimic_comm%send_value("num_kinds")
80 : CASE (MCL_SEND_PARTICLE_SPECIES_IDS)
81 0 : CALL mimic_comm%send_atom_info("kinds")
82 : CASE (MCL_SEND_NUM_FRAGMENTS)
83 0 : CALL mimic_comm%send_value("num_fragments")
84 : CASE (MCL_SEND_NUM_PARTICLES_IN_FRAGMENTS)
85 0 : CALL mimic_comm%send_value("num_atoms_in_fragments")
86 : CASE (MCL_SEND_NUM_CONSTR_BONDS)
87 0 : CALL mimic_comm%send_value("num_bonds")
88 : CASE (MCL_SEND_NUM_CONSTR_ANGLES)
89 0 : CALL mimic_comm%send_value("num_angles")
90 : CASE (MCL_SEND_SPECIES_MASSES)
91 0 : CALL mimic_comm%send_kind_info("masses")
92 : CASE (MCL_SEND_PARTICLE_IDS_IN_FRAGMENTS)
93 0 : CALL mimic_comm%send_atom_info("ids")
94 : CASE (MCL_SEND_SPECIES_ELEMENTS)
95 0 : CALL mimic_comm%send_kind_info("elements")
96 : CASE (MCL_SEND_SPECIES_LABELS)
97 0 : CALL mimic_comm%send_kind_info("labels")
98 : CASE (MCL_SEND_PARTICLE_POSITIONS)
99 0 : CALL mimic_comm%send_positions()
100 : CASE (MCL_RECV_PARTICLE_POSITIONS)
101 0 : CALL mimic_comm%receive_positions()
102 : CASE (MCL_SEND_PARTICLE_FORCES)
103 0 : CALL mimic_comm%send_forces()
104 : CASE (MCL_SEND_ENERGY)
105 0 : CALL mimic_comm%send_value("energy")
106 : CASE (MCL_SEND_NUCLEAR_CHARGES)
107 0 : CALL mimic_comm%send_kind_info("nuclear_charges")
108 : CASE (MCL_SEND_BOX_NUM_GRIDPOINTS)
109 0 : CALL mimic_comm%send_box_info("num_gridpoints")
110 : CASE (MCL_SEND_BOX_ORIGIN)
111 0 : CALL mimic_comm%send_box_info("origin")
112 : CASE (MCL_SEND_BOX_VECTORS)
113 0 : CALL mimic_comm%send_box_info("box_vectors")
114 : CASE (MCL_SEND_BOX_GRIDPOINT_COORDS)
115 0 : CALL mimic_comm%send_grid_coordinates()
116 : CASE (MCL_SEND_DENSITY)
117 0 : CALL mimic_comm%send_density()
118 : CASE (MCL_RECV_POTENTIAL_ON_GRIDPOINTS)
119 0 : CALL mimic_comm%receive_potential()
120 : CASE (MCL_SEND_REFERENCE_CHARGES)
121 0 : CALL mimic_comm%send_result("hirshfeld_charges")
122 : CASE (MCL_COMPUTE_FORCES)
123 0 : CALL force_env_calc_energy_force(force_env, calc_force=.TRUE.)
124 : CASE (MCL_EXIT)
125 0 : is_last_step = .TRUE.
126 : CASE DEFAULT
127 0 : WRITE (request_str, "(I0)") request
128 0 : CPABORT("Unrecognized MiMiC request: "//TRIM(request_str))
129 : END SELECT
130 : END DO
131 :
132 0 : CALL mimic_comm%finalize()
133 :
134 0 : CALL timestop(handle)
135 :
136 0 : END SUBROUTINE do_mimic_loop
137 :
138 : END MODULE mimic_loop
139 :
|