[3331] | 1 | MODULE buffer_mod |
---|
| 2 | |
---|
| 3 | PRIVATE |
---|
| 4 | REAL,PARAMETER :: grow_factor=1.5 |
---|
| 5 | |
---|
| 6 | INTEGER, POINTER, SAVE :: buffer_i(:) |
---|
| 7 | INTEGER,SAVE :: size_buffer_i = 0 |
---|
| 8 | !$OMP THREADPRIVATE(buffer_i,size_buffer_i) |
---|
| 9 | |
---|
| 10 | REAL,POINTER,SAVE :: buffer_r(:) |
---|
| 11 | INTEGER,SAVE :: size_buffer_r = 0 |
---|
| 12 | !$OMP THREADPRIVATE(buffer_r,size_buffer_r) |
---|
| 13 | |
---|
| 14 | LOGICAL,POINTER,SAVE :: buffer_l(:) |
---|
| 15 | INTEGER,SAVE :: size_buffer_l = 0 |
---|
| 16 | !$OMP THREADPRIVATE(buffer_l,size_buffer_l) |
---|
| 17 | |
---|
| 18 | CHARACTER,POINTER,SAVE :: buffer_c(:) |
---|
| 19 | INTEGER,SAVE :: size_buffer_c = 0 |
---|
| 20 | !$OMP THREADPRIVATE(buffer_c,size_buffer_c) |
---|
| 21 | |
---|
| 22 | INTERFACE get_buffer |
---|
| 23 | MODULE PROCEDURE get_buffer_i, get_buffer_r, get_buffer_l, get_buffer_c |
---|
| 24 | END INTERFACE |
---|
| 25 | |
---|
| 26 | PUBLIC :: get_buffer |
---|
| 27 | |
---|
| 28 | CONTAINS |
---|
| 29 | |
---|
| 30 | SUBROUTINE get_buffer_i(buff,buff_size) |
---|
| 31 | IMPLICIT NONE |
---|
| 32 | INTEGER,POINTER :: buff(:) |
---|
| 33 | INTEGER,INTENT(IN) :: buff_size |
---|
| 34 | |
---|
| 35 | IF (buff_size>size_buffer_i) THEN |
---|
| 36 | DEALLOCATE(buffer_i) |
---|
| 37 | size_buffer_i=MAX(2,INT(size_buffer_i*grow_factor)) |
---|
| 38 | ALLOCATE(buffer_i(size_buffer_i)) |
---|
| 39 | ENDIF |
---|
| 40 | |
---|
| 41 | buff=>buffer_i |
---|
| 42 | END SUBROUTINE get_buffer_i |
---|
| 43 | |
---|
| 44 | SUBROUTINE get_buffer_r(buff,buff_size) |
---|
| 45 | IMPLICIT NONE |
---|
| 46 | REAL,POINTER :: buff(:) |
---|
| 47 | INTEGER,INTENT(IN) :: buff_size |
---|
| 48 | |
---|
| 49 | IF (buff_size>size_buffer_r) THEN |
---|
| 50 | DEALLOCATE(buffer_r) |
---|
| 51 | size_buffer_r=MAX(2,INT(size_buffer_r*grow_factor)) |
---|
| 52 | ALLOCATE(buffer_r(size_buffer_r)) |
---|
| 53 | ENDIF |
---|
| 54 | |
---|
| 55 | buff=>buffer_r |
---|
| 56 | END SUBROUTINE get_buffer_r |
---|
| 57 | |
---|
| 58 | SUBROUTINE get_buffer_l(buff,buff_size) |
---|
| 59 | IMPLICIT NONE |
---|
| 60 | LOGICAL,POINTER :: buff(:) |
---|
| 61 | INTEGER,INTENT(IN) :: buff_size |
---|
| 62 | |
---|
| 63 | IF (buff_size>size_buffer_l) THEN |
---|
| 64 | DEALLOCATE(buffer_l) |
---|
| 65 | size_buffer_l=MAX(2,INT(size_buffer_l*grow_factor)) |
---|
| 66 | ALLOCATE(buffer_l(size_buffer_l)) |
---|
| 67 | ENDIF |
---|
| 68 | |
---|
| 69 | buff=>buffer_l |
---|
| 70 | END SUBROUTINE get_buffer_l |
---|
| 71 | |
---|
| 72 | SUBROUTINE get_buffer_c(buff,buff_size) |
---|
| 73 | IMPLICIT NONE |
---|
| 74 | CHARACTER,POINTER :: buff(:) |
---|
| 75 | INTEGER,INTENT(IN) :: buff_size |
---|
| 76 | |
---|
| 77 | IF (buff_size>size_buffer_c) THEN |
---|
| 78 | DEALLOCATE(buffer_c) |
---|
| 79 | size_buffer_c=MAX(2,INT(size_buffer_c*grow_factor)) |
---|
| 80 | ALLOCATE(buffer_c(size_buffer_c)) |
---|
| 81 | ENDIF |
---|
| 82 | |
---|
| 83 | buff=>buffer_c |
---|
| 84 | END SUBROUTINE get_buffer_c |
---|
| 85 | |
---|
| 86 | END MODULE buffer_mod |
---|