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 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 : ! **************************************************************************************************
13 : MODULE cp_parser_buffer_types
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 : ! **************************************************************************************************
26 : TYPE buffer_type
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 :
37 : PUBLIC :: buffer_type, create_buffer_type, release_buffer_type, copy_buffer_type, &
38 : initialize_sub_buffer, finalize_sub_buffer
39 : CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'cp_parser_buffer_types'
40 : INTEGER, PARAMETER, PRIVATE :: buffer_size = 1000
41 :
42 : CONTAINS
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 108908 : SUBROUTINE create_buffer_type(buffer)
51 : TYPE(buffer_type), POINTER :: buffer
52 :
53 108908 : CPASSERT(.NOT. ASSOCIATED(buffer))
54 108908 : ALLOCATE (buffer)
55 108908 : buffer%size = buffer_size
56 108908 : ALLOCATE (buffer%input_lines(buffer%size))
57 108908 : ALLOCATE (buffer%input_line_numbers(buffer%size))
58 108908 : buffer%present_line_number = buffer%size
59 108908 : buffer%last_line_number = buffer%size
60 108908 : 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 108908 : RECURSIVE SUBROUTINE release_buffer_type(buffer)
69 : TYPE(buffer_type), POINTER :: buffer
70 :
71 108908 : CPASSERT(ASSOCIATED(buffer))
72 108908 : DEALLOCATE (buffer%input_lines)
73 108908 : DEALLOCATE (buffer%input_line_numbers)
74 108908 : IF (ASSOCIATED(buffer%sub_buffer)) THEN
75 0 : CALL release_buffer_type(buffer%sub_buffer)
76 : END IF
77 108908 : DEALLOCATE (buffer)
78 108908 : 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 8958962 : 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 8958962 : CPASSERT(ASSOCIATED(buffer_in))
96 8958962 : CPASSERT(ASSOCIATED(buffer_out))
97 8958962 : CPASSERT(buffer_in%size == buffer_out%size)
98 8958962 : my_force = .FALSE.
99 8958962 : IF (PRESENT(force)) my_force = force
100 : ! Copy buffer structure
101 8958962 : buffer_out%present_line_number = buffer_in%present_line_number
102 8958962 : buffer_out%last_line_number = buffer_in%last_line_number
103 8958962 : buffer_out%istat = buffer_in%istat
104 : ! This part can be quite expensive.. we do it only when strictly necessary..
105 8958962 : IF ((buffer_out%buffer_id /= buffer_in%buffer_id) .OR. (my_force)) THEN
106 29550 : buffer_out%buffer_id = buffer_in%buffer_id
107 59159100 : buffer_out%input_line_numbers = buffer_in%input_line_numbers
108 : ! Explicit loop: bypass a NAG bug..
109 29579550 : DO i = 1, SIZE(buffer_in%input_lines)
110 38508962 : buffer_out%input_lines(i) = buffer_in%input_lines(i)
111 : END DO
112 : END IF
113 8958962 : IF (ASSOCIATED(buffer_in%sub_buffer) .AND. ASSOCIATED(buffer_out%sub_buffer)) THEN
114 0 : CALL copy_buffer_type(buffer_in%sub_buffer, buffer_out%sub_buffer, force)
115 : END IF
116 8958962 : 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 38 : SUBROUTINE initialize_sub_buffer(sub_buffer, buffer)
126 : TYPE(buffer_type), POINTER :: sub_buffer, buffer
127 :
128 38 : CPASSERT(ASSOCIATED(buffer))
129 38 : CPASSERT(.NOT. ASSOCIATED(sub_buffer))
130 38 : CALL create_buffer_type(sub_buffer)
131 38 : CALL copy_buffer_type(buffer, sub_buffer)
132 38 : sub_buffer%present_line_number = 0
133 38 : 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 38 : SUBROUTINE finalize_sub_buffer(sub_buffer, buffer)
143 : TYPE(buffer_type), POINTER :: sub_buffer, buffer
144 :
145 38 : CPASSERT(ASSOCIATED(buffer))
146 38 : CPASSERT(ASSOCIATED(sub_buffer))
147 38 : CALL copy_buffer_type(sub_buffer, buffer)
148 38 : CALL release_buffer_type(sub_buffer)
149 38 : END SUBROUTINE finalize_sub_buffer
150 :
151 0 : END MODULE cp_parser_buffer_types
|