(git:ed6f26b)
Loading...
Searching...
No Matches
force_env_types.F
Go to the documentation of this file.
1!--------------------------------------------------------------------------------------------------!
2! CP2K: A general program to perform molecular dynamics simulations !
3! Copyright 2000-2025 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! **************************************************************************************************
19 USE cell_types, ONLY: cell_type
36 USE fp_types, ONLY: fp_env_release,&
49 USE kinds, ONLY: dp
65 USE qmmm_types, ONLY: qmmm_env_get,&
68 USE qmmmx_types, ONLY: qmmmx_env_get,&
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, &
109
110 PUBLIC :: force_env_retain, &
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! **************************************************************************************************
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! **************************************************************************************************
175 TYPE(force_env_type), POINTER :: force_env => null()
176 END TYPE force_env_p_type
177
178CONTAINS
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 SUBROUTINE force_env_retain(force_env)
190 TYPE(force_env_type), POINTER :: force_env
191
192 cpassert(ASSOCIATED(force_env))
193 cpassert(force_env%ref_count > 0)
194 force_env%ref_count = force_env%ref_count + 1
195 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 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 IF (ASSOCIATED(force_env)) THEN
213 cpassert(force_env%ref_count > 0)
214 force_env%ref_count = force_env%ref_count - 1
215 IF (force_env%ref_count == 0) THEN
216 ! Deallocate SUB_FORCE_ENV
217 IF (ASSOCIATED(force_env%sub_force_env)) THEN
218 DO i = 1, SIZE(force_env%sub_force_env)
219 IF (.NOT. ASSOCIATED(force_env%sub_force_env(i)%force_env)) cycle
220 ! Use the proper logger to deallocate..
221 IF (force_env%in_use == use_mixed_force) THEN
222 my_group = force_env%mixed_env%group_distribution(force_env%para_env%mepos)
223 my_logger => force_env%mixed_env%sub_logger(my_group + 1)%p
224 CALL cp_add_default_logger(my_logger)
225 END IF
226 ! The same for embedding
227 IF (force_env%in_use == use_embed) THEN
228 my_group = force_env%embed_env%group_distribution(force_env%para_env%mepos)
229 my_logger => force_env%embed_env%sub_logger(my_group + 1)%p
230 CALL cp_add_default_logger(my_logger)
231 END IF
232 CALL force_env_release(force_env%sub_force_env(i)%force_env)
233 IF (force_env%in_use == use_mixed_force) &
235 IF (force_env%in_use == use_embed) &
237 END DO
238 DEALLOCATE (force_env%sub_force_env)
239 END IF
240
241 SELECT CASE (force_env%in_use)
242 CASE (use_fist_force)
243 CALL fist_env_release(force_env%fist_env)
244 DEALLOCATE (force_env%fist_env)
245 CASE (use_qs_force)
246 CALL qs_env_release(force_env%qs_env)
247 DEALLOCATE (force_env%qs_env)
248 CASE (use_eip_force)
249 CALL eip_env_release(force_env%eip_env)
250 DEALLOCATE (force_env%eip_env)
251 CASE (use_pwdft_force)
252 CALL pwdft_env_release(force_env%pwdft_env)
253 DEALLOCATE (force_env%pwdft_env)
254 CASE (use_mixed_force)
255 CALL mixed_env_release(force_env%mixed_env)
256 DEALLOCATE (force_env%mixed_env)
257 CASE (use_nnp_force)
258 CALL nnp_env_release(force_env%nnp_env)
259 DEALLOCATE (force_env%nnp_env)
260 CASE (use_embed)
261 CALL embed_env_release(force_env%embed_env)
262 DEALLOCATE (force_env%embed_env)
263 CASE (use_ipi)
264 CALL shutdown_server(force_env%ipi_env)
265 CALL ipi_env_release(force_env%ipi_env)
266 DEALLOCATE (force_env%ipi_env)
267 END SELECT
268 CALL globenv_release(force_env%globenv)
269 CALL mp_para_env_release(force_env%para_env)
270 ! Not deallocated
271 cpassert(.NOT. ASSOCIATED(force_env%fist_env))
272 cpassert(.NOT. ASSOCIATED(force_env%qs_env))
273 cpassert(.NOT. ASSOCIATED(force_env%eip_env))
274 cpassert(.NOT. ASSOCIATED(force_env%pwdft_env))
275 cpassert(.NOT. ASSOCIATED(force_env%mixed_env))
276 cpassert(.NOT. ASSOCIATED(force_env%nnp_env))
277 cpassert(.NOT. ASSOCIATED(force_env%embed_env))
278 cpassert(.NOT. ASSOCIATED(force_env%ipi_env))
279 IF (ASSOCIATED(force_env%meta_env)) THEN
280 CALL meta_env_release(force_env%meta_env)
281 DEALLOCATE (force_env%meta_env)
282 END IF
283 IF (ASSOCIATED(force_env%fp_env)) THEN
284 CALL fp_env_release(force_env%fp_env)
285 DEALLOCATE (force_env%fp_env)
286 END IF
287 IF (ASSOCIATED(force_env%qmmm_env)) THEN
288 CALL qmmm_env_release(force_env%qmmm_env)
289 DEALLOCATE (force_env%qmmm_env)
290 END IF
291 IF (ASSOCIATED(force_env%qmmmx_env)) THEN
292 CALL qmmmx_env_release(force_env%qmmmx_env)
293 DEALLOCATE (force_env%qmmmx_env)
294 END IF
295 CALL section_vals_release(force_env%force_env_section)
296 CALL section_vals_release(force_env%root_section)
297 DEALLOCATE (force_env)
298 END IF
299 END IF
300 NULLIFY (force_env)
301 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 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 NULLIFY (subsys_tmp)
377
378 cpassert(force_env%ref_count > 0)
379
380 SELECT CASE (force_env%in_use)
381 CASE (use_qs_force)
382 cpassert(ASSOCIATED(force_env%qs_env))
383 cpassert(.NOT. PRESENT(fist_env))
384 cpassert(.NOT. PRESENT(eip_env))
385 cpassert(.NOT. PRESENT(pwdft_env))
386 cpassert(.NOT. PRESENT(ipi_env))
387 CALL get_qs_env(force_env%qs_env, &
388 energy=qs_energy, &
389 input=input, &
390 cp_subsys=subsys)
391 IF (PRESENT(potential_energy)) potential_energy = qs_energy%total
392 cpassert(.NOT. PRESENT(kinetic_energy))
393 CASE (use_fist_force)
394 cpassert(ASSOCIATED(force_env%fist_env))
395 cpassert(.NOT. PRESENT(input))
396 CALL fist_env_get(force_env%fist_env, &
397 thermo=thermo, &
398 subsys=subsys)
399 IF (PRESENT(potential_energy)) potential_energy = thermo%pot
400 IF (PRESENT(kinetic_energy)) kinetic_energy = thermo%kin
401 IF (PRESENT(kinetic_shell)) kinetic_shell = thermo%kin_shell
402 IF (PRESENT(harmonic_shell)) harmonic_shell = thermo%harm_shell
403 CASE (use_eip_force)
404 cpassert(ASSOCIATED(force_env%eip_env))
405 cpassert(.NOT. PRESENT(qs_env))
406 cpassert(.NOT. PRESENT(fist_env))
407 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 subsys=subsys)
412 IF (PRESENT(potential_energy)) THEN
413 potential_energy = eip_potential_energy
414 END IF
415 IF (PRESENT(kinetic_energy)) kinetic_energy = eip_kinetic_energy
416 cpassert(.NOT. PRESENT(kinetic_energy))
417 CASE (use_pwdft_force)
418 cpassert(ASSOCIATED(force_env%pwdft_env))
419 cpassert(.NOT. PRESENT(qs_env))
420 cpassert(.NOT. PRESENT(fist_env))
421 cpassert(.NOT. PRESENT(ipi_env))
422 CALL pwdft_env_get(force_env%pwdft_env, energy=pwdft_energy)
423 CALL pwdft_env_get(force_env%pwdft_env, cp_subsys=subsys)
424 IF (PRESENT(potential_energy)) potential_energy = pwdft_energy%etotal
425 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 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 kinetic_energy=kinetic_energy)
436 CASE (use_mixed_force)
437 cpassert(ASSOCIATED(force_env%mixed_env))
438 cpassert(.NOT. PRESENT(input))
439 CALL get_mixed_env(force_env%mixed_env, &
440 mixed_energy=mixed_energy, &
441 subsys=subsys)
442 IF (PRESENT(potential_energy)) potential_energy = mixed_energy%pot
443 IF (PRESENT(kinetic_energy)) kinetic_energy = mixed_energy%kin
444 ! In embedding we only have potential energies (electronic energies)
445 CASE (use_embed)
446 cpassert(ASSOCIATED(force_env%embed_env))
447 cpassert(.NOT. PRESENT(input))
448 CALL get_embed_env(force_env%embed_env, &
449 pot_energy=potential_energy, &
450 subsys=subsys)
451 CASE (use_nnp_force)
452 cpassert(ASSOCIATED(force_env%nnp_env))
453 cpassert(.NOT. PRESENT(ipi_env))
454 CALL nnp_env_get(force_env%nnp_env, &
455 nnp_potential_energy=potential_energy, &
456 subsys=subsys)
457 cpassert(.NOT. PRESENT(kinetic_energy))
458 CASE (use_ipi)
459 CALL ipi_env_get(force_env%ipi_env, &
460 ipi_energy=potential_energy, &
461 subsys=subsys)
462 CASE DEFAULT
463 cpabort("unknown in_use flag value ")
464 END SELECT
465
466 IF (PRESENT(force_env_section)) force_env_section => force_env%force_env_section
467 IF (PRESENT(in_use)) in_use = force_env%in_use
468 IF (PRESENT(method_name_id)) method_name_id = force_env%method_name_id
469 IF (PRESENT(fist_env)) THEN
470 fist_env => force_env%fist_env
471 END IF
472 IF (PRESENT(qs_env)) THEN
473 qs_env => force_env%qs_env
474 END IF
475 IF (PRESENT(eip_env)) THEN
476 eip_env => force_env%eip_env
477 END IF
478 IF (PRESENT(pwdft_env)) THEN
479 pwdft_env => force_env%pwdft_env
480 END IF
481 IF (PRESENT(nnp_env)) THEN
482 nnp_env => force_env%nnp_env
483 END IF
484 IF (PRESENT(ipi_env)) THEN
485 ipi_env => force_env%ipi_env
486 END IF
487 IF (PRESENT(para_env)) para_env => force_env%para_env
488 ! adjust the total energy for the metadynamics
489 IF (ASSOCIATED(force_env%meta_env)) THEN
490 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 force_env%meta_env%hills_env%energy
495 END IF
496 IF (PRESENT(kinetic_energy)) THEN
497 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 IF (ASSOCIATED(force_env%fp_env) .AND. PRESENT(potential_energy)) THEN
502 IF (force_env%fp_env%use_fp) THEN
503 potential_energy = potential_energy + force_env%fp_env%energy
504 END IF
505 END IF
506 IF (PRESENT(potential_energy)) THEN
507 potential_energy = potential_energy + force_env%additional_potential
508 END IF
509 IF (PRESENT(additional_potential)) THEN
510 additional_potential = force_env%additional_potential
511 END IF
512 IF (PRESENT(cell)) THEN
513 CALL force_env_get(force_env, subsys=subsys_tmp)
514 CALL cp_subsys_get(subsys_tmp, cell=cell)
515 END IF
516 IF (PRESENT(fp_env)) fp_env => force_env%fp_env
517 IF (PRESENT(meta_env)) meta_env => force_env%meta_env
518 IF (PRESENT(sub_force_env)) sub_force_env => force_env%sub_force_env
519 IF (PRESENT(qmmm_env)) qmmm_env => force_env%qmmm_env
520 IF (PRESENT(qmmmx_env)) qmmmx_env => force_env%qmmmx_env
521 IF (PRESENT(mixed_env)) mixed_env => force_env%mixed_env
522 IF (PRESENT(embed_env)) embed_env => force_env%embed_env
523 IF (PRESENT(ipi_env)) ipi_env => force_env%ipi_env
524 IF (PRESENT(globenv)) globenv => force_env%globenv
525 IF (PRESENT(root_section)) root_section => force_env%root_section
526
527 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 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 NULLIFY (subsys)
545 CALL force_env_get(force_env, subsys=subsys)
546 CALL cp_subsys_get(subsys, natom=n_atom)
547
548 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 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 NULLIFY (subsys)
566 CALL force_env_get(force_env, subsys=subsys)
567 CALL cp_subsys_get(subsys, nparticle=n_particle)
568
569 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 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 CALL timeset(routinen, handle)
591 cpassert(force_env%ref_count > 0)
592 CALL force_env_get(force_env, subsys=subsys)
593 CALL pack_subsys_particles(subsys=subsys, f=frc(1:n))
594 CALL timestop(handle)
595
596 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 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 CALL timeset(routinen, handle)
618 cpassert(force_env%ref_count > 0)
619 CALL force_env_get(force_env, subsys=subsys)
620 CALL pack_subsys_particles(subsys=subsys, r=pos(1:n))
621 CALL timestop(handle)
622
623 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 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 CALL timeset(routinen, handle)
645 cpassert(force_env%ref_count > 0)
646 CALL force_env_get(force_env, subsys=subsys)
647 CALL pack_subsys_particles(subsys=subsys, v=vel(1:n))
648 CALL timestop(handle)
649
650 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 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 cpassert(force_env%ref_count > 0)
675 IF (PRESENT(meta_env)) THEN
676 IF (ASSOCIATED(force_env%meta_env)) THEN
677 CALL meta_env_release(force_env%meta_env)
678 DEALLOCATE (force_env%meta_env)
679 END IF
680 force_env%meta_env => meta_env
681 END IF
682 IF (PRESENT(fp_env)) THEN
683 IF (ASSOCIATED(force_env%fp_env)) CALL fp_env_release(force_env%fp_env)
684 force_env%fp_env => fp_env
685 END IF
686 IF (PRESENT(force_env_section)) THEN
687 IF (ASSOCIATED(force_env_section)) THEN
688 CALL section_vals_retain(force_env_section)
689 CALL section_vals_release(force_env%force_env_section)
690 force_env%force_env_section => force_env_section
691 END IF
692 END IF
693 IF (PRESENT(additional_potential)) THEN
694 force_env%additional_potential = additional_potential
695 END IF
696 IF (PRESENT(method_name_id)) THEN
697 force_env%method_name_id = method_name_id
698 END IF
699
700 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 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 INTEGER, DIMENSION(:), POINTER :: my_i_force_eval
718
719! Let's treat the case of Multiple force_eval
720
721 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 i_vals=my_i_force_eval)
724 ALLOCATE (i_force_eval(nforce_eval))
725 IF (nforce_eval > 0) THEN
726 IF (nforce_eval == SIZE(my_i_force_eval)) THEN
727 i_force_eval = my_i_force_eval
728 ELSE
729 ! The difference in the amount of defined force_env MUST be one..
730 cpassert(nforce_eval - SIZE(my_i_force_eval) == 1)
731 DO iforce_eval = 1, nforce_eval
732 IF (any(my_i_force_eval == iforce_eval)) cycle
733 main_force_eval = iforce_eval
734 EXIT
735 END DO
736 i_force_eval(1) = main_force_eval
737 i_force_eval(2:nforce_eval) = my_i_force_eval
738 END IF
739 END IF
740
741 END SUBROUTINE multiple_fe_list
742
743END MODULE force_env_types
Handles all functions related to the CELL.
Definition cell_types.F:15
various routines to log and control the output. The idea is that decisions about where to log should ...
subroutine, public cp_rm_default_logger()
the cousin of cp_add_default_logger, decrements the stack, so that the default logger is what it has ...
subroutine, public cp_add_default_logger(logger)
adds a default logger. MUST be called before logging occours
types that represent a subsys, i.e. a part of the system
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
subroutine, public pack_subsys_particles(subsys, f, r, s, v, fscale, cell)
Pack components of a subsystem particle sets into a single vector.
The environment for the empirical interatomic potential methods.
subroutine, public eip_env_release(eip_env)
Releases the given eip environment (see doc/ReferenceCounting.html)
subroutine, public eip_env_get(eip_env, eip_model, eip_energy, eip_energy_var, eip_forces, coord_avg, coord_var, count, subsys, atomic_kind_set, particle_set, local_particles, molecule_kind_set, molecule_set, local_molecules, eip_input, force_env_input, cell, cell_ref, use_ref_cell, eip_kinetic_energy, eip_potential_energy, virial)
Returns various attributes of the eip environment.
subroutine, public get_embed_env(embed_env, atomic_kind_set, particle_set, local_particles, local_molecules, molecule_kind_set, molecule_set, cell, cell_ref, para_env, sub_para_env, subsys, input, results, pot_energy)
Get the embed environment.
subroutine, public embed_env_release(embed_env)
...
subroutine, public fist_env_release(fist_env)
releases the given fist_env (see doc/ReferenceCounting.html)
subroutine, public fist_env_get(fist_env, atomic_kind_set, particle_set, ewald_pw, local_particles, local_molecules, molecule_kind_set, molecule_set, cell, cell_ref, ewald_env, fist_nonbond_env, thermo, para_env, subsys, qmmm, qmmm_env, input, shell_model, shell_model_ad, shell_particle_set, core_particle_set, multipoles, results, exclusions, efield)
Purpose: Get the FIST environment.
Interface for the force calculations.
integer function, public force_env_get_natom(force_env)
returns the number of atoms
subroutine, public force_env_get_vel(force_env, vel, n)
returns the particle velocities in a dimension(*) array
integer, parameter, public use_qmmm
subroutine, public multiple_fe_list(force_env_sections, root_section, i_force_eval, nforce_eval)
returns the order of the multiple force_env
integer, parameter, public use_mixed_force
character(len=10), dimension(501:510), parameter, public use_prog_name
integer, parameter, public use_eip_force
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
integer, parameter, public use_embed
integer, parameter, public use_qmmmx
subroutine, public force_env_retain(force_env)
retains the given force env
subroutine, public force_env_get_pos(force_env, pos, n)
returns the particle positions in a dimension(*) array
subroutine, public force_env_set(force_env, meta_env, fp_env, force_env_section, method_name_id, additional_potential)
changes some attributes of the force_env
integer, parameter, public use_qs_force
subroutine, public force_env_get_frc(force_env, frc, n)
returns the particle forces in a dimension(*) array
integer, parameter, public use_pwdft_force
integer, parameter, public use_nnp_force
recursive subroutine, public force_env_release(force_env)
releases the given force env
integer, parameter, public use_ipi
integer, parameter, public use_fist_force
integer function, public force_env_get_nparticle(force_env)
returns the number of particles in a force environment
types used in the flexible partitioning scheme
Definition fp_types.F:14
subroutine, public fp_env_release(fp_env)
...
Definition fp_types.F:80
Define type storing the global information of a run. Keep the amount of stored data small....
subroutine, public globenv_release(globenv)
Releases the global environment globenv.
objects that represent the structure of input sections and the data contained in an input section
subroutine, public section_vals_retain(section_vals)
retains the given section values (see doc/ReferenceCounting.html)
subroutine, public section_vals_get(section_vals, ref_count, n_repetition, n_subs_vals_rep, section, explicit)
returns various attributes about the section_vals
subroutine, public section_vals_val_get(section_vals, keyword_name, i_rep_section, i_rep_val, n_rep_val, val, l_val, i_val, r_val, c_val, l_vals, i_vals, r_vals, c_vals, explicit)
returns the requested value
recursive subroutine, public section_vals_release(section_vals)
releases the given object
The environment for the empirical interatomic potential methods.
subroutine, public ipi_env_get(ipi_env, ipi_energy, ipi_forces, subsys, atomic_kind_set, particle_set, local_particles, molecule_kind_set, molecule_set, local_molecules, force_env_input, cell, cell_ref, virial, sockfd)
Returns various attributes of the ipi environment.
subroutine, public ipi_env_release(ipi_env)
Releases the given ipi environment (see doc/ReferenceCounting.html)
i–PI server mode: Communication with i–PI clients
Definition ipi_server.F:14
subroutine, public shutdown_server(ipi_env)
Shut down the i–PI server.
Definition ipi_server.F:151
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public dp
Definition kinds.F:34
Interface to the message passing library MPI.
subroutine, public mp_para_env_release(para_env)
releases the para object (to be called when you don't want anymore the shared copy of this object)
defines types for metadynamics calculation
subroutine, public meta_env_release(meta_env)
releases the meta_env
subroutine, public mixed_env_release(mixed_env)
releases the given mixed_env (see doc/ReferenceCounting.html)
subroutine, public get_mixed_env(mixed_env, atomic_kind_set, particle_set, local_particles, local_molecules, molecule_kind_set, molecule_set, cell, cell_ref, mixed_energy, para_env, sub_para_env, subsys, input, results, cdft_control)
Get the MIXED environment.
Data types for neural network potentials.
subroutine, public nnp_env_get(nnp_env, nnp_forces, subsys, atomic_kind_set, particle_set, local_particles, molecule_kind_set, molecule_set, local_molecules, nnp_input, force_env_input, cell, cell_ref, use_ref_cell, nnp_potential_energy, virial)
Returns various attributes of the nnp environment.
subroutine, public nnp_env_release(nnp_env)
Release data structure that holds all the information for neural network potentials.
The type definitions for the PWDFT environment.
subroutine, public pwdft_env_get(pwdft_env, pwdft_input, force_env_input, xc_input, cp_subsys, qs_subsys, para_env, energy, forces, stress, sctx, gs_handler, ks_handler)
Returns various attributes of the pwdft environment.
subroutine, public pwdft_env_release(pwdft_env)
Releases the given pwdft environment.
Basic container type for QM/MM.
Definition qmmm_types.F:12
subroutine, public qmmm_env_release(qmmm_env)
releases the given qmmm_env (see doc/ReferenceCounting.html)
Definition qmmm_types.F:81
subroutine, public qmmm_env_get(qmmm_env, subsys, potential_energy, kinetic_energy)
...
Definition qmmm_types.F:50
Basic container type for QM/MM with force mixing.
Definition qmmmx_types.F:12
subroutine, public qmmmx_env_release(qmmmx_env)
releases the given qmmmx_env (see doc/ReferenceCounting.html)
Definition qmmmx_types.F:61
subroutine, public qmmmx_env_get(qmmmx_env, subsys, potential_energy, kinetic_energy)
...
Definition qmmmx_types.F:42
Perform a QUICKSTEP wavefunction optimization (single point)
Definition qs_energy.F:14
subroutine, public qs_env_release(qs_env)
releases the given qs_env (see doc/ReferenceCounting.html)
subroutine, public get_qs_env(qs_env, atomic_kind_set, qs_kind_set, cell, super_cell, cell_ref, use_ref_cell, kpoints, dft_control, mos, sab_orb, sab_all, qmmm, qmmm_periodic, sac_ae, sac_ppl, sac_lri, sap_ppnl, sab_vdw, sab_scp, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_pp, sab_xtb_nonbond, sab_almo, sab_kp, sab_kp_nosym, particle_set, energy, force, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, run_rtp, rtp, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_ks_im_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_ri_aux_kp, matrix_s, matrix_s_ri_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, rho, rho_xc, pw_env, ewald_env, ewald_pw, active_space, mpools, input, para_env, blacs_env, scf_control, rel_control, kinetic, qs_charges, vppl, rho_core, rho_nlcc, rho_nlcc_g, ks_env, ks_qmmm_env, wf_history, scf_env, local_particles, local_molecules, distribution_2d, dbcsr_dist, molecule_kind_set, molecule_set, subsys, cp_subsys, oce, local_rho_set, rho_atom_set, task_list, task_list_soft, rho0_atom_set, rho0_mpole, rhoz_set, ecoul_1c, rho0_s_rs, rho0_s_gs, do_kpoints, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, nkind, natom, nelectron_total, nelectron_spin, efield, neighbor_list_id, linres_control, xas_env, virial, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, results, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, lri_env, lri_density, exstate_env, ec_env, harris_env, dispersion_env, gcp_env, vee, rho_external, external_vxc, mask, mp2_env, bs_env, kg_env, wanniercentres, atprop, ls_scf_env, do_transport, transport_env, v_hartree_rspace, s_mstruct_changed, rho_changed, potential_changed, forces_up_to_date, mscfg_env, almo_scf_env, gradient_history, variable_history, embed_pot, spin_embed_pot, polar_env, mos_last_converged, eeq, rhs)
Get the QUICKSTEP environment.
Type defining parameters related to the simulation cell.
Definition cell_types.F:55
type of a logger, at the moment it contains just a print level starting at which level it should be l...
represents a system: atoms, molecules, their pos,vel,...
The empirical interatomic potential environment.
Embedding environment type.
allows for the creation of an array of force_env
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
Main data type collecting all relevant data for neural network potentials.