Line data Source code
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 Basic container type for QM/MM.
10 : !> \author Ole Schuett
11 : ! **************************************************************************************************
12 : MODULE qmmm_types
13 : USE cp_subsys_types, ONLY: cp_subsys_type
14 : USE fist_energy_types, ONLY: fist_energy_type
15 : USE fist_environment_types, ONLY: fist_env_get,&
16 : fist_env_release,&
17 : fist_environment_type
18 : USE kinds, ONLY: dp
19 : USE qmmm_types_low, ONLY: qmmm_env_qm_release,&
20 : qmmm_env_qm_type
21 : USE qs_energy_types, ONLY: qs_energy_type
22 : USE qs_environment_types, ONLY: get_qs_env,&
23 : qs_env_release,&
24 : qs_environment_type
25 : #include "./base/base_uses.f90"
26 :
27 : IMPLICIT NONE
28 : PRIVATE
29 :
30 : CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qmmm_types'
31 :
32 : PUBLIC :: qmmm_env_type, qmmm_env_release, qmmm_env_get
33 :
34 : TYPE qmmm_env_type
35 : TYPE(qs_environment_type), POINTER :: qs_env => Null()
36 : TYPE(fist_environment_type), POINTER :: fist_env => Null()
37 : TYPE(qmmm_env_qm_type), POINTER :: qm => Null()
38 : END TYPE qmmm_env_type
39 :
40 : CONTAINS
41 :
42 : ! **************************************************************************************************
43 : !> \brief ...
44 : !> \param qmmm_env ...
45 : !> \param subsys ...
46 : !> \param potential_energy ...
47 : !> \param kinetic_energy ...
48 : ! **************************************************************************************************
49 63288 : SUBROUTINE qmmm_env_get(qmmm_env, subsys, potential_energy, kinetic_energy)
50 : TYPE(qmmm_env_type), INTENT(IN) :: qmmm_env
51 : TYPE(cp_subsys_type), OPTIONAL, POINTER :: subsys
52 : REAL(KIND=dp), INTENT(OUT), OPTIONAL :: potential_energy, kinetic_energy
53 :
54 : TYPE(fist_energy_type), POINTER :: thermo
55 : TYPE(qs_energy_type), POINTER :: qs_energy
56 :
57 63288 : NULLIFY (qs_energy, thermo)
58 :
59 63288 : IF (PRESENT(kinetic_energy)) THEN
60 0 : CALL fist_env_get(qmmm_env%fist_env, thermo=thermo)
61 0 : kinetic_energy = thermo%kin
62 : END IF
63 63288 : IF (PRESENT(subsys)) THEN
64 52208 : CALL fist_env_get(qmmm_env%fist_env, subsys=subsys)
65 : END IF
66 63288 : IF (PRESENT(potential_energy)) THEN
67 : ! get the underlying energies from primary subsys. This is the only subsys
68 : ! for conventional QM/MM, and force-mixing knows to put relevant energy there.
69 7306 : CALL fist_env_get(qmmm_env%fist_env, thermo=thermo)
70 7306 : CALL get_qs_env(qmmm_env%qs_env, energy=qs_energy)
71 7306 : potential_energy = thermo%pot + qs_energy%total
72 : END IF
73 63288 : END SUBROUTINE qmmm_env_get
74 :
75 : ! **************************************************************************************************
76 : !> \brief releases the given qmmm_env (see doc/ReferenceCounting.html)
77 : !> \param qmmm_env the object to release
78 : !> \author Ole Schuett
79 : ! **************************************************************************************************
80 394 : SUBROUTINE qmmm_env_release(qmmm_env)
81 : TYPE(qmmm_env_type), INTENT(INOUT) :: qmmm_env
82 :
83 394 : CALL qs_env_release(qmmm_env%qs_env)
84 394 : DEALLOCATE (qmmm_env%qs_env)
85 394 : CALL qmmm_env_qm_release(qmmm_env%qm)
86 394 : DEALLOCATE (qmmm_env%qm)
87 394 : CALL fist_env_release(qmmm_env%fist_env)
88 394 : DEALLOCATE (qmmm_env%fist_env)
89 :
90 394 : END SUBROUTINE qmmm_env_release
91 :
92 0 : END MODULE qmmm_types
|