Line data Source code
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 : ! ************************************************************************************************** 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 103720 : SUBROUTINE create_buffer_type(buffer) 51 : TYPE(buffer_type), POINTER :: buffer 52 : 53 103720 : CPASSERT(.NOT. ASSOCIATED(buffer)) 54 103720 : ALLOCATE (buffer) 55 103720 : buffer%size = buffer_size 56 103720 : ALLOCATE (buffer%input_lines(buffer%size)) 57 103720 : ALLOCATE (buffer%input_line_numbers(buffer%size)) 58 103720 : buffer%present_line_number = buffer%size 59 103720 : buffer%last_line_number = buffer%size 60 103720 : 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 103720 : RECURSIVE SUBROUTINE release_buffer_type(buffer) 69 : TYPE(buffer_type), POINTER :: buffer 70 : 71 103720 : CPASSERT(ASSOCIATED(buffer)) 72 103720 : DEALLOCATE (buffer%input_lines) 73 103720 : DEALLOCATE (buffer%input_line_numbers) 74 103720 : IF (ASSOCIATED(buffer%sub_buffer)) THEN 75 0 : CALL release_buffer_type(buffer%sub_buffer) 76 : END IF 77 103720 : DEALLOCATE (buffer) 78 103720 : 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 8823678 : 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 8823678 : CPASSERT(ASSOCIATED(buffer_in)) 96 8823678 : CPASSERT(ASSOCIATED(buffer_out)) 97 8823678 : CPASSERT(buffer_in%size == buffer_out%size) 98 8823678 : my_force = .FALSE. 99 8823678 : IF (PRESENT(force)) my_force = force 100 : ! Copy buffer structure 101 8823678 : buffer_out%present_line_number = buffer_in%present_line_number 102 8823678 : buffer_out%last_line_number = buffer_in%last_line_number 103 8823678 : buffer_out%istat = buffer_in%istat 104 : ! This part can be quite expensive.. we do it only when strictly necessary.. 105 8823678 : IF ((buffer_out%buffer_id /= buffer_in%buffer_id) .OR. (my_force)) THEN 106 28632 : buffer_out%buffer_id = buffer_in%buffer_id 107 57321264 : buffer_out%input_line_numbers = buffer_in%input_line_numbers 108 : ! Explicit loop: bypass a NAG bug.. 109 28660632 : DO i = 1, SIZE(buffer_in%input_lines) 110 37455678 : buffer_out%input_lines(i) = buffer_in%input_lines(i) 111 : END DO 112 : END IF 113 8823678 : 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 8823678 : 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