Line data Source code
1 : !--------------------------------------------------------------------------------------------------!
2 : ! CP2K: A general program to perform molecular dynamics simulations !
3 : ! Copyright 2000-2024 CP2K developers group <https://cp2k.org> !
4 : ! !
5 : ! SPDX-License-Identifier: GPL-2.0-or-later !
6 : !--------------------------------------------------------------------------------------------------!
7 :
8 : ! **************************************************************************************************
9 : !> \brief Interface for the force calculations
10 : !> \par History
11 : !> cjm, FEB-20-2001: pass variable box_ref
12 : !> cjm, SEPT-12-2002: major reorganization
13 : !> fawzi, APR-12-2003: introduced force_env
14 : !> cjm, FEB-27-2006: no more box_change
15 : !> MK, Nov. 2010: new interfaces added and others were updated
16 : !> \author CJM & JGH
17 : ! **************************************************************************************************
18 : MODULE force_env_types
19 : USE cell_types, ONLY: cell_type
20 : USE cp_log_handling, ONLY: cp_add_default_logger,&
21 : cp_logger_type,&
22 : cp_rm_default_logger
23 : USE cp_subsys_types, ONLY: cp_subsys_get,&
24 : cp_subsys_type,&
25 : pack_subsys_particles
26 : USE eip_environment_types, ONLY: eip_env_get,&
27 : eip_env_release,&
28 : eip_environment_type
29 : USE embed_types, ONLY: embed_env_release,&
30 : embed_env_type,&
31 : get_embed_env
32 : USE fist_energy_types, ONLY: fist_energy_type
33 : USE fist_environment_types, ONLY: fist_env_get,&
34 : fist_env_release,&
35 : fist_environment_type
36 : USE fp_types, ONLY: fp_env_release,&
37 : fp_type
38 : USE global_types, ONLY: global_environment_type,&
39 : globenv_release
40 : USE input_section_types, ONLY: section_vals_get,&
41 : section_vals_release,&
42 : section_vals_retain,&
43 : section_vals_type,&
44 : section_vals_val_get
45 : USE ipi_environment_types, ONLY: ipi_env_get,&
46 : ipi_env_release,&
47 : ipi_environment_type
48 : USE ipi_server, ONLY: shutdown_server
49 : USE kinds, ONLY: dp
50 : USE message_passing, ONLY: mp_para_env_release,&
51 : mp_para_env_type
52 : USE metadynamics_types, ONLY: meta_env_release,&
53 : meta_env_type
54 : USE mixed_energy_types, ONLY: mixed_energy_type
55 : USE mixed_environment_types, ONLY: get_mixed_env,&
56 : mixed_env_release,&
57 : mixed_environment_type
58 : USE nnp_environment_types, ONLY: nnp_env_get,&
59 : nnp_env_release,&
60 : nnp_type
61 : USE pwdft_environment_types, ONLY: pwdft_energy_type,&
62 : pwdft_env_get,&
63 : pwdft_env_release,&
64 : pwdft_environment_type
65 : USE qmmm_types, ONLY: qmmm_env_get,&
66 : qmmm_env_release,&
67 : qmmm_env_type
68 : USE qmmmx_types, ONLY: qmmmx_env_get,&
69 : qmmmx_env_release,&
70 : qmmmx_env_type
71 : USE qs_energy_types, ONLY: qs_energy_type
72 : USE qs_environment_types, ONLY: get_qs_env,&
73 : qs_env_release,&
74 : qs_environment_type
75 : #include "./base/base_uses.f90"
76 :
77 : IMPLICIT NONE
78 :
79 : PRIVATE
80 :
81 : CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'force_env_types'
82 :
83 : INTEGER, PARAMETER, PUBLIC :: use_fist_force = 501, &
84 : use_qs_force = 502, &
85 : use_qmmm = 503, &
86 : use_qmmmx = 504, &
87 : use_eip_force = 505, &
88 : use_mixed_force = 506, &
89 : use_embed = 507, &
90 : use_pwdft_force = 508, &
91 : use_nnp_force = 509, &
92 : use_ipi = 510
93 :
94 : CHARACTER(LEN=10), DIMENSION(501:510), PARAMETER, PUBLIC :: &
95 : use_prog_name = (/ &
96 : "FIST ", &
97 : "QS ", &
98 : "QMMM ", &
99 : "QMMMX ", &
100 : "EIP ", &
101 : "MIXED ", &
102 : "EMBED ", &
103 : "SIRIUS", &
104 : "NNP ", &
105 : "IPI "/)
106 :
107 : PUBLIC :: force_env_type, &
108 : force_env_p_type
109 :
110 : PUBLIC :: force_env_retain, &
111 : force_env_release, &
112 : force_env_get, &
113 : force_env_get_natom, &
114 : force_env_get_nparticle, &
115 : force_env_get_frc, &
116 : force_env_get_pos, &
117 : force_env_get_vel, &
118 : force_env_set, &
119 : multiple_fe_list
120 :
121 : ! **************************************************************************************************
122 : !> \brief wrapper to abstract the force evaluation of the various methods
123 : !> \param ref_count reference count (see doc/ReferenceCounting.html)
124 : !> \param in_use which method is in use
125 : !> \param fist_env the fist environment (allocated only if fist is in use)
126 : !> \param qs_env qs_env (activated only if quickstep is in use)
127 : !> \param globenv the globenv to have the input that generated this force_env
128 : !> \param para_env the parallel environment that contains all the parallel
129 : !> environment of the fragments
130 : !> \param meta_env the metadynamics environment, allocated if there is
131 : !> metadynamics
132 : !> \param fp_env the flexible partitioning environment
133 : !> read-only attributes (get them *only* through force_env_get):
134 : !> \param subsys the fragments that build up the actual system.
135 : !> \param cell the cell of the actual system
136 : !> \note
137 : !> as always direct manipulation of these attributes can have very
138 : !> bad effects. In this case it can be quite bad and the variables
139 : !> might not be up to date. You are warned, use only the get method...
140 : !> \par History
141 : !> 04.2003 created [fawzi]
142 : !> 07.2003 tried to adapt to multiple mpi groups
143 : !> \author fawzi
144 : ! **************************************************************************************************
145 : TYPE force_env_type
146 : INTEGER :: ref_count = 0, in_use = 0, method_name_id = 0
147 : REAL(KIND=dp) :: additional_potential = 0.0_dp
148 : TYPE(fist_environment_type), POINTER :: fist_env => NULL()
149 : TYPE(meta_env_type), POINTER :: meta_env => NULL()
150 : TYPE(fp_type), POINTER :: fp_env => NULL()
151 : TYPE(qs_environment_type), POINTER :: qs_env => NULL()
152 : TYPE(eip_environment_type), POINTER :: eip_env => NULL()
153 : TYPE(pwdft_environment_type), POINTER :: pwdft_env => NULL()
154 : TYPE(global_environment_type), POINTER :: globenv => NULL()
155 : TYPE(mp_para_env_type), POINTER :: para_env => NULL()
156 : TYPE(force_env_p_type), DIMENSION(:), POINTER :: sub_force_env => NULL()
157 : TYPE(qmmm_env_type), POINTER :: qmmm_env => NULL()
158 : TYPE(qmmmx_env_type), POINTER :: qmmmx_env => NULL()
159 : TYPE(mixed_environment_type), POINTER :: mixed_env => NULL()
160 : TYPE(nnp_type), POINTER :: nnp_env => NULL()
161 : TYPE(embed_env_type), POINTER :: embed_env => NULL()
162 : TYPE(ipi_environment_type), POINTER :: ipi_env => NULL()
163 : TYPE(section_vals_type), POINTER :: force_env_section => NULL()
164 : TYPE(section_vals_type), POINTER :: root_section => NULL()
165 : END TYPE force_env_type
166 :
167 : ! **************************************************************************************************
168 : !> \brief allows for the creation of an array of force_env
169 : !> \param force_env a force environment (see above)
170 : !> \note
171 : !> added by MJM for MC swap moves
172 : !> \author MJM
173 : ! **************************************************************************************************
174 : TYPE force_env_p_type
175 : TYPE(force_env_type), POINTER :: force_env => NULL()
176 : END TYPE force_env_p_type
177 :
178 : CONTAINS
179 :
180 : ! **************************************************************************************************
181 : !> \brief retains the given force env
182 : !> \param force_env the force environment to retain
183 : !> \par History
184 : !> 04.2003 created [fawzi]
185 : !> \author fawzi
186 : !> \note
187 : !> see doc/ReferenceCounting.html
188 : ! **************************************************************************************************
189 12527 : SUBROUTINE force_env_retain(force_env)
190 : TYPE(force_env_type), POINTER :: force_env
191 :
192 12527 : CPASSERT(ASSOCIATED(force_env))
193 12527 : CPASSERT(force_env%ref_count > 0)
194 12527 : force_env%ref_count = force_env%ref_count + 1
195 12527 : END SUBROUTINE force_env_retain
196 :
197 : ! **************************************************************************************************
198 : !> \brief releases the given force env
199 : !> \param force_env the force environment to release
200 : !> \par History
201 : !> 04.2003 created [fawzi]
202 : !> \author fawzi
203 : !> \note
204 : !> see doc/ReferenceCounting.html
205 : ! **************************************************************************************************
206 21346 : RECURSIVE SUBROUTINE force_env_release(force_env)
207 : TYPE(force_env_type), POINTER :: force_env
208 :
209 : INTEGER :: i, my_group
210 : TYPE(cp_logger_type), POINTER :: my_logger
211 :
212 21346 : IF (ASSOCIATED(force_env)) THEN
213 21346 : CPASSERT(force_env%ref_count > 0)
214 21346 : force_env%ref_count = force_env%ref_count - 1
215 21346 : IF (force_env%ref_count == 0) THEN
216 : ! Deallocate SUB_FORCE_ENV
217 8819 : IF (ASSOCIATED(force_env%sub_force_env)) THEN
218 560 : DO i = 1, SIZE(force_env%sub_force_env)
219 398 : IF (.NOT. ASSOCIATED(force_env%sub_force_env(i)%force_env)) CYCLE
220 : ! Use the proper logger to deallocate..
221 314 : IF (force_env%in_use == use_mixed_force) THEN
222 208 : my_group = force_env%mixed_env%group_distribution(force_env%para_env%mepos)
223 208 : my_logger => force_env%mixed_env%sub_logger(my_group + 1)%p
224 208 : CALL cp_add_default_logger(my_logger)
225 : END IF
226 : ! The same for embedding
227 314 : IF (force_env%in_use == use_embed) THEN
228 96 : my_group = force_env%embed_env%group_distribution(force_env%para_env%mepos)
229 96 : my_logger => force_env%embed_env%sub_logger(my_group + 1)%p
230 96 : CALL cp_add_default_logger(my_logger)
231 : END IF
232 314 : CALL force_env_release(force_env%sub_force_env(i)%force_env)
233 314 : IF (force_env%in_use == use_mixed_force) &
234 208 : CALL cp_rm_default_logger()
235 314 : IF (force_env%in_use == use_embed) &
236 258 : CALL cp_rm_default_logger()
237 : END DO
238 162 : DEALLOCATE (force_env%sub_force_env)
239 : END IF
240 :
241 11064 : SELECT CASE (force_env%in_use)
242 : CASE (use_fist_force)
243 2245 : CALL fist_env_release(force_env%fist_env)
244 2245 : DEALLOCATE (force_env%fist_env)
245 : CASE (use_qs_force)
246 6056 : CALL qs_env_release(force_env%qs_env)
247 6056 : DEALLOCATE (force_env%qs_env)
248 : CASE (use_eip_force)
249 2 : CALL eip_env_release(force_env%eip_env)
250 2 : DEALLOCATE (force_env%eip_env)
251 : CASE (use_pwdft_force)
252 14 : CALL pwdft_env_release(force_env%pwdft_env)
253 14 : DEALLOCATE (force_env%pwdft_env)
254 : CASE (use_mixed_force)
255 130 : CALL mixed_env_release(force_env%mixed_env)
256 130 : DEALLOCATE (force_env%mixed_env)
257 : CASE (use_nnp_force)
258 14 : CALL nnp_env_release(force_env%nnp_env)
259 14 : DEALLOCATE (force_env%nnp_env)
260 : CASE (use_embed)
261 24 : CALL embed_env_release(force_env%embed_env)
262 24 : DEALLOCATE (force_env%embed_env)
263 : CASE (use_ipi)
264 0 : CALL shutdown_server(force_env%ipi_env)
265 0 : CALL ipi_env_release(force_env%ipi_env)
266 8819 : DEALLOCATE (force_env%ipi_env)
267 : END SELECT
268 8819 : CALL globenv_release(force_env%globenv)
269 8819 : CALL mp_para_env_release(force_env%para_env)
270 : ! Not deallocated
271 8819 : CPASSERT(.NOT. ASSOCIATED(force_env%fist_env))
272 8819 : CPASSERT(.NOT. ASSOCIATED(force_env%qs_env))
273 8819 : CPASSERT(.NOT. ASSOCIATED(force_env%eip_env))
274 8819 : CPASSERT(.NOT. ASSOCIATED(force_env%pwdft_env))
275 8819 : CPASSERT(.NOT. ASSOCIATED(force_env%mixed_env))
276 8819 : CPASSERT(.NOT. ASSOCIATED(force_env%nnp_env))
277 8819 : CPASSERT(.NOT. ASSOCIATED(force_env%embed_env))
278 8819 : CPASSERT(.NOT. ASSOCIATED(force_env%ipi_env))
279 8819 : IF (ASSOCIATED(force_env%meta_env)) THEN
280 150 : CALL meta_env_release(force_env%meta_env)
281 150 : DEALLOCATE (force_env%meta_env)
282 : END IF
283 8819 : IF (ASSOCIATED(force_env%fp_env)) THEN
284 8505 : CALL fp_env_release(force_env%fp_env)
285 8505 : DEALLOCATE (force_env%fp_env)
286 : END IF
287 8819 : IF (ASSOCIATED(force_env%qmmm_env)) THEN
288 326 : CALL qmmm_env_release(force_env%qmmm_env)
289 326 : DEALLOCATE (force_env%qmmm_env)
290 : END IF
291 8819 : IF (ASSOCIATED(force_env%qmmmx_env)) THEN
292 8 : CALL qmmmx_env_release(force_env%qmmmx_env)
293 8 : DEALLOCATE (force_env%qmmmx_env)
294 : END IF
295 8819 : CALL section_vals_release(force_env%force_env_section)
296 8819 : CALL section_vals_release(force_env%root_section)
297 8819 : DEALLOCATE (force_env)
298 : END IF
299 : END IF
300 21346 : NULLIFY (force_env)
301 21346 : END SUBROUTINE force_env_release
302 :
303 : ! **************************************************************************************************
304 : !> \brief returns various attributes about the force environment
305 : !> \param force_env the force environment you what informations about
306 : !> \param in_use ...
307 : !> \param fist_env ...
308 : !> \param qs_env ...
309 : !> \param meta_env ...
310 : !> \param fp_env ...
311 : !> \param subsys ...
312 : !> \param para_env ...
313 : !> \param potential_energy ...
314 : !> \param additional_potential ...
315 : !> \param kinetic_energy ...
316 : !> \param harmonic_shell ...
317 : !> \param kinetic_shell ...
318 : !> \param cell ...
319 : !> \param sub_force_env ...
320 : !> \param qmmm_env ...
321 : !> \param qmmmx_env ...
322 : !> \param eip_env ...
323 : !> \param pwdft_env ...
324 : !> \param globenv ...
325 : !> \param input ...
326 : !> \param force_env_section ...
327 : !> \param method_name_id ...
328 : !> \param root_section ...
329 : !> \param mixed_env ...
330 : !> \param nnp_env ...
331 : !> \param embed_env ...
332 : !> \param ipi_env ...
333 : !> \par History
334 : !> 04.2003 created [fawzi]
335 : !> \author fawzi
336 : ! **************************************************************************************************
337 2147979 : RECURSIVE SUBROUTINE force_env_get(force_env, in_use, fist_env, qs_env, &
338 : meta_env, fp_env, subsys, para_env, potential_energy, additional_potential, &
339 : kinetic_energy, harmonic_shell, kinetic_shell, cell, sub_force_env, &
340 : qmmm_env, qmmmx_env, eip_env, pwdft_env, globenv, input, force_env_section, &
341 : method_name_id, root_section, mixed_env, nnp_env, embed_env, ipi_env)
342 : TYPE(force_env_type), INTENT(IN) :: force_env
343 : INTEGER, INTENT(out), OPTIONAL :: in_use
344 : TYPE(fist_environment_type), OPTIONAL, POINTER :: fist_env
345 : TYPE(qs_environment_type), OPTIONAL, POINTER :: qs_env
346 : TYPE(meta_env_type), OPTIONAL, POINTER :: meta_env
347 : TYPE(fp_type), OPTIONAL, POINTER :: fp_env
348 : TYPE(cp_subsys_type), OPTIONAL, POINTER :: subsys
349 : TYPE(mp_para_env_type), OPTIONAL, POINTER :: para_env
350 : REAL(KIND=dp), INTENT(OUT), OPTIONAL :: potential_energy, additional_potential, &
351 : kinetic_energy, harmonic_shell, &
352 : kinetic_shell
353 : TYPE(cell_type), OPTIONAL, POINTER :: cell
354 : TYPE(force_env_p_type), DIMENSION(:), OPTIONAL, &
355 : POINTER :: sub_force_env
356 : TYPE(qmmm_env_type), OPTIONAL, POINTER :: qmmm_env
357 : TYPE(qmmmx_env_type), OPTIONAL, POINTER :: qmmmx_env
358 : TYPE(eip_environment_type), OPTIONAL, POINTER :: eip_env
359 : TYPE(pwdft_environment_type), OPTIONAL, POINTER :: pwdft_env
360 : TYPE(global_environment_type), OPTIONAL, POINTER :: globenv
361 : TYPE(section_vals_type), OPTIONAL, POINTER :: input, force_env_section
362 : INTEGER, INTENT(out), OPTIONAL :: method_name_id
363 : TYPE(section_vals_type), OPTIONAL, POINTER :: root_section
364 : TYPE(mixed_environment_type), OPTIONAL, POINTER :: mixed_env
365 : TYPE(nnp_type), OPTIONAL, POINTER :: nnp_env
366 : TYPE(embed_env_type), OPTIONAL, POINTER :: embed_env
367 : TYPE(ipi_environment_type), OPTIONAL, POINTER :: ipi_env
368 :
369 : REAL(KIND=dp) :: eip_kinetic_energy, eip_potential_energy
370 : TYPE(cp_subsys_type), POINTER :: subsys_tmp
371 : TYPE(fist_energy_type), POINTER :: thermo
372 : TYPE(mixed_energy_type), POINTER :: mixed_energy
373 : TYPE(pwdft_energy_type), POINTER :: pwdft_energy
374 : TYPE(qs_energy_type), POINTER :: qs_energy
375 :
376 2147979 : NULLIFY (subsys_tmp)
377 :
378 2147979 : CPASSERT(force_env%ref_count > 0)
379 :
380 2426238 : SELECT CASE (force_env%in_use)
381 : CASE (use_qs_force)
382 278259 : CPASSERT(ASSOCIATED(force_env%qs_env))
383 278259 : CPASSERT(.NOT. PRESENT(fist_env))
384 278259 : CPASSERT(.NOT. PRESENT(eip_env))
385 278259 : CPASSERT(.NOT. PRESENT(pwdft_env))
386 278259 : CPASSERT(.NOT. PRESENT(ipi_env))
387 : CALL get_qs_env(force_env%qs_env, &
388 : energy=qs_energy, &
389 : input=input, &
390 278259 : cp_subsys=subsys)
391 278259 : IF (PRESENT(potential_energy)) potential_energy = qs_energy%total
392 278259 : CPASSERT(.NOT. PRESENT(kinetic_energy))
393 : CASE (use_fist_force)
394 1784963 : CPASSERT(ASSOCIATED(force_env%fist_env))
395 1784963 : CPASSERT(.NOT. PRESENT(input))
396 : CALL fist_env_get(force_env%fist_env, &
397 : thermo=thermo, &
398 1784963 : subsys=subsys)
399 1784963 : IF (PRESENT(potential_energy)) potential_energy = thermo%pot
400 1784963 : IF (PRESENT(kinetic_energy)) kinetic_energy = thermo%kin
401 1784963 : IF (PRESENT(kinetic_shell)) kinetic_shell = thermo%kin_shell
402 1784963 : IF (PRESENT(harmonic_shell)) harmonic_shell = thermo%harm_shell
403 : CASE (use_eip_force)
404 600 : CPASSERT(ASSOCIATED(force_env%eip_env))
405 600 : CPASSERT(.NOT. PRESENT(qs_env))
406 600 : CPASSERT(.NOT. PRESENT(fist_env))
407 600 : CPASSERT(.NOT. PRESENT(ipi_env))
408 : CALL eip_env_get(force_env%eip_env, &
409 : eip_potential_energy=eip_potential_energy, &
410 : eip_kinetic_energy=eip_kinetic_energy, &
411 600 : subsys=subsys)
412 600 : IF (PRESENT(potential_energy)) THEN
413 44 : potential_energy = eip_potential_energy
414 : END IF
415 600 : IF (PRESENT(kinetic_energy)) kinetic_energy = eip_kinetic_energy
416 0 : CPASSERT(.NOT. PRESENT(kinetic_energy))
417 : CASE (use_pwdft_force)
418 154 : CPASSERT(ASSOCIATED(force_env%pwdft_env))
419 154 : CPASSERT(.NOT. PRESENT(qs_env))
420 154 : CPASSERT(.NOT. PRESENT(fist_env))
421 154 : CPASSERT(.NOT. PRESENT(ipi_env))
422 154 : CALL pwdft_env_get(force_env%pwdft_env, energy=pwdft_energy)
423 154 : CALL pwdft_env_get(force_env%pwdft_env, cp_subsys=subsys)
424 154 : IF (PRESENT(potential_energy)) potential_energy = pwdft_energy%etotal
425 154 : CPASSERT(.NOT. PRESENT(kinetic_energy))
426 : CASE (use_qmmm)
427 : CALL qmmm_env_get(force_env%qmmm_env, &
428 : subsys=subsys, &
429 : potential_energy=potential_energy, &
430 62932 : kinetic_energy=kinetic_energy)
431 : CASE (use_qmmmx)
432 : CALL qmmmx_env_get(force_env%qmmmx_env, &
433 : subsys=subsys, &
434 : potential_energy=potential_energy, &
435 16497 : kinetic_energy=kinetic_energy)
436 : CASE (use_mixed_force)
437 14955 : CPASSERT(ASSOCIATED(force_env%mixed_env))
438 14955 : CPASSERT(.NOT. PRESENT(input))
439 : CALL get_mixed_env(force_env%mixed_env, &
440 : mixed_energy=mixed_energy, &
441 14955 : subsys=subsys)
442 14955 : IF (PRESENT(potential_energy)) potential_energy = mixed_energy%pot
443 14955 : IF (PRESENT(kinetic_energy)) kinetic_energy = mixed_energy%kin
444 : ! In embedding we only have potential energies (electronic energies)
445 : CASE (use_embed)
446 338 : CPASSERT(ASSOCIATED(force_env%embed_env))
447 338 : CPASSERT(.NOT. PRESENT(input))
448 : CALL get_embed_env(force_env%embed_env, &
449 : pot_energy=potential_energy, &
450 338 : subsys=subsys)
451 : CASE (use_nnp_force)
452 5778 : CPASSERT(ASSOCIATED(force_env%nnp_env))
453 5778 : CPASSERT(.NOT. PRESENT(ipi_env))
454 : CALL nnp_env_get(force_env%nnp_env, &
455 : nnp_potential_energy=potential_energy, &
456 5778 : subsys=subsys)
457 5778 : CPASSERT(.NOT. PRESENT(kinetic_energy))
458 : CASE (use_ipi)
459 : CALL ipi_env_get(force_env%ipi_env, &
460 : ipi_energy=potential_energy, &
461 0 : subsys=subsys)
462 : CASE DEFAULT
463 2154357 : CPABORT("unknown in_use flag value ")
464 : END SELECT
465 :
466 2147979 : IF (PRESENT(force_env_section)) force_env_section => force_env%force_env_section
467 2147979 : IF (PRESENT(in_use)) in_use = force_env%in_use
468 2147979 : IF (PRESENT(method_name_id)) method_name_id = force_env%method_name_id
469 2147979 : IF (PRESENT(fist_env)) THEN
470 14 : fist_env => force_env%fist_env
471 : END IF
472 2147979 : IF (PRESENT(qs_env)) THEN
473 24441 : qs_env => force_env%qs_env
474 : END IF
475 2147979 : IF (PRESENT(eip_env)) THEN
476 0 : eip_env => force_env%eip_env
477 : END IF
478 2147979 : IF (PRESENT(pwdft_env)) THEN
479 0 : pwdft_env => force_env%pwdft_env
480 : END IF
481 2147979 : IF (PRESENT(nnp_env)) THEN
482 0 : nnp_env => force_env%nnp_env
483 : END IF
484 2147979 : IF (PRESENT(ipi_env)) THEN
485 0 : ipi_env => force_env%ipi_env
486 : END IF
487 2147979 : IF (PRESENT(para_env)) para_env => force_env%para_env
488 : ! adjust the total energy for the metadynamics
489 2147979 : IF (ASSOCIATED(force_env%meta_env)) THEN
490 425538 : IF (PRESENT(potential_energy)) THEN
491 : potential_energy = potential_energy + &
492 : force_env%meta_env%epot_s + &
493 : force_env%meta_env%epot_walls + &
494 27576 : force_env%meta_env%hills_env%energy
495 : END IF
496 425538 : IF (PRESENT(kinetic_energy)) THEN
497 0 : kinetic_energy = kinetic_energy + force_env%meta_env%ekin_s
498 : END IF
499 : END IF
500 : ! adjust the total energy for the flexible partitioning
501 2147979 : IF (ASSOCIATED(force_env%fp_env) .AND. PRESENT(potential_energy)) THEN
502 193536 : IF (force_env%fp_env%use_fp) THEN
503 244 : potential_energy = potential_energy + force_env%fp_env%energy
504 : END IF
505 : END IF
506 199403 : IF (PRESENT(potential_energy)) THEN
507 195064 : potential_energy = potential_energy + force_env%additional_potential
508 : END IF
509 2147979 : IF (PRESENT(additional_potential)) THEN
510 97570 : additional_potential = force_env%additional_potential
511 : END IF
512 2147979 : IF (PRESENT(cell)) THEN
513 525910 : CALL force_env_get(force_env, subsys=subsys_tmp)
514 525910 : CALL cp_subsys_get(subsys_tmp, cell=cell)
515 : END IF
516 2147979 : IF (PRESENT(fp_env)) fp_env => force_env%fp_env
517 2147979 : IF (PRESENT(meta_env)) meta_env => force_env%meta_env
518 2147979 : IF (PRESENT(sub_force_env)) sub_force_env => force_env%sub_force_env
519 2147979 : IF (PRESENT(qmmm_env)) qmmm_env => force_env%qmmm_env
520 2147979 : IF (PRESENT(qmmmx_env)) qmmmx_env => force_env%qmmmx_env
521 2147979 : IF (PRESENT(mixed_env)) mixed_env => force_env%mixed_env
522 2147979 : IF (PRESENT(embed_env)) embed_env => force_env%embed_env
523 2147979 : IF (PRESENT(ipi_env)) ipi_env => force_env%ipi_env
524 2147979 : IF (PRESENT(globenv)) globenv => force_env%globenv
525 2147979 : IF (PRESENT(root_section)) root_section => force_env%root_section
526 :
527 2147979 : END SUBROUTINE force_env_get
528 :
529 : ! **************************************************************************************************
530 : !> \brief returns the number of atoms
531 : !> \param force_env the force_env you what information about
532 : !> \return the number of atoms
533 : !> \date 22.11.2010 updated (MK)
534 : !> \author fawzi
535 : ! **************************************************************************************************
536 214052 : FUNCTION force_env_get_natom(force_env) RESULT(n_atom)
537 :
538 : TYPE(force_env_type), INTENT(IN) :: force_env
539 : INTEGER :: n_atom
540 :
541 : TYPE(cp_subsys_type), POINTER :: subsys
542 :
543 : n_atom = 0
544 107026 : NULLIFY (subsys)
545 107026 : CALL force_env_get(force_env, subsys=subsys)
546 107026 : CALL cp_subsys_get(subsys, natom=n_atom)
547 :
548 107026 : END FUNCTION force_env_get_natom
549 :
550 : ! **************************************************************************************************
551 : !> \brief returns the number of particles in a force environment
552 : !> \param force_env the force_env you what information about
553 : !> \return the number of particles
554 : !> \date 22.11.2010 (MK)
555 : !> \author Matthias Krack
556 : ! **************************************************************************************************
557 27952 : FUNCTION force_env_get_nparticle(force_env) RESULT(n_particle)
558 :
559 : TYPE(force_env_type), INTENT(IN) :: force_env
560 : INTEGER :: n_particle
561 :
562 : TYPE(cp_subsys_type), POINTER :: subsys
563 :
564 : n_particle = 0
565 13976 : NULLIFY (subsys)
566 13976 : CALL force_env_get(force_env, subsys=subsys)
567 13976 : CALL cp_subsys_get(subsys, nparticle=n_particle)
568 :
569 13976 : END FUNCTION force_env_get_nparticle
570 :
571 : ! **************************************************************************************************
572 : !> \brief returns the particle forces in a dimension(*) array
573 : !> \param force_env the force_env you want to get the forces
574 : !> \param frc the array of the forces
575 : !> \param n ...
576 : !> \date 22.11.2010 Creation
577 : !> \author Matthias Krack
578 : ! **************************************************************************************************
579 9238 : SUBROUTINE force_env_get_frc(force_env, frc, n)
580 :
581 : TYPE(force_env_type), INTENT(IN) :: force_env
582 : REAL(KIND=dp), DIMENSION(*), INTENT(OUT) :: frc
583 : INTEGER, INTENT(IN) :: n
584 :
585 : CHARACTER(LEN=*), PARAMETER :: routineN = 'force_env_get_frc'
586 :
587 : INTEGER :: handle
588 : TYPE(cp_subsys_type), POINTER :: subsys
589 :
590 9238 : CALL timeset(routineN, handle)
591 9238 : CPASSERT(force_env%ref_count > 0)
592 9238 : CALL force_env_get(force_env, subsys=subsys)
593 9238 : CALL pack_subsys_particles(subsys=subsys, f=frc(1:n))
594 9238 : CALL timestop(handle)
595 :
596 9238 : END SUBROUTINE force_env_get_frc
597 :
598 : ! **************************************************************************************************
599 : !> \brief returns the particle positions in a dimension(*) array
600 : !> \param force_env the force_env you want to get the positions
601 : !> \param pos the array of the positions
602 : !> \param n ...
603 : !> \date 22.11.2010 updated (MK)
604 : !> \author fawzi
605 : ! **************************************************************************************************
606 340 : SUBROUTINE force_env_get_pos(force_env, pos, n)
607 :
608 : TYPE(force_env_type), INTENT(IN) :: force_env
609 : REAL(kind=dp), DIMENSION(*), INTENT(OUT) :: pos
610 : INTEGER, INTENT(IN) :: n
611 :
612 : CHARACTER(LEN=*), PARAMETER :: routineN = 'force_env_get_pos'
613 :
614 : INTEGER :: handle
615 : TYPE(cp_subsys_type), POINTER :: subsys
616 :
617 340 : CALL timeset(routineN, handle)
618 340 : CPASSERT(force_env%ref_count > 0)
619 340 : CALL force_env_get(force_env, subsys=subsys)
620 340 : CALL pack_subsys_particles(subsys=subsys, r=pos(1:n))
621 340 : CALL timestop(handle)
622 :
623 340 : END SUBROUTINE force_env_get_pos
624 :
625 : ! **************************************************************************************************
626 : !> \brief returns the particle velocities in a dimension(*) array
627 : !> \param force_env the force_env you want to get the velocities
628 : !> \param vel the array of the velocities
629 : !> \param n ...
630 : !> \date 22.11.2010 Creation (MK)
631 : !> \author Matthias Krack
632 : ! **************************************************************************************************
633 0 : SUBROUTINE force_env_get_vel(force_env, vel, n)
634 :
635 : TYPE(force_env_type), INTENT(IN) :: force_env
636 : REAL(KIND=dp), DIMENSION(*), INTENT(OUT) :: vel
637 : INTEGER, INTENT(IN) :: n
638 :
639 : CHARACTER(LEN=*), PARAMETER :: routineN = 'force_env_get_vel'
640 :
641 : INTEGER :: handle
642 : TYPE(cp_subsys_type), POINTER :: subsys
643 :
644 0 : CALL timeset(routineN, handle)
645 0 : CPASSERT(force_env%ref_count > 0)
646 0 : CALL force_env_get(force_env, subsys=subsys)
647 0 : CALL pack_subsys_particles(subsys=subsys, v=vel(1:n))
648 0 : CALL timestop(handle)
649 :
650 0 : END SUBROUTINE force_env_get_vel
651 :
652 : ! **************************************************************************************************
653 : !> \brief changes some attributes of the force_env
654 : !> \param force_env the force environment where the cell should be changed
655 : !> \param meta_env the new meta environment
656 : !> \param fp_env ...
657 : !> \param force_env_section ...
658 : !> \param method_name_id ...
659 : !> \param additional_potential ...
660 : !> \par History
661 : !> 09.2003 created [fawzi]
662 : !> \author Fawzi Mohamed
663 : ! **************************************************************************************************
664 212650 : SUBROUTINE force_env_set(force_env, meta_env, fp_env, force_env_section, &
665 : method_name_id, additional_potential)
666 :
667 : TYPE(force_env_type), INTENT(INOUT) :: force_env
668 : TYPE(meta_env_type), OPTIONAL, POINTER :: meta_env
669 : TYPE(fp_type), OPTIONAL, POINTER :: fp_env
670 : TYPE(section_vals_type), OPTIONAL, POINTER :: force_env_section
671 : INTEGER, OPTIONAL :: method_name_id
672 : REAL(KIND=dp), INTENT(IN), OPTIONAL :: additional_potential
673 :
674 212650 : CPASSERT(force_env%ref_count > 0)
675 212650 : IF (PRESENT(meta_env)) THEN
676 8505 : IF (ASSOCIATED(force_env%meta_env)) THEN
677 0 : CALL meta_env_release(force_env%meta_env)
678 0 : DEALLOCATE (force_env%meta_env)
679 : END IF
680 8505 : force_env%meta_env => meta_env
681 : END IF
682 212650 : IF (PRESENT(fp_env)) THEN
683 8505 : IF (ASSOCIATED(force_env%fp_env)) CALL fp_env_release(force_env%fp_env)
684 8505 : force_env%fp_env => fp_env
685 : END IF
686 212650 : IF (PRESENT(force_env_section)) THEN
687 0 : IF (ASSOCIATED(force_env_section)) THEN
688 0 : CALL section_vals_retain(force_env_section)
689 0 : CALL section_vals_release(force_env%force_env_section)
690 0 : force_env%force_env_section => force_env_section
691 : END IF
692 : END IF
693 212650 : IF (PRESENT(additional_potential)) THEN
694 195640 : force_env%additional_potential = additional_potential
695 : END IF
696 212650 : IF (PRESENT(method_name_id)) THEN
697 0 : force_env%method_name_id = method_name_id
698 : END IF
699 :
700 212650 : END SUBROUTINE force_env_set
701 :
702 : ! **************************************************************************************************
703 : !> \brief returns the order of the multiple force_env
704 : !> \param force_env_sections ...
705 : !> \param root_section ...
706 : !> \param i_force_eval ...
707 : !> \param nforce_eval ...
708 : !> \author teo
709 : ! **************************************************************************************************
710 27505 : SUBROUTINE multiple_fe_list(force_env_sections, root_section, i_force_eval, nforce_eval)
711 :
712 : TYPE(section_vals_type), INTENT(IN) :: force_env_sections, root_section
713 : INTEGER, DIMENSION(:), POINTER :: i_force_eval
714 : INTEGER :: nforce_eval
715 :
716 : INTEGER :: iforce_eval, main_force_eval
717 27505 : INTEGER, DIMENSION(:), POINTER :: my_i_force_eval
718 :
719 : ! Let's treat the case of Multiple force_eval
720 :
721 27505 : CALL section_vals_get(force_env_sections, n_repetition=nforce_eval)
722 : CALL section_vals_val_get(root_section, "MULTIPLE_FORCE_EVALS%FORCE_EVAL_ORDER", &
723 27505 : i_vals=my_i_force_eval)
724 82258 : ALLOCATE (i_force_eval(nforce_eval))
725 27505 : IF (nforce_eval > 0) THEN
726 27248 : IF (nforce_eval == SIZE(my_i_force_eval)) THEN
727 108214 : i_force_eval = my_i_force_eval
728 : ELSE
729 : ! The difference in the amount of defined force_env MUST be one..
730 261 : CPASSERT(nforce_eval - SIZE(my_i_force_eval) == 1)
731 271 : DO iforce_eval = 1, nforce_eval
732 928 : IF (ANY(my_i_force_eval == iforce_eval)) CYCLE
733 : main_force_eval = iforce_eval
734 10 : EXIT
735 : END DO
736 261 : i_force_eval(1) = main_force_eval
737 1826 : i_force_eval(2:nforce_eval) = my_i_force_eval
738 : END IF
739 : END IF
740 :
741 27505 : END SUBROUTINE multiple_fe_list
742 :
743 0 : END MODULE force_env_types
|