(git:374b731)
Loading...
Searching...
No Matches
cp_parser_buffer_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 a module to allow simple buffering of read lines of a parser
10!> \author Teodoro Laino [tlaino] - University of Zurich
11!> \date 08.2008
12! **************************************************************************************************
14
15 USE kinds, ONLY: max_line_length
16#include "../base/base_uses.f90"
17
18 IMPLICIT NONE
19 PRIVATE
20
21! ****************************************************************************
22!> \brief Buffer type for speeding-up the parsing in parallel
23!> \author Teodoro Laino [tlaino] - University of Zurich
24!> \date 08.2008
25! **************************************************************************************************
27 INTEGER :: size = 0, buffer_id = 0
28 INTEGER :: present_line_number = 0, &
29 last_line_number = 0, &
30 istat = 0
31 INTEGER, DIMENSION(:), POINTER :: input_line_numbers => null()
32 CHARACTER(LEN=max_line_length), &
33 DIMENSION(:), POINTER :: input_lines => null()
34 TYPE(buffer_type), POINTER :: sub_buffer => null()
35 END TYPE buffer_type
36
39 CHARACTER(len=*), PARAMETER, PRIVATE :: modulen = 'cp_parser_buffer_types'
40 INTEGER, PARAMETER, PRIVATE :: buffer_size = 1000
41
42CONTAINS
43
44! ****************************************************************************
45!> \brief Creates the parser buffer type
46!> \param buffer ...
47!> \date 08.2008
48!> \author Teodoro Laino [tlaino] - University of Zurich
49! **************************************************************************************************
50 SUBROUTINE create_buffer_type(buffer)
51 TYPE(buffer_type), POINTER :: buffer
52
53 cpassert(.NOT. ASSOCIATED(buffer))
54 ALLOCATE (buffer)
55 buffer%size = buffer_size
56 ALLOCATE (buffer%input_lines(buffer%size))
57 ALLOCATE (buffer%input_line_numbers(buffer%size))
58 buffer%present_line_number = buffer%size
59 buffer%last_line_number = buffer%size
60 END SUBROUTINE create_buffer_type
61
62! ****************************************************************************
63!> \brief Releases the parser buffer type
64!> \param buffer ...
65!> \date 08.2008
66!> \author Teodoro Laino [tlaino] - University of Zurich
67! **************************************************************************************************
68 RECURSIVE SUBROUTINE release_buffer_type(buffer)
69 TYPE(buffer_type), POINTER :: buffer
70
71 cpassert(ASSOCIATED(buffer))
72 DEALLOCATE (buffer%input_lines)
73 DEALLOCATE (buffer%input_line_numbers)
74 IF (ASSOCIATED(buffer%sub_buffer)) THEN
75 CALL release_buffer_type(buffer%sub_buffer)
76 END IF
77 DEALLOCATE (buffer)
78 END SUBROUTINE release_buffer_type
79
80! ****************************************************************************
81!> \brief Copies buffer types
82!> \param buffer_in ...
83!> \param buffer_out ...
84!> \param force ...
85!> \date 08.2008
86!> \author Teodoro Laino [tlaino] - University of Zurich
87! **************************************************************************************************
88 RECURSIVE SUBROUTINE copy_buffer_type(buffer_in, buffer_out, force)
89 TYPE(buffer_type), POINTER :: buffer_in, buffer_out
90 LOGICAL, INTENT(IN), OPTIONAL :: force
91
92 INTEGER :: i
93 LOGICAL :: my_force
94
95 cpassert(ASSOCIATED(buffer_in))
96 cpassert(ASSOCIATED(buffer_out))
97 cpassert(buffer_in%size == buffer_out%size)
98 my_force = .false.
99 IF (PRESENT(force)) my_force = force
100 ! Copy buffer structure
101 buffer_out%present_line_number = buffer_in%present_line_number
102 buffer_out%last_line_number = buffer_in%last_line_number
103 buffer_out%istat = buffer_in%istat
104 ! This part can be quite expensive.. we do it only when strictly necessary..
105 IF ((buffer_out%buffer_id /= buffer_in%buffer_id) .OR. (my_force)) THEN
106 buffer_out%buffer_id = buffer_in%buffer_id
107 buffer_out%input_line_numbers = buffer_in%input_line_numbers
108 ! Explicit loop: bypass a NAG bug..
109 DO i = 1, SIZE(buffer_in%input_lines)
110 buffer_out%input_lines(i) = buffer_in%input_lines(i)
111 END DO
112 END IF
113 IF (ASSOCIATED(buffer_in%sub_buffer) .AND. ASSOCIATED(buffer_out%sub_buffer)) THEN
114 CALL copy_buffer_type(buffer_in%sub_buffer, buffer_out%sub_buffer, force)
115 END IF
116 END SUBROUTINE copy_buffer_type
117
118! ****************************************************************************
119!> \brief Initializes sub buffer structure
120!> \param sub_buffer ...
121!> \param buffer ...
122!> \date 08.2008
123!> \author Teodoro Laino [tlaino] - University of Zurich
124! **************************************************************************************************
125 SUBROUTINE initialize_sub_buffer(sub_buffer, buffer)
126 TYPE(buffer_type), POINTER :: sub_buffer, buffer
127
128 cpassert(ASSOCIATED(buffer))
129 cpassert(.NOT. ASSOCIATED(sub_buffer))
130 CALL create_buffer_type(sub_buffer)
131 CALL copy_buffer_type(buffer, sub_buffer)
132 sub_buffer%present_line_number = 0
133 END SUBROUTINE initialize_sub_buffer
134
135! ****************************************************************************
136!> \brief Finalizes sub buffer structure
137!> \param sub_buffer ...
138!> \param buffer ...
139!> \date 08.2008
140!> \author Teodoro Laino [tlaino] - University of Zurich
141! **************************************************************************************************
142 SUBROUTINE finalize_sub_buffer(sub_buffer, buffer)
143 TYPE(buffer_type), POINTER :: sub_buffer, buffer
144
145 cpassert(ASSOCIATED(buffer))
146 cpassert(ASSOCIATED(sub_buffer))
147 CALL copy_buffer_type(sub_buffer, buffer)
148 CALL release_buffer_type(sub_buffer)
149 END SUBROUTINE finalize_sub_buffer
150
151END MODULE cp_parser_buffer_types
a module to allow simple buffering of read lines of a parser
recursive subroutine, public copy_buffer_type(buffer_in, buffer_out, force)
Copies buffer types.
subroutine, public initialize_sub_buffer(sub_buffer, buffer)
Initializes sub buffer structure.
subroutine, public create_buffer_type(buffer)
Creates the parser buffer type.
recursive subroutine, public release_buffer_type(buffer)
Releases the parser buffer type.
subroutine, public finalize_sub_buffer(sub_buffer, buffer)
Finalizes sub buffer structure.
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public max_line_length
Definition kinds.F:59
Buffer type for speeding-up the parsing in parallel.