# product_matrix_size_guess Function

## public function product_matrix_size_guess(matrix_left, matrix_right, product_matrix, left_data_size, right_data_size, left_col_nimages, right_row_nimages, nthreads) result(size_guess)

Guess the size of the product matrix from the A and B sparsities

### Arguments

Type IntentOptional Attributes Name
type(dbcsr_type), intent(in) :: matrix_left
type(dbcsr_type), intent(in) :: matrix_right
type(dbcsr_type), intent(in) :: product_matrix
integer, intent(in) :: left_data_size
integer, intent(in) :: right_data_size
integer, intent(in) :: left_col_nimages
integer, intent(in) :: right_row_nimages
integer, intent(in) :: nthreads

## Source Code

   FUNCTION product_matrix_size_guess(matrix_left, matrix_right, product_matrix, &
!! Guess the size of the product matrix from the A and B sparsities
left_data_size, right_data_size, &
left_col_nimages, right_row_nimages, &
TYPE(dbcsr_type), INTENT(IN)                       :: matrix_left, matrix_right, product_matrix
INTEGER, INTENT(IN)                                :: left_data_size, right_data_size, &
left_col_nimages, right_row_nimages, &
INTEGER                                            :: size_guess

INTEGER(KIND=int_8)                                :: size8
REAL(kind=real_8)                                  :: factor, fill_guess, left_fill, right_fill

! First we calculate the sparsities
size8 = INT(dbcsr_nfullrows_local(matrix_left), KIND=int_8)* &
INT(dbcsr_nfullcols_local(matrix_left), KIND=int_8)
size8 = MAX(1_int_8, size8)
left_fill = (REAL(left_data_size, KIND=real_8)*REAL(left_col_nimages, KIND=real_8))/REAL(size8, KIND=real_8)
size8 = INT(dbcsr_nfullrows_local(matrix_right), KIND=int_8)* &
INT(dbcsr_nfullcols_local(matrix_right), KIND=int_8)
size8 = MAX(1_int_8, size8)
right_fill = (REAL(right_data_size, KIND=real_8)*REAL(right_row_nimages, KIND=real_8))/REAL(size8, KIND=real_8)
size8 = INT(dbcsr_nfullrows_local(product_matrix), KIND=int_8)* &
INT(dbcsr_nfullcols_local(product_matrix), KIND=int_8)
size8 = MAX(1_int_8, size8)
!     factor = 7.0 ! Old guess
factor = 2.4 ! New guess
fill_guess = factor*MAX(left_fill, right_fill)
fill_guess = MIN(1.0_real_8, MAX(0.0_real_8, fill_guess))
IF (nthreads .GT. 1) THEN
fill_guess = fill_guess*3.0_real_8/REAL(2*nthreads, KIND=real_8)
END IF
size_guess = INT(REAL(size8, KIND=real_8)*fill_guess, KIND=int_4)
END FUNCTION product_matrix_size_guess