// this matrix_h07.h file has the factorization of a non-symmetric or partitioned matrix.
// the ability to handle the real-isomorph of a complex matrix is inherited from matrix_c05.cpp.




//  computes the ket of a non-symmetric matrix array, given its bra and diagonal.
MATRIX_DLL_API
int matrix_bra_diag_array_ket(MAT *bra, MAT *diag, MAT *array, MAT *ket,
							  MAT *scratch_1, MAT *scratch_2);


//  factors a real square or horizontal array into its bra, diagonal, and ket.
//  will error-out if array is taller than wide.  that is, if array->imx > array->jmx.
//		in such a case, use matrix_real_factor_vertical.
//	also will error-out on a symmetric array -- use matrix_symmetric_o_diag, instead.
MATRIX_DLL_API
int matrix_real_factor_horizontal(MAT *array, MAT *bra, MAT *diag, MAT *ket, unsigned long sort,
					   MAT *scratch_1, MAT *scratch_2, MAT *scratch_3, MAT *scratch_4,
						MAT *scratch_5);


//  factors a real vertical array into its bra, diagonal, and ket.
//  will error-out if array is wider than tall.  that is, if array->imx <= array->jmx.
//	also will error-out on a symmetric array -- use matrix_symmetric_o_diag, instead.
MATRIX_DLL_API
int matrix_real_factor_vertical(MAT *array, MAT *bra, MAT *diag, MAT *ket, unsigned long sort,
					            MAT *scratch_1, MAT *scratch_2, MAT *scratch_3, MAT *scratch_4,
						        MAT *scratch_5, MAT *scratch_6, MAT *scratch_7, MAT *scratch_8);


//  factors a real array into its bra, diagonal, and ket.
//  handles a symmetric array correctly.
//  also handles any real -- square, horizontal, or vertical -- array.
//  however, the specialized routines require fewer scratch arrays.
MATRIX_DLL_API
int matrix_real_factor(MAT *array, MAT *bra, MAT *diag, MAT *ket, unsigned long sort,
					   MAT *scratch_1, MAT *scratch_2, MAT *scratch_3, MAT *scratch_4,
					   MAT *scratch_5, MAT *scratch_6, MAT *scratch_7, MAT *scratch_8);


//	matrix inversion by the preceding routine.
MATRIX_DLL_API
int matrix_real_factor_inverse(MAT *array, MAT *bra, MAT *diag, MAT *ket, unsigned long sort,
							   MAT *inverse, MAT *scratch_1, MAT *scratch_2, MAT *scratch_3,
							   MAT *scratch_4, MAT *scratch_5, MAT *scratch_6, MAT *scratch_7,
							   MAT *scratch_8);




// copyright (c) 2003,4 by R.I. 'Scibor-Marchocki.  last modified Tuesday 30-th March 2004.
