(git:374b731)
Loading...
Searching...
No Matches
cp_result_types.F
Go to the documentation of this file.
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 set of type/routines to handle the storage of results in force_envs
10!> \author fschiff (12.2007)
11!> \par History
12!> - 10.2008 Teodoro Laino [tlaino] - University of Zurich
13!> major rewriting:
14!> - information stored in a proper type (not in a character!)
15!> - module more lean
16!> - splitting types and creating methods for cp_results
17! **************************************************************************************************
19
20 USE kinds, ONLY: default_string_length,&
21 dp
22#include "../base/base_uses.f90"
23
24 IMPLICIT NONE
25
26 PRIVATE
27
28 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'cp_result_types'
29
30 INTEGER, PARAMETER, PUBLIC :: result_type_logical = 1, &
33
34! *** Public data types ***
35 PUBLIC :: cp_result_type, &
37
38! *** Public subroutines ***
39 PUBLIC :: cp_result_create, &
48
49! **************************************************************************************************
50!> \brief low level type for storing real informations
51!> \author Teodoro Laino [tlaino] - University of Zurich 10.2008
52! **************************************************************************************************
53 TYPE cp_result_value_type
54 INTEGER :: type_in_use = -1
55 LOGICAL, DIMENSION(:), POINTER :: logical_type => null()
56 INTEGER, DIMENSION(:), POINTER :: integer_type => null()
57 REAL(kind=dp), DIMENSION(:), POINTER :: real_type => null()
58 END TYPE cp_result_value_type
59
60! **************************************************************************************************
61 TYPE cp_result_value_p_type
62 TYPE(cp_result_value_type), POINTER :: value => null()
63 END TYPE cp_result_value_p_type
64
65! **************************************************************************************************
66!> \brief contains arbitrary information which need to be stored
67!> \note
68!> result_list is a character list, in which everything can be stored
69!> before passing any variable just name the variable like '[NAME]'
70!> brackets will be used to identify the start of a new set
71!> \author fschiff (12.2007)
72! **************************************************************************************************
74 INTEGER :: ref_count = -1
75 TYPE(cp_result_value_p_type), POINTER, DIMENSION(:) :: result_value => null()
76 CHARACTER(LEN=default_string_length), DIMENSION(:), &
77 POINTER :: result_label => null()
78 END TYPE cp_result_type
79
80! **************************************************************************************************
82 TYPE(cp_result_type), POINTER :: results => null()
83 END TYPE cp_result_p_type
84
85CONTAINS
86
87! **************************************************************************************************
88!> \brief Allocates and intitializes the cp_result
89!> \param results ...
90!> \par History
91!> 12.2007 created
92!> 10.2008 Teodoro Laino [tlaino] - major rewriting
93!> \author fschiff
94! **************************************************************************************************
95 SUBROUTINE cp_result_create(results)
96 TYPE(cp_result_type), POINTER :: results
97
98 CHARACTER(len=*), PARAMETER :: routinen = 'cp_result_create'
99
100 INTEGER :: handle
101
102 CALL timeset(routinen, handle)
103 ALLOCATE (results)
104 NULLIFY (results%result_value, results%result_label)
105 results%ref_count = 1
106 ALLOCATE (results%result_label(0))
107 ALLOCATE (results%result_value(0))
108 CALL timestop(handle)
109 END SUBROUTINE cp_result_create
110
111! **************************************************************************************************
112!> \brief Releases cp_result type
113!> \param results ...
114!> \par History
115!> 12.2007 created
116!> 10.2008 Teodoro Laino [tlaino] - major rewriting
117!> \author fschiff
118! **************************************************************************************************
119 SUBROUTINE cp_result_release(results)
120 TYPE(cp_result_type), POINTER :: results
121
122 CHARACTER(len=*), PARAMETER :: routinen = 'cp_result_release'
123
124 INTEGER :: handle, i
125
126 CALL timeset(routinen, handle)
127 IF (ASSOCIATED(results)) THEN
128 cpassert(results%ref_count > 0)
129 results%ref_count = results%ref_count - 1
130 IF (results%ref_count == 0) THEN
131 ! Description
132 IF (ASSOCIATED(results%result_label)) THEN
133 DEALLOCATE (results%result_label)
134 END IF
135 ! Values
136 IF (ASSOCIATED(results%result_value)) THEN
137 DO i = 1, SIZE(results%result_value)
138 CALL cp_result_value_release(results%result_value(i)%value)
139 END DO
140 DEALLOCATE (results%result_value)
141 END IF
142 DEALLOCATE (results)
143 END IF
144 END IF
145 CALL timestop(handle)
146 END SUBROUTINE cp_result_release
147
148! **************************************************************************************************
149!> \brief Releases cp_result clean
150!> \param results ...
151!> \author Teodoro Laino [tlaino] - University of Zurich - 10.2008
152! **************************************************************************************************
153 SUBROUTINE cp_result_clean(results)
154 TYPE(cp_result_type), INTENT(INOUT) :: results
155
156 CHARACTER(len=*), PARAMETER :: routinen = 'cp_result_clean'
157
158 INTEGER :: handle, i
159
160 CALL timeset(routinen, handle)
161 ! Description
162 IF (ASSOCIATED(results%result_label)) THEN
163 DEALLOCATE (results%result_label)
164 END IF
165 ! Values
166 IF (ASSOCIATED(results%result_value)) THEN
167 DO i = 1, SIZE(results%result_value)
168 CALL cp_result_value_release(results%result_value(i)%value)
169 END DO
170 DEALLOCATE (results%result_value)
171 END IF
172 CALL timestop(handle)
173 END SUBROUTINE cp_result_clean
174
175! **************************************************************************************************
176!> \brief Retains cp_result type
177!> \param results ...
178!> \par History
179!> 12.2007 created
180!> \author fschiff
181! **************************************************************************************************
182 SUBROUTINE cp_result_retain(results)
183 TYPE(cp_result_type), INTENT(INOUT) :: results
184
185 cpassert(results%ref_count > 0)
186 results%ref_count = results%ref_count + 1
187 END SUBROUTINE cp_result_retain
188
189! **************************************************************************************************
190!> \brief Allocates and intitializes the cp_result_value type
191!> \param value ...
192!> \author Teodoro Laino [tlaino] - University of Zurich 10.2008
193! **************************************************************************************************
194 SUBROUTINE cp_result_value_create(value)
195 TYPE(cp_result_value_type), POINTER :: value
196
197 CHARACTER(len=*), PARAMETER :: routinen = 'cp_result_value_create'
198
199 INTEGER :: handle
200
201 CALL timeset(routinen, handle)
202 ALLOCATE (value)
203 CALL timestop(handle)
204 END SUBROUTINE cp_result_value_create
205
206! **************************************************************************************************
207!> \brief Setup of the cp_result_value type
208!> \param value ...
209!> \param type_in_use ...
210!> \param size_value ...
211!> \author Teodoro Laino [tlaino] - University of Zurich 10.2008
212! **************************************************************************************************
213 SUBROUTINE cp_result_value_init(value, type_in_use, size_value)
214 TYPE(cp_result_value_type), INTENT(INOUT) :: value
215 INTEGER, INTENT(IN) :: type_in_use, size_value
216
217 CHARACTER(len=*), PARAMETER :: routinen = 'cp_result_value_init'
218
219 INTEGER :: handle
220
221 CALL timeset(routinen, handle)
222 value%type_in_use = type_in_use
223 SELECT CASE (value%type_in_use)
224 CASE (result_type_real)
225 ALLOCATE (value%real_type(size_value))
227 ALLOCATE (value%integer_type(size_value))
229 ALLOCATE (value%logical_type(size_value))
230 CASE DEFAULT
231 ! Type not implemented in cp_result_type
232 cpabort("")
233 END SELECT
234 CALL timestop(handle)
235 END SUBROUTINE cp_result_value_init
236
237! **************************************************************************************************
238!> \brief Releases the cp_result_value type
239!> \param value ...
240!> \author Teodoro Laino [tlaino] - University of Zurich 10.2008
241! **************************************************************************************************
242 SUBROUTINE cp_result_value_release(value)
243 TYPE(cp_result_value_type), POINTER :: value
244
245 CHARACTER(len=*), PARAMETER :: routinen = 'cp_result_value_release'
246
247 INTEGER :: handle
248
249 CALL timeset(routinen, handle)
250 IF (ASSOCIATED(value)) THEN
251 SELECT CASE (value%type_in_use)
252 CASE (result_type_real)
253 IF (ASSOCIATED(value%real_type)) THEN
254 DEALLOCATE (value%real_type)
255 END IF
256 cpassert(.NOT. ASSOCIATED(value%integer_type))
257 cpassert(.NOT. ASSOCIATED(value%logical_type))
259 IF (ASSOCIATED(value%integer_type)) THEN
260 DEALLOCATE (value%integer_type)
261 END IF
262 cpassert(.NOT. ASSOCIATED(value%real_type))
263 cpassert(.NOT. ASSOCIATED(value%logical_type))
265 IF (ASSOCIATED(value%logical_type)) THEN
266 DEALLOCATE (value%logical_type)
267 END IF
268 cpassert(.NOT. ASSOCIATED(value%integer_type))
269 cpassert(.NOT. ASSOCIATED(value%real_type))
270 CASE DEFAULT
271 ! Type not implemented in cp_result_type
272 cpabort("")
273 END SELECT
274 DEALLOCATE (value)
275 END IF
276 CALL timestop(handle)
277 END SUBROUTINE cp_result_value_release
278
279! **************************************************************************************************
280!> \brief Copies the cp_result type
281!> \param results_in ...
282!> \param results_out ...
283!> \author Teodoro Laino [tlaino] - University of Zurich 10.2008
284! **************************************************************************************************
285 SUBROUTINE cp_result_copy(results_in, results_out)
286 TYPE(cp_result_type), INTENT(INOUT) :: results_in, results_out
287
288 CHARACTER(len=*), PARAMETER :: routinen = 'cp_result_copy'
289
290 INTEGER :: handle, i, ndim
291 LOGICAL :: check
292
293 CALL timeset(routinen, handle)
294 CALL cp_result_clean(results_out)
295
296 check = SIZE(results_in%result_label) == SIZE(results_in%result_value)
297 cpassert(check)
298 ndim = SIZE(results_in%result_value)
299 ALLOCATE (results_out%result_label(ndim))
300 ALLOCATE (results_out%result_value(ndim))
301 DO i = 1, ndim
302 results_out%result_label(i) = results_in%result_label(i)
303 CALL cp_result_value_create(results_out%result_value(i)%value)
304 CALL cp_result_value_copy(results_out%result_value(i)%value, &
305 results_in%result_value(i)%value)
306 END DO
307 CALL timestop(handle)
308 END SUBROUTINE cp_result_copy
309
310! **************************************************************************************************
311!> \brief Copies the cp_result_value type
312!> \param value_out ...
313!> \param value_in ...
314!> \author Teodoro Laino [tlaino] - University of Zurich 10.2008
315! **************************************************************************************************
316 SUBROUTINE cp_result_value_copy(value_out, value_in)
317 TYPE(cp_result_value_type), INTENT(INOUT) :: value_out, value_in
318
319 CHARACTER(len=*), PARAMETER :: routinen = 'cp_result_value_copy'
320
321 INTEGER :: handle, isize
322
323 CALL timeset(routinen, handle)
324 value_out%type_in_use = value_in%type_in_use
325 SELECT CASE (value_out%type_in_use)
326 CASE (result_type_real)
327 isize = SIZE(value_in%real_type)
328 ALLOCATE (value_out%real_type(isize))
329 value_out%real_type = value_in%real_type
331 isize = SIZE(value_in%integer_type)
332 ALLOCATE (value_out%integer_type(isize))
333 value_out%integer_type = value_in%integer_type
335 isize = SIZE(value_in%logical_type)
336 ALLOCATE (value_out%logical_type(isize))
337 value_out%logical_type = value_in%logical_type
338 CASE DEFAULT
339 ! Type not implemented in cp_result_type
340 cpabort("")
341 END SELECT
342 CALL timestop(handle)
343 END SUBROUTINE cp_result_value_copy
344
345! **************************************************************************************************
346!> \brief Reallocates the cp_result_value type
347!> \param result_value ...
348!> \param istart ...
349!> \param iend ...
350!> \author Teodoro Laino [tlaino] - University of Zurich 10.2008
351! **************************************************************************************************
352 SUBROUTINE cp_result_value_p_reallocate(result_value, istart, iend)
353 TYPE(cp_result_value_p_type), DIMENSION(:), &
354 POINTER :: result_value
355 INTEGER, INTENT(in) :: istart, iend
356
357 CHARACTER(len=*), PARAMETER :: routinen = 'cp_result_value_p_reallocate'
358
359 INTEGER :: handle, i, lb_size, ub_size
360 TYPE(cp_result_value_p_type), DIMENSION(:), &
361 POINTER :: tmp_value
362
363 CALL timeset(routinen, handle)
364 ub_size = 0
365 lb_size = 0
366 IF (ASSOCIATED(result_value)) THEN
367 ub_size = ubound(result_value, 1)
368 lb_size = lbound(result_value, 1)
369 END IF
370 ! Allocate and copy new values while releases old
371 ALLOCATE (tmp_value(istart:iend))
372 DO i = istart, iend
373 NULLIFY (tmp_value(i)%value)
374 CALL cp_result_value_create(tmp_value(i)%value)
375 IF ((i <= ub_size) .AND. (i >= lb_size)) THEN
376 CALL cp_result_value_copy(tmp_value(i)%value, result_value(i)%value)
377 CALL cp_result_value_release(result_value(i)%value)
378 END IF
379 END DO
380 DEALLOCATE (result_value)
381 result_value => tmp_value
382 CALL timestop(handle)
383 END SUBROUTINE cp_result_value_p_reallocate
384
385END MODULE cp_result_types
set of type/routines to handle the storage of results in force_envs
integer, parameter, public result_type_real
subroutine, public cp_result_copy(results_in, results_out)
Copies the cp_result type.
integer, parameter, public result_type_logical
subroutine, public cp_result_retain(results)
Retains cp_result type.
subroutine, public cp_result_release(results)
Releases cp_result type.
subroutine, public cp_result_value_create(value)
Allocates and intitializes the cp_result_value type.
subroutine, public cp_result_clean(results)
Releases cp_result clean.
integer, parameter, public result_type_integer
subroutine, public cp_result_create(results)
Allocates and intitializes the cp_result.
subroutine, public cp_result_value_p_reallocate(result_value, istart, iend)
Reallocates the cp_result_value type.
subroutine, public cp_result_value_copy(value_out, value_in)
Copies the cp_result_value type.
subroutine, public cp_result_value_init(value, type_in_use, size_value)
Setup of the cp_result_value type.
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public dp
Definition kinds.F:34
integer, parameter, public default_string_length
Definition kinds.F:57
contains arbitrary information which need to be stored