Line data Source code
1 : !--------------------------------------------------------------------------------------------------! 2 : ! CP2K: A general program to perform molecular dynamics simulations ! 3 : ! Copyright 2000-2023 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, buffer_id 28 : INTEGER :: present_line_number, & 29 : last_line_number, & 30 : istat 31 : INTEGER, DIMENSION(:), POINTER :: input_line_numbers 32 : CHARACTER(LEN=max_line_length), & 33 : DIMENSION(:), POINTER :: input_lines 34 : TYPE(buffer_type), POINTER :: sub_buffer 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 99100 : SUBROUTINE create_buffer_type(buffer) 51 : TYPE(buffer_type), POINTER :: buffer 52 : 53 99100 : CPASSERT(.NOT. ASSOCIATED(buffer)) 54 99100 : ALLOCATE (buffer) 55 99100 : buffer%size = buffer_size 56 99100 : ALLOCATE (buffer%input_lines(buffer%size)) 57 99100 : ALLOCATE (buffer%input_line_numbers(buffer%size)) 58 99100 : buffer%buffer_id = 0 59 99199100 : buffer%input_line_numbers = 0 60 99100 : buffer%istat = 0 61 99100 : buffer%present_line_number = buffer%size 62 99100 : buffer%last_line_number = buffer%size 63 99100 : NULLIFY (buffer%sub_buffer) 64 99100 : END SUBROUTINE create_buffer_type 65 : 66 : ! **************************************************************************** 67 : !> \brief Releases the parser buffer type 68 : !> \param buffer ... 69 : !> \date 08.2008 70 : !> \author Teodoro Laino [tlaino] - University of Zurich 71 : ! ************************************************************************************************** 72 99100 : RECURSIVE SUBROUTINE release_buffer_type(buffer) 73 : TYPE(buffer_type), POINTER :: buffer 74 : 75 99100 : CPASSERT(ASSOCIATED(buffer)) 76 99100 : DEALLOCATE (buffer%input_lines) 77 99100 : DEALLOCATE (buffer%input_line_numbers) 78 99100 : IF (ASSOCIATED(buffer%sub_buffer)) THEN 79 0 : CALL release_buffer_type(buffer%sub_buffer) 80 : END IF 81 99100 : DEALLOCATE (buffer) 82 99100 : END SUBROUTINE release_buffer_type 83 : 84 : ! **************************************************************************** 85 : !> \brief Copies buffer types 86 : !> \param buffer_in ... 87 : !> \param buffer_out ... 88 : !> \param force ... 89 : !> \date 08.2008 90 : !> \author Teodoro Laino [tlaino] - University of Zurich 91 : ! ************************************************************************************************** 92 20671808 : RECURSIVE SUBROUTINE copy_buffer_type(buffer_in, buffer_out, force) 93 : TYPE(buffer_type), POINTER :: buffer_in, buffer_out 94 : LOGICAL, INTENT(IN), OPTIONAL :: force 95 : 96 : INTEGER :: i 97 : LOGICAL :: my_force 98 : 99 20671808 : CPASSERT(ASSOCIATED(buffer_in)) 100 20671808 : CPASSERT(ASSOCIATED(buffer_out)) 101 20671808 : CPASSERT(buffer_in%size == buffer_out%size) 102 20671808 : my_force = .FALSE. 103 20671808 : IF (PRESENT(force)) my_force = force 104 : ! Copy buffer structure 105 20671808 : buffer_out%present_line_number = buffer_in%present_line_number 106 20671808 : buffer_out%last_line_number = buffer_in%last_line_number 107 20671808 : buffer_out%istat = buffer_in%istat 108 : ! This part can be quite expensive.. we do it only when strictly necessary.. 109 20671808 : IF ((buffer_out%buffer_id /= buffer_in%buffer_id) .OR. (my_force)) THEN 110 32218 : buffer_out%buffer_id = buffer_in%buffer_id 111 64500436 : buffer_out%input_line_numbers = buffer_in%input_line_numbers 112 : ! Explicit loop: bypass a NAG bug.. 113 32250218 : DO i = 1, SIZE(buffer_in%input_lines) 114 52889808 : buffer_out%input_lines(i) = buffer_in%input_lines(i) 115 : END DO 116 : END IF 117 20671808 : IF (ASSOCIATED(buffer_in%sub_buffer) .AND. ASSOCIATED(buffer_out%sub_buffer)) THEN 118 0 : CALL copy_buffer_type(buffer_in%sub_buffer, buffer_out%sub_buffer, force) 119 : END IF 120 20671808 : END SUBROUTINE copy_buffer_type 121 : 122 : ! **************************************************************************** 123 : !> \brief Initializes sub buffer structure 124 : !> \param sub_buffer ... 125 : !> \param buffer ... 126 : !> \date 08.2008 127 : !> \author Teodoro Laino [tlaino] - University of Zurich 128 : ! ************************************************************************************************** 129 1238 : SUBROUTINE initialize_sub_buffer(sub_buffer, buffer) 130 : TYPE(buffer_type), POINTER :: sub_buffer, buffer 131 : 132 1238 : CPASSERT(ASSOCIATED(buffer)) 133 1238 : CPASSERT(.NOT. ASSOCIATED(sub_buffer)) 134 1238 : CALL create_buffer_type(sub_buffer) 135 1238 : CALL copy_buffer_type(buffer, sub_buffer) 136 1238 : sub_buffer%present_line_number = 0 137 1238 : END SUBROUTINE initialize_sub_buffer 138 : 139 : ! **************************************************************************** 140 : !> \brief Finalizes sub buffer structure 141 : !> \param sub_buffer ... 142 : !> \param buffer ... 143 : !> \date 08.2008 144 : !> \author Teodoro Laino [tlaino] - University of Zurich 145 : ! ************************************************************************************************** 146 1238 : SUBROUTINE finalize_sub_buffer(sub_buffer, buffer) 147 : TYPE(buffer_type), POINTER :: sub_buffer, buffer 148 : 149 1238 : CPASSERT(ASSOCIATED(buffer)) 150 1238 : CPASSERT(ASSOCIATED(sub_buffer)) 151 1238 : CALL copy_buffer_type(sub_buffer, buffer) 152 1238 : CALL release_buffer_type(sub_buffer) 153 1238 : END SUBROUTINE finalize_sub_buffer 154 : 155 0 : END MODULE cp_parser_buffer_types