27 #include "./base/base_uses.f90"
34 PUBLIC :: fb_matrix_data_obj
45 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'qs_fb_matrix_data_types'
48 INTEGER,
PARAMETER,
PRIVATE :: EXPAND_FACTOR = 2
62 TYPE fb_matrix_data_data
66 TYPE(fb_hash_table_obj) :: ind
67 TYPE(fb_buffer_d_obj) :: blks
68 INTEGER,
DIMENSION(:),
POINTER :: lds => null()
69 END TYPE fb_matrix_data_data
77 TYPE fb_matrix_data_obj
78 TYPE(fb_matrix_data_data),
POINTER,
PRIVATE :: obj => null()
79 END TYPE fb_matrix_data_obj
92 TYPE(fb_matrix_data_obj),
INTENT(INOUT) :: matrix_data
93 INTEGER,
INTENT(IN) :: row, col
94 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(IN) :: blk
96 INTEGER :: existing_ii, ii, ncols, nrows, old_nblks
97 INTEGER(KIND=int_8) :: pair_ind
98 INTEGER,
DIMENSION(:),
POINTER :: new_lds
99 LOGICAL :: check_ok, found
107 pair_ind = fb_matrix_data_encode_pair(row, col, matrix_data%obj%nencode)
110 CALL fb_buffer_replace(matrix_data%obj%blks, existing_ii, reshape(blk, (/nrows*ncols/)))
112 old_nblks = matrix_data%obj%nblks
113 matrix_data%obj%nblks = old_nblks + 1
114 ii = matrix_data%obj%nblks
116 IF (
SIZE(matrix_data%obj%lds) .LT. ii)
THEN
117 ALLOCATE (new_lds(ii*expand_factor))
119 new_lds(1:old_nblks) = matrix_data%obj%lds(1:old_nblks)
120 DEALLOCATE (matrix_data%obj%lds)
121 matrix_data%obj%lds => new_lds
124 matrix_data%obj%lds(ii) = nrows
125 CALL fb_buffer_add(matrix_data%obj%blks, reshape(blk, (/nrows*ncols/)))
137 SUBROUTINE fb_matrix_data_associate(a, b)
138 TYPE(fb_matrix_data_obj),
INTENT(OUT) :: a
139 TYPE(fb_matrix_data_obj),
INTENT(IN) :: b
142 END SUBROUTINE fb_matrix_data_associate
153 TYPE(fb_matrix_data_obj),
INTENT(OUT) :: matrix_data
154 INTEGER,
INTENT(IN) :: nmax, nencode
156 NULLIFY (matrix_data%obj)
157 ALLOCATE (matrix_data%obj)
159 CALL fb_buffer_nullify(matrix_data%obj%blks)
160 NULLIFY (matrix_data%obj%lds)
161 matrix_data%obj%nmax = 0
162 matrix_data%obj%nblks = 0
163 matrix_data%obj%nencode = nencode
164 CALL fb_matrix_data_init(matrix_data=matrix_data, &
181 TYPE(fb_matrix_data_obj),
INTENT(IN) :: matrix_data
182 INTEGER,
INTENT(IN) :: row, col
183 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: blk_p
184 LOGICAL,
INTENT(OUT) :: found
186 INTEGER :: ind_in_blks
187 INTEGER(KIND=int_8) :: pair_ind
192 pair_ind = fb_matrix_data_encode_pair(row, col, matrix_data%obj%nencode)
195 CALL fb_buffer_get(buffer=matrix_data%obj%blks, &
196 i_slice=ind_in_blks, &
198 data_2d_ld=matrix_data%obj%lds(ind_in_blks))
211 TYPE(fb_matrix_data_obj),
INTENT(IN) :: matrix_data
214 res =
ASSOCIATED(matrix_data%obj)
227 SUBROUTINE fb_matrix_data_init(matrix_data, nmax, nencode)
228 TYPE(fb_matrix_data_obj),
INTENT(INOUT) :: matrix_data
229 INTEGER,
INTENT(IN),
OPTIONAL :: nmax, nencode
236 my_nmax = matrix_data%obj%nmax
237 IF (
PRESENT(nmax)) my_nmax = nmax
238 my_nmax = max(my_nmax, 1)
243 IF (fb_buffer_has_data(matrix_data%obj%blks))
THEN
244 CALL fb_buffer_release(matrix_data%obj%blks)
246 CALL fb_buffer_create(buffer=matrix_data%obj%blks)
247 IF (
ASSOCIATED(matrix_data%obj%lds))
THEN
248 DEALLOCATE (matrix_data%obj%lds)
250 ALLOCATE (matrix_data%obj%lds(0))
251 matrix_data%obj%nblks = 0
252 IF (
PRESENT(nencode)) matrix_data%obj%nencode = nencode
253 END SUBROUTINE fb_matrix_data_init
261 TYPE(fb_matrix_data_obj),
INTENT(INOUT) :: matrix_data
263 NULLIFY (matrix_data%obj)
272 TYPE(fb_matrix_data_obj),
INTENT(INOUT) :: matrix_data
274 IF (
ASSOCIATED(matrix_data%obj))
THEN
278 IF (fb_buffer_has_data(matrix_data%obj%blks))
THEN
279 CALL fb_buffer_release(matrix_data%obj%blks)
281 IF (
ASSOCIATED(matrix_data%obj%lds))
THEN
282 DEALLOCATE (matrix_data%obj%lds)
284 DEALLOCATE (matrix_data%obj)
286 NULLIFY (matrix_data%obj)
299 SUBROUTINE fb_matrix_data_status(matrix_data, nmax, nblks, nencode, blk_sizes)
300 TYPE(fb_matrix_data_obj),
INTENT(INOUT) :: matrix_data
301 INTEGER,
INTENT(OUT),
OPTIONAL :: nmax, nblks, nencode
302 INTEGER,
DIMENSION(:, :),
INTENT(OUT),
OPTIONAL :: blk_sizes
305 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: buffer_sizes
310 IF (
PRESENT(nmax)) nmax = matrix_data%obj%nmax
311 IF (
PRESENT(nblks)) nblks = matrix_data%obj%nblks
312 IF (
PRESENT(nencode)) nencode = matrix_data%obj%nencode
313 IF (
PRESENT(blk_sizes))
THEN
314 check_ok = (
SIZE(blk_sizes, 1) .GE. matrix_data%obj%nblks .AND. &
315 SIZE(blk_sizes, 2) .GE. 2)
318 ALLOCATE (buffer_sizes(matrix_data%obj%nblks))
319 CALL fb_buffer_get(buffer=matrix_data%obj%blks, &
321 DO ii = 1, matrix_data%obj%nblks
322 blk_sizes(ii, 1) = matrix_data%obj%lds(ii)
323 blk_sizes(ii, 2) = buffer_sizes(ii)/matrix_data%obj%lds(ii)
325 DEALLOCATE (buffer_sizes)
327 END SUBROUTINE fb_matrix_data_status
337 PURE FUNCTION fb_matrix_data_encode_pair(row, col, nencode) &
339 INTEGER,
INTENT(IN) :: row, col, nencode
340 INTEGER(KIND=int_8) :: pair_ind
342 INTEGER(KIND=int_8) :: col_8, nencode_8, row_8
344 row_8 = int(row,
int_8)
345 col_8 = int(col,
int_8)
346 nencode_8 = int(nencode,
int_8)
347 pair_ind = (row_8 - 1_int_8)*nencode_8 + (col_8 - 1_int_8) + 1
348 END FUNCTION fb_matrix_data_encode_pair
Defines the basic variable types.
integer, parameter, public int_8
integer, parameter, public dp
A simple hash table of integer keys, using hash function: H(k) = (k*p) mod n + 1 where: k = key p = a...
pure logical function, public fb_hash_table_has_data(hash_table)
check if the object has data associated to it
recursive subroutine, public fb_hash_table_add(hash_table, key, val)
Add element to a hash table, auto resize if necessary.
subroutine, public fb_hash_table_release(hash_table)
releases given object
subroutine, public fb_hash_table_get(hash_table, key, val, found)
Retrieve value from a key from a hash table.
subroutine, public fb_hash_table_create(hash_table, nmax)
Creates and initialises an empty fb_hash_table object.
pure subroutine, public fb_hash_table_nullify(hash_table)
Nullifies a fb_hash_table object.
pure logical function, public fb_matrix_data_has_data(matrix_data)
check if the object has data associated to it
subroutine, public fb_matrix_data_add(matrix_data, row, col, blk)
Add a matrix block to a fb_matrix_data object.
subroutine, public fb_matrix_data_get(matrix_data, row, col, blk_p, found)
retrieve a matrix block from a matrix_data object
subroutine, public fb_matrix_data_create(matrix_data, nmax, nencode)
Creates and initialises an empty fb_matrix_data object of a given size.
pure subroutine, public fb_matrix_data_nullify(matrix_data)
Nullifies a fb_matrix_data object.
subroutine, public fb_matrix_data_release(matrix_data)
releases given object