#include <format.h>
An matrix is stored in BCSR format using six arrays, . The triplet stores rows 1 through using uniformly aligned blocks, and the triplet stores any remaining rows using uniformly aligned blocks.
Define blockrow to be rows through of , where . For each such that , is the column index entry of an explicitly stored nonzero block whose values are laid out in rowmajor order in the subarray .
These blocks are uniformly aligned, meaning that . However, there is one exception: if does not divide , then each block row may contain one block with . If such a block overlaps with another block starting at column index , then the initial columns of the block at are set to zero.
If does not divide , then the remaining rows are stored in as a single block row with blocks. These arrays follow the same conventions as .
Data Fields  
int  has_unit_diag_implicit 
1 <==> Diagonal == 1 and is implicitly stored  
oski_index_t  row_block_size 
Row block size.  
oski_index_t  col_block_size 
Column block size.  
oski_index_t  num_block_rows 
# of full block rows  
oski_index_t  num_block_cols 
# of full block columns  
oski_index_t *  bptr 
Block row pointers.  
oski_index_t *  bind 
Block column indices.  
oski_value_t *  bval 
Nonzero blocks.  
oski_index_t  num_rows_leftover 
Number of "leftover" rows (i.e., ).  
tagBebop_matBCSR_t *  leftover 
Stores leftover rows, if any.  
char *  mod_name 
Module name containing this rxc implementation.  
void *  mod_cached 
Cached module pointer. 

Stores leftover rows, if any. (NULL otherwise) 