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 Define Resonant Inelastic XRAY Scattering (RIXS) control type and associated create,
10 : !> release, etc subroutines
11 : !> \author BSG (02.2025)
12 : !> *************************************************************************************************
13 : MODULE rixs_types
14 : USE cp_fm_types, ONLY: cp_fm_release,&
15 : cp_fm_type
16 : USE kinds, ONLY: dp
17 : USE xas_tdp_types, ONLY: xas_tdp_env_create,&
18 : xas_tdp_env_release,&
19 : xas_tdp_env_type
20 : #include "./base/base_uses.f90"
21 :
22 : IMPLICIT NONE
23 :
24 : PRIVATE
25 :
26 : ! **************************************************************************************************
27 : !> \brief
28 : ! **************************************************************************************************
29 : TYPE rixs_env_type
30 :
31 : TYPE(xas_tdp_env_type), POINTER :: core_state => NULL()
32 : TYPE(tddfpt2_valence_type), &
33 : POINTER :: valence_state => NULL()
34 :
35 : END TYPE rixs_env_type
36 :
37 : ! **************************************************************************************************
38 : !> \brief Valence state coming from the qs_tddfpt2 routine
39 : ! **************************************************************************************************
40 : TYPE tddfpt2_valence_type
41 :
42 : INTEGER :: nstates = 0
43 : TYPE(cp_fm_type), DIMENSION(:, :), &
44 : POINTER :: evects => NULL() ! eigenvectors
45 : REAL(dp), DIMENSION(:), ALLOCATABLE :: evals ! energies
46 :
47 : ! entities below are coming from tddfpt_ground_state_mos type
48 : TYPE(cp_fm_type), DIMENSION(:), &
49 : POINTER :: mos_occ => NULL()
50 :
51 : END TYPE tddfpt2_valence_type
52 :
53 : CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'rixs_types'
54 :
55 : PUBLIC :: rixs_env_type, tddfpt2_valence_type, tddfpt2_valence_state_create
56 :
57 : PUBLIC :: rixs_env_create, rixs_env_release
58 :
59 : CONTAINS
60 :
61 : ! **************************************************************************************************
62 : !> \brief Creates a rixs environment type
63 : !> \param rixs_env the type to create
64 : ! **************************************************************************************************
65 14 : SUBROUTINE rixs_env_create(rixs_env)
66 : TYPE(rixs_env_type), POINTER :: rixs_env
67 :
68 14 : ALLOCATE (rixs_env)
69 : NULLIFY (rixs_env%core_state)
70 14 : CALL xas_tdp_env_create(rixs_env%core_state)
71 14 : NULLIFY (rixs_env%valence_state)
72 14 : CALL tddfpt2_valence_state_create(rixs_env%valence_state)
73 :
74 14 : END SUBROUTINE rixs_env_create
75 :
76 : ! **************************************************************************************************
77 : !> \brief Releases the rixs environment type
78 : !> \param rixs_env the type to release
79 : ! **************************************************************************************************
80 14 : SUBROUTINE rixs_env_release(rixs_env)
81 : TYPE(rixs_env_type), POINTER :: rixs_env
82 :
83 14 : IF (ASSOCIATED(rixs_env)) THEN
84 14 : IF (ASSOCIATED(rixs_env%core_state)) THEN
85 14 : CALL xas_tdp_env_release(rixs_env%core_state)
86 : END IF
87 14 : IF (ASSOCIATED(rixs_env%valence_state)) THEN
88 14 : CALL tddfpt2_valence_state_release(rixs_env%valence_state)
89 : END IF
90 : END IF
91 :
92 14 : DEALLOCATE (rixs_env)
93 :
94 14 : END SUBROUTINE rixs_env_release
95 :
96 : ! **************************************************************************************************
97 : !> \brief Creates the valence state type
98 : !> \param valence_state ...
99 : ! **************************************************************************************************
100 14 : SUBROUTINE tddfpt2_valence_state_create(valence_state)
101 : TYPE(tddfpt2_valence_type), POINTER :: valence_state
102 :
103 14 : ALLOCATE (valence_state)
104 :
105 : NULLIFY (valence_state%evects)
106 :
107 : ! entities below come from tddfpt_ground_state_mos type
108 : NULLIFY (valence_state%mos_occ)
109 :
110 14 : END SUBROUTINE tddfpt2_valence_state_create
111 :
112 : ! **************************************************************************************************
113 : !> \brief Releases the valence state type
114 : !> \param valence_state ...
115 : ! **************************************************************************************************
116 14 : SUBROUTINE tddfpt2_valence_state_release(valence_state)
117 : TYPE(tddfpt2_valence_type), POINTER :: valence_state
118 :
119 : INTEGER :: i, j
120 :
121 14 : IF (ASSOCIATED(valence_state)) THEN
122 14 : IF (ASSOCIATED(valence_state%evects)) THEN
123 32 : DO i = 1, SIZE(valence_state%evects, 1)
124 100 : DO j = 1, SIZE(valence_state%evects, 2)
125 86 : CALL cp_fm_release(valence_state%evects(i, j))
126 : END DO
127 : END DO
128 14 : DEALLOCATE (valence_state%evects)
129 : END IF
130 14 : IF (ALLOCATED(valence_state%evals)) THEN
131 14 : DEALLOCATE (valence_state%evals)
132 : END IF
133 14 : IF (ASSOCIATED(valence_state%mos_occ)) THEN
134 32 : DO i = 1, SIZE(valence_state%mos_occ)
135 32 : CALL cp_fm_release(valence_state%mos_occ(i))
136 : END DO
137 14 : DEALLOCATE (valence_state%mos_occ)
138 : END IF
139 : END IF
140 :
141 14 : DEALLOCATE (valence_state)
142 :
143 14 : END SUBROUTINE tddfpt2_valence_state_release
144 :
145 0 : END MODULE rixs_types
|