/* update.c */
#include "../FrontMtx.h"
/*--------------------------------------------------------------------*/
/*
------------------------------------------------------------
accumulate updates to front J, store them in the Chv object
created -- 98may04, cca
------------------------------------------------------------
*/
void
FrontMtx_update (
FrontMtx *frontmtx,
Chv *frontJ,
IP *heads[],
char status[],
DV *tempDV,
int msglvl,
FILE *msgFile
) {
SubMtx *mtxD, *mtxL, *mtxU ;
int I, J, nfront ;
IP *first, *ip, *last, *nextip ;
/*
--------------------------------------
loop over the fronts that may update J
--------------------------------------
*/
if ( msglvl > 3 ) {
fprintf(msgFile, "\n\n inside FrontMtx_update(%d)", frontJ->id) ;
fflush(stdout) ;
}
J = frontJ->id ;
nfront = frontmtx->nfront ;
for ( ip = heads[J], heads[J] = first = last = NULL ;
ip != NULL ;
ip = nextip ) {
nextip = ip->next ;
I = ip->val ;
if ( status == NULL || status[I] == 'F' ) {
mtxD = FrontMtx_diagMtx(frontmtx, I) ;
if ( msglvl > 3 ) {
fprintf(msgFile, "\n update from I %d, mtxD = %p", I, mtxD) ;
fflush(stdout) ;
}
if ( mtxD != NULL ) {
/*
-------------------------------------------------
front I did have some rows and columns eliminated
-------------------------------------------------
*/
mtxU = FrontMtx_upperMtx(frontmtx, I, nfront) ;
if ( msglvl > 3 ) {
fprintf(msgFile, "\n mtxU = %p", mtxU) ;
fflush(stdout) ;
}
if ( mtxU != NULL ) {
/*
------------------------------
the U_{I,bnd{I}} matrix exists
------------------------------
*/
if ( FRONTMTX_IS_SYMMETRIC(frontmtx) ) {
Chv_updateS(frontJ, mtxD, mtxU, tempDV) ;
} else if ( FRONTMTX_IS_HERMITIAN(frontmtx) ) {
Chv_updateH(frontJ, mtxD, mtxU, tempDV) ;
/*
fprintf(msgFile, "\n after update from front %d", mtxD->rowid) ;
Chv_writeForHumanEye(frontJ, msgFile) ;
*/
} else if ( FRONTMTX_IS_NONSYMMETRIC(frontmtx) ) {
mtxL = FrontMtx_lowerMtx(frontmtx, nfront, I) ;
if ( msglvl > 3 ) {
fprintf(msgFile, "\n mtxL = %p", mtxL) ;
fflush(stdout) ;
}
if ( mtxL != NULL ) {
/*
------------------------------
the L_{bnd{I},I} matrix exists
------------------------------
*/
Chv_updateN(frontJ, mtxL, mtxD, mtxU, tempDV) ;
}
}
}
}
if ( last == NULL ) {
last = ip ;
}
ip->next = first ;
first = ip ;
if ( msglvl > 3 ) {
fprintf(msgFile, "\n update from I %d is finished", I) ;
fflush(stdout) ;
}
} else {
ip->next = heads[J] ;
heads[J] = ip ;
}
}
/*
if ( frontJ->id == frontmtx->nfront - 1 ) {
fprintf(msgFile, "\n\n last front after updates made") ;
Chv_writeForHumanEye(frontJ, msgFile) ;
fflush(msgFile) ;
}
*/
if ( last != NULL ) {
/*
------------------------------------
link the IP objects to the free list
------------------------------------
*/
last->next = heads[nfront] ;
heads[nfront] = first ;
}
if ( msglvl > 3 ) {
fprintf(msgFile, "\n\n leaving FrontMtx_update(%d)", frontJ->id) ;
fflush(stdout) ;
}
return ; }
/*--------------------------------------------------------------------*/
syntax highlighted by Code2HTML, v. 0.9.1