/* This file contains a collection of routines to multiply two matrices
   and store it in a third. As we have to work with two-dimensional
   arrays, and C is really too stupid to handle this in a flexible
   manner, we can use either of two approaches:
   1. Store it in a 1-D array and compute the indices myself.
   2. Store it in an array of vectors.

   Here we have opted for the first approach.

   The matrix product C = A B is computed.
   The arrays are stored row-wise.
   A is n1 by n2 (row length n2)
   B is n2 by n3 (row length n3)
   C is n1 by n3 (row length n3)

   Author:      G.D. van Albada                                                                                        
		Section Computational Science                                                                          
		CSP Lab                                                                                                
		Faculty of Science                                                                                     
		Universiteit van Amsterdam                                                                             
   Date:        September 6, 2003                                                                                      
   Copyright:   (C) Universiteit van Amsterdam                                                                         

*/

void
MatMul_1(double *A, double *B, double *C, int n1, int n2, int n3);

void
MatMul_2(double *A, double *B, double *C, int n1, int n2, int n3);

void
MatMul_3(double *A, double *B, double *C, int n1, int n2, int n3);

void
MatMul_4(double *A, double *B, double *C, int n1, int n2, int n3);

void
MatMul_5(double *A, double *B, double *C, int n1, int n2, int n3);

void
MatMul_6(double *A, double *B, double *C, int n1, int n2, int n3);

void
MatMul_7(double *A, double *B, double *C, int n1, int n2, int n3);

void
MatMul_8(double *A, double *B, double *C, int n1, int n2, int n3);

void
MatMul_9(double *A, double *B, double *C, int n1, int n2, int n3);

void
MatMul_10(double *A, double *B, double *C, int n1, int n2, int n3);

void
MatMul_11(double *A, double *B, double *C, int n1, int n2, int n3);

void
MatMul_12(double *A, double *B, double *C, int n1, int n2, int n3);

void
MatMul_13(double *A, double *B, double *C, int n1, int n2, int n3);

void
MatMul_14(double *A, double *B, double *C, int n1, int n2, int n3);

void
MatMul_15(double *A, double *B, double *C, int n1, int n2, int n3);

void
MatMul_16(double *A, double *B, double *C, int n1, int n2, int n3);

void
MatMul_17(double *A, double *B, double *C, int n1, int n2, int n3);

void
MatMul_18(double *A, double *B, double *C, int n1, int n2, int n3);

void
MatMul_19(double *A, double *B, double *C, int n1, int n2, int n3);

void
MatMul_20(double *A, double *B, double *C, int n1, int n2, int n3);

void
MatMul_21(double *A, double *B, double *C, int n1, int n2, int n3);

void
MatMul_22(double *A, double *B, double *C, int n1, int n2, int n3);


typedef void MatMulFun(double * , double *, double *, int , int , int);

typedef struct MATMULFUNSTRUCT
{
    MatMulFun *MatMul;
    char      funName[64];
} MatMulFunStruct;

int
set_subm_size(int val);
