/* QRsolveMT.c */
#include "../spoolesMT.h"
#include "../../timings.h"
#define MYDEBUG 0
/*--------------------------------------------------------------------*/
/*
--------------------------------------------------------
multithreaded version:
minimize ||b - Ax||_2 by
solving (U^T + I) * D * (I + U) X = A^T * B
where A = QR = QD(I + U)
by calling FrontMtx_solve()
note: if A is square, mtxX and mtxB must not be the same
cpus -- vector of cpu time breakdowns
cpus[0] -- set up solves
cpus[1] -- fetch rhs and store solution
cpus[2] -- forward solve
cpus[3] -- diagonal solve
cpus[4] -- backward solve
cpus[5] -- total solve time
cpus[6] -- time to compute A^T * B
cpus[7] -- total time
created -- 98may30, cca
--------------------------------------------------------
*/
void
FrontMtx_MT_QR_solve (
FrontMtx *frontmtx,
InpMtx *mtxA,
DenseMtx *mtxX,
DenseMtx *mtxB,
SubMtxManager *mtxmanager,
SolveMap *solvemap,
double cpus[],
int msglvl,
FILE *msgFile
) {
double t0, t1, t2 ;
double alpha[2] ;
/*
---------------
check the input
---------------
*/
MARKTIME(t0) ;
if ( frontmtx == NULL || mtxA == NULL || mtxX == NULL || mtxB == NULL
|| mtxmanager == NULL || solvemap == NULL
|| cpus == NULL || (msglvl > 0 && msgFile == NULL) ) {
fprintf(stderr, "\n fatal error in FrontMtx_MT_QR_solve()"
"\n bad input\n") ;
exit(-1) ;
}
/*
---------------------------------
compute X := A^T * B
this method is not multithreaded.
---------------------------------
*/
MARKTIME(t1) ;
DenseMtx_zero(mtxX) ;
alpha[0] = 1.0 ; alpha[1] = 0.0 ;
if ( FRONTMTX_IS_REAL(frontmtx) ) {
InpMtx_nonsym_mmm_T(mtxA, mtxX, alpha, mtxB) ;
} else if ( FRONTMTX_IS_COMPLEX(frontmtx) ) {
InpMtx_nonsym_mmm_H(mtxA, mtxX, alpha, mtxB) ;
}
MARKTIME(t2) ;
cpus[6] = t2 - t1 ;
if ( msglvl > 3 ) {
fprintf(msgFile, "\n B") ;
DenseMtx_writeForHumanEye(mtxB, msgFile) ;
fprintf(msgFile, "\n A^T * B") ;
DenseMtx_writeForHumanEye(mtxX, msgFile) ;
fflush(msgFile) ;
}
/*
-----------------------------------
solve (U^T + I) * D * (I + U) Z = X
where Z overwrites X
this method is multithreaded.
-----------------------------------
*/
MARKTIME(t1) ;
FrontMtx_MT_solve(frontmtx, mtxX, mtxX, mtxmanager, solvemap,
cpus, msglvl, msgFile) ;
if ( msglvl > 3 ) {
fprintf(msgFile, "\n computed mtxX") ;
DenseMtx_writeForHumanEye(mtxX, msgFile) ;
fflush(msgFile) ;
}
MARKTIME(t2) ;
cpus[7] = t2 - t0 ;
return ; }
/*--------------------------------------------------------------------*/
syntax highlighted by Code2HTML, v. 0.9.1