(git:21ef868)
Loading...
Searching...
No Matches
semi_empirical_store_int_types.F
Go to the documentation of this file.
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 Type to store integrals for semi-empirical calculations
10!> \author Teodoro Laino [tlaino] - University of Zurich
11!> \date 05.2008
12! **************************************************************************************************
14
18 USE hfx_types, ONLY: hfx_cache_type,&
26 USE kinds, ONLY: dp
28#include "./base/base_uses.f90"
29
30 IMPLICIT NONE
31
32 PRIVATE
33
34! *** Global parameters ***
35
36 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'semi_empirical_store_int_types'
37
38! **************************************************************************************************
39!> \brief Semi-empirical store integrals type
40!> \author Teodoro Laino [tlaino] - University of Zurich
41!> \date 05.2008
42! **************************************************************************************************
44 LOGICAL :: filling_containers = .false., compress = .false.
45 INTEGER :: nbuffer = -1
46 REAL(kind=dp), POINTER, DIMENSION(:) :: max_val_buffer => null(), uncompressed_container => null()
47 TYPE(hfx_memory_type) :: memory_parameter = hfx_memory_type()
48 TYPE(hfx_cache_type), DIMENSION(:), &
49 POINTER :: integral_caches => null()
50 TYPE(hfx_container_type), DIMENSION(:), &
51 POINTER :: integral_containers => null()
53
54 PUBLIC :: semi_empirical_si_type, &
59
60CONTAINS
61
62! **************************************************************************************************
63!> \brief Allocate semi-empirical store integrals type
64!> \param store_int_env ...
65!> \param se_section ...
66!> \param compression ...
67!> \date 05.2008
68!> \author Teodoro Laino [tlaino] - University of Zurich
69! **************************************************************************************************
70 SUBROUTINE semi_empirical_si_create(store_int_env, se_section, compression)
71 TYPE(semi_empirical_si_type), POINTER :: store_int_env
72 TYPE(section_vals_type), POINTER :: se_section
73 LOGICAL, INTENT(in), OPTIONAL :: compression
74
75 INTEGER :: i
76 TYPE(section_vals_type), POINTER :: se_mem_section
77
78 cpassert(.NOT. ASSOCIATED(store_int_env))
79 ALLOCATE (store_int_env)
80 store_int_env%filling_containers = .true.
81 store_int_env%nbuffer = 0
82 NULLIFY (store_int_env%max_val_buffer, store_int_env%uncompressed_container)
83
84 ! Memory section
85 se_mem_section => section_vals_get_subs_vals(se_section, "MEMORY")
86 IF (PRESENT(compression)) THEN
87 store_int_env%compress = compression
88 ELSE
89 CALL section_vals_val_get(se_mem_section, "COMPRESS", l_val=store_int_env%compress)
90 END IF
91 CALL parse_memory_section(store_int_env%memory_parameter, se_mem_section, skip_disk=.true., &
92 skip_in_core_forces=.true.)
93 store_int_env%memory_parameter%ram_counter = 0
94 ! If we don't compress there's no cache
95 IF (.NOT. store_int_env%compress) THEN
96 store_int_env%memory_parameter%cache_size = 1
97 END IF
98
99 ! Disk Storage disabled for semi-empirical methods
100 IF (store_int_env%memory_parameter%do_disk_storage) THEN
101 cpabort("Disk storage for SEMIEMPIRICAL methods disabled! ")
102 END IF
103
104 ! Allocate containers/caches for integral storage if requested
105 IF (.NOT. store_int_env%memory_parameter%do_all_on_the_fly .AND. store_int_env%compress) THEN
106 ALLOCATE (store_int_env%integral_containers(64))
107 ALLOCATE (store_int_env%integral_caches(64))
108 DO i = 1, 64
109 store_int_env%integral_caches(i)%element_counter = 1
110 store_int_env%integral_caches(i)%data = 0
111 ALLOCATE (store_int_env%integral_containers(i)%first)
112 store_int_env%integral_containers(i)%first%prev => null()
113 store_int_env%integral_containers(i)%first%next => null()
114 store_int_env%integral_containers(i)%current => store_int_env%integral_containers(i)%first
115 store_int_env%integral_containers(i)%current%data = 0
116 store_int_env%integral_containers(i)%element_counter = 1
117 END DO
118 END IF
119 END SUBROUTINE semi_empirical_si_create
120
121! **************************************************************************************************
122!> \brief Deallocate the semi-empirical store integrals type
123!> \param store_int_env ...
124!> \date 05.2008
125!> \author Teodoro Laino [tlaino] - University of Zurich
126! **************************************************************************************************
127 SUBROUTINE semi_empirical_si_release(store_int_env)
128 TYPE(semi_empirical_si_type), POINTER :: store_int_env
129
130 INTEGER :: i
131
132 IF (ASSOCIATED(store_int_env)) THEN
133 ! Deallocate containers/caches
134 IF (.NOT. store_int_env%memory_parameter%do_all_on_the_fly) THEN
135 IF (store_int_env%compress) THEN
136 ! Deallocate containers/caches
137 DO i = 1, 64
138 CALL hfx_init_container(store_int_env%integral_containers(i), &
139 store_int_env%memory_parameter%actual_memory_usage, &
140 .false.)
141 DEALLOCATE (store_int_env%integral_containers(i)%first)
142 END DO
143 IF (ASSOCIATED(store_int_env%max_val_buffer)) THEN
144 DEALLOCATE (store_int_env%max_val_buffer)
145 END IF
146 DEALLOCATE (store_int_env%integral_containers)
147 DEALLOCATE (store_int_env%integral_caches)
148 ELSE
149 IF (ASSOCIATED(store_int_env%uncompressed_container)) THEN
150 DEALLOCATE (store_int_env%uncompressed_container)
151 END IF
152 END IF
153 END IF
154 ! Deallocate the full store_int_env
155 DEALLOCATE (store_int_env)
156 END IF
157
158 END SUBROUTINE semi_empirical_si_release
159
160! **************************************************************************************************
161!> \brief Deallocate the semi-empirical store integrals type
162!> \param store_int_env ...
163!> \param geometry_did_change ...
164!> \date 05.2008
165!> \author Teodoro Laino [tlaino] - University of Zurich
166! **************************************************************************************************
167 SUBROUTINE semi_empirical_si_initialize(store_int_env, geometry_did_change)
168 TYPE(semi_empirical_si_type), POINTER :: store_int_env
169 LOGICAL, INTENT(IN) :: geometry_did_change
170
171 INTEGER :: i
172
173 IF (ASSOCIATED(store_int_env)) THEN
174 IF (.NOT. store_int_env%memory_parameter%do_all_on_the_fly) THEN
175 IF (geometry_did_change) THEN
176 store_int_env%filling_containers = .true.
177 store_int_env%nbuffer = 0
178 store_int_env%memory_parameter%ram_counter = huge(store_int_env%memory_parameter%ram_counter)
179 IF (store_int_env%compress) THEN
180 ! Compress integrals
181 CALL reallocate(store_int_env%max_val_buffer, 1, store_int_env%nbuffer)
182 ! Clean containers
183 DO i = 1, 64
184 CALL hfx_init_container(store_int_env%integral_containers(i), &
185 store_int_env%memory_parameter%actual_memory_usage, &
186 .false.)
187 END DO
188 ELSE
189 ! Skip compression
190 CALL reallocate(store_int_env%uncompressed_container, 1, 0)
191 store_int_env%memory_parameter%actual_memory_usage = 1
192 END IF
193 ELSE
194 store_int_env%filling_containers = .false.
195 store_int_env%nbuffer = 0
196 IF (store_int_env%compress) THEN
197 ! Retrieve data into the cache
198 DO i = 1, 64
199 CALL hfx_decompress_first_cache(i, store_int_env%integral_caches(i), &
200 store_int_env%integral_containers(i), &
201 store_int_env%memory_parameter%actual_memory_usage, .false.)
202 END DO
203 ELSE
204 store_int_env%memory_parameter%actual_memory_usage = 1
205 END IF
206 END IF
207 END IF
208 END IF
209
210 END SUBROUTINE semi_empirical_si_initialize
211
212! **************************************************************************************************
213!> \brief Deallocate the semi-empirical store integrals type
214!> \param store_int_env ...
215!> \param geometry_did_change ...
216!> \date 05.2008
217!> \author Teodoro Laino [tlaino] - University of Zurich
218! **************************************************************************************************
219 SUBROUTINE semi_empirical_si_finalize(store_int_env, geometry_did_change)
220 TYPE(semi_empirical_si_type), POINTER :: store_int_env
221 LOGICAL, INTENT(IN) :: geometry_did_change
222
223 INTEGER :: i
224
225 IF (ASSOCIATED(store_int_env)) THEN
226 IF (.NOT. store_int_env%memory_parameter%do_all_on_the_fly) THEN
227 IF (geometry_did_change) THEN
228 IF (store_int_env%compress) THEN
229 ! Flush last cache
230 DO i = 1, 64
231 CALL hfx_flush_last_cache(i, store_int_env%integral_caches(i), &
232 store_int_env%integral_containers(i), &
233 store_int_env%memory_parameter%actual_memory_usage, .false.)
234 END DO
235 ! Reallocate this array with the proper size
236 CALL reallocate(store_int_env%max_val_buffer, 1, store_int_env%nbuffer)
237 ELSE
238 ! Skip compression
239 CALL reallocate(store_int_env%uncompressed_container, 1, &
240 store_int_env%memory_parameter%actual_memory_usage - 1)
241 END IF
242 END IF
243 IF (store_int_env%compress) THEN
244 ! Reset caches and containers
245 DO i = 1, 64
247 store_int_env%integral_caches(i), &
248 store_int_env%integral_containers(i), store_int_env%memory_parameter%actual_memory_usage, &
249 .false.)
250 END DO
251 END IF
252 END IF
253 END IF
254
255 END SUBROUTINE semi_empirical_si_finalize
256
routines and types for Hartree-Fock-Exchange
subroutine, public hfx_flush_last_cache(nbits, cache, container, memory_usage, use_disk_storage)
This routine compresses the last probably not yet compressed cache into a container
subroutine, public hfx_decompress_first_cache(nbits, cache, container, memory_usage, use_disk_storage)
This routine decompresses the first bunch of data in a container and copies them into a cache
subroutine, public hfx_reset_cache_and_container(cache, container, memory_usage, do_disk_storage)
This routine resets the containers list pointer to the first element and moves the element counters o...
Types and set/get functions for HFX.
Definition hfx_types.F:16
subroutine, public hfx_init_container(container, memory_usage, do_disk_storage)
This routine deletes all list entries in a container in order to deallocate the memory.
Definition hfx_types.F:2598
subroutine, public parse_memory_section(memory_parameter, hf_sub_section, storage_id, i_thread, n_threads, para_env, irep, skip_disk, skip_in_core_forces)
Parses the memory section
Definition hfx_types.F:1879
objects that represent the structure of input sections and the data contained in an input section
recursive type(section_vals_type) function, pointer, public section_vals_get_subs_vals(section_vals, subsection_name, i_rep_section, can_return_null)
returns the values of the requested subsection
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
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public dp
Definition kinds.F:34
Utility routines for the memory handling.
Type to store integrals for semi-empirical calculations.
subroutine, public semi_empirical_si_finalize(store_int_env, geometry_did_change)
Deallocate the semi-empirical store integrals type.
subroutine, public semi_empirical_si_initialize(store_int_env, geometry_did_change)
Deallocate the semi-empirical store integrals type.
subroutine, public semi_empirical_si_release(store_int_env)
Deallocate the semi-empirical store integrals type.
subroutine, public semi_empirical_si_create(store_int_env, se_section, compression)
Allocate semi-empirical store integrals type.